├── .gitignore ├── .travis.yml ├── LICENSE ├── README.md ├── example.js ├── index.js ├── messages.js ├── package-lock.json ├── package.json ├── schema.proto └── test.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | sandbox 3 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - '4' 4 | - '6' 5 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2017 Mathias Buus 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # append-tree 2 | 3 | Model a tree structure on top of an append-only log. 4 | 5 | ``` 6 | npm install append-tree 7 | ``` 8 | 9 | [![Build Status](https://travis-ci.org/mafintosh/append-tree.svg?branch=master)](https://travis-ci.org/mafintosh/append-tree) 10 | 11 | The data structure stores a small index for every entry in the log, meaning no external indexing is required to model the tree. Also means that you can perform fast lookups on sparsely replicated logs. 12 | 13 | ## Usage 14 | 15 | ``` js 16 | var tree = require('append-tree') 17 | var hypercore = require('hypercore') 18 | 19 | var feed = hypercore('./my-tree') 20 | var tr = tree(feed, {valueEncoding: 'utf-8'}) 21 | 22 | tr.put('/hello', 'world', function (err) { 23 | if (err) throw err 24 | 25 | tr.get('/hello', function (err, val) { 26 | if (err) throw err 27 | console.log(val) // <-- 'world' 28 | 29 | tr.list('/', function (err, list) { 30 | if (err) throw err 31 | console.log(list) // <-- ['hello'] 32 | }) 33 | }) 34 | }) 35 | ``` 36 | 37 | ## API 38 | 39 | #### `var tr = tree(feed, [options])` 40 | 41 | Create a new append tree. 42 | 43 | First option should be a [hypercore](https://github.com/mafintosh/hypercore) feed (or any append-only log that supports `.append()` and `.length`). 44 | 45 | Options include: 46 | 47 | ``` js 48 | { 49 | valueEncoding: 'binary' | 'utf-8' | 'json' | anyAbstractEncoding 50 | offset: 0 // optional feed offset where the tree starts 51 | cache: true // use an LRU cache on tree entries 52 | cacheSize: 65536 // how many entries to use in the LRU cache 53 | } 54 | ``` 55 | 56 | #### `tr.put(name, value, [callback])` 57 | 58 | Insert a new node in the tree. 59 | 60 | #### `tr.del(name, [callback])` 61 | 62 | Delete a node from the tree. 63 | 64 | #### `tr.get(name, [options], callback)` 65 | 66 | Retrieve a value from the tree. Accepts the same options as [hypercore's get](https://github.com/mafintosh/hypercore#feedgetindex-options-callback) method. 67 | 68 | #### `tr.list(name, [options], callback)` 69 | 70 | List all immediate children of a node. Similar to doing a `readdir` in a file system. Accepts the same options as [hypercore's get](https://github.com/mafintosh/hypercore#feedgetindex-options-callback) method. 71 | 72 | #### `tr.path(name, [options], callback)` 73 | 74 | Will call the callback with a list of feed indexes needed to lookup the given name. 75 | Useful if you are replicating the tree and want to avoid roundtrips. Accepts the same options as [hypercore's get](https://github.com/mafintosh/hypercore#feedgetindex-options-callback) method. 76 | 77 | #### `var stream = tr.history([options])` 78 | 79 | Create a history stream containing all the changes in the tree. Accepts the same options as [hypercore's createReadStream](https://github.com/mafintosh/hypercore#var-stream--feedcreatereadstreamoptions) method. 80 | 81 | Each data event looks like this 82 | 83 | ``` js 84 | { 85 | type: 'put' | 'del', 86 | version: 42, // version of the tree at this point in time 87 | name: '/foo', 88 | value: new Buffer('bar') // null if it is a del 89 | } 90 | ``` 91 | 92 | #### `tr.version` 93 | 94 | Number describing the current version of the tree. 95 | 96 | Populated initially after `ready` event. Will be `-1` before. 97 | 98 | #### `tr.on('ready', cb)` 99 | 100 | Fired when the tree is ready and all properties have been populated. 101 | 102 | #### `var oldTree = tr.checkout(version, [options])` 103 | 104 | Checkout an old readonly version of the tree. `.get`, `.list` will return the same values as the tree did at the old version. 105 | Accepts the same options as the tree constructor. 106 | 107 | #### `var stream = tr.diff(checkout, [options])` 108 | 109 | Diff a tree against another checkout of the tree. 110 | Will emit the same data as the history stream but representing the diff from `tr` to `checkout`. 111 | 112 | Accepts the same options as [hypercore's createReadStream](https://github.com/mafintosh/hypercore#var-stream--feedcreatereadstreamoptions) method. 113 | 114 | ## License 115 | 116 | MIT 117 | -------------------------------------------------------------------------------- /example.js: -------------------------------------------------------------------------------- 1 | var tree = require('append-tree') 2 | var hypercore = require('hypercore') 3 | var ram = require('random-access-memory') 4 | 5 | var feed = hypercore(ram) 6 | var tr = tree(feed, {valueEncoding: 'utf-8'}) 7 | 8 | tr.put('/hello', 'world', function (err) { 9 | if (err) throw err 10 | 11 | tr.get('/hello', function (err, val) { 12 | if (err) throw err 13 | console.log(val) // <-- 'world' 14 | 15 | tr.list('/', function (err, list) { 16 | if (err) throw err 17 | console.log(list) // <-- ['hello'] 18 | }) 19 | }) 20 | }) 21 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | var from = require('from2') 2 | var mutexify = require('mutexify') 3 | var varint = require('varint') 4 | var messages = require('./messages') 5 | var codecs = require('codecs') 6 | var inherits = require('inherits') 7 | var events = require('events') 8 | var cache = require('array-lru') 9 | var nextTick = require('process-nextick-args') 10 | 11 | module.exports = Tree 12 | 13 | function Tree (feed, opts) { 14 | if (!(this instanceof Tree)) return new Tree(feed, opts) 15 | if (!opts) opts = {} 16 | 17 | events.EventEmitter.call(this) 18 | 19 | this._offset = opts.offset || 0 20 | this._codec = opts.codec || codecs(opts.valueEncoding) 21 | this._head = typeof opts.checkout === 'number' ? opts.checkout : -1 22 | this._lock = mutexify() 23 | this._cache = getCache(opts) 24 | this._wait = opts.wait !== false 25 | this._cached = !!opts.cached 26 | this._asNode = !!opts.node 27 | this._readonly = !!opts.readonly 28 | 29 | this.feed = feed 30 | this.version = this._head 31 | 32 | var self = this 33 | 34 | this.ready(function (err) { 35 | if (!err) self.emit('ready') 36 | }) 37 | } 38 | 39 | inherits(Tree, events.EventEmitter) 40 | 41 | Tree.prototype.put = function (name, value, cb) { 42 | var self = this 43 | var names = split(name) 44 | 45 | this._lock(function (release) { 46 | self.head(function (err, head, seq) { 47 | if (err) return done(err) 48 | if (self._readonly) return done(new Error('Cannot delete on a checkout')) 49 | if (!head) self._init(names, value, done) 50 | else self._put(head, seq, names, value, done) 51 | }) 52 | 53 | function done (err) { 54 | release(cb, err) 55 | } 56 | }) 57 | } 58 | 59 | Tree.prototype._put = function (head, seq, names, value, cb) { 60 | var self = this 61 | var i = 0 62 | var end = names.length + 1 63 | var index = [] 64 | var len = self.feed.length 65 | 66 | loop(null, null, null) 67 | 68 | function loop (err, nodes, seqs) { 69 | if (err) return cb(err) 70 | 71 | if (nodes) { 72 | var result = [] 73 | 74 | for (var j = 0; j < nodes.length; j++) { 75 | if (split(nodes[j].name)[i - 1] !== names[i - 1]) { 76 | result.push(seqs[j]) 77 | } 78 | } 79 | 80 | result.push(len) 81 | index.push(result) 82 | } 83 | 84 | if (i === end) { 85 | var node = { 86 | name: join(names), 87 | value: self._codec.encode(value), 88 | paths: self._deflate(len, index) 89 | } 90 | 91 | self.version = self.feed.length 92 | self.feed.append(messages.Node.encode(node), cb) 93 | return 94 | } 95 | 96 | self._list(head, seq, names.slice(0, i++), null, loop) 97 | } 98 | } 99 | 100 | Tree.prototype.list = function (name, opts, cb) { 101 | if (typeof opts === 'function') return this.list(name, null, opts) 102 | opts = this._defaultOpts(opts) 103 | 104 | var self = this 105 | var names = split(name) 106 | var ns = !!(opts.node || opts.nodes) 107 | 108 | this.head(opts, function (err, head, seq) { 109 | if (err) return cb(err) 110 | if (!head) return cb(notFound(names)) 111 | 112 | self._list(head, seq, names, opts, onnodes) 113 | 114 | function onnodes (err, nodes, seqs) { 115 | if (err) return cb(err) 116 | if (!nodes.length) return cb(notFound(names)) 117 | 118 | var list = [] 119 | for (var i = 0; i < nodes.length; i++) { 120 | var nodeNames = split(nodes[i].name) 121 | if (nodeNames.length > names.length) { 122 | list.push(ns ? self._node(nodes[i], seqs[i]) : nodeNames[names.length]) 123 | } 124 | } 125 | 126 | cb(null, list) 127 | } 128 | }) 129 | } 130 | 131 | Tree.prototype._list = function (head, seq, names, opts, cb) { 132 | var headIndex 133 | try { 134 | headIndex = this._inflate(seq, head.paths) 135 | } catch (e) { 136 | return cb(e) 137 | } 138 | var cmp = compare(split(head.name), names) 139 | 140 | var index = cmp < headIndex.length && headIndex[cmp] 141 | var closest = cmp === names.length 142 | 143 | if (!closest) { 144 | if (!index || !index.length || (index.length === 1 && index[0] === seq)) return cb(null, [], []) 145 | this._closer(names, cmp, index, opts, cb) 146 | return 147 | } 148 | 149 | if (!index || !index.length) return cb(null, [], []) 150 | 151 | this._getAll(index, opts, cb) 152 | } 153 | 154 | Tree.prototype.get = function (name, opts, cb) { 155 | if (typeof opts === 'function') return this.get(name, null, opts) 156 | opts = this._defaultOpts(opts) 157 | 158 | var names = split(name) 159 | var self = this 160 | 161 | this.head(opts, function (err, head, seq) { 162 | if (err) return cb(err) 163 | if (!head) return cb(notFound(names)) 164 | self._get(head, seq, names, null, opts, cb) 165 | }) 166 | } 167 | 168 | Tree.prototype.path = function (name, opts, cb) { 169 | if (typeof opts === 'function') return this.path(name, null, opts) 170 | opts = this._defaultOpts(opts) 171 | 172 | var names = split(name) 173 | var path = [] 174 | var self = this 175 | 176 | this.head(opts, function (err, head, seq) { 177 | if (err) return cb(err) 178 | if (!head) return cb(notFound(names)) 179 | self._get(head, seq, names, path, opts, function (err) { 180 | if (err && !err.notFound) return cb(err) 181 | cb(null, path) 182 | }) 183 | }) 184 | } 185 | 186 | Tree.prototype.checkout = function (seq, opts) { 187 | opts = this._defaultOpts(opts) 188 | 189 | return new Tree(this.feed, { 190 | checkout: seq, 191 | readonly: true, 192 | offset: this._offset, 193 | codec: opts.valueEncoding ? codecs(opts.valueEncoding) : this._codec, 194 | cache: this._cache || opts.cache || false, 195 | node: opts.node, 196 | wait: opts.wait, 197 | cached: opts.cached 198 | }) 199 | } 200 | 201 | Tree.prototype._del = function (head, seq, names, cb) { 202 | var self = this 203 | var i = 0 204 | var end = names.length + 1 205 | var index = [] 206 | var len = self.feed.length 207 | var ignore = join(names) 208 | 209 | closest(names.length, function (err, c, cseq) { 210 | if (err) return cb(err) 211 | 212 | var cnames = c ? split(c.name) : [] 213 | var depth = compare(names, cnames) + 1 214 | 215 | loop(null, null, null) 216 | 217 | function loop (err, nodes, seqs) { 218 | if (err) return cb(err) 219 | 220 | if (nodes && i <= depth) { 221 | var result = [] 222 | 223 | for (var j = 0; j < nodes.length; j++) { 224 | if (split(nodes[j].name)[i - 1] !== names[i - 1]) { 225 | if (nodes[j].name !== ignore) { 226 | result.push(seqs[j]) 227 | } 228 | } 229 | } 230 | 231 | if (i < depth) { 232 | result.push(len) 233 | } 234 | 235 | index.push(result) 236 | } 237 | 238 | if (i === end) { 239 | var node = { 240 | name: join(names), 241 | value: null, 242 | paths: self._deflate(len, index) 243 | } 244 | 245 | self.version = self.feed.length 246 | self.feed.append(messages.Node.encode(node), cb) 247 | return 248 | } 249 | 250 | self._list(head, seq, names.slice(0, i++), null, loop) 251 | } 252 | }) 253 | 254 | function closest (j, cb) { 255 | self._list(head, seq, names.slice(0, j), null, function (err, nodes, seqs) { 256 | if (err) return cb(err) 257 | 258 | for (var i = nodes.length - 1; i >= 0; i--) { 259 | if (nodes[i].name !== ignore && nodes[i].value) return cb(null, nodes[i], seqs[i]) 260 | } 261 | 262 | if (j <= 0) { 263 | return cb(null, null, -1) 264 | } 265 | 266 | closest(j - 1, cb) 267 | }) 268 | } 269 | } 270 | 271 | Tree.prototype.del = function (name, cb) { 272 | var self = this 273 | var names = split(name) 274 | 275 | this._lock(function (release) { 276 | self.head(function (err, head, seq) { 277 | if (err) return done(err) 278 | if (self._readonly) return done(new Error('Cannot delete on a checkout')) 279 | if (!head) return done(null) 280 | else self._del(head, seq, names, done) 281 | }) 282 | 283 | function done (err) { 284 | release(cb, err) 285 | } 286 | }) 287 | } 288 | 289 | Tree.prototype._get = function (head, seq, names, record, opts, cb) { 290 | var self = this 291 | var headNames = split(head.name) 292 | var cmp = compare(names, headNames) 293 | 294 | if (record) record.push(seq) 295 | 296 | if (cmp === headNames.length && cmp === names.length) { 297 | if (opts.node) return cb(null, this._node(head, seq)) 298 | if (!head.value) return cb(notFound(names)) 299 | return cb(null, this._codec.decode(head.value)) 300 | } 301 | 302 | var inflated 303 | try { 304 | inflated = this._inflate(seq, head.paths) 305 | } catch (e) { 306 | return cb(e) 307 | } 308 | if (cmp >= inflated.length) return cb(notFound(names)) 309 | 310 | var index = inflated[cmp] 311 | var len = index.length 312 | if (index[len - 1] === seq) len-- 313 | 314 | if (!len) return cb(notFound(names)) 315 | 316 | var target = cmp < names.length ? names[cmp] : null 317 | var error = null 318 | var missing = len 319 | 320 | for (var i = 0; i < len; i++) { 321 | this._getAndDecode(index[i], opts, onget) 322 | } 323 | 324 | function onget (err, node, seq) { 325 | if (err) error = err 326 | 327 | if (node) { 328 | var nodeNames = split(node.name) 329 | if ((cmp < nodeNames.length ? nodeNames[cmp] : null) === target) { 330 | return self._get(node, seq, names, record, opts, cb) 331 | } 332 | } 333 | 334 | if (!--missing) cb(error || notFound(names)) 335 | } 336 | } 337 | 338 | Tree.prototype._closer = function (names, cmp, index, opts, cb) { 339 | var self = this 340 | var target = names[cmp] 341 | var error = null 342 | var missing = index.length 343 | var done = false 344 | 345 | for (var i = 0; i < index.length; i++) { 346 | this._getAndDecode(index[i], opts, onget) 347 | } 348 | 349 | function onget (err, node, seq) { 350 | if (done) return 351 | if (err) error = err 352 | 353 | if (node && split(node.name)[cmp] === target) { 354 | self._list(node, seq, names, opts, cb) 355 | return 356 | } 357 | 358 | if (!--missing) cb(error, [], []) 359 | } 360 | } 361 | 362 | Tree.prototype.head = function (opts, cb) { 363 | if (typeof opts === 'function') return this.head(null, opts) 364 | if (this._head >= this._offset) return this._getAndDecode(this._head, opts, cb) 365 | if (this._readonly) return cb(null, null, -1) 366 | 367 | var self = this 368 | 369 | this.ready(function (err) { 370 | if (err) return cb(err) 371 | if (self.feed.length > self._offset) self._getAndDecode(self.feed.length - 1, opts, cb) 372 | else cb(null, null, -1) 373 | }) 374 | } 375 | 376 | Tree.prototype.ready = function (cb) { 377 | var self = this 378 | 379 | this.feed.ready(function (err) { 380 | if (err) return cb(err) 381 | if ((self.version === -1 || self._head === -1) && self.feed.length > self._offset) self.version = self.feed.length - 1 382 | cb(null) 383 | }) 384 | } 385 | 386 | Tree.prototype.history = function (opts) { 387 | opts = this._defaultOpts(opts) 388 | 389 | if (this._offset) opts.start = Math.max(opts.start || 0, this._offset) 390 | if (this._head > -1) opts.end = this._head + 1 391 | 392 | var version = opts.start || 0 393 | var self = this 394 | 395 | opts.valueEncoding = { 396 | encode: function () {}, 397 | decode: function (buf) { 398 | return self._node(messages.Node.decode(buf), version++) 399 | } 400 | } 401 | 402 | return this.feed.createReadStream(opts) 403 | } 404 | 405 | Tree.prototype.diff = function (toTree, opts) { 406 | if (typeof toTree === 'number') toTree = this.checkout(toTree) 407 | opts = this._defaultOpts(opts) 408 | 409 | var fromTree = this 410 | var diffPuts = opts.puts !== false 411 | var diffDels = opts.dels !== false 412 | var queue = ['/'] 413 | var first = true 414 | var forceVisit = {} 415 | 416 | if (opts.reverse) { 417 | fromTree = toTree 418 | toTree = this 419 | } 420 | 421 | var stream = from.obj(read) 422 | return stream 423 | 424 | function firstRead (size, cb) { 425 | first = false 426 | toTree.head(function (err, head) { 427 | if (err) return cb(err) 428 | if (!head || head.value) return read(size, cb) 429 | 430 | var parts = head.name.split('/') 431 | for (var i = 0; i < parts.length; i++) { 432 | forceVisit[parts.slice(0, i).join('/') || '/'] = true 433 | } 434 | 435 | read(size, cb) 436 | }) 437 | } 438 | 439 | function read (size, cb) { 440 | if (first) return firstRead(size, cb) 441 | if (!queue.length) return cb(null, null) 442 | visit(queue.pop(), function (err, result) { 443 | if (err) return cb(err) 444 | if (!result.length) return read(size, cb) 445 | for (var i = 0; i < result.length - 1; i++) { 446 | stream.push(result[i]) 447 | } 448 | cb(null, result[result.length - 1]) 449 | }) 450 | } 451 | 452 | function push (dir, isPut, node, visited, result) { 453 | if (isPut && !diffPuts) return 454 | if (!isPut && !diffDels) return 455 | 456 | var name = node.name 457 | var nameDir = parseDir(dir, node.name) 458 | 459 | if (name === nameDir) { 460 | result.push({ 461 | type: isPut ? 'put' : 'del', 462 | name: node.name, 463 | version: node.version, 464 | value: node.value 465 | }) 466 | } 467 | 468 | if (!visited.hasOwnProperty(nameDir)) { 469 | visited[nameDir] = true 470 | queue.push(nameDir) 471 | } 472 | } 473 | 474 | function parseDir (dir, name) { 475 | return '/' + split(name).slice(0, split(dir).length + 1).join('/') 476 | } 477 | 478 | function visit (dir, cb) { 479 | var visited = {} 480 | 481 | toTree.list(dir, {node: true}, function (err, a) { 482 | if (err && !err.notFound) return cb(err) 483 | if (!a) a = [] 484 | 485 | fromTree.list(dir, {node: true}, function (err, b) { 486 | if (err && !err.notFound) return cb(err) 487 | if (!b) b = [] 488 | 489 | var result = [] 490 | var i = 0 491 | var j = 0 492 | 493 | while (i < a.length && j < b.length) { 494 | if (a[i].version === b[j].version) { 495 | var nameDir = parseDir(dir, a[i].name) 496 | if (forceVisit.hasOwnProperty(nameDir) && !visited[nameDir]) { 497 | visited[nameDir] = true 498 | queue.push(nameDir) 499 | } 500 | i++ 501 | j++ 502 | } else if (a[i].version < b[j].version) { 503 | push(dir, true, a[i++], visited, result) 504 | } else { 505 | push(dir, false, b[j++], visited, result) 506 | } 507 | } 508 | 509 | for (; i < a.length; i++) push(dir, true, a[i], visited, result) 510 | for (; j < b.length; j++) push(dir, false, b[j], visited, result) 511 | 512 | cb(null, result) 513 | }) 514 | }) 515 | } 516 | } 517 | 518 | Tree.prototype._node = function (node, version) { 519 | return { 520 | type: node.value ? 'put' : 'del', 521 | version: version, 522 | name: node.name, 523 | value: node.value && this._codec.decode(node.value) 524 | } 525 | } 526 | 527 | Tree.prototype._init = function (names, value, cb) { 528 | var index = [] 529 | 530 | while (names.length >= index.length) { 531 | index.push([this.feed.length]) 532 | } 533 | 534 | var node = { 535 | name: join(names), 536 | value: this._codec.encode(value), 537 | paths: this._deflate(this.feed.length, index) 538 | } 539 | 540 | this.version = this.feed.length 541 | this.feed.append(messages.Node.encode(node), cb) 542 | } 543 | 544 | Tree.prototype._getAndDecode = function (seq, opts, cb) { 545 | if (opts && opts.cached) opts.wait = false 546 | 547 | var self = this 548 | var cached = this._cache && this._cache.get(seq) 549 | if (cached) return nextTick(cb, null, cached, seq) 550 | 551 | this.feed.get(seq, opts, function (err, value) { 552 | if (err) return cb(err) 553 | try { 554 | var node = new Node(messages.Node.decode(value), seq) 555 | } catch (err) { 556 | return cb(err) 557 | } 558 | if (self._cache) self._cache.set(seq, node) 559 | cb(null, node, seq) 560 | }) 561 | } 562 | 563 | Tree.prototype._getAll = function (seqs, opts, cb) { 564 | if (opts && opts.cached) seqs = this._onlyCached(seqs) 565 | 566 | var nodes = new Array(seqs.length) 567 | var missing = seqs.length 568 | var error = null 569 | 570 | if (!missing) return cb(null, nodes, seqs) 571 | for (var i = 0; i < seqs.length; i++) this._getAndDecode(seqs[i], opts, get) 572 | 573 | function get (err, node, seq) { 574 | if (err) error = err 575 | else nodes[seqs.indexOf(seq)] = node 576 | if (--missing) return 577 | if (error) cb(error) 578 | else cb(null, nodes, seqs) 579 | } 580 | } 581 | 582 | Tree.prototype._onlyCached = function (seqs) { 583 | var cachedSeqs = [] 584 | 585 | for (var i = 0; i < seqs.length; i++) { 586 | if (this.feed.has(seqs[i])) cachedSeqs.push(seqs[i]) 587 | } 588 | 589 | return cachedSeqs 590 | } 591 | 592 | Tree.prototype._deflate = function (seq, index) { 593 | var endsWithSeq = true 594 | var lenIsh = 11 595 | var i = 0 596 | var idx 597 | 598 | for (i = 0; i < index.length; i++) { 599 | idx = index[i] 600 | 601 | lenIsh += idx.length * 11 + 11 602 | if (idx[idx.length - 1] !== seq) endsWithSeq = false 603 | } 604 | 605 | var header = 0 606 | if (endsWithSeq) header |= 1 607 | 608 | var buf = new Buffer(lenIsh) 609 | var offset = 0 610 | 611 | buf[offset++] = header 612 | 613 | for (i = 0; i < index.length; i++) { 614 | idx = index[i] 615 | 616 | var prev = 0 617 | var len = endsWithSeq ? idx.length - 1 : idx.length 618 | 619 | varint.encode(len, buf, offset) 620 | offset += varint.encode.bytes 621 | 622 | for (var j = 0; j < len; j++) { 623 | varint.encode(idx[j] - prev, buf, offset) 624 | offset += varint.encode.bytes 625 | prev = idx[j] 626 | } 627 | } 628 | 629 | if (offset > buf.length) throw new Error('Assert error: buffer length too small') 630 | return buf.slice(0, offset) 631 | } 632 | 633 | Tree.prototype._inflate = function (seq, buf) { 634 | var offset = 0 635 | 636 | var header = varint.decode(buf, offset) 637 | offset += varint.decode.bytes 638 | 639 | var endsWithSeq = !!(header & 1) 640 | var index = [] 641 | 642 | while (offset < buf.length) { 643 | var len = varint.decode(buf, offset) // TODO: sanity check this length 644 | offset += varint.decode.bytes 645 | 646 | var seqs = new Array(endsWithSeq ? len + 1 : len) 647 | var i = 0 648 | 649 | for (; i < len; i++) { 650 | if (offset >= buf.length) throw new Error('Invalid index') 651 | 652 | seqs[i] = varint.decode(buf, offset) + (i ? seqs[i - 1] : 0) 653 | offset += varint.decode.bytes 654 | } 655 | 656 | if (endsWithSeq) seqs[i] = seq 657 | index.push(seqs) 658 | } 659 | 660 | return index 661 | } 662 | 663 | Tree.prototype._defaultOpts = function (opts) { 664 | if (!opts) return {wait: this._wait, cached: this._cached, node: this._asNode} 665 | if (opts.wait === undefined) opts.wait = this._wait 666 | if (opts.cached === undefined) opts.cached = this._cached 667 | if (opts.node === undefined) opts.node = this._asNode 668 | return opts 669 | } 670 | 671 | function join (names) { 672 | return '/' + names.join('/') 673 | } 674 | 675 | function split (name) { 676 | var list = name.split('/') 677 | if (list[0] === '') list.shift() 678 | if (list[list.length - 1] === '') list.pop() 679 | return list 680 | } 681 | 682 | function notFound (names) { 683 | var err = new Error(join(names) + ' could not be found') 684 | err.notFound = true 685 | err.status = 404 686 | return err 687 | } 688 | 689 | function compare (a, b) { 690 | var idx = 0 691 | while (idx < a.length && a[idx] === b[idx]) idx++ 692 | return idx 693 | } 694 | 695 | function Node (node, seq) { 696 | this.index = seq 697 | this.name = node.name 698 | this.value = node.value 699 | this.paths = node.paths 700 | } 701 | 702 | function getCache (opts) { 703 | if (opts.cache === false) return null 704 | if (opts.cache === true || !opts.cache) { 705 | var cacheSize = opts.cacheSize || 65536 706 | return cache(cacheSize, {indexedValues: true}) 707 | } 708 | return opts.cache 709 | } 710 | -------------------------------------------------------------------------------- /messages.js: -------------------------------------------------------------------------------- 1 | // This file is auto generated by the protocol-buffers cli tool 2 | 3 | /* eslint-disable quotes */ 4 | /* eslint-disable indent */ 5 | /* eslint-disable no-redeclare */ 6 | 7 | // Remember to `npm install --save protocol-buffers-encodings` 8 | var encodings = require('protocol-buffers-encodings') 9 | var varint = encodings.varint 10 | var skip = encodings.skip 11 | 12 | var Node = exports.Node = { 13 | buffer: true, 14 | encodingLength: null, 15 | encode: null, 16 | decode: null 17 | } 18 | 19 | defineNode() 20 | 21 | function defineNode () { 22 | var enc = [ 23 | encodings.string, 24 | encodings.bytes 25 | ] 26 | 27 | Node.encodingLength = encodingLength 28 | Node.encode = encode 29 | Node.decode = decode 30 | 31 | function encodingLength (obj) { 32 | var length = 0 33 | if (!defined(obj.name)) throw new Error("name is required") 34 | var len = enc[0].encodingLength(obj.name) 35 | length += 1 + len 36 | if (defined(obj.value)) { 37 | var len = enc[1].encodingLength(obj.value) 38 | length += 1 + len 39 | } 40 | if (defined(obj.paths)) { 41 | var len = enc[1].encodingLength(obj.paths) 42 | length += 1 + len 43 | } 44 | return length 45 | } 46 | 47 | function encode (obj, buf, offset) { 48 | if (!offset) offset = 0 49 | if (!buf) buf = Buffer.allocUnsafe(encodingLength(obj)) 50 | var oldOffset = offset 51 | if (!defined(obj.name)) throw new Error("name is required") 52 | buf[offset++] = 10 53 | enc[0].encode(obj.name, buf, offset) 54 | offset += enc[0].encode.bytes 55 | if (defined(obj.value)) { 56 | buf[offset++] = 18 57 | enc[1].encode(obj.value, buf, offset) 58 | offset += enc[1].encode.bytes 59 | } 60 | if (defined(obj.paths)) { 61 | buf[offset++] = 26 62 | enc[1].encode(obj.paths, buf, offset) 63 | offset += enc[1].encode.bytes 64 | } 65 | encode.bytes = offset - oldOffset 66 | return buf 67 | } 68 | 69 | function decode (buf, offset, end) { 70 | if (!offset) offset = 0 71 | if (!end) end = buf.length 72 | if (!(end <= buf.length && offset <= buf.length)) throw new Error("Decoded message is not valid") 73 | var oldOffset = offset 74 | var obj = { 75 | name: "", 76 | value: null, 77 | paths: null 78 | } 79 | var found0 = false 80 | while (true) { 81 | if (end <= offset) { 82 | if (!found0) throw new Error("Decoded message is not valid") 83 | decode.bytes = offset - oldOffset 84 | return obj 85 | } 86 | var prefix = varint.decode(buf, offset) 87 | offset += varint.decode.bytes 88 | var tag = prefix >> 3 89 | switch (tag) { 90 | case 1: 91 | obj.name = enc[0].decode(buf, offset) 92 | offset += enc[0].decode.bytes 93 | found0 = true 94 | break 95 | case 2: 96 | obj.value = enc[1].decode(buf, offset) 97 | offset += enc[1].decode.bytes 98 | break 99 | case 3: 100 | obj.paths = enc[1].decode(buf, offset) 101 | offset += enc[1].decode.bytes 102 | break 103 | default: 104 | offset = skip(prefix & 7, buf, offset) 105 | } 106 | } 107 | } 108 | } 109 | 110 | function defined (val) { 111 | return val !== null && val !== undefined && (typeof val !== 'number' || !isNaN(val)) 112 | } 113 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "append-tree", 3 | "version": "2.4.4", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "acorn": { 8 | "version": "5.2.1", 9 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.2.1.tgz", 10 | "integrity": "sha512-jG0u7c4Ly+3QkkW18V+NRDN+4bWHdln30NL1ZL2AvFZZmQe/BfopYCtghCKKVBUSetZ4QKcyA0pY6/4Gw8Pv8w==" 11 | }, 12 | "acorn-jsx": { 13 | "version": "3.0.1", 14 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", 15 | "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", 16 | "dev": true, 17 | "requires": { 18 | "acorn": "3.3.0" 19 | }, 20 | "dependencies": { 21 | "acorn": { 22 | "version": "3.3.0", 23 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", 24 | "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", 25 | "dev": true 26 | } 27 | } 28 | }, 29 | "ajv": { 30 | "version": "4.11.8", 31 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", 32 | "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", 33 | "dev": true, 34 | "requires": { 35 | "co": "4.6.0", 36 | "json-stable-stringify": "1.0.1" 37 | } 38 | }, 39 | "ajv-keywords": { 40 | "version": "1.5.1", 41 | "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", 42 | "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", 43 | "dev": true 44 | }, 45 | "amdefine": { 46 | "version": "1.0.1", 47 | "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", 48 | "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", 49 | "optional": true 50 | }, 51 | "ansi-escapes": { 52 | "version": "1.4.0", 53 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", 54 | "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", 55 | "dev": true 56 | }, 57 | "ansi-regex": { 58 | "version": "2.1.1", 59 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 60 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 61 | "dev": true 62 | }, 63 | "ansi-styles": { 64 | "version": "2.2.1", 65 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 66 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", 67 | "dev": true 68 | }, 69 | "argparse": { 70 | "version": "1.0.9", 71 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", 72 | "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", 73 | "dev": true, 74 | "requires": { 75 | "sprintf-js": "1.0.3" 76 | } 77 | }, 78 | "array-lru": { 79 | "version": "1.1.1", 80 | "resolved": "https://registry.npmjs.org/array-lru/-/array-lru-1.1.1.tgz", 81 | "integrity": "sha1-DH4bTgIq4Wb/HoRIxZXzGB/NMzc=" 82 | }, 83 | "array-union": { 84 | "version": "1.0.2", 85 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", 86 | "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", 87 | "dev": true, 88 | "requires": { 89 | "array-uniq": "1.0.3" 90 | } 91 | }, 92 | "array-uniq": { 93 | "version": "1.0.3", 94 | "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", 95 | "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", 96 | "dev": true 97 | }, 98 | "array.prototype.find": { 99 | "version": "2.0.4", 100 | "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.0.4.tgz", 101 | "integrity": "sha1-VWpcU2LAhkgyPdrrnenRS8GGTJA=", 102 | "dev": true, 103 | "requires": { 104 | "define-properties": "1.1.2", 105 | "es-abstract": "1.9.0" 106 | } 107 | }, 108 | "arrify": { 109 | "version": "1.0.1", 110 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", 111 | "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", 112 | "dev": true 113 | }, 114 | "atomic-batcher": { 115 | "version": "1.0.2", 116 | "resolved": "https://registry.npmjs.org/atomic-batcher/-/atomic-batcher-1.0.2.tgz", 117 | "integrity": "sha1-0WkB0QzOxZUWwZe5zNiTBom4E7Q=", 118 | "dev": true 119 | }, 120 | "babel-code-frame": { 121 | "version": "6.26.0", 122 | "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", 123 | "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", 124 | "dev": true, 125 | "requires": { 126 | "chalk": "1.1.3", 127 | "esutils": "2.0.2", 128 | "js-tokens": "3.0.2" 129 | }, 130 | "dependencies": { 131 | "esutils": { 132 | "version": "2.0.2", 133 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", 134 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", 135 | "dev": true 136 | } 137 | } 138 | }, 139 | "balanced-match": { 140 | "version": "1.0.0", 141 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 142 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 143 | "dev": true 144 | }, 145 | "base64-to-uint8array": { 146 | "version": "1.0.0", 147 | "resolved": "https://registry.npmjs.org/base64-to-uint8array/-/base64-to-uint8array-1.0.0.tgz", 148 | "integrity": "sha512-drjWQcees55+XQSVHYxiUF05Fj6ko3XJUoxykZEXbm0BMmNz2ieWiZGJ+6TFWnjN2saucG6pI13LS92O4kaiAg==", 149 | "dev": true 150 | }, 151 | "bitfield-rle": { 152 | "version": "2.1.0", 153 | "resolved": "https://registry.npmjs.org/bitfield-rle/-/bitfield-rle-2.1.0.tgz", 154 | "integrity": "sha1-rinpOCp7pImN6fSLsj/TOMT73Pg=", 155 | "dev": true, 156 | "requires": { 157 | "varint": "4.0.1" 158 | }, 159 | "dependencies": { 160 | "varint": { 161 | "version": "4.0.1", 162 | "resolved": "https://registry.npmjs.org/varint/-/varint-4.0.1.tgz", 163 | "integrity": "sha1-SQgpuULSSEY7KzUJeZXDv3NxmOk=", 164 | "dev": true 165 | } 166 | } 167 | }, 168 | "blake2b": { 169 | "version": "2.1.2", 170 | "resolved": "https://registry.npmjs.org/blake2b/-/blake2b-2.1.2.tgz", 171 | "integrity": "sha1-aIDt3KNc/t6SxPsnJCITNPmJFFo=", 172 | "dev": true, 173 | "requires": { 174 | "blake2b-wasm": "1.1.4", 175 | "nanoassert": "1.1.0" 176 | } 177 | }, 178 | "blake2b-wasm": { 179 | "version": "1.1.4", 180 | "resolved": "https://registry.npmjs.org/blake2b-wasm/-/blake2b-wasm-1.1.4.tgz", 181 | "integrity": "sha512-j7ZsvtE8wEXFnyt6TJwNUvBKBOHeNJMQSwIAriQkMcQU5/Ce03Y1kS4W7Sjx6WnhOZi8kVwcrVu9DgUcLHz24A==", 182 | "dev": true, 183 | "requires": { 184 | "base64-to-uint8array": "1.0.0", 185 | "brfs": "1.4.3", 186 | "nanoassert": "1.1.0" 187 | } 188 | }, 189 | "brace-expansion": { 190 | "version": "1.1.8", 191 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", 192 | "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", 193 | "dev": true, 194 | "requires": { 195 | "balanced-match": "1.0.0", 196 | "concat-map": "0.0.1" 197 | } 198 | }, 199 | "brfs": { 200 | "version": "1.4.3", 201 | "resolved": "https://registry.npmjs.org/brfs/-/brfs-1.4.3.tgz", 202 | "integrity": "sha1-22ddb16SPm3wh/ylhZyQkKrtMhY=", 203 | "requires": { 204 | "quote-stream": "1.0.2", 205 | "resolve": "1.5.0", 206 | "static-module": "1.5.0", 207 | "through2": "2.0.3" 208 | } 209 | }, 210 | "buffer-alloc-unsafe": { 211 | "version": "1.0.0", 212 | "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.0.0.tgz", 213 | "integrity": "sha1-R0qojzTnvHX6MR0uZFdAnFhGw/4=", 214 | "dev": true 215 | }, 216 | "buffer-equal": { 217 | "version": "0.0.1", 218 | "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", 219 | "integrity": "sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs=" 220 | }, 221 | "buffer-equals": { 222 | "version": "1.0.4", 223 | "resolved": "https://registry.npmjs.org/buffer-equals/-/buffer-equals-1.0.4.tgz", 224 | "integrity": "sha1-A1O1T9B/2VZBcGca5vZrnPENJ/U=", 225 | "dev": true 226 | }, 227 | "bulk-write-stream": { 228 | "version": "1.1.3", 229 | "resolved": "https://registry.npmjs.org/bulk-write-stream/-/bulk-write-stream-1.1.3.tgz", 230 | "integrity": "sha1-0pyjhfvVPzV67lvT0wKHMrYq4nU=", 231 | "dev": true, 232 | "requires": { 233 | "inherits": "2.0.3", 234 | "readable-stream": "2.3.3" 235 | } 236 | }, 237 | "caller-path": { 238 | "version": "0.1.0", 239 | "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", 240 | "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", 241 | "dev": true, 242 | "requires": { 243 | "callsites": "0.2.0" 244 | } 245 | }, 246 | "callsites": { 247 | "version": "0.2.0", 248 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", 249 | "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", 250 | "dev": true 251 | }, 252 | "chalk": { 253 | "version": "1.1.3", 254 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 255 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 256 | "dev": true, 257 | "requires": { 258 | "ansi-styles": "2.2.1", 259 | "escape-string-regexp": "1.0.5", 260 | "has-ansi": "2.0.0", 261 | "strip-ansi": "3.0.1", 262 | "supports-color": "2.0.0" 263 | } 264 | }, 265 | "circular-json": { 266 | "version": "0.3.3", 267 | "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", 268 | "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", 269 | "dev": true 270 | }, 271 | "cli-cursor": { 272 | "version": "1.0.2", 273 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", 274 | "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", 275 | "dev": true, 276 | "requires": { 277 | "restore-cursor": "1.0.1" 278 | } 279 | }, 280 | "cli-width": { 281 | "version": "2.2.0", 282 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", 283 | "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", 284 | "dev": true 285 | }, 286 | "co": { 287 | "version": "4.6.0", 288 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 289 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", 290 | "dev": true 291 | }, 292 | "code-point-at": { 293 | "version": "1.1.0", 294 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 295 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", 296 | "dev": true 297 | }, 298 | "codecs": { 299 | "version": "1.2.0", 300 | "resolved": "https://registry.npmjs.org/codecs/-/codecs-1.2.0.tgz", 301 | "integrity": "sha1-UUhUnj0VbF+gU9fLtBlxWgz0PRY=" 302 | }, 303 | "concat-map": { 304 | "version": "0.0.1", 305 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 306 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 307 | "dev": true 308 | }, 309 | "concat-stream": { 310 | "version": "1.6.0", 311 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", 312 | "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", 313 | "requires": { 314 | "inherits": "2.0.3", 315 | "readable-stream": "2.3.3", 316 | "typedarray": "0.0.6" 317 | } 318 | }, 319 | "core-util-is": { 320 | "version": "1.0.2", 321 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 322 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 323 | }, 324 | "d": { 325 | "version": "1.0.0", 326 | "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", 327 | "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", 328 | "dev": true, 329 | "requires": { 330 | "es5-ext": "0.10.35" 331 | } 332 | }, 333 | "debug": { 334 | "version": "2.6.9", 335 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 336 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 337 | "dev": true, 338 | "requires": { 339 | "ms": "2.0.0" 340 | } 341 | }, 342 | "debug-log": { 343 | "version": "1.0.1", 344 | "resolved": "https://registry.npmjs.org/debug-log/-/debug-log-1.0.1.tgz", 345 | "integrity": "sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8=", 346 | "dev": true 347 | }, 348 | "deep-equal": { 349 | "version": "1.0.1", 350 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", 351 | "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", 352 | "dev": true 353 | }, 354 | "deep-is": { 355 | "version": "0.1.3", 356 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 357 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 358 | "dev": true 359 | }, 360 | "define-properties": { 361 | "version": "1.1.2", 362 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", 363 | "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", 364 | "dev": true, 365 | "requires": { 366 | "foreach": "2.0.5", 367 | "object-keys": "1.0.11" 368 | } 369 | }, 370 | "defined": { 371 | "version": "1.0.0", 372 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", 373 | "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", 374 | "dev": true 375 | }, 376 | "deglob": { 377 | "version": "2.1.0", 378 | "resolved": "https://registry.npmjs.org/deglob/-/deglob-2.1.0.tgz", 379 | "integrity": "sha1-TUSr4W7zLHebSXK9FBqAMlApoUo=", 380 | "dev": true, 381 | "requires": { 382 | "find-root": "1.1.0", 383 | "glob": "7.1.2", 384 | "ignore": "3.3.7", 385 | "pkg-config": "1.1.1", 386 | "run-parallel": "1.1.6", 387 | "uniq": "1.0.1" 388 | } 389 | }, 390 | "del": { 391 | "version": "2.2.2", 392 | "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", 393 | "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", 394 | "dev": true, 395 | "requires": { 396 | "globby": "5.0.0", 397 | "is-path-cwd": "1.0.0", 398 | "is-path-in-cwd": "1.0.0", 399 | "object-assign": "4.1.1", 400 | "pify": "2.3.0", 401 | "pinkie-promise": "2.0.1", 402 | "rimraf": "2.6.2" 403 | } 404 | }, 405 | "doctrine": { 406 | "version": "2.0.0", 407 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz", 408 | "integrity": "sha1-xz2NKQnSIpHhoAejlYBNqLZl/mM=", 409 | "dev": true, 410 | "requires": { 411 | "esutils": "2.0.2", 412 | "isarray": "1.0.0" 413 | }, 414 | "dependencies": { 415 | "esutils": { 416 | "version": "2.0.2", 417 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", 418 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", 419 | "dev": true 420 | } 421 | } 422 | }, 423 | "duplexer2": { 424 | "version": "0.0.2", 425 | "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", 426 | "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", 427 | "requires": { 428 | "readable-stream": "1.1.14" 429 | }, 430 | "dependencies": { 431 | "isarray": { 432 | "version": "0.0.1", 433 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 434 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" 435 | }, 436 | "readable-stream": { 437 | "version": "1.1.14", 438 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", 439 | "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", 440 | "requires": { 441 | "core-util-is": "1.0.2", 442 | "inherits": "2.0.3", 443 | "isarray": "0.0.1", 444 | "string_decoder": "0.10.31" 445 | } 446 | }, 447 | "string_decoder": { 448 | "version": "0.10.31", 449 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 450 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" 451 | } 452 | } 453 | }, 454 | "error-ex": { 455 | "version": "1.3.1", 456 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", 457 | "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", 458 | "dev": true, 459 | "requires": { 460 | "is-arrayish": "0.2.1" 461 | } 462 | }, 463 | "es-abstract": { 464 | "version": "1.9.0", 465 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.9.0.tgz", 466 | "integrity": "sha512-kk3IJoKo7A3pWJc0OV8yZ/VEX2oSUytfekrJiqoxBlKJMFAJVJVpGdHClCCTdv+Fn2zHfpDHHIelMFhZVfef3Q==", 467 | "dev": true, 468 | "requires": { 469 | "es-to-primitive": "1.1.1", 470 | "function-bind": "1.1.1", 471 | "has": "1.0.1", 472 | "is-callable": "1.1.3", 473 | "is-regex": "1.0.4" 474 | } 475 | }, 476 | "es-to-primitive": { 477 | "version": "1.1.1", 478 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", 479 | "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", 480 | "dev": true, 481 | "requires": { 482 | "is-callable": "1.1.3", 483 | "is-date-object": "1.0.1", 484 | "is-symbol": "1.0.1" 485 | } 486 | }, 487 | "es5-ext": { 488 | "version": "0.10.35", 489 | "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.35.tgz", 490 | "integrity": "sha1-GO6FjOajxFx9eekcFfzKnsVoSU8=", 491 | "dev": true, 492 | "requires": { 493 | "es6-iterator": "2.0.3", 494 | "es6-symbol": "3.1.1" 495 | } 496 | }, 497 | "es6-iterator": { 498 | "version": "2.0.3", 499 | "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", 500 | "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", 501 | "dev": true, 502 | "requires": { 503 | "d": "1.0.0", 504 | "es5-ext": "0.10.35", 505 | "es6-symbol": "3.1.1" 506 | } 507 | }, 508 | "es6-map": { 509 | "version": "0.1.5", 510 | "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", 511 | "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", 512 | "dev": true, 513 | "requires": { 514 | "d": "1.0.0", 515 | "es5-ext": "0.10.35", 516 | "es6-iterator": "2.0.3", 517 | "es6-set": "0.1.5", 518 | "es6-symbol": "3.1.1", 519 | "event-emitter": "0.3.5" 520 | } 521 | }, 522 | "es6-set": { 523 | "version": "0.1.5", 524 | "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", 525 | "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", 526 | "dev": true, 527 | "requires": { 528 | "d": "1.0.0", 529 | "es5-ext": "0.10.35", 530 | "es6-iterator": "2.0.3", 531 | "es6-symbol": "3.1.1", 532 | "event-emitter": "0.3.5" 533 | } 534 | }, 535 | "es6-symbol": { 536 | "version": "3.1.1", 537 | "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", 538 | "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", 539 | "dev": true, 540 | "requires": { 541 | "d": "1.0.0", 542 | "es5-ext": "0.10.35" 543 | } 544 | }, 545 | "es6-weak-map": { 546 | "version": "2.0.2", 547 | "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", 548 | "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", 549 | "dev": true, 550 | "requires": { 551 | "d": "1.0.0", 552 | "es5-ext": "0.10.35", 553 | "es6-iterator": "2.0.3", 554 | "es6-symbol": "3.1.1" 555 | } 556 | }, 557 | "escape-string-regexp": { 558 | "version": "1.0.5", 559 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 560 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 561 | "dev": true 562 | }, 563 | "escodegen": { 564 | "version": "1.3.3", 565 | "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.3.3.tgz", 566 | "integrity": "sha1-8CQBb1qI4Eb9EgBQVek5gC5sXyM=", 567 | "requires": { 568 | "esprima": "1.1.1", 569 | "estraverse": "1.5.1", 570 | "esutils": "1.0.0", 571 | "source-map": "0.1.43" 572 | } 573 | }, 574 | "escope": { 575 | "version": "3.6.0", 576 | "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", 577 | "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", 578 | "dev": true, 579 | "requires": { 580 | "es6-map": "0.1.5", 581 | "es6-weak-map": "2.0.2", 582 | "esrecurse": "4.2.0", 583 | "estraverse": "4.2.0" 584 | }, 585 | "dependencies": { 586 | "estraverse": { 587 | "version": "4.2.0", 588 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", 589 | "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", 590 | "dev": true 591 | } 592 | } 593 | }, 594 | "eslint": { 595 | "version": "3.18.0", 596 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.18.0.tgz", 597 | "integrity": "sha1-ZH6YXErnFQLSCsYsEJ9m1RBMiks=", 598 | "dev": true, 599 | "requires": { 600 | "babel-code-frame": "6.26.0", 601 | "chalk": "1.1.3", 602 | "concat-stream": "1.6.0", 603 | "debug": "2.6.9", 604 | "doctrine": "2.0.0", 605 | "escope": "3.6.0", 606 | "espree": "3.5.1", 607 | "esquery": "1.0.0", 608 | "estraverse": "4.2.0", 609 | "esutils": "2.0.2", 610 | "file-entry-cache": "2.0.0", 611 | "glob": "7.1.2", 612 | "globals": "9.18.0", 613 | "ignore": "3.3.7", 614 | "imurmurhash": "0.1.4", 615 | "inquirer": "0.12.0", 616 | "is-my-json-valid": "2.16.1", 617 | "is-resolvable": "1.0.0", 618 | "js-yaml": "3.10.0", 619 | "json-stable-stringify": "1.0.1", 620 | "levn": "0.3.0", 621 | "lodash": "4.17.4", 622 | "mkdirp": "0.5.1", 623 | "natural-compare": "1.4.0", 624 | "optionator": "0.8.2", 625 | "path-is-inside": "1.0.2", 626 | "pluralize": "1.2.1", 627 | "progress": "1.1.8", 628 | "require-uncached": "1.0.3", 629 | "shelljs": "0.7.8", 630 | "strip-bom": "3.0.0", 631 | "strip-json-comments": "2.0.1", 632 | "table": "3.8.3", 633 | "text-table": "0.2.0", 634 | "user-home": "2.0.0" 635 | }, 636 | "dependencies": { 637 | "estraverse": { 638 | "version": "4.2.0", 639 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", 640 | "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", 641 | "dev": true 642 | }, 643 | "esutils": { 644 | "version": "2.0.2", 645 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", 646 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", 647 | "dev": true 648 | } 649 | } 650 | }, 651 | "eslint-config-standard": { 652 | "version": "7.1.0", 653 | "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-7.1.0.tgz", 654 | "integrity": "sha1-R+dp6gc59bLVaTsaUBwhyWUPr88=", 655 | "dev": true 656 | }, 657 | "eslint-config-standard-jsx": { 658 | "version": "3.3.0", 659 | "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-3.3.0.tgz", 660 | "integrity": "sha1-yrCAGhWjYL9j+suXqyL73YjYpeA=", 661 | "dev": true 662 | }, 663 | "eslint-plugin-promise": { 664 | "version": "3.4.2", 665 | "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-3.4.2.tgz", 666 | "integrity": "sha1-G+J5Pq/i0YtbEjuBNsJp+AT+cSI=", 667 | "dev": true 668 | }, 669 | "eslint-plugin-react": { 670 | "version": "6.9.0", 671 | "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-6.9.0.tgz", 672 | "integrity": "sha1-VMLpkGt2+dEBQgML3DTp1oQKC7I=", 673 | "dev": true, 674 | "requires": { 675 | "array.prototype.find": "2.0.4", 676 | "doctrine": "1.5.0", 677 | "jsx-ast-utils": "1.4.1" 678 | }, 679 | "dependencies": { 680 | "doctrine": { 681 | "version": "1.5.0", 682 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", 683 | "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", 684 | "dev": true, 685 | "requires": { 686 | "esutils": "2.0.2", 687 | "isarray": "1.0.0" 688 | } 689 | }, 690 | "esutils": { 691 | "version": "2.0.2", 692 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", 693 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", 694 | "dev": true 695 | } 696 | } 697 | }, 698 | "eslint-plugin-standard": { 699 | "version": "2.0.1", 700 | "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-2.0.1.tgz", 701 | "integrity": "sha1-NYlpn/nJF/LCX3apFmh/ZBw2n/M=", 702 | "dev": true 703 | }, 704 | "espree": { 705 | "version": "3.5.1", 706 | "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.1.tgz", 707 | "integrity": "sha1-DJiLirRttTEAoZVK5LqZXd0n2H4=", 708 | "dev": true, 709 | "requires": { 710 | "acorn": "5.2.1", 711 | "acorn-jsx": "3.0.1" 712 | } 713 | }, 714 | "esprima": { 715 | "version": "1.1.1", 716 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.1.1.tgz", 717 | "integrity": "sha1-W28VR/TRAuZw4UDFCb5ncdautUk=" 718 | }, 719 | "esquery": { 720 | "version": "1.0.0", 721 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", 722 | "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", 723 | "dev": true, 724 | "requires": { 725 | "estraverse": "4.2.0" 726 | }, 727 | "dependencies": { 728 | "estraverse": { 729 | "version": "4.2.0", 730 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", 731 | "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", 732 | "dev": true 733 | } 734 | } 735 | }, 736 | "esrecurse": { 737 | "version": "4.2.0", 738 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", 739 | "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", 740 | "dev": true, 741 | "requires": { 742 | "estraverse": "4.2.0", 743 | "object-assign": "4.1.1" 744 | }, 745 | "dependencies": { 746 | "estraverse": { 747 | "version": "4.2.0", 748 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", 749 | "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", 750 | "dev": true 751 | } 752 | } 753 | }, 754 | "estraverse": { 755 | "version": "1.5.1", 756 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.5.1.tgz", 757 | "integrity": "sha1-hno+jlip+EYYr7bC3bzZFrfLr3E=" 758 | }, 759 | "esutils": { 760 | "version": "1.0.0", 761 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.0.0.tgz", 762 | "integrity": "sha1-gVHTWOIMisx/t0XnRywAJf5JZXA=" 763 | }, 764 | "event-emitter": { 765 | "version": "0.3.5", 766 | "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", 767 | "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", 768 | "dev": true, 769 | "requires": { 770 | "d": "1.0.0", 771 | "es5-ext": "0.10.35" 772 | } 773 | }, 774 | "exit-hook": { 775 | "version": "1.1.1", 776 | "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", 777 | "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", 778 | "dev": true 779 | }, 780 | "falafel": { 781 | "version": "2.1.0", 782 | "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.1.0.tgz", 783 | "integrity": "sha1-lrsXdh2rqU9G0AFzizzt86Z/4Gw=", 784 | "requires": { 785 | "acorn": "5.2.1", 786 | "foreach": "2.0.5", 787 | "isarray": "0.0.1", 788 | "object-keys": "1.0.11" 789 | }, 790 | "dependencies": { 791 | "isarray": { 792 | "version": "0.0.1", 793 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 794 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" 795 | } 796 | } 797 | }, 798 | "fast-levenshtein": { 799 | "version": "2.0.6", 800 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 801 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 802 | "dev": true 803 | }, 804 | "figures": { 805 | "version": "1.7.0", 806 | "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", 807 | "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", 808 | "dev": true, 809 | "requires": { 810 | "escape-string-regexp": "1.0.5", 811 | "object-assign": "4.1.1" 812 | } 813 | }, 814 | "file-entry-cache": { 815 | "version": "2.0.0", 816 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", 817 | "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", 818 | "dev": true, 819 | "requires": { 820 | "flat-cache": "1.3.0", 821 | "object-assign": "4.1.1" 822 | } 823 | }, 824 | "find-root": { 825 | "version": "1.1.0", 826 | "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", 827 | "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", 828 | "dev": true 829 | }, 830 | "find-up": { 831 | "version": "2.1.0", 832 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", 833 | "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", 834 | "dev": true, 835 | "requires": { 836 | "locate-path": "2.0.0" 837 | } 838 | }, 839 | "flat-cache": { 840 | "version": "1.3.0", 841 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", 842 | "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", 843 | "dev": true, 844 | "requires": { 845 | "circular-json": "0.3.3", 846 | "del": "2.2.2", 847 | "graceful-fs": "4.1.11", 848 | "write": "0.2.1" 849 | } 850 | }, 851 | "flat-tree": { 852 | "version": "1.6.0", 853 | "resolved": "https://registry.npmjs.org/flat-tree/-/flat-tree-1.6.0.tgz", 854 | "integrity": "sha1-/KMM3bkAb7ZW6168ea6ydOf96e0=", 855 | "dev": true 856 | }, 857 | "for-each": { 858 | "version": "0.3.2", 859 | "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.2.tgz", 860 | "integrity": "sha1-LEBFC5NI6X8oEyJZO6lnBLmr1NQ=", 861 | "dev": true, 862 | "requires": { 863 | "is-function": "1.0.1" 864 | } 865 | }, 866 | "foreach": { 867 | "version": "2.0.5", 868 | "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", 869 | "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" 870 | }, 871 | "from2": { 872 | "version": "2.3.0", 873 | "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", 874 | "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", 875 | "requires": { 876 | "inherits": "2.0.3", 877 | "readable-stream": "2.3.3" 878 | } 879 | }, 880 | "fs.realpath": { 881 | "version": "1.0.0", 882 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 883 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 884 | "dev": true 885 | }, 886 | "function-bind": { 887 | "version": "1.1.1", 888 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 889 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 890 | }, 891 | "generate-function": { 892 | "version": "2.0.0", 893 | "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", 894 | "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=" 895 | }, 896 | "generate-object-property": { 897 | "version": "1.2.0", 898 | "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", 899 | "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", 900 | "requires": { 901 | "is-property": "1.0.2" 902 | } 903 | }, 904 | "get-stdin": { 905 | "version": "5.0.1", 906 | "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", 907 | "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=", 908 | "dev": true 909 | }, 910 | "glob": { 911 | "version": "7.1.2", 912 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 913 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", 914 | "dev": true, 915 | "requires": { 916 | "fs.realpath": "1.0.0", 917 | "inflight": "1.0.6", 918 | "inherits": "2.0.3", 919 | "minimatch": "3.0.4", 920 | "once": "1.4.0", 921 | "path-is-absolute": "1.0.1" 922 | } 923 | }, 924 | "globals": { 925 | "version": "9.18.0", 926 | "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", 927 | "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", 928 | "dev": true 929 | }, 930 | "globby": { 931 | "version": "5.0.0", 932 | "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", 933 | "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", 934 | "dev": true, 935 | "requires": { 936 | "array-union": "1.0.2", 937 | "arrify": "1.0.1", 938 | "glob": "7.1.2", 939 | "object-assign": "4.1.1", 940 | "pify": "2.3.0", 941 | "pinkie-promise": "2.0.1" 942 | } 943 | }, 944 | "graceful-fs": { 945 | "version": "4.1.11", 946 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", 947 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", 948 | "dev": true 949 | }, 950 | "has": { 951 | "version": "1.0.1", 952 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", 953 | "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", 954 | "requires": { 955 | "function-bind": "1.1.1" 956 | } 957 | }, 958 | "has-ansi": { 959 | "version": "2.0.0", 960 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 961 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 962 | "dev": true, 963 | "requires": { 964 | "ansi-regex": "2.1.1" 965 | } 966 | }, 967 | "home-or-tmp": { 968 | "version": "2.0.0", 969 | "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", 970 | "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", 971 | "dev": true, 972 | "requires": { 973 | "os-homedir": "1.0.2", 974 | "os-tmpdir": "1.0.2" 975 | } 976 | }, 977 | "hypercore": { 978 | "version": "5.11.3", 979 | "resolved": "https://registry.npmjs.org/hypercore/-/hypercore-5.11.3.tgz", 980 | "integrity": "sha1-lpOKOc9vvSwtdURA+yp4ZSAUDpQ=", 981 | "dev": true, 982 | "requires": { 983 | "array-lru": "1.1.1", 984 | "atomic-batcher": "1.0.2", 985 | "bitfield-rle": "2.1.0", 986 | "buffer-equals": "1.0.4", 987 | "bulk-write-stream": "1.1.3", 988 | "codecs": "1.2.0", 989 | "flat-tree": "1.6.0", 990 | "from2": "2.3.0", 991 | "hypercore-protocol": "6.4.0", 992 | "inherits": "2.0.3", 993 | "last-one-wins": "1.0.4", 994 | "memory-pager": "1.1.0", 995 | "merkle-tree-stream": "3.0.3", 996 | "random-access-file": "1.8.1", 997 | "sodium-signatures": "2.1.0", 998 | "sodium-universal": "1.4.0", 999 | "sparse-bitfield": "3.0.3", 1000 | "thunky": "1.0.2", 1001 | "uint64be": "2.0.1", 1002 | "unordered-array-remove": "1.0.2", 1003 | "unordered-set": "2.0.0" 1004 | } 1005 | }, 1006 | "hypercore-protocol": { 1007 | "version": "6.4.0", 1008 | "resolved": "https://registry.npmjs.org/hypercore-protocol/-/hypercore-protocol-6.4.0.tgz", 1009 | "integrity": "sha1-iXpvoLeSa0iZXdp+A9qtB31jODg=", 1010 | "dev": true, 1011 | "requires": { 1012 | "brfs": "1.4.3", 1013 | "inherits": "2.0.3", 1014 | "protocol-buffers": "3.2.1", 1015 | "readable-stream": "2.3.3", 1016 | "sodium-universal": "1.4.0", 1017 | "sorted-indexof": "1.0.0", 1018 | "varint": "5.0.0" 1019 | } 1020 | }, 1021 | "ignore": { 1022 | "version": "3.3.7", 1023 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", 1024 | "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==", 1025 | "dev": true 1026 | }, 1027 | "imurmurhash": { 1028 | "version": "0.1.4", 1029 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1030 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 1031 | "dev": true 1032 | }, 1033 | "inflight": { 1034 | "version": "1.0.6", 1035 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1036 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1037 | "dev": true, 1038 | "requires": { 1039 | "once": "1.4.0", 1040 | "wrappy": "1.0.2" 1041 | } 1042 | }, 1043 | "inherits": { 1044 | "version": "2.0.3", 1045 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 1046 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 1047 | }, 1048 | "inquirer": { 1049 | "version": "0.12.0", 1050 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", 1051 | "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", 1052 | "dev": true, 1053 | "requires": { 1054 | "ansi-escapes": "1.4.0", 1055 | "ansi-regex": "2.1.1", 1056 | "chalk": "1.1.3", 1057 | "cli-cursor": "1.0.2", 1058 | "cli-width": "2.2.0", 1059 | "figures": "1.7.0", 1060 | "lodash": "4.17.4", 1061 | "readline2": "1.0.1", 1062 | "run-async": "0.1.0", 1063 | "rx-lite": "3.1.2", 1064 | "string-width": "1.0.2", 1065 | "strip-ansi": "3.0.1", 1066 | "through": "2.3.8" 1067 | } 1068 | }, 1069 | "interpret": { 1070 | "version": "1.0.4", 1071 | "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.4.tgz", 1072 | "integrity": "sha1-ggzdWIuGj/sZGoCVBtbJyPISsbA=", 1073 | "dev": true 1074 | }, 1075 | "is-arrayish": { 1076 | "version": "0.2.1", 1077 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 1078 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", 1079 | "dev": true 1080 | }, 1081 | "is-callable": { 1082 | "version": "1.1.3", 1083 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", 1084 | "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", 1085 | "dev": true 1086 | }, 1087 | "is-date-object": { 1088 | "version": "1.0.1", 1089 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", 1090 | "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", 1091 | "dev": true 1092 | }, 1093 | "is-fullwidth-code-point": { 1094 | "version": "1.0.0", 1095 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 1096 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 1097 | "dev": true, 1098 | "requires": { 1099 | "number-is-nan": "1.0.1" 1100 | } 1101 | }, 1102 | "is-function": { 1103 | "version": "1.0.1", 1104 | "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.1.tgz", 1105 | "integrity": "sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU=", 1106 | "dev": true 1107 | }, 1108 | "is-my-json-valid": { 1109 | "version": "2.16.1", 1110 | "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz", 1111 | "integrity": "sha512-ochPsqWS1WXj8ZnMIV0vnNXooaMhp7cyL4FMSIPKTtnV0Ha/T19G2b9kkhcNsabV9bxYkze7/aLZJb/bYuFduQ==", 1112 | "dev": true, 1113 | "requires": { 1114 | "generate-function": "2.0.0", 1115 | "generate-object-property": "1.2.0", 1116 | "jsonpointer": "4.0.1", 1117 | "xtend": "4.0.1" 1118 | } 1119 | }, 1120 | "is-path-cwd": { 1121 | "version": "1.0.0", 1122 | "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", 1123 | "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", 1124 | "dev": true 1125 | }, 1126 | "is-path-in-cwd": { 1127 | "version": "1.0.0", 1128 | "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", 1129 | "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", 1130 | "dev": true, 1131 | "requires": { 1132 | "is-path-inside": "1.0.0" 1133 | } 1134 | }, 1135 | "is-path-inside": { 1136 | "version": "1.0.0", 1137 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", 1138 | "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", 1139 | "dev": true, 1140 | "requires": { 1141 | "path-is-inside": "1.0.2" 1142 | } 1143 | }, 1144 | "is-property": { 1145 | "version": "1.0.2", 1146 | "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", 1147 | "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" 1148 | }, 1149 | "is-regex": { 1150 | "version": "1.0.4", 1151 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", 1152 | "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", 1153 | "dev": true, 1154 | "requires": { 1155 | "has": "1.0.1" 1156 | } 1157 | }, 1158 | "is-resolvable": { 1159 | "version": "1.0.0", 1160 | "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz", 1161 | "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=", 1162 | "dev": true, 1163 | "requires": { 1164 | "tryit": "1.0.3" 1165 | } 1166 | }, 1167 | "is-symbol": { 1168 | "version": "1.0.1", 1169 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", 1170 | "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", 1171 | "dev": true 1172 | }, 1173 | "isarray": { 1174 | "version": "1.0.0", 1175 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1176 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 1177 | }, 1178 | "js-tokens": { 1179 | "version": "3.0.2", 1180 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", 1181 | "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", 1182 | "dev": true 1183 | }, 1184 | "js-yaml": { 1185 | "version": "3.10.0", 1186 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", 1187 | "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", 1188 | "dev": true, 1189 | "requires": { 1190 | "argparse": "1.0.9", 1191 | "esprima": "4.0.0" 1192 | }, 1193 | "dependencies": { 1194 | "esprima": { 1195 | "version": "4.0.0", 1196 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", 1197 | "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", 1198 | "dev": true 1199 | } 1200 | } 1201 | }, 1202 | "json-stable-stringify": { 1203 | "version": "1.0.1", 1204 | "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", 1205 | "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", 1206 | "dev": true, 1207 | "requires": { 1208 | "jsonify": "0.0.0" 1209 | } 1210 | }, 1211 | "jsonify": { 1212 | "version": "0.0.0", 1213 | "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", 1214 | "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", 1215 | "dev": true 1216 | }, 1217 | "jsonpointer": { 1218 | "version": "4.0.1", 1219 | "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", 1220 | "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", 1221 | "dev": true 1222 | }, 1223 | "jsx-ast-utils": { 1224 | "version": "1.4.1", 1225 | "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz", 1226 | "integrity": "sha1-OGchPo3Xm/Ho8jAMDPwe+xgsDfE=", 1227 | "dev": true 1228 | }, 1229 | "last-one-wins": { 1230 | "version": "1.0.4", 1231 | "resolved": "https://registry.npmjs.org/last-one-wins/-/last-one-wins-1.0.4.tgz", 1232 | "integrity": "sha1-wb/Qy8tGeQ7JFWuNGu6Py4bNoio=", 1233 | "dev": true 1234 | }, 1235 | "levn": { 1236 | "version": "0.3.0", 1237 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 1238 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 1239 | "dev": true, 1240 | "requires": { 1241 | "prelude-ls": "1.1.2", 1242 | "type-check": "0.3.2" 1243 | } 1244 | }, 1245 | "load-json-file": { 1246 | "version": "2.0.0", 1247 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", 1248 | "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", 1249 | "dev": true, 1250 | "requires": { 1251 | "graceful-fs": "4.1.11", 1252 | "parse-json": "2.2.0", 1253 | "pify": "2.3.0", 1254 | "strip-bom": "3.0.0" 1255 | } 1256 | }, 1257 | "locate-path": { 1258 | "version": "2.0.0", 1259 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", 1260 | "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", 1261 | "dev": true, 1262 | "requires": { 1263 | "p-locate": "2.0.0", 1264 | "path-exists": "3.0.0" 1265 | } 1266 | }, 1267 | "lodash": { 1268 | "version": "4.17.4", 1269 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", 1270 | "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", 1271 | "dev": true 1272 | }, 1273 | "memory-pager": { 1274 | "version": "1.1.0", 1275 | "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.1.0.tgz", 1276 | "integrity": "sha512-Mf9OHV/Y7h6YWDxTzX/b4ZZ4oh9NSXblQL8dtPCOomOtZciEHxePR78+uHFLLlsk01A6jVHhHsQZZ/WcIPpnzg==", 1277 | "dev": true 1278 | }, 1279 | "merkle-tree-stream": { 1280 | "version": "3.0.3", 1281 | "resolved": "https://registry.npmjs.org/merkle-tree-stream/-/merkle-tree-stream-3.0.3.tgz", 1282 | "integrity": "sha1-+KBkdg0355eK1fn208EZpJT1cIE=", 1283 | "dev": true, 1284 | "requires": { 1285 | "flat-tree": "1.6.0", 1286 | "readable-stream": "2.3.3" 1287 | } 1288 | }, 1289 | "minimatch": { 1290 | "version": "3.0.4", 1291 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1292 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1293 | "dev": true, 1294 | "requires": { 1295 | "brace-expansion": "1.1.8" 1296 | } 1297 | }, 1298 | "minimist": { 1299 | "version": "1.2.0", 1300 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 1301 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" 1302 | }, 1303 | "mkdirp": { 1304 | "version": "0.5.1", 1305 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 1306 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 1307 | "dev": true, 1308 | "requires": { 1309 | "minimist": "0.0.8" 1310 | }, 1311 | "dependencies": { 1312 | "minimist": { 1313 | "version": "0.0.8", 1314 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 1315 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 1316 | "dev": true 1317 | } 1318 | } 1319 | }, 1320 | "ms": { 1321 | "version": "2.0.0", 1322 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1323 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 1324 | "dev": true 1325 | }, 1326 | "mute-stream": { 1327 | "version": "0.0.5", 1328 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", 1329 | "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", 1330 | "dev": true 1331 | }, 1332 | "mutexify": { 1333 | "version": "1.2.0", 1334 | "resolved": "https://registry.npmjs.org/mutexify/-/mutexify-1.2.0.tgz", 1335 | "integrity": "sha512-oprzxd2zhfrJqEuB98qc1dRMMonClBQ57UPDjnbcrah4orEMTq1jq3+AcdFe5ePzdbJXI7zmdhfftIdMnhYFoQ==" 1336 | }, 1337 | "nan": { 1338 | "version": "2.7.0", 1339 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.7.0.tgz", 1340 | "integrity": "sha1-2Vv3IeyHfgjbJ27T/G63j5CDrUY=", 1341 | "dev": true, 1342 | "optional": true 1343 | }, 1344 | "nanoassert": { 1345 | "version": "1.1.0", 1346 | "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-1.1.0.tgz", 1347 | "integrity": "sha1-TzFS4JVA/eKMdvRLGbvNHVpCR40=", 1348 | "dev": true 1349 | }, 1350 | "natural-compare": { 1351 | "version": "1.4.0", 1352 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1353 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 1354 | "dev": true 1355 | }, 1356 | "node-gyp-build": { 1357 | "version": "3.2.2", 1358 | "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-3.2.2.tgz", 1359 | "integrity": "sha512-t8W/0UqFGl1c+5ORA3NoT3npU+PxWBL9iPhY7ZySSTszodj3RWexmu8niayWBE0v+0DLARvOXsjaAvfmSEQOyQ==", 1360 | "dev": true, 1361 | "optional": true 1362 | }, 1363 | "number-is-nan": { 1364 | "version": "1.0.1", 1365 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 1366 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", 1367 | "dev": true 1368 | }, 1369 | "object-assign": { 1370 | "version": "4.1.1", 1371 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1372 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 1373 | "dev": true 1374 | }, 1375 | "object-inspect": { 1376 | "version": "0.4.0", 1377 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-0.4.0.tgz", 1378 | "integrity": "sha1-9RV8EWwUVbJDsG7pdwM5LFrYn+w=" 1379 | }, 1380 | "object-keys": { 1381 | "version": "1.0.11", 1382 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", 1383 | "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=" 1384 | }, 1385 | "once": { 1386 | "version": "1.4.0", 1387 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1388 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1389 | "dev": true, 1390 | "requires": { 1391 | "wrappy": "1.0.2" 1392 | } 1393 | }, 1394 | "onetime": { 1395 | "version": "1.1.0", 1396 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", 1397 | "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", 1398 | "dev": true 1399 | }, 1400 | "optionator": { 1401 | "version": "0.8.2", 1402 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", 1403 | "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", 1404 | "dev": true, 1405 | "requires": { 1406 | "deep-is": "0.1.3", 1407 | "fast-levenshtein": "2.0.6", 1408 | "levn": "0.3.0", 1409 | "prelude-ls": "1.1.2", 1410 | "type-check": "0.3.2", 1411 | "wordwrap": "1.0.0" 1412 | } 1413 | }, 1414 | "os-homedir": { 1415 | "version": "1.0.2", 1416 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", 1417 | "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", 1418 | "dev": true 1419 | }, 1420 | "os-tmpdir": { 1421 | "version": "1.0.2", 1422 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 1423 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 1424 | "dev": true 1425 | }, 1426 | "p-limit": { 1427 | "version": "1.1.0", 1428 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz", 1429 | "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=", 1430 | "dev": true 1431 | }, 1432 | "p-locate": { 1433 | "version": "2.0.0", 1434 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", 1435 | "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", 1436 | "dev": true, 1437 | "requires": { 1438 | "p-limit": "1.1.0" 1439 | } 1440 | }, 1441 | "parse-json": { 1442 | "version": "2.2.0", 1443 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", 1444 | "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", 1445 | "dev": true, 1446 | "requires": { 1447 | "error-ex": "1.3.1" 1448 | } 1449 | }, 1450 | "path-exists": { 1451 | "version": "3.0.0", 1452 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 1453 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", 1454 | "dev": true 1455 | }, 1456 | "path-is-absolute": { 1457 | "version": "1.0.1", 1458 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1459 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1460 | "dev": true 1461 | }, 1462 | "path-is-inside": { 1463 | "version": "1.0.2", 1464 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", 1465 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", 1466 | "dev": true 1467 | }, 1468 | "path-parse": { 1469 | "version": "1.0.5", 1470 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", 1471 | "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" 1472 | }, 1473 | "pify": { 1474 | "version": "2.3.0", 1475 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 1476 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", 1477 | "dev": true 1478 | }, 1479 | "pinkie": { 1480 | "version": "2.0.4", 1481 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", 1482 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", 1483 | "dev": true 1484 | }, 1485 | "pinkie-promise": { 1486 | "version": "2.0.1", 1487 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", 1488 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", 1489 | "dev": true, 1490 | "requires": { 1491 | "pinkie": "2.0.4" 1492 | } 1493 | }, 1494 | "pkg-conf": { 1495 | "version": "2.0.0", 1496 | "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.0.0.tgz", 1497 | "integrity": "sha1-BxyHZQQDvM+5xif1h1G/5HwGcnk=", 1498 | "dev": true, 1499 | "requires": { 1500 | "find-up": "2.1.0", 1501 | "load-json-file": "2.0.0" 1502 | } 1503 | }, 1504 | "pkg-config": { 1505 | "version": "1.1.1", 1506 | "resolved": "https://registry.npmjs.org/pkg-config/-/pkg-config-1.1.1.tgz", 1507 | "integrity": "sha1-VX7yLXPaPIg3EHdmxS6tq94pj+Q=", 1508 | "dev": true, 1509 | "requires": { 1510 | "debug-log": "1.0.1", 1511 | "find-root": "1.1.0", 1512 | "xtend": "4.0.1" 1513 | } 1514 | }, 1515 | "pluralize": { 1516 | "version": "1.2.1", 1517 | "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", 1518 | "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", 1519 | "dev": true 1520 | }, 1521 | "prelude-ls": { 1522 | "version": "1.1.2", 1523 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 1524 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", 1525 | "dev": true 1526 | }, 1527 | "process-nextick-args": { 1528 | "version": "1.0.7", 1529 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", 1530 | "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" 1531 | }, 1532 | "progress": { 1533 | "version": "1.1.8", 1534 | "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", 1535 | "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", 1536 | "dev": true 1537 | }, 1538 | "protocol-buffers": { 1539 | "version": "3.2.1", 1540 | "resolved": "https://registry.npmjs.org/protocol-buffers/-/protocol-buffers-3.2.1.tgz", 1541 | "integrity": "sha1-NyWOF+JKCC8G67F3MekoUdHHaIk=", 1542 | "requires": { 1543 | "brfs": "1.4.3", 1544 | "generate-function": "2.0.0", 1545 | "generate-object-property": "1.2.0", 1546 | "protocol-buffers-schema": "3.3.2", 1547 | "signed-varint": "2.0.1", 1548 | "varint": "5.0.0" 1549 | } 1550 | }, 1551 | "protocol-buffers-schema": { 1552 | "version": "3.3.2", 1553 | "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.3.2.tgz", 1554 | "integrity": "sha512-Xdayp8sB/mU+sUV4G7ws8xtYMGdQnxbeIfLjyO9TZZRJdztBGhlmbI5x1qcY4TG5hBkIKGnc28i7nXxaugu88w==" 1555 | }, 1556 | "quote-stream": { 1557 | "version": "1.0.2", 1558 | "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-1.0.2.tgz", 1559 | "integrity": "sha1-hJY/jJwmuULhU/7rU6rnRlK34LI=", 1560 | "requires": { 1561 | "buffer-equal": "0.0.1", 1562 | "minimist": "1.2.0", 1563 | "through2": "2.0.3" 1564 | } 1565 | }, 1566 | "random-access-file": { 1567 | "version": "1.8.1", 1568 | "resolved": "https://registry.npmjs.org/random-access-file/-/random-access-file-1.8.1.tgz", 1569 | "integrity": "sha512-+Uhk0Of+dWHWjpbL2hizcwSV1UomcN3S0iUGV6BTZ2Js1BP9jHx3E5CT7y0eLbqTQNkVi4iehkHmia7Mdqa47w==", 1570 | "dev": true, 1571 | "requires": { 1572 | "buffer-alloc-unsafe": "1.0.0", 1573 | "debug": "2.6.9", 1574 | "inherits": "2.0.3", 1575 | "mkdirp": "0.5.1", 1576 | "thunky": "1.0.2" 1577 | } 1578 | }, 1579 | "random-access-memory": { 1580 | "version": "2.4.0", 1581 | "resolved": "https://registry.npmjs.org/random-access-memory/-/random-access-memory-2.4.0.tgz", 1582 | "integrity": "sha1-cvPYZbS1WiWYeUc+L7LeNWnGnuI=", 1583 | "dev": true, 1584 | "requires": { 1585 | "process-nextick-args": "1.0.7" 1586 | } 1587 | }, 1588 | "readable-stream": { 1589 | "version": "2.3.3", 1590 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", 1591 | "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", 1592 | "requires": { 1593 | "core-util-is": "1.0.2", 1594 | "inherits": "2.0.3", 1595 | "isarray": "1.0.0", 1596 | "process-nextick-args": "1.0.7", 1597 | "safe-buffer": "5.1.1", 1598 | "string_decoder": "1.0.3", 1599 | "util-deprecate": "1.0.2" 1600 | } 1601 | }, 1602 | "readline2": { 1603 | "version": "1.0.1", 1604 | "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", 1605 | "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", 1606 | "dev": true, 1607 | "requires": { 1608 | "code-point-at": "1.1.0", 1609 | "is-fullwidth-code-point": "1.0.0", 1610 | "mute-stream": "0.0.5" 1611 | } 1612 | }, 1613 | "rechoir": { 1614 | "version": "0.6.2", 1615 | "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", 1616 | "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", 1617 | "dev": true, 1618 | "requires": { 1619 | "resolve": "1.5.0" 1620 | } 1621 | }, 1622 | "require-uncached": { 1623 | "version": "1.0.3", 1624 | "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", 1625 | "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", 1626 | "dev": true, 1627 | "requires": { 1628 | "caller-path": "0.1.0", 1629 | "resolve-from": "1.0.1" 1630 | } 1631 | }, 1632 | "resolve": { 1633 | "version": "1.5.0", 1634 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", 1635 | "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", 1636 | "requires": { 1637 | "path-parse": "1.0.5" 1638 | } 1639 | }, 1640 | "resolve-from": { 1641 | "version": "1.0.1", 1642 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", 1643 | "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", 1644 | "dev": true 1645 | }, 1646 | "restore-cursor": { 1647 | "version": "1.0.1", 1648 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", 1649 | "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", 1650 | "dev": true, 1651 | "requires": { 1652 | "exit-hook": "1.1.1", 1653 | "onetime": "1.1.0" 1654 | } 1655 | }, 1656 | "resumer": { 1657 | "version": "0.0.0", 1658 | "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", 1659 | "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=", 1660 | "dev": true, 1661 | "requires": { 1662 | "through": "2.3.8" 1663 | } 1664 | }, 1665 | "rimraf": { 1666 | "version": "2.6.2", 1667 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", 1668 | "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", 1669 | "dev": true, 1670 | "requires": { 1671 | "glob": "7.1.2" 1672 | } 1673 | }, 1674 | "run-async": { 1675 | "version": "0.1.0", 1676 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", 1677 | "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", 1678 | "dev": true, 1679 | "requires": { 1680 | "once": "1.4.0" 1681 | } 1682 | }, 1683 | "run-parallel": { 1684 | "version": "1.1.6", 1685 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.6.tgz", 1686 | "integrity": "sha1-KQA8miFj4B4tLfyQV18sbB1hoDk=", 1687 | "dev": true 1688 | }, 1689 | "rx-lite": { 1690 | "version": "3.1.2", 1691 | "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", 1692 | "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", 1693 | "dev": true 1694 | }, 1695 | "safe-buffer": { 1696 | "version": "5.1.1", 1697 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", 1698 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" 1699 | }, 1700 | "shallow-copy": { 1701 | "version": "0.0.1", 1702 | "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", 1703 | "integrity": "sha1-QV9CcC1z2BAzApLMXuhurhoRoXA=" 1704 | }, 1705 | "shelljs": { 1706 | "version": "0.7.8", 1707 | "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", 1708 | "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", 1709 | "dev": true, 1710 | "requires": { 1711 | "glob": "7.1.2", 1712 | "interpret": "1.0.4", 1713 | "rechoir": "0.6.2" 1714 | } 1715 | }, 1716 | "signed-varint": { 1717 | "version": "2.0.1", 1718 | "resolved": "https://registry.npmjs.org/signed-varint/-/signed-varint-2.0.1.tgz", 1719 | "integrity": "sha1-UKmYnafJjCxh2tEZvJdHDvhSgSk=", 1720 | "requires": { 1721 | "varint": "5.0.0" 1722 | } 1723 | }, 1724 | "siphash24": { 1725 | "version": "1.0.2", 1726 | "resolved": "https://registry.npmjs.org/siphash24/-/siphash24-1.0.2.tgz", 1727 | "integrity": "sha512-/yUF5S4+z46QxpT/mW/wdlsQQTdO1yl3H36aql6u2m3Ve6u9iATS+yHN+rMXr4jm1qQ0wJUDK2ofdkZeQjMmig==", 1728 | "dev": true, 1729 | "requires": { 1730 | "base64-to-uint8array": "1.0.0", 1731 | "brfs": "1.4.3", 1732 | "nanoassert": "1.1.0" 1733 | } 1734 | }, 1735 | "slice-ansi": { 1736 | "version": "0.0.4", 1737 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", 1738 | "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", 1739 | "dev": true 1740 | }, 1741 | "sodium-javascript": { 1742 | "version": "0.5.2", 1743 | "resolved": "https://registry.npmjs.org/sodium-javascript/-/sodium-javascript-0.5.2.tgz", 1744 | "integrity": "sha1-NjWUWzoGHt9nwelUxBj49UCTi8Q=", 1745 | "dev": true, 1746 | "requires": { 1747 | "blake2b": "2.1.2", 1748 | "nanoassert": "1.1.0", 1749 | "siphash24": "1.0.2", 1750 | "xsalsa20": "1.0.2" 1751 | } 1752 | }, 1753 | "sodium-native": { 1754 | "version": "1.10.3", 1755 | "resolved": "https://registry.npmjs.org/sodium-native/-/sodium-native-1.10.3.tgz", 1756 | "integrity": "sha512-FIeYaG5cc0YZjsAaWP/BCXDNO2xusbtDJbCbEvXrf6/6+dRo/8XCiEG0kwlRcR0wr56sgsZ327BId3ifFe2WYw==", 1757 | "dev": true, 1758 | "optional": true, 1759 | "requires": { 1760 | "nan": "2.7.0", 1761 | "node-gyp-build": "3.2.2" 1762 | } 1763 | }, 1764 | "sodium-signatures": { 1765 | "version": "2.1.0", 1766 | "resolved": "https://registry.npmjs.org/sodium-signatures/-/sodium-signatures-2.1.0.tgz", 1767 | "integrity": "sha512-kNTta6Nyc5VR8OHvLHGpjTvdBfTz9+yC+fJBvrdPOquKgyYAE0tfvxoL286uIkHbP/IkdDjiiMbhjsDqUrRMbw==", 1768 | "dev": true, 1769 | "requires": { 1770 | "sodium-universal": "1.4.0" 1771 | } 1772 | }, 1773 | "sodium-universal": { 1774 | "version": "1.4.0", 1775 | "resolved": "https://registry.npmjs.org/sodium-universal/-/sodium-universal-1.4.0.tgz", 1776 | "integrity": "sha512-hMQ4uoqoyUES9Q8CAeUFYcc2ODq72cq+riSTO+XsuZZjYDTvKlvFIK+v/wMTbv5woa/omMwFvsxib5gVz0qEXg==", 1777 | "dev": true, 1778 | "requires": { 1779 | "sodium-javascript": "0.5.2", 1780 | "sodium-native": "1.10.3" 1781 | } 1782 | }, 1783 | "sorted-indexof": { 1784 | "version": "1.0.0", 1785 | "resolved": "https://registry.npmjs.org/sorted-indexof/-/sorted-indexof-1.0.0.tgz", 1786 | "integrity": "sha1-F8dC/3zxh+L1mhXfm4HxemLOCJk=", 1787 | "dev": true 1788 | }, 1789 | "source-map": { 1790 | "version": "0.1.43", 1791 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", 1792 | "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", 1793 | "optional": true, 1794 | "requires": { 1795 | "amdefine": "1.0.1" 1796 | } 1797 | }, 1798 | "sparse-bitfield": { 1799 | "version": "3.0.3", 1800 | "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", 1801 | "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", 1802 | "dev": true, 1803 | "requires": { 1804 | "memory-pager": "1.1.0" 1805 | } 1806 | }, 1807 | "sprintf-js": { 1808 | "version": "1.0.3", 1809 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 1810 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 1811 | "dev": true 1812 | }, 1813 | "standard": { 1814 | "version": "9.0.2", 1815 | "resolved": "https://registry.npmjs.org/standard/-/standard-9.0.2.tgz", 1816 | "integrity": "sha1-m9O5RnSS4hKxkU14VTlD/5tI/Zk=", 1817 | "dev": true, 1818 | "requires": { 1819 | "eslint": "3.18.0", 1820 | "eslint-config-standard": "7.1.0", 1821 | "eslint-config-standard-jsx": "3.3.0", 1822 | "eslint-plugin-promise": "3.4.2", 1823 | "eslint-plugin-react": "6.9.0", 1824 | "eslint-plugin-standard": "2.0.1", 1825 | "standard-engine": "5.4.0" 1826 | } 1827 | }, 1828 | "standard-engine": { 1829 | "version": "5.4.0", 1830 | "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-5.4.0.tgz", 1831 | "integrity": "sha1-4OhpWeoHhkJdM4PkDBv3DS+YVXk=", 1832 | "dev": true, 1833 | "requires": { 1834 | "deglob": "2.1.0", 1835 | "get-stdin": "5.0.1", 1836 | "home-or-tmp": "2.0.0", 1837 | "minimist": "1.2.0", 1838 | "pkg-conf": "2.0.0" 1839 | } 1840 | }, 1841 | "static-eval": { 1842 | "version": "0.2.4", 1843 | "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-0.2.4.tgz", 1844 | "integrity": "sha1-t9NNg4k3uWn5ZBygfUj47eJj6ns=", 1845 | "requires": { 1846 | "escodegen": "0.0.28" 1847 | }, 1848 | "dependencies": { 1849 | "escodegen": { 1850 | "version": "0.0.28", 1851 | "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-0.0.28.tgz", 1852 | "integrity": "sha1-Dk/xcV8yh3XWyrUaxEpAbNer/9M=", 1853 | "requires": { 1854 | "esprima": "1.0.4", 1855 | "estraverse": "1.3.2", 1856 | "source-map": "0.1.43" 1857 | } 1858 | }, 1859 | "esprima": { 1860 | "version": "1.0.4", 1861 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", 1862 | "integrity": "sha1-n1V+CPw7TSbs6d00+Pv0drYlha0=" 1863 | }, 1864 | "estraverse": { 1865 | "version": "1.3.2", 1866 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.3.2.tgz", 1867 | "integrity": "sha1-N8K4k+8T1yPydth41g2FNRUqbEI=" 1868 | } 1869 | } 1870 | }, 1871 | "static-module": { 1872 | "version": "1.5.0", 1873 | "resolved": "https://registry.npmjs.org/static-module/-/static-module-1.5.0.tgz", 1874 | "integrity": "sha1-J9qYg8QajNCSNvhC8MHrxu32PYY=", 1875 | "requires": { 1876 | "concat-stream": "1.6.0", 1877 | "duplexer2": "0.0.2", 1878 | "escodegen": "1.3.3", 1879 | "falafel": "2.1.0", 1880 | "has": "1.0.1", 1881 | "object-inspect": "0.4.0", 1882 | "quote-stream": "0.0.0", 1883 | "readable-stream": "1.0.34", 1884 | "shallow-copy": "0.0.1", 1885 | "static-eval": "0.2.4", 1886 | "through2": "0.4.2" 1887 | }, 1888 | "dependencies": { 1889 | "isarray": { 1890 | "version": "0.0.1", 1891 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 1892 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" 1893 | }, 1894 | "minimist": { 1895 | "version": "0.0.8", 1896 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 1897 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" 1898 | }, 1899 | "object-keys": { 1900 | "version": "0.4.0", 1901 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", 1902 | "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=" 1903 | }, 1904 | "quote-stream": { 1905 | "version": "0.0.0", 1906 | "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-0.0.0.tgz", 1907 | "integrity": "sha1-zeKelMQJsW4Z3HCYuJtmWPlyHTs=", 1908 | "requires": { 1909 | "minimist": "0.0.8", 1910 | "through2": "0.4.2" 1911 | } 1912 | }, 1913 | "readable-stream": { 1914 | "version": "1.0.34", 1915 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", 1916 | "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", 1917 | "requires": { 1918 | "core-util-is": "1.0.2", 1919 | "inherits": "2.0.3", 1920 | "isarray": "0.0.1", 1921 | "string_decoder": "0.10.31" 1922 | } 1923 | }, 1924 | "string_decoder": { 1925 | "version": "0.10.31", 1926 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 1927 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" 1928 | }, 1929 | "through2": { 1930 | "version": "0.4.2", 1931 | "resolved": "https://registry.npmjs.org/through2/-/through2-0.4.2.tgz", 1932 | "integrity": "sha1-2/WGYDEVHsg1K7bE22SiKSqEC5s=", 1933 | "requires": { 1934 | "readable-stream": "1.0.34", 1935 | "xtend": "2.1.2" 1936 | } 1937 | }, 1938 | "xtend": { 1939 | "version": "2.1.2", 1940 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", 1941 | "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", 1942 | "requires": { 1943 | "object-keys": "0.4.0" 1944 | } 1945 | } 1946 | } 1947 | }, 1948 | "string_decoder": { 1949 | "version": "1.0.3", 1950 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", 1951 | "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", 1952 | "requires": { 1953 | "safe-buffer": "5.1.1" 1954 | } 1955 | }, 1956 | "string-width": { 1957 | "version": "1.0.2", 1958 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 1959 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 1960 | "dev": true, 1961 | "requires": { 1962 | "code-point-at": "1.1.0", 1963 | "is-fullwidth-code-point": "1.0.0", 1964 | "strip-ansi": "3.0.1" 1965 | } 1966 | }, 1967 | "string.prototype.trim": { 1968 | "version": "1.1.2", 1969 | "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz", 1970 | "integrity": "sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo=", 1971 | "dev": true, 1972 | "requires": { 1973 | "define-properties": "1.1.2", 1974 | "es-abstract": "1.9.0", 1975 | "function-bind": "1.1.1" 1976 | } 1977 | }, 1978 | "strip-ansi": { 1979 | "version": "3.0.1", 1980 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 1981 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 1982 | "dev": true, 1983 | "requires": { 1984 | "ansi-regex": "2.1.1" 1985 | } 1986 | }, 1987 | "strip-bom": { 1988 | "version": "3.0.0", 1989 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", 1990 | "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", 1991 | "dev": true 1992 | }, 1993 | "strip-json-comments": { 1994 | "version": "2.0.1", 1995 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 1996 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 1997 | "dev": true 1998 | }, 1999 | "supports-color": { 2000 | "version": "2.0.0", 2001 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 2002 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 2003 | "dev": true 2004 | }, 2005 | "table": { 2006 | "version": "3.8.3", 2007 | "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", 2008 | "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", 2009 | "dev": true, 2010 | "requires": { 2011 | "ajv": "4.11.8", 2012 | "ajv-keywords": "1.5.1", 2013 | "chalk": "1.1.3", 2014 | "lodash": "4.17.4", 2015 | "slice-ansi": "0.0.4", 2016 | "string-width": "2.1.1" 2017 | }, 2018 | "dependencies": { 2019 | "ansi-regex": { 2020 | "version": "3.0.0", 2021 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 2022 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 2023 | "dev": true 2024 | }, 2025 | "is-fullwidth-code-point": { 2026 | "version": "2.0.0", 2027 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 2028 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 2029 | "dev": true 2030 | }, 2031 | "string-width": { 2032 | "version": "2.1.1", 2033 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 2034 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 2035 | "dev": true, 2036 | "requires": { 2037 | "is-fullwidth-code-point": "2.0.0", 2038 | "strip-ansi": "4.0.0" 2039 | } 2040 | }, 2041 | "strip-ansi": { 2042 | "version": "4.0.0", 2043 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 2044 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 2045 | "dev": true, 2046 | "requires": { 2047 | "ansi-regex": "3.0.0" 2048 | } 2049 | } 2050 | } 2051 | }, 2052 | "tape": { 2053 | "version": "4.8.0", 2054 | "resolved": "https://registry.npmjs.org/tape/-/tape-4.8.0.tgz", 2055 | "integrity": "sha512-TWILfEnvO7I8mFe35d98F6T5fbLaEtbFTG/lxWvid8qDfFTxt19EBijWmB4j3+Hoh5TfHE2faWs73ua+EphuBA==", 2056 | "dev": true, 2057 | "requires": { 2058 | "deep-equal": "1.0.1", 2059 | "defined": "1.0.0", 2060 | "for-each": "0.3.2", 2061 | "function-bind": "1.1.1", 2062 | "glob": "7.1.2", 2063 | "has": "1.0.1", 2064 | "inherits": "2.0.3", 2065 | "minimist": "1.2.0", 2066 | "object-inspect": "1.3.0", 2067 | "resolve": "1.4.0", 2068 | "resumer": "0.0.0", 2069 | "string.prototype.trim": "1.1.2", 2070 | "through": "2.3.8" 2071 | }, 2072 | "dependencies": { 2073 | "object-inspect": { 2074 | "version": "1.3.0", 2075 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.3.0.tgz", 2076 | "integrity": "sha512-OHHnLgLNXpM++GnJRyyhbr2bwl3pPVm4YvaraHrRvDt/N3r+s/gDVHciA7EJBTkijKXj61ssgSAikq1fb0IBRg==", 2077 | "dev": true 2078 | }, 2079 | "resolve": { 2080 | "version": "1.4.0", 2081 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", 2082 | "integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==", 2083 | "dev": true, 2084 | "requires": { 2085 | "path-parse": "1.0.5" 2086 | } 2087 | } 2088 | } 2089 | }, 2090 | "text-table": { 2091 | "version": "0.2.0", 2092 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 2093 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 2094 | "dev": true 2095 | }, 2096 | "through": { 2097 | "version": "2.3.8", 2098 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 2099 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 2100 | "dev": true 2101 | }, 2102 | "through2": { 2103 | "version": "2.0.3", 2104 | "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", 2105 | "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", 2106 | "requires": { 2107 | "readable-stream": "2.3.3", 2108 | "xtend": "4.0.1" 2109 | } 2110 | }, 2111 | "thunky": { 2112 | "version": "1.0.2", 2113 | "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.2.tgz", 2114 | "integrity": "sha1-qGLgGOP7HqLsP85dVWBc9X8kc3E=", 2115 | "dev": true 2116 | }, 2117 | "tryit": { 2118 | "version": "1.0.3", 2119 | "resolved": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", 2120 | "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=", 2121 | "dev": true 2122 | }, 2123 | "type-check": { 2124 | "version": "0.3.2", 2125 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 2126 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 2127 | "dev": true, 2128 | "requires": { 2129 | "prelude-ls": "1.1.2" 2130 | } 2131 | }, 2132 | "typedarray": { 2133 | "version": "0.0.6", 2134 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 2135 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" 2136 | }, 2137 | "uint64be": { 2138 | "version": "2.0.1", 2139 | "resolved": "https://registry.npmjs.org/uint64be/-/uint64be-2.0.1.tgz", 2140 | "integrity": "sha1-oxDZTk5eCwKpXWeOMzI/gCvchCg=", 2141 | "dev": true 2142 | }, 2143 | "uniq": { 2144 | "version": "1.0.1", 2145 | "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", 2146 | "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", 2147 | "dev": true 2148 | }, 2149 | "unordered-array-remove": { 2150 | "version": "1.0.2", 2151 | "resolved": "https://registry.npmjs.org/unordered-array-remove/-/unordered-array-remove-1.0.2.tgz", 2152 | "integrity": "sha1-xUbo+I4xegzyZEyX7LV9umbSUO8=", 2153 | "dev": true 2154 | }, 2155 | "unordered-set": { 2156 | "version": "2.0.0", 2157 | "resolved": "https://registry.npmjs.org/unordered-set/-/unordered-set-2.0.0.tgz", 2158 | "integrity": "sha1-mFon6XW6oguCY66np5HpMAlBqew=", 2159 | "dev": true 2160 | }, 2161 | "user-home": { 2162 | "version": "2.0.0", 2163 | "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", 2164 | "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", 2165 | "dev": true, 2166 | "requires": { 2167 | "os-homedir": "1.0.2" 2168 | } 2169 | }, 2170 | "util-deprecate": { 2171 | "version": "1.0.2", 2172 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2173 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 2174 | }, 2175 | "varint": { 2176 | "version": "5.0.0", 2177 | "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.0.tgz", 2178 | "integrity": "sha1-2Ca4n3SQcy+rwMDtaT7Uddyynr8=" 2179 | }, 2180 | "wordwrap": { 2181 | "version": "1.0.0", 2182 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", 2183 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", 2184 | "dev": true 2185 | }, 2186 | "wrappy": { 2187 | "version": "1.0.2", 2188 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2189 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 2190 | "dev": true 2191 | }, 2192 | "write": { 2193 | "version": "0.2.1", 2194 | "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", 2195 | "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", 2196 | "dev": true, 2197 | "requires": { 2198 | "mkdirp": "0.5.1" 2199 | } 2200 | }, 2201 | "xsalsa20": { 2202 | "version": "1.0.2", 2203 | "resolved": "https://registry.npmjs.org/xsalsa20/-/xsalsa20-1.0.2.tgz", 2204 | "integrity": "sha512-g1DFmZ5JJ9Qzvt4dMw6m9IydqoCSP381ucU5zm46Owbk3bwmqAr8eEJirOPc7PrXRn45drzOpAyDp8jsnoyXyw==", 2205 | "dev": true 2206 | }, 2207 | "xtend": { 2208 | "version": "4.0.1", 2209 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", 2210 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" 2211 | } 2212 | } 2213 | } 2214 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "append-tree", 3 | "version": "2.4.4", 4 | "description": "Model a tree structure on top of an append-only log.", 5 | "main": "index.js", 6 | "dependencies": { 7 | "array-lru": "^1.1.1", 8 | "codecs": "^1.2.0", 9 | "from2": "^2.3.0", 10 | "inherits": "^2.0.3", 11 | "mutexify": "^1.1.0", 12 | "process-nextick-args": "^1.0.7", 13 | "protocol-buffers-encodings": "^1.1.0", 14 | "varint": "^5.0.0" 15 | }, 16 | "devDependencies": { 17 | "hypercore": "^6.11.0", 18 | "protocol-buffers": "^4.0.2", 19 | "random-access-memory": "^2.3.0", 20 | "standard": "^9.0.1", 21 | "tape": "^4.6.3" 22 | }, 23 | "scripts": { 24 | "test": "standard && tape test.js", 25 | "protobuf": "protocol-buffers schema.proto -o messages.js" 26 | }, 27 | "repository": { 28 | "type": "git", 29 | "url": "https://github.com/mafintosh/append-tree.git" 30 | }, 31 | "author": "Mathias Buus (@mafintosh)", 32 | "license": "MIT", 33 | "bugs": { 34 | "url": "https://github.com/mafintosh/append-tree/issues" 35 | }, 36 | "homepage": "https://github.com/mafintosh/append-tree" 37 | } 38 | -------------------------------------------------------------------------------- /schema.proto: -------------------------------------------------------------------------------- 1 | message Node { 2 | required string name = 1; 3 | optional bytes value = 2; 4 | optional bytes paths = 3; 5 | } 6 | -------------------------------------------------------------------------------- /test.js: -------------------------------------------------------------------------------- 1 | var tape = require('tape') 2 | var hypercore = require('hypercore') 3 | var ram = require('random-access-memory') 4 | var tree = require('./') 5 | 6 | tape('basic', function (t) { 7 | var tr = create() 8 | 9 | tr.get('/hello', function (err) { 10 | t.ok(err, 'had error') 11 | tr.put('/hello', 'world', function (err) { 12 | t.error(err, 'no error') 13 | tr.get('/hello', function (err, value) { 14 | t.error(err, 'no error') 15 | t.same(value, new Buffer('world')) 16 | tr.get('/foo', function (err) { 17 | t.ok(err, 'had error') 18 | t.end() 19 | }) 20 | }) 21 | }) 22 | }) 23 | }) 24 | 25 | tape('basic list', function (t) { 26 | t.plan(5) 27 | 28 | var tr = create() 29 | 30 | tr.put('/hello', 'world', function () { 31 | tr.list('/', function (err, list) { 32 | t.error(err, 'no error') 33 | t.same(list, ['hello']) 34 | }) 35 | tr.list('/hello', function (err, list) { 36 | t.error(err, 'no error') 37 | t.same(list, []) 38 | }) 39 | tr.list('/hello/world', function (err, list) { 40 | t.ok(err, 'had error') 41 | }) 42 | }) 43 | }) 44 | 45 | tape('put twice', function (t) { 46 | t.plan(4) 47 | 48 | var tr = create() 49 | 50 | tr.put('/hello', 'world', function () { 51 | tr.put('/world', 'hello', function () { 52 | tr.get('/hello', function (err, value) { 53 | t.error(err, 'no error') 54 | t.same(value, new Buffer('world')) 55 | }) 56 | tr.get('/world', function (err, value) { 57 | t.error(err, 'no error') 58 | t.same(value, new Buffer('hello')) 59 | }) 60 | }) 61 | }) 62 | }) 63 | 64 | tape('put twice same folder', function (t) { 65 | t.plan(8) 66 | 67 | var tr = create() 68 | 69 | tr.put('/hello', 'world', function () { 70 | tr.put('/hello/world', 'hello', function () { 71 | tr.get('/hello', function (err, value) { 72 | t.error(err, 'no error') 73 | t.same(value, new Buffer('world')) 74 | }) 75 | tr.get('/hello/world', function (err, value) { 76 | t.error(err, 'no error') 77 | t.same(value, new Buffer('hello')) 78 | }) 79 | tr.list('/', function (err, list) { 80 | t.error(err, 'no error') 81 | t.same(list, ['hello']) 82 | }) 83 | tr.list('/hello', function (err, list) { 84 | t.error(err, 'no error') 85 | t.same(list, ['world']) 86 | }) 87 | }) 88 | }) 89 | }) 90 | 91 | tape('put twice same folder diff root', function (t) { 92 | t.plan(8) 93 | 94 | var tr = create() 95 | 96 | tr.put('/root', 'root', function () { 97 | tr.put('/hello', 'world', function () { 98 | tr.put('/hello/world', 'hello', function () { 99 | tr.get('/hello', function (err, value) { 100 | t.error(err, 'no error') 101 | t.same(value, new Buffer('world')) 102 | }) 103 | 104 | tr.get('/hello/world', function (err, value) { 105 | t.error(err, 'no error') 106 | t.same(value, new Buffer('hello')) 107 | }) 108 | 109 | tr.list('/', function (err, list) { 110 | t.error(err, 'no error') 111 | t.same(list, ['root', 'hello']) 112 | }) 113 | 114 | tr.list('/hello', function (err, list) { 115 | t.error(err, 'no error') 116 | t.same(list, ['world']) 117 | }) 118 | }) 119 | }) 120 | }) 121 | }) 122 | 123 | tape('put three times', function (t) { 124 | t.plan(6) 125 | 126 | var tr = create() 127 | 128 | tr.put('/hello', 'world', function () { 129 | tr.put('/world', 'hello', function () { 130 | tr.put('/hello/world', 'hi', function () { 131 | tr.get('/hello', function (err, value) { 132 | t.error(err, 'no error') 133 | t.same(value, new Buffer('world')) 134 | }) 135 | tr.get('/world', function (err, value) { 136 | t.error(err, 'no error') 137 | t.same(value, new Buffer('hello')) 138 | }) 139 | tr.get('/hello/world', function (err, value) { 140 | t.error(err, 'no error') 141 | t.same(value, new Buffer('hi')) 142 | }) 143 | }) 144 | }) 145 | }) 146 | }) 147 | 148 | tape('put four times', function (t) { 149 | t.plan(19) 150 | 151 | var tr = create() 152 | 153 | tr.put('/hello', 'world', function () { 154 | tr.put('/world', 'hello', function () { 155 | tr.put('/hello/world', 'hi', function () { 156 | tr.put('/world/hello', 'hi', function () { 157 | tr.get('/hello', function (err, value) { 158 | t.error(err, 'no error') 159 | t.same(value, new Buffer('world')) 160 | }) 161 | tr.get('/world', function (err, value) { 162 | t.error(err, 'no error') 163 | t.same(value, new Buffer('hello')) 164 | }) 165 | tr.get('/hello/world', function (err, value) { 166 | t.error(err, 'no error') 167 | t.same(value, new Buffer('hi')) 168 | }) 169 | tr.get('/world/hello', function (err, value) { 170 | t.error(err, 'no error') 171 | t.same(value, new Buffer('hi')) 172 | }) 173 | tr.list('/', function (err, list) { 174 | t.error(err, 'no error') 175 | t.same(list, ['hello', 'world']) 176 | }) 177 | tr.list('/hello', function (err, list) { 178 | t.error(err, 'no error') 179 | t.same(list, ['world']) 180 | }) 181 | tr.list('/world', function (err, list) { 182 | t.error(err, 'no error') 183 | t.same(list, ['hello']) 184 | }) 185 | tr.list('/world/foo', function (err) { 186 | t.ok(err, 'had error') 187 | }) 188 | tr.list('/world/hello', function (err, list) { 189 | t.error(err, 'no error') 190 | t.same(list, []) 191 | }) 192 | tr.list('/hello/world', function (err, list) { 193 | t.error(err, 'no error') 194 | t.same(list, []) 195 | }) 196 | }) 197 | }) 198 | }) 199 | }) 200 | }) 201 | 202 | tape('put and delete', function (t) { 203 | t.plan(2) 204 | 205 | var tr = create() 206 | 207 | tr.put('/hello', 'world', function () { 208 | tr.del('/hello', function () { 209 | tr.list('/hello', function (err) { 210 | t.ok(err, 'had error') 211 | }) 212 | tr.get('/hello', function (err, node) { 213 | t.ok(err, 'had error') 214 | }) 215 | }) 216 | }) 217 | }) 218 | 219 | tape('twice put and delete', function (t) { 220 | t.plan(4) 221 | 222 | var tr = create() 223 | 224 | tr.put('/world', 'hello', function () { 225 | tr.put('/hello', 'world', function () { 226 | tr.del('/hello', function () { 227 | tr.list('/', function (err, list) { 228 | t.error(err, 'no error') 229 | t.same(list, ['world']) 230 | }) 231 | tr.get('/hello', function (err) { 232 | t.ok(err, 'had error') 233 | }) 234 | tr.get('/world', function (err) { 235 | t.error(err, 'no error') 236 | }) 237 | }) 238 | }) 239 | }) 240 | }) 241 | 242 | tape('twice put (opposite order) and delete', function (t) { 243 | t.plan(4) 244 | 245 | var tr = create() 246 | 247 | tr.put('/hello', 'world', function () { 248 | tr.put('/world', 'hello', function () { 249 | tr.del('/hello', function () { 250 | tr.list('/', function (err, list) { 251 | t.error(err, 'no error') 252 | t.same(list, ['world']) 253 | }) 254 | tr.get('/hello', function (err) { 255 | t.ok(err, 'had error') 256 | }) 257 | tr.get('/world', function (err) { 258 | t.error(err, 'no error') 259 | }) 260 | }) 261 | }) 262 | }) 263 | }) 264 | 265 | tape('many puts and delete', function (t) { 266 | t.plan(8) 267 | 268 | var tr = create() 269 | 270 | tr.put('/hello', 'a') 271 | tr.put('/hello', 'b') 272 | tr.put('/hello', 'c') 273 | tr.put('/world/foo', 'bar') 274 | tr.put('/world', 'baz') 275 | tr.put('/world', 'hello', function () { 276 | tr.del('/hello') 277 | tr.put('/hello', 'world', function () { 278 | tr.del('/world', function () { 279 | tr.list('/', function (err, list) { 280 | t.error(err, 'no error') 281 | t.same(list.sort(), ['hello', 'world']) 282 | }) 283 | tr.get('/hello', function (err, val) { 284 | t.error(err, 'no error') 285 | t.same(val, new Buffer('world')) 286 | }) 287 | tr.get('/world/foo', function (err, val) { 288 | t.error(err, 'no error') 289 | t.same(val, new Buffer('bar')) 290 | }) 291 | tr.list('/world', function (err, list) { 292 | t.error(err, 'no error') 293 | t.same(list, ['foo']) 294 | }) 295 | }) 296 | }) 297 | }) 298 | }) 299 | 300 | tape('many puts and delete 2', function (t) { 301 | t.plan(7) 302 | 303 | var tr = create() 304 | 305 | tr.put('/a/b/c/d/e', '0') 306 | tr.put('/a', '1') 307 | tr.put('/a/a', '2') 308 | tr.put('/a/b/c/d/f', '3') 309 | tr.del('/a/b/c/d/f', function () { 310 | tr.get('/a', function (err, val) { 311 | t.error(err, 'no error') 312 | t.same(val, new Buffer('1')) 313 | }) 314 | tr.get('/a/a', function (err, val) { 315 | t.error(err, 'no error') 316 | t.same(val, new Buffer('2')) 317 | }) 318 | tr.get('/a/b/c/d/e', function (err, val) { 319 | t.error(err, 'no error') 320 | t.same(val, new Buffer('0')) 321 | }) 322 | tr.get('/a/b/c/d/f', function (err) { 323 | t.ok(err, 'had error') 324 | }) 325 | }) 326 | }) 327 | 328 | tape('many puts and delete 2 (opposite)', function (t) { 329 | t.plan(7) 330 | 331 | var tr = create() 332 | 333 | tr.put('/a/b/c/d/e', '0') 334 | tr.put('/a', '1') 335 | tr.put('/a/a', '2') 336 | tr.put('/a/b/c/d/f', '3') 337 | tr.del('/a/b/c/d/e', function () { 338 | tr.get('/a', function (err, val) { 339 | t.error(err, 'no error') 340 | t.same(val, new Buffer('1')) 341 | }) 342 | tr.get('/a/a', function (err, val) { 343 | t.error(err, 'no error') 344 | t.same(val, new Buffer('2')) 345 | }) 346 | tr.get('/a/b/c/d/f', function (err, val) { 347 | t.error(err, 'no error') 348 | t.same(val, new Buffer('3')) 349 | }) 350 | tr.get('/a/b/c/d/e', function (err) { 351 | t.ok(err, 'had error') 352 | }) 353 | }) 354 | }) 355 | 356 | tape('valueEncoding', function (t) { 357 | var tr = create({valueEncoding: 'json'}) 358 | 359 | tr.put('/', {hello: 'world'}, function () { 360 | tr.get('/', function (err, val) { 361 | t.error(err, 'no error') 362 | t.same(val, {hello: 'world'}) 363 | t.end() 364 | }) 365 | }) 366 | }) 367 | 368 | tape('checkout', function (t) { 369 | t.plan(6) 370 | 371 | var tr = create() 372 | 373 | tr.put('/', 'foo') 374 | tr.put('/foo', 'bar') 375 | tr.del('/foo') 376 | tr.put('/bar', 'baz') 377 | tr.put('/bar', 'meh', function () { 378 | var old1 = tr.checkout(0) 379 | 380 | old1.list('/', function (err, list) { 381 | t.error(err, 'no error') 382 | t.same(list, []) 383 | }) 384 | 385 | var old2 = tr.checkout(3) 386 | 387 | old2.list('/', function (err, list) { 388 | t.error(err, 'no error') 389 | t.same(list, ['bar']) 390 | }) 391 | 392 | old2.get('/bar', function (err, val) { 393 | t.error(err, 'no error') 394 | t.same(val, new Buffer('baz')) 395 | }) 396 | }) 397 | }) 398 | 399 | tape('history stream', function (t) { 400 | var tr = create() 401 | 402 | tr.put('/', 'foo') 403 | tr.put('/foo', 'bar') 404 | tr.del('/foo') 405 | tr.put('/bar', 'baz', function () { 406 | var expected = [{ 407 | type: 'put', 408 | version: 0, 409 | name: '/', 410 | value: new Buffer('foo') 411 | }, { 412 | type: 'put', 413 | version: 1, 414 | name: '/foo', 415 | value: new Buffer('bar') 416 | }, { 417 | type: 'del', 418 | version: 2, 419 | name: '/foo', 420 | value: null 421 | }, { 422 | type: 'put', 423 | version: 3, 424 | name: '/bar', 425 | value: new Buffer('baz') 426 | }] 427 | 428 | tr.history() 429 | .on('data', function (data) { 430 | t.same(data, expected.shift()) 431 | }) 432 | .on('end', function () { 433 | t.same(expected.length, 0) 434 | t.end() 435 | }) 436 | }) 437 | }) 438 | 439 | tape('cached', function (t) { 440 | t.plan(5) 441 | 442 | var tr = create({cache: false}) 443 | 444 | tr.put('/', 'foo') 445 | tr.put('/foo', 'bar') 446 | tr.put('/bar', 'baz', function () { 447 | tr.feed.clear(1, function () { 448 | tr.list('/', {cached: true}, function (err, list) { 449 | t.error(err, 'no error') 450 | t.same(list, ['bar']) 451 | }) 452 | tr.get('/bar', {cached: true}, function (err, val) { 453 | t.error(err, 'no error') 454 | t.same(val, new Buffer('baz')) 455 | }) 456 | tr.get('/foo', {cached: true}, function (err) { 457 | t.ok(err, 'had error') 458 | }) 459 | }) 460 | }) 461 | }) 462 | 463 | tape('default options', function (t) { 464 | t.plan(6) 465 | 466 | var tr = create({node: true}) 467 | 468 | tr.put('/', 'foo') 469 | tr.put('/foo', 'bar') 470 | tr.put('/bar', 'baz', function () { 471 | tr.list('/', function (err, list) { 472 | t.error(err, 'no error') 473 | t.same(list, [{ 474 | type: 'put', 475 | name: '/foo', 476 | version: 1, 477 | value: new Buffer('bar') 478 | }, { 479 | type: 'put', 480 | name: '/bar', 481 | version: 2, 482 | value: new Buffer('baz') 483 | }]) 484 | }) 485 | tr.get('/bar', function (err, val) { 486 | t.error(err, 'no error') 487 | t.same(val, { 488 | type: 'put', 489 | name: '/bar', 490 | version: 2, 491 | value: new Buffer('baz') 492 | }) 493 | }) 494 | tr.get('/bar', {node: false}, function (err, val) { 495 | t.error(err, 'no error') 496 | t.same(val, new Buffer('baz')) 497 | }) 498 | }) 499 | }) 500 | 501 | tape('diff', function (t) { 502 | var tr = create() 503 | 504 | tr.put('/foo', 'bar') 505 | tr.put('/bar', 'baz', function () { 506 | var stream = tr.checkout(0).diff(tr) 507 | var expected = [{type: 'put', name: '/bar', value: new Buffer('baz'), version: 1}] 508 | 509 | stream.on('data', function (data) { 510 | t.same(data, expected.shift()) 511 | }) 512 | stream.on('end', function () { 513 | t.same(expected.length, 0, 'no more data') 514 | t.end() 515 | }) 516 | }) 517 | }) 518 | 519 | tape('diff empty', function (t) { 520 | var tr = create() 521 | 522 | tr.put('/foo', 'bar') 523 | tr.put('/bar', 'baz', function () { 524 | var stream = tr.checkout(-1).diff(tr) 525 | var expected = [{ 526 | type: 'put', 527 | name: '/foo', 528 | value: new Buffer('bar'), 529 | version: 0 530 | }, { 531 | type: 'put', 532 | name: '/bar', 533 | value: new Buffer('baz'), 534 | version: 1 535 | }] 536 | 537 | stream.on('data', function (data) { 538 | t.same(data, expected.shift()) 539 | }) 540 | stream.on('end', function () { 541 | t.same(expected.length, 0, 'no more data') 542 | t.end() 543 | }) 544 | }) 545 | }) 546 | 547 | tape('diff self', function (t) { 548 | var tr = create() 549 | 550 | tr.put('/foo', 'bar') 551 | tr.put('/bar', 'baz', function () { 552 | var stream = tr.diff(tr) 553 | 554 | stream.on('data', function (data) { 555 | t.fail('no diff') 556 | }) 557 | stream.on('end', function () { 558 | t.pass('diff ends') 559 | t.end() 560 | }) 561 | }) 562 | }) 563 | 564 | tape('diff with dels', function (t) { 565 | var tr = create() 566 | 567 | tr.put('/foo', 'bar') 568 | tr.put('/bar', 'foo') 569 | tr.del('/foo', function () { 570 | var stream = tr.checkout(0).diff(tr) 571 | var expected = [{ 572 | type: 'del', 573 | name: '/foo', 574 | value: new Buffer('bar'), 575 | version: 0 576 | }, { 577 | type: 'put', 578 | name: '/bar', 579 | value: new Buffer('foo'), 580 | version: 1 581 | }] 582 | 583 | stream.on('data', function (data) { 584 | t.same(data, expected.shift()) 585 | }) 586 | 587 | stream.on('end', function () { 588 | t.same(expected.length, 0, 'no more data') 589 | t.end() 590 | }) 591 | }) 592 | }) 593 | 594 | tape('diff with overwrites', function (t) { 595 | var tr = create() 596 | 597 | tr.put('/foo', 'bar') 598 | tr.put('/bar', 'foo') 599 | tr.put('/foo', 'baz', function () { 600 | var stream = tr.checkout(0).diff(tr) 601 | var expected = [{ 602 | type: 'del', 603 | name: '/foo', 604 | value: new Buffer('bar'), 605 | version: 0 606 | }, { 607 | type: 'put', 608 | name: '/bar', 609 | value: new Buffer('foo'), 610 | version: 1 611 | }, { 612 | type: 'put', 613 | name: '/foo', 614 | value: new Buffer('baz'), 615 | version: 2 616 | }] 617 | 618 | stream.on('data', function (data) { 619 | t.same(data, expected.shift()) 620 | }) 621 | 622 | stream.on('end', function () { 623 | t.same(expected.length, 0, 'no more data') 624 | t.end() 625 | }) 626 | }) 627 | }) 628 | 629 | tape('diff only dels', function (t) { 630 | var tr = create() 631 | 632 | tr.put('/foo', 'bar') 633 | tr.put('/bar', 'foo') 634 | tr.put('/foo', 'baz', function () { 635 | var stream = tr.checkout(0).diff(tr, {puts: false, dels: true}) 636 | var expected = [{ 637 | type: 'del', 638 | name: '/foo', 639 | value: new Buffer('bar'), 640 | version: 0 641 | }] 642 | 643 | stream.on('data', function (data) { 644 | t.same(data, expected.shift()) 645 | }) 646 | 647 | stream.on('end', function () { 648 | t.same(expected.length, 0, 'no more data') 649 | t.end() 650 | }) 651 | }) 652 | }) 653 | 654 | tape('last del + diff', function (t) { 655 | var tr = create() 656 | 657 | tr.put('/b', 'a') 658 | tr.put('/c', 'a') 659 | tr.del('/a') 660 | tr.put('/foo/a', 'a') 661 | tr.del('/b') 662 | tr.put('/foo/b', 'a') 663 | tr.del('/c') 664 | tr.put('/foo/c', 'a') 665 | tr.del('/foo/a') 666 | tr.put('/foo/bar/a', 'a') 667 | tr.del('/foo/b') 668 | tr.put('/foo/bar/b', 'a') 669 | tr.del('/foo/c') 670 | tr.put('/foo/bar/c', 'a') 671 | tr.del('/foo/bar/a') 672 | tr.put('/foo/bar/baz/a', 'a') 673 | tr.del('/foo/bar/b') 674 | tr.put('/foo/bar/baz/b', 'a') // 17 675 | tr.del('/foo/bar/c') 676 | tr.del('/foo/bar/baz/a') // 19 677 | tr.put('/foo/bar/baz/c', 'a', function () { 678 | var a = tr.checkout(17) 679 | var b = tr.checkout(19) 680 | 681 | var expected = [{ 682 | type: 'del', 683 | name: '/foo/bar/c', 684 | value: new Buffer('a'), 685 | version: 13 686 | }, { 687 | type: 'del', 688 | name: '/foo/bar/baz/a', 689 | value: new Buffer('a'), 690 | version: 15 691 | }] 692 | 693 | a.diff(b) 694 | .on('data', function (data) { 695 | t.same(expected.shift(), data) 696 | }) 697 | .on('end', function () { 698 | t.end() 699 | }) 700 | }) 701 | }) 702 | 703 | tape('@pfrazee bug delete removes too much', function (t) { 704 | var tr = create() 705 | 706 | tr.put('/dat.json', 'put') 707 | tr.put('/2016', 'put') 708 | tr.put('/404.html', 'put') 709 | tr.put('/Gemfile', 'put') 710 | tr.put('/Gemfile.lock', 'put') 711 | tr.put('/assets', 'put') 712 | tr.put('/blog', 'put') 713 | tr.put('/feed.xml', 'put') 714 | tr.put('/index.html', 'put') 715 | tr.put('/2016/08', 'put') 716 | tr.put('/assets/css', 'put') 717 | tr.put('/assets/fonts', 'put') 718 | tr.put('/assets/img', 'put') 719 | tr.put('/assets/js', 'put') 720 | tr.put('/assets/vid', 'put') 721 | tr.put('/blog/a-chat-about-beaker-apps.html', 'put') 722 | tr.put('/blog/achieving-scale.html', 'put') 723 | tr.put('/blog/actually-serverless.html', 'put') 724 | tr.put('/blog/alan-kays-talks.html', 'put') 725 | tr.put('/blog/announcing-dathttpd.html', 'put') 726 | tr.put('/blog/beaker-browser-0.1.html', 'put') 727 | tr.put('/blog/beaker-browser-0.2.html', 'put') 728 | tr.put('/blog/computing-trust.html', 'put') 729 | tr.put('/blog/index.html', 'put') 730 | tr.put('/blog/not-media-companies.html', 'put') 731 | tr.put('/blog/web-of-trust-roundup.html', 'put') 732 | tr.put('/blog/webcomponents-yo.html', 'put') 733 | tr.put('/blog/what-is-the-p2p-web.html', 'put') 734 | tr.put('/blog/why-johnny-cant-encrypt.html', 'put') 735 | tr.put('/2016/08/10', 'put') 736 | tr.put('/assets/css/main.css', 'put') 737 | tr.put('/assets/fonts/inconsolata-400-latin-ext.woff2', 'put') 738 | tr.put('/assets/fonts/inconsolata-400-latin.woff2', 'put') 739 | tr.put('/assets/fonts/inconsolata-700-latin-ext.woff2', 'put') 740 | tr.put('/assets/fonts/inconsolata-700-latin.woff2', 'put') 741 | tr.put('/assets/img/alankay.jpg', 'put') 742 | tr.put('/assets/img/app-as-media-conversation.png', 'put') 743 | tr.put('/assets/img/auto-updater.gif', 'put') 744 | tr.put('/assets/img/beaker-thumb.png', 'put') 745 | tr.put('/assets/img/beaker.jpg', 'put') 746 | tr.put('/assets/img/beaker.png', 'put') 747 | tr.put('/assets/img/cat1.jpg', 'put') 748 | tr.put('/assets/img/computing-trust.jpg', 'put') 749 | tr.put('/assets/img/conquistador.jpg', 'put') 750 | tr.put('/assets/img/ct_hash_1.png', 'put') 751 | tr.put('/assets/img/ct_hash_2.png', 'put') 752 | tr.put('/assets/img/dat-viewer-history.png', 'put') 753 | tr.put('/assets/img/dat-viewer.png', 'put') 754 | tr.put('/assets/img/datdns.png', 'put') 755 | tr.put('/assets/img/favicon.png', 'put') 756 | tr.put('/assets/img/getting-started-screen-justcreated.png', 'put') 757 | tr.put('/assets/img/github.svg', 'put') 758 | tr.put('/assets/img/home.jpg', 'put') 759 | tr.put('/assets/img/illustration-fork.png', 'put') 760 | tr.put('/assets/img/illustration-hosting-service-hybrid.png', 'put') 761 | tr.put('/assets/img/illustration-hosting.png', 'put') 762 | tr.put('/assets/img/lol-contributions.png', 'put') 763 | tr.put('/assets/img/markedowneditor.png', 'put') 764 | tr.put('/assets/img/p2p-site-info.png', 'put') 765 | tr.put('/assets/img/pgp1.png', 'put') 766 | tr.put('/assets/img/pgp2.png', 'put') 767 | tr.put('/assets/img/pgp3.png', 'put') 768 | tr.put('/assets/img/pgp4.png', 'put') 769 | tr.put('/assets/img/pics', 'put') 770 | tr.put('/assets/img/prank.png', 'put') 771 | tr.put('/assets/img/request-create-dat.png', 'put') 772 | tr.put('/assets/img/request-network-access.png', 'put') 773 | tr.put('/assets/img/todolist.png', 'put') 774 | tr.put('/assets/img/twitter.png', 'put') 775 | tr.put('/assets/img/web.jpg', 'put') 776 | tr.put('/assets/img/webcomponents.png', 'put') 777 | tr.put('/assets/img/whyjohnnycantencrypt.jpg', 'put') 778 | tr.put('/assets/js/fun.js', 'put') 779 | tr.put('/assets/js/main.js', 'put') 780 | tr.put('/assets/js/vars.js', 'put') 781 | tr.put('/assets/vid/beaker-0.1-demo.mp4', 'put') 782 | tr.put('/2016/08/10/beaker-browser-0.1.html', 'put') 783 | tr.put('/assets/img/pics/decentralized-web-summit-2016-1.jpg', 'put') 784 | tr.put('/assets/img/pics/hash-the-planet-2014.jpg', 'put') 785 | tr.put('/assets/img/pics/wizard-eating-a-cupcake-2013.jpg', 'put') 786 | tr.put('/feed.xml', 'put') 787 | tr.del('/dat.json') 788 | tr.put('/404.html', 'put') 789 | tr.put('/feed.xml', 'put') 790 | tr.put('/index.html', 'put') 791 | tr.put('/blog/a-chat-about-beaker-apps.html', 'put') 792 | tr.put('/blog/achieving-scale.html', 'put') 793 | tr.put('/blog/actually-serverless.html', 'put') 794 | tr.put('/blog/alan-kays-talks.html', 'put') 795 | tr.put('/blog/announcing-dathttpd.html', 'put') 796 | tr.put('/blog/beaker-browser-0.1.html', 'put') 797 | tr.put('/blog/beaker-browser-0.2.html', 'put') 798 | tr.put('/blog/computing-trust.html', 'put') 799 | tr.put('/blog/index.html', 'put') 800 | tr.put('/blog/not-media-companies.html', 'put') 801 | tr.put('/blog/web-of-trust-roundup.html', 'put') 802 | tr.put('/blog/webcomponents-yo.html', 'put') 803 | tr.put('/blog/what-is-the-p2p-web.html', 'put') 804 | tr.put('/blog/why-johnny-cant-encrypt.html', 'put') 805 | tr.del('/assets/img/pics/wizard-eating-a-cupcake-2013.jpg') 806 | tr.del('/assets/img/pics/decentralized-web-summit-2016-1.jpg') 807 | tr.del('/assets/img/pics/hash-the-planet-2014.jpg') 808 | tr.del('/assets/img/pics') 809 | tr.put('/assets/css/main.css', 'put') 810 | tr.put('/assets/img/beaker-editor-1.png', 'put') 811 | tr.put('/assets/img/beaker-editor-2.png', 'put') 812 | tr.put('/assets/img/beaker-editor-3.png', 'put') 813 | tr.put('/assets/img/feed.png', 'put') 814 | tr.put('/assets/img/robot.jpeg', 'put') 815 | tr.put('/2016/08/10/beaker-browser-0.1.html', 'put') 816 | tr.put('/assets/img/alankay.jpg', 'put') 817 | tr.put('/assets/img/app-as-media-conversation.png', 'put') 818 | tr.put('/assets/img/auto-updater.gif', 'put') 819 | tr.put('/assets/img/beaker-thumb.png', 'put') 820 | tr.put('/assets/img/beaker.jpg', 'put') 821 | tr.put('/assets/img/beaker.png', 'put') 822 | tr.put('/assets/img/cat1.jpg', 'put') 823 | tr.put('/assets/img/computing-trust.jpg', 'put') 824 | tr.put('/assets/img/conquistador.jpg', 'put') 825 | tr.put('/assets/img/ct_hash_1.png', 'put') 826 | tr.put('/assets/img/ct_hash_2.png', 'put') 827 | tr.put('/assets/img/dat-viewer-history.png', 'put') 828 | tr.put('/assets/img/dat-viewer.png', 'put') 829 | tr.put('/assets/img/datdns.png', 'put') 830 | tr.put('/assets/img/favicon.png', 'put') 831 | tr.put('/assets/img/getting-started-screen-justcreated.png', 'put') 832 | tr.put('/assets/img/github.svg', 'put') 833 | tr.put('/assets/img/home.jpg', 'put') 834 | tr.put('/assets/img/illustration-fork.png', 'put') 835 | tr.put('/assets/img/illustration-hosting-service-hybrid.png', 'put') 836 | tr.put('/assets/img/illustration-hosting.png', 'put') 837 | tr.put('/assets/img/lol-contributions.png', 'put') 838 | tr.put('/assets/img/markedowneditor.png', 'put') 839 | tr.put('/assets/img/p2p-site-info.png', 'put') 840 | tr.put('/assets/img/pgp1.png', 'put') 841 | tr.put('/assets/img/pgp2.png', 'put') 842 | tr.put('/assets/img/pgp3.png', 'put') 843 | tr.put('/assets/img/pgp4.png', 'put') 844 | tr.put('/assets/img/prank.png', 'put') 845 | tr.put('/assets/img/request-create-dat.png', 'put') 846 | tr.put('/assets/img/request-network-access.png', 'put') 847 | tr.put('/assets/img/todolist.png', 'put') 848 | tr.put('/assets/img/twitter.png', 'put') 849 | tr.put('/assets/img/web.jpg', 'put') 850 | tr.put('/assets/img/webcomponents.png', 'put') 851 | tr.put('/assets/img/whyjohnnycantencrypt.jpg', 'put') 852 | tr.put('/dat.json', 'put') 853 | tr.put('/404.html', 'put') 854 | tr.put('/feed.xml', 'put') 855 | tr.put('/index.html', 'put') 856 | tr.put('/blog/a-chat-about-beaker-apps.html', 'put') 857 | tr.put('/blog/achieving-scale.html', 'put') 858 | tr.put('/blog/actually-serverless.html', 'put') 859 | tr.put('/blog/alan-kays-talks.html', 'put') 860 | tr.put('/blog/announcing-dathttpd.html', 'put') 861 | tr.put('/blog/beaker-browser-0.1.html', 'put') 862 | tr.put('/blog/beaker-browser-0.2.html', 'put') 863 | tr.put('/blog/computing-trust.html', 'put') 864 | tr.put('/blog/index.html', 'put') 865 | tr.put('/blog/not-media-companies.html', 'put') 866 | tr.put('/blog/web-of-trust-roundup.html', 'put') 867 | tr.put('/blog/webcomponents-yo.html', 'put') 868 | tr.put('/blog/what-is-the-p2p-web.html', 'put') 869 | tr.put('/blog/why-johnny-cant-encrypt.html', 'put') 870 | tr.put('/assets/css/main.css', 'put') 871 | tr.put('/2016/08/10/beaker-browser-0.1.html', 'put') 872 | tr.del('/assets/img/robot.jpeg') 873 | tr.put('/404.html', 'put', function () { 874 | tr.list('/assets/', function (err, list) { 875 | t.error(err, 'no error') 876 | t.same(list.sort(), ['css', 'fonts', 'img', 'js', 'vid']) 877 | tr.get('/assets/img/robot.jpeg', function (err, node) { 878 | t.ok(err, 'should error') 879 | t.end() 880 | }) 881 | }) 882 | }) 883 | }) 884 | 885 | tape('small cache', function (t) { 886 | var tr = create({cacheSize: 2}) 887 | 888 | tr.get('/hello', function (err) { 889 | t.ok(err, 'had error') 890 | tr.put('/hello', 'world', function (err) { 891 | t.error(err, 'no error') 892 | tr.get('/hello', function (err, value) { 893 | t.error(err, 'no error') 894 | t.same(value, new Buffer('world')) 895 | tr.get('/foo', function (err) { 896 | t.ok(err, 'had error') 897 | t.end() 898 | }) 899 | }) 900 | }) 901 | }) 902 | }) 903 | 904 | tape('no cache', function (t) { 905 | var tr = create({cache: false}) 906 | 907 | tr.get('/hello', function (err) { 908 | t.ok(err, 'had error') 909 | tr.put('/hello', 'world', function (err) { 910 | t.error(err, 'no error') 911 | tr.get('/hello', function (err, value) { 912 | t.error(err, 'no error') 913 | t.same(value, new Buffer('world')) 914 | tr.get('/foo', function (err) { 915 | t.ok(err, 'had error') 916 | t.end() 917 | }) 918 | }) 919 | }) 920 | }) 921 | }) 922 | 923 | function create (opts) { 924 | return tree(hypercore(ram), opts) 925 | } 926 | --------------------------------------------------------------------------------