├── .github └── stale.yml ├── .gitignore ├── .npmrc ├── .travis.yml ├── LICENSE ├── README.md ├── help.js ├── index.js ├── links.js ├── package-lock.json └── package.json /.github/stale.yml: -------------------------------------------------------------------------------- 1 | _extends: .github 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | package-lock=false 2 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - 8 4 | - 10 5 | 6 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2016 Dominic Tarr 2 | 3 | Permission is hereby granted, free of charge, 4 | to any person obtaining a copy of this software and 5 | associated documentation files (the "Software"), to 6 | deal in the Software without restriction, including 7 | without limitation the rights to use, copy, modify, 8 | merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom 10 | the Software is furnished to do so, 11 | subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice 14 | shall be included in all copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 18 | OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 19 | IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR 20 | ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 21 | TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 22 | SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ssb-links 2 | 3 | an [ssb-plugin](https://github.com/ssbc/secret-stack/blob/master/PLUGINS.md) that indexes all the links! 4 | 5 | This plugin can perform queries about messages that refer to other messages or feeds. 6 | 7 | ## Example 8 | 9 | if you have a handle on the sbot server: 10 | ``` js 11 | sbot.use(require('ssb-links') 12 | sbot.links2.read({query: [{$filter: {rel: ['mentions', {$prefix: '@d'}]}}]}) 13 | ``` 14 | OR if sbot is a client... 15 | 16 | ``` js 17 | links2 = require('ssb-links').init(sbot, {path: '~/.ssb'}) 18 | links2.read({query: [{$filter: {rel: ['mentions', {$prefix: '@d'}]}}]}) 19 | ``` 20 | 21 | ## Installation 22 | 23 | Most clients will install ssb-links for you, check if the `ssb-server links2.read --help` command works 24 | If not, to install it manually. Since ssb-links has the same name as a core feature, it actually exposes 25 | it's api as `sbot.links2` it was [originally intended to replace ssb-db.links](https://hackmd.io/IM5_tWIfSFuNoe3jtrjrtQ?view#incomplete-intentions) 26 | but that didn't end up happening. So after installing it you need to configure a different name. 27 | see [the configuration for renaming a plugin](https://github.com/ssbc/ssb-plugins#load-user-configured-plugins). 28 | This is not necessary if you are loading ssb-links directly in javascript code (as in the examples below). 29 | 30 | to install `ssb-server plugins.install ssb-links` then to configure 31 | `{"plugins":{"ssb-links": "links2"}}``` to your `~/.ssb/config`. 32 | 33 | ## database 34 | 35 | A leveldb instance will be created in your ssb directory `~/.ssb/flume/links`. 36 | Because of the size of a message id, this will be quite a large index. 37 | 38 | ## api: links2.read ({query: QUERY, live, reverse, limit}) 39 | 40 | If there is no query provided, a full scan of the links database 41 | will be performed. this will return a stream of data that looks like 42 | 43 | ``` js 44 | { 45 | source: @{author_of_link}, 46 | rel: [{rel}, {rel_data}...], 47 | dest: @/%/&{link} //the dest can be any type of ssb object. 48 | ts: {local_timestamp} 49 | } 50 | ``` 51 | 52 | this format will be the input to the query. 53 | 54 | ### relation data. 55 | 56 | this module introduces the concept of "rel data", 57 | the rel is now stored as an array, and the data associated 58 | with the rel stored with it. by indexing it as an array, 59 | it becomes easy to query it when that data is a sortable range 60 | (for example, mention names, which may be alphabetically sorted) 61 | 62 | see `./links.js` to see how data is mapped. 63 | 64 | TODO: map all markdown links, including http links. 65 | 66 | ### query syntax 67 | 68 | the query must be a valid [map-filter-reduce](https://github.com/dominictarr/map-filter-reduce) 69 | 70 | ## example queries 71 | 72 | these queries are in JSON format so you can use them via the cli, 73 | `ssb-server links2.read --query '{QUERY}'` 74 | be sure to use single quotes around the query so that the json is property 75 | escaped. otherwise, run these queries by passing them to `sbot.links2.read({query: QUERY})` 76 | and taking the output as a [pull-stream](https://github.com/pull-stream/pull-stream). 77 | 78 | ### all feeds mentioned 79 | 80 | counts the number of times each name is used by which feed. 81 | 82 | returns a stream all `{name, feed, uses}` 83 | ``` js 84 | [ 85 | {"$filter": { 86 | "rel": ["mentions", {"$prefix": "@"}] 87 | }}, 88 | 89 | {"$reduce":{ 90 | "name": ["rel", 1], "feed": "dest", "uses": {"$count": true} 91 | }} 92 | ] 93 | ``` 94 | 95 | ### thread contributors 96 | 97 | returns feeds in each thread, and how many posts they have made. 98 | return object in form of `{[thread_id]:{[poster]:count}}` 99 | ``` js 100 | [ 101 | {"$filter": { 102 | "rel": ["root"] 103 | }}, 104 | {"$reduce":{ 105 | "thread": "dest", "participant": "source", "posts": {"$count": true} 106 | }} 107 | ] 108 | ``` 109 | 110 | ### names used for "@EMovhfIr...=.ed25519" and who mentioned them. 111 | 112 | ``` js 113 | [ 114 | {"$filter": { 115 | "rel": ["mentions", {"$prefix": "@"}], 116 | "dest": "@EMovhfIrFk4NihAKnRNhrfRaqIhBv1Wj8pTxJNgvCCY=.ed25519" 117 | }}, 118 | {"$reduce": { 119 | "name": ["rel", 1], "by": "source", "uses": {"$count": true} 120 | }} 121 | ] 122 | ``` 123 | 124 | ## License 125 | 126 | MIT 127 | 128 | -------------------------------------------------------------------------------- /help.js: -------------------------------------------------------------------------------- 1 | 2 | module.exports = { 3 | description: 'query messages that link to other messages or feeds', 4 | commands: { 5 | read: { 6 | type: 'source', 7 | description: 'perform a query', 8 | args: { 9 | query: { 10 | type: 'MapFilterReduce', 11 | description: 'a map-filter-reduce query, see examples in ssb-links readme' 12 | } 13 | } 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | var FlumeLinks = require('flumeview-links') 2 | var extractLinks = require('./links') 3 | 4 | function isString (s) { 5 | return typeof s === 'string' 6 | } 7 | 8 | // we could have up to six indexes for links, 9 | // but these are the three that we really need. 10 | // queries are fast if the fields you already know 11 | // are left most, and the ranges are to the right of that. 12 | 13 | var indexes = [ 14 | { key: 'SRD', value: ['source', 'rel', 'dest', 'ts'] }, 15 | { key: 'DRS', value: ['dest', 'rel', 'source', 'ts'] }, 16 | { key: 'RDS', value: ['rel', 'dest', 'source', 'ts'] } 17 | ] 18 | 19 | exports.name = 'links2' 20 | exports.version = require('./package.json').version 21 | exports.manifest = { 22 | read: 'source', 23 | help: 'sync' 24 | } 25 | 26 | exports.init = function (ssb) { 27 | var s = ssb._flumeUse('links2', FlumeLinks(indexes, extractLinks, 3)) 28 | var read = s.read 29 | s.read = function (opts) { 30 | if (!opts) opts = {} 31 | 32 | // accept json, makes it easier to query from cli. 33 | if (isString(opts)) opts = { query: JSON.parse(opts) } 34 | else if (isString(opts.query)) opts.query = JSON.parse(opts.query) 35 | 36 | return read(opts) 37 | } 38 | s.help = function () { 39 | return require('./help') 40 | } 41 | return s 42 | } 43 | -------------------------------------------------------------------------------- /links.js: -------------------------------------------------------------------------------- 1 | var msgs = require('ssb-msgs') 2 | 3 | function noObjects(value) { 4 | if (Array.isArray(value)) return value.map(noObjects) 5 | if (typeof value === 'object' && value !== null) return JSON.stringify(value) 6 | return value 7 | } 8 | 9 | module.exports = function (data, iter) { 10 | if(data.sync) return 11 | var content = data.value.content 12 | var source = data.value.author 13 | 14 | //TODO parse the links from markdown 15 | //and index those also. most of these are http links, 16 | //some ipfs. 17 | 18 | //it would be easy to tag another message, 19 | //and query that, once markdown links are ready 20 | //[#hashtag](msgId) would tag msg with #hashtag 21 | 22 | //TODO: what about a syntax for self-links? 23 | //interpret a lone hashtag in a message as a selflink, 24 | //and then that will work. 25 | 26 | msgs.indexLinks(data.value, function (ln, rel) { 27 | var dest = ln.link 28 | 29 | //take all the already existing links and put 30 | //the relevant aspects into the index, 31 | //as part of the rel, so that we don't need to lookup 32 | //the message to get them, and even better, 33 | //we can query by these attributes! enabling search. 34 | 35 | if(rel == 'vote') 36 | rel = ['vote', ln.value] 37 | else if(rel == 'flag') 38 | rel = ['flag', ln.reason] 39 | else if(rel == 'mentions') { 40 | if(ln.link[0] === '@') 41 | rel = ['mentions', '@'+(ln.name||'').toLowerCase()] 42 | else if(ln.link[0] == '&') { 43 | rel = ['mentions', ln.filename || ln.name, ln.size] 44 | } 45 | else { 46 | //TODO: check whether they included some text in the markdown link. 47 | rel = ['mentions'] 48 | } 49 | } 50 | else if(rel == 'about' && typeof content.name === 'string') { 51 | rel = ['about', content.name] 52 | } 53 | else if(rel == 'image') 54 | rel = ['image', ln.type, ln.size] 55 | else if(rel == 'contact') 56 | rel = ['contact', content.following, content.blocking] 57 | else 58 | rel = [rel] 59 | 60 | iter({ 61 | source: source, dest: dest, 62 | rel: rel.map(noObjects), 63 | ts: data.timestamp 64 | }) 65 | }) 66 | } 67 | 68 | 69 | 70 | 71 | 72 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ssb-links", 3 | "version": "3.0.10", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "abstract-leveldown": { 8 | "version": "4.0.3", 9 | "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-4.0.3.tgz", 10 | "integrity": "sha512-qsIHFQy0u17JqSY+3ZUT+ykqxYY17yOfvAsLkFkw8kSQqi05d1jyj0bCuSX6sjYlXuY9cKpgUt5EudQdP4aXyA==", 11 | "requires": { 12 | "xtend": "~4.0.0" 13 | } 14 | }, 15 | "ansi-regex": { 16 | "version": "2.1.1", 17 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 18 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 19 | }, 20 | "aproba": { 21 | "version": "1.2.0", 22 | "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", 23 | "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" 24 | }, 25 | "are-we-there-yet": { 26 | "version": "1.1.5", 27 | "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", 28 | "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", 29 | "requires": { 30 | "delegates": "^1.0.0", 31 | "readable-stream": "^2.0.6" 32 | } 33 | }, 34 | "binary-search": { 35 | "version": "1.3.4", 36 | "resolved": "https://registry.npmjs.org/binary-search/-/binary-search-1.3.4.tgz", 37 | "integrity": "sha512-dPxU/vZLnH0tEVjVPgi015oSwqu6oLfCeHywuFRhBE0yM0mYocvleTl8qsdM1YFhRzTRhM1+VzS8XLDVrHPopg==" 38 | }, 39 | "bindings": { 40 | "version": "1.3.0", 41 | "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.3.0.tgz", 42 | "integrity": "sha512-DpLh5EzMR2kzvX1KIlVC0VkC3iZtHKTgdtZ0a3pglBZdaQFjt5S9g9xd1lE+YvXyfd6mtCeRnrUfOLYiTMlNSw==" 43 | }, 44 | "bl": { 45 | "version": "1.2.2", 46 | "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", 47 | "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", 48 | "requires": { 49 | "readable-stream": "^2.3.5", 50 | "safe-buffer": "^5.1.1" 51 | } 52 | }, 53 | "buffer-alloc": { 54 | "version": "1.2.0", 55 | "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", 56 | "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", 57 | "requires": { 58 | "buffer-alloc-unsafe": "^1.1.0", 59 | "buffer-fill": "^1.0.0" 60 | } 61 | }, 62 | "buffer-alloc-unsafe": { 63 | "version": "1.1.0", 64 | "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", 65 | "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" 66 | }, 67 | "buffer-fill": { 68 | "version": "1.0.0", 69 | "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", 70 | "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" 71 | }, 72 | "charwise": { 73 | "version": "3.0.1", 74 | "resolved": "https://registry.npmjs.org/charwise/-/charwise-3.0.1.tgz", 75 | "integrity": "sha512-RcdumNsM6fJZ5HHbYunqj2bpurVRGsXour3OR+SlLEHFhG6ALm54i6Osnh+OvO7kEoSBzwExpblYFH8zKQiEPw==" 76 | }, 77 | "chownr": { 78 | "version": "1.0.1", 79 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", 80 | "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=" 81 | }, 82 | "code-point-at": { 83 | "version": "1.1.0", 84 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 85 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" 86 | }, 87 | "console-control-strings": { 88 | "version": "1.1.0", 89 | "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", 90 | "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" 91 | }, 92 | "core-util-is": { 93 | "version": "1.0.2", 94 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 95 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 96 | }, 97 | "decompress-response": { 98 | "version": "3.3.0", 99 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", 100 | "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", 101 | "requires": { 102 | "mimic-response": "^1.0.0" 103 | } 104 | }, 105 | "deep-equal": { 106 | "version": "1.0.1", 107 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", 108 | "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" 109 | }, 110 | "deep-extend": { 111 | "version": "0.6.0", 112 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", 113 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" 114 | }, 115 | "deferred-leveldown": { 116 | "version": "3.0.0", 117 | "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-3.0.0.tgz", 118 | "integrity": "sha512-ajbXqRPMXRlcdyt0TuWqknOJkp1JgQjGB7xOl2V+ebol7/U11E9h3/nCZAtN1M7djmAJEIhypCUc1tIWxdQAuQ==", 119 | "requires": { 120 | "abstract-leveldown": "~4.0.0" 121 | } 122 | }, 123 | "delegates": { 124 | "version": "1.0.0", 125 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", 126 | "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" 127 | }, 128 | "detect-libc": { 129 | "version": "1.0.3", 130 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", 131 | "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" 132 | }, 133 | "encoding-down": { 134 | "version": "4.0.1", 135 | "resolved": "https://registry.npmjs.org/encoding-down/-/encoding-down-4.0.1.tgz", 136 | "integrity": "sha512-AlSE+ugBIpLL0i9if2SlnOZ4oWj/XvBb8tw2Ie/pFB73vdYs5O/6plRyqIgjbZbz8onaL20AAuMP87LWbP56IQ==", 137 | "requires": { 138 | "abstract-leveldown": "^4.0.0", 139 | "level-codec": "^8.0.0", 140 | "level-errors": "^1.0.4", 141 | "xtend": "^4.0.1" 142 | } 143 | }, 144 | "end-of-stream": { 145 | "version": "1.4.1", 146 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", 147 | "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", 148 | "requires": { 149 | "once": "^1.4.0" 150 | } 151 | }, 152 | "errno": { 153 | "version": "0.1.7", 154 | "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", 155 | "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", 156 | "requires": { 157 | "prr": "~1.0.1" 158 | } 159 | }, 160 | "expand-template": { 161 | "version": "1.1.1", 162 | "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-1.1.1.tgz", 163 | "integrity": "sha512-cebqLtV8KOZfw0UI8TEFWxtczxxC1jvyUvx6H4fyp1K1FN7A4Q+uggVUlOsI1K8AGU0rwOGqP8nCapdrw8CYQg==" 164 | }, 165 | "explain-error": { 166 | "version": "1.0.4", 167 | "resolved": "https://registry.npmjs.org/explain-error/-/explain-error-1.0.4.tgz", 168 | "integrity": "sha1-p5PTrAytTGq1cemWj7urbLJTKSk=" 169 | }, 170 | "fast-future": { 171 | "version": "1.0.2", 172 | "resolved": "https://registry.npmjs.org/fast-future/-/fast-future-1.0.2.tgz", 173 | "integrity": "sha1-hDWpqqAteSSNF9cE52JZMB2ZKAo=" 174 | }, 175 | "flumeview-level": { 176 | "version": "3.0.5", 177 | "resolved": "https://registry.npmjs.org/flumeview-level/-/flumeview-level-3.0.5.tgz", 178 | "integrity": "sha512-LKW+YdJGemOo7TnUwpFHq4cBBiYAIKtWk+G2CK7zrxbCIiAHemBRudohBOUKuSUZZ0CReR5fJ73peBHW02VerA==", 179 | "requires": { 180 | "charwise": "^3.0.1", 181 | "explain-error": "^1.0.4", 182 | "level": "^3.0.1", 183 | "ltgt": "^2.1.3", 184 | "mkdirp": "^0.5.1", 185 | "obv": "0.0.0", 186 | "pull-level": "^2.0.3", 187 | "pull-paramap": "^1.2.1", 188 | "pull-stream": "^3.5.0", 189 | "pull-write": "^1.1.1" 190 | } 191 | }, 192 | "flumeview-query": { 193 | "version": "6.3.0", 194 | "resolved": "https://registry.npmjs.org/flumeview-query/-/flumeview-query-6.3.0.tgz", 195 | "integrity": "sha512-8QBannTFLICARmflhHpXNeR5hh6IzIyJz4XhKTofzmxq/hXEn1un7aF6P6dRQkOwthENDTbSB07eWKqwnYDKtw==", 196 | "requires": { 197 | "deep-equal": "^1.0.1", 198 | "flumeview-level": "^3.0.0", 199 | "map-filter-reduce": "^3.0.7", 200 | "pull-flatmap": "0.0.1", 201 | "pull-paramap": "^1.1.3", 202 | "pull-sink-through": "0.0.0", 203 | "pull-stream": "^3.4.0" 204 | }, 205 | "dependencies": { 206 | "map-filter-reduce": { 207 | "version": "3.1.0", 208 | "resolved": "https://registry.npmjs.org/map-filter-reduce/-/map-filter-reduce-3.1.0.tgz", 209 | "integrity": "sha512-os2GlG1lEWRSAvAb9iqfapQ0I1GRXSA+alSjQl0DB7XxNyDx2/VOVAEVhK7EMsqwDDCWNTBSstoo1roc7U5H0w==", 210 | "requires": { 211 | "binary-search": "^1.2.0", 212 | "pull-sink-through": "0.0.0", 213 | "pull-stream": "^3.4.3", 214 | "typewiselite": "^1.0.0" 215 | } 216 | } 217 | } 218 | }, 219 | "fs-constants": { 220 | "version": "1.0.0", 221 | "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", 222 | "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" 223 | }, 224 | "gauge": { 225 | "version": "2.7.4", 226 | "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", 227 | "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", 228 | "requires": { 229 | "aproba": "^1.0.3", 230 | "console-control-strings": "^1.0.0", 231 | "has-unicode": "^2.0.0", 232 | "object-assign": "^4.1.0", 233 | "signal-exit": "^3.0.0", 234 | "string-width": "^1.0.1", 235 | "strip-ansi": "^3.0.1", 236 | "wide-align": "^1.1.0" 237 | } 238 | }, 239 | "github-from-package": { 240 | "version": "0.0.0", 241 | "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", 242 | "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=" 243 | }, 244 | "has-unicode": { 245 | "version": "2.0.1", 246 | "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", 247 | "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" 248 | }, 249 | "inherits": { 250 | "version": "2.0.3", 251 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 252 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 253 | }, 254 | "ini": { 255 | "version": "1.3.5", 256 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", 257 | "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" 258 | }, 259 | "ip": { 260 | "version": "1.1.5", 261 | "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", 262 | "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" 263 | }, 264 | "is-fullwidth-code-point": { 265 | "version": "1.0.0", 266 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 267 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 268 | "requires": { 269 | "number-is-nan": "^1.0.0" 270 | } 271 | }, 272 | "is-valid-domain": { 273 | "version": "0.0.5", 274 | "resolved": "https://registry.npmjs.org/is-valid-domain/-/is-valid-domain-0.0.5.tgz", 275 | "integrity": "sha1-SOcDGfy0MAkjbpazf5hDiJzntRM=" 276 | }, 277 | "isarray": { 278 | "version": "1.0.0", 279 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 280 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 281 | }, 282 | "level": { 283 | "version": "3.0.2", 284 | "resolved": "https://registry.npmjs.org/level/-/level-3.0.2.tgz", 285 | "integrity": "sha512-2qYbbiptPsPWGUI+AgB1gTNXqIjPpALRqrQyNx1zWYNZxhhuzEj/IE4Unu9weEBnsUEocfYe56xOGlAceb8/Fg==", 286 | "requires": { 287 | "level-packager": "^2.0.2", 288 | "leveldown": "^3.0.0", 289 | "opencollective-postinstall": "^2.0.0" 290 | } 291 | }, 292 | "level-codec": { 293 | "version": "8.0.0", 294 | "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-8.0.0.tgz", 295 | "integrity": "sha512-gNZlo1HRHz0BWxzGCyNf7xntAs2HKOPvvRBWtXsoDvEX4vMYnSTBS6ZnxoaiX7nhxSBPpegRa8CQ/hnfGBKk3Q==" 296 | }, 297 | "level-errors": { 298 | "version": "1.1.2", 299 | "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-1.1.2.tgz", 300 | "integrity": "sha512-Sw/IJwWbPKF5Ai4Wz60B52yj0zYeqzObLh8k1Tk88jVmD51cJSKWSYpRyhVIvFzZdvsPqlH5wfhp/yxdsaQH4w==", 301 | "requires": { 302 | "errno": "~0.1.1" 303 | } 304 | }, 305 | "level-iterator-stream": { 306 | "version": "2.0.3", 307 | "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-2.0.3.tgz", 308 | "integrity": "sha512-I6Heg70nfF+e5Y3/qfthJFexhRw/Gi3bIymCoXAlijZdAcLaPuWSJs3KXyTYf23ID6g0o2QF62Yh+grOXY3Rig==", 309 | "requires": { 310 | "inherits": "^2.0.1", 311 | "readable-stream": "^2.0.5", 312 | "xtend": "^4.0.0" 313 | } 314 | }, 315 | "level-packager": { 316 | "version": "2.1.1", 317 | "resolved": "https://registry.npmjs.org/level-packager/-/level-packager-2.1.1.tgz", 318 | "integrity": "sha512-6l3G6dVkmdvHwOJrEA9d9hL6SSFrzwjQoLP8HsvohOgfY/8Z9LyTKNCM5Gc84wtsUWCuIHu6r+S6WrCtTWUJCw==", 319 | "requires": { 320 | "encoding-down": "~4.0.0", 321 | "levelup": "^2.0.0" 322 | } 323 | }, 324 | "level-post": { 325 | "version": "1.0.7", 326 | "resolved": "https://registry.npmjs.org/level-post/-/level-post-1.0.7.tgz", 327 | "integrity": "sha512-PWYqG4Q00asOrLhX7BejSajByB4EmG2GaKHfj3h5UmmZ2duciXLPGYWIjBzLECFWUGOZWlm5B20h/n3Gs3HKew==", 328 | "requires": { 329 | "ltgt": "^2.1.2" 330 | } 331 | }, 332 | "leveldown": { 333 | "version": "3.0.2", 334 | "resolved": "https://registry.npmjs.org/leveldown/-/leveldown-3.0.2.tgz", 335 | "integrity": "sha512-+ANRScj1npQQzv6e4DYAKRjVQZZ+ahMoubKrNP68nIq+l9bYgb+WiXF+14oTcQTg2f7qE9WHGW7rBG9nGSsA+A==", 336 | "requires": { 337 | "abstract-leveldown": "~4.0.0", 338 | "bindings": "~1.3.0", 339 | "fast-future": "~1.0.2", 340 | "nan": "~2.10.0", 341 | "prebuild-install": "^4.0.0" 342 | } 343 | }, 344 | "levelup": { 345 | "version": "2.0.2", 346 | "resolved": "https://registry.npmjs.org/levelup/-/levelup-2.0.2.tgz", 347 | "integrity": "sha512-us+nTLUyd/eLnclYYddOCdAVw1hnymGx/9p4Jr5ThohStsjLqMVmbYiz6/SYFZEPXNF+AKQSvh6fA2e2KZpC8w==", 348 | "requires": { 349 | "deferred-leveldown": "~3.0.0", 350 | "level-errors": "~1.1.0", 351 | "level-iterator-stream": "~2.0.0", 352 | "xtend": "~4.0.0" 353 | } 354 | }, 355 | "looper": { 356 | "version": "2.0.0", 357 | "resolved": "https://registry.npmjs.org/looper/-/looper-2.0.0.tgz", 358 | "integrity": "sha1-Zs0Md0rz1P7axTeU90LbVtqPCew=" 359 | }, 360 | "ltgt": { 361 | "version": "2.2.1", 362 | "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", 363 | "integrity": "sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=" 364 | }, 365 | "map-filter-reduce": { 366 | "version": "2.2.1", 367 | "resolved": "https://registry.npmjs.org/map-filter-reduce/-/map-filter-reduce-2.2.1.tgz", 368 | "integrity": "sha1-YysSfDrl1q2eIc/dlpG2O4lE/NI=", 369 | "requires": { 370 | "binary-search": "^1.2.0", 371 | "pull-sink-through": "0.0.0", 372 | "pull-stream": "^3.3.0", 373 | "typewiselite": "^1.0.0" 374 | } 375 | }, 376 | "mimic-response": { 377 | "version": "1.0.1", 378 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", 379 | "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" 380 | }, 381 | "minimist": { 382 | "version": "1.2.0", 383 | "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 384 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" 385 | }, 386 | "mkdirp": { 387 | "version": "0.5.1", 388 | "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 389 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 390 | "requires": { 391 | "minimist": "0.0.8" 392 | }, 393 | "dependencies": { 394 | "minimist": { 395 | "version": "0.0.8", 396 | "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 397 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" 398 | } 399 | } 400 | }, 401 | "nan": { 402 | "version": "2.10.0", 403 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", 404 | "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==" 405 | }, 406 | "node-abi": { 407 | "version": "2.4.3", 408 | "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.4.3.tgz", 409 | "integrity": "sha512-b656V5C0628gOOA2kwcpNA/bxdlqYF9FvxJ+qqVX0ctdXNVZpS8J6xEUYir3WAKc7U0BH/NRlSpNbGsy+azjeg==", 410 | "requires": { 411 | "semver": "^5.4.1" 412 | } 413 | }, 414 | "noop-logger": { 415 | "version": "0.1.1", 416 | "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", 417 | "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=" 418 | }, 419 | "npmlog": { 420 | "version": "4.1.2", 421 | "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", 422 | "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", 423 | "requires": { 424 | "are-we-there-yet": "~1.1.2", 425 | "console-control-strings": "~1.1.0", 426 | "gauge": "~2.7.3", 427 | "set-blocking": "~2.0.0" 428 | } 429 | }, 430 | "number-is-nan": { 431 | "version": "1.0.1", 432 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 433 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" 434 | }, 435 | "object-assign": { 436 | "version": "4.1.1", 437 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 438 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 439 | }, 440 | "obv": { 441 | "version": "0.0.0", 442 | "resolved": "https://registry.npmjs.org/obv/-/obv-0.0.0.tgz", 443 | "integrity": "sha1-7eq4Ro+R1BkzYu1/kdC5bdOaecE=" 444 | }, 445 | "once": { 446 | "version": "1.4.0", 447 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 448 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 449 | "requires": { 450 | "wrappy": "1" 451 | } 452 | }, 453 | "opencollective-postinstall": { 454 | "version": "2.0.0", 455 | "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.0.tgz", 456 | "integrity": "sha512-XAe80GycLe2yRGnJsUtt+EO5lk06XYRQt4kJJe53O2kJHPZJOZ+XMF/b47HW96e6LhfKVpwnXVr/s56jhV98jg==" 457 | }, 458 | "os-homedir": { 459 | "version": "1.0.2", 460 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", 461 | "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" 462 | }, 463 | "prebuild-install": { 464 | "version": "4.0.0", 465 | "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-4.0.0.tgz", 466 | "integrity": "sha512-7tayxeYboJX0RbVzdnKyGl2vhQRWr6qfClEXDhOkXjuaOKCw2q8aiuFhONRYVsG/czia7KhpykIlI2S2VaPunA==", 467 | "requires": { 468 | "detect-libc": "^1.0.3", 469 | "expand-template": "^1.0.2", 470 | "github-from-package": "0.0.0", 471 | "minimist": "^1.2.0", 472 | "mkdirp": "^0.5.1", 473 | "node-abi": "^2.2.0", 474 | "noop-logger": "^0.1.1", 475 | "npmlog": "^4.0.1", 476 | "os-homedir": "^1.0.1", 477 | "pump": "^2.0.1", 478 | "rc": "^1.1.6", 479 | "simple-get": "^2.7.0", 480 | "tar-fs": "^1.13.0", 481 | "tunnel-agent": "^0.6.0", 482 | "which-pm-runs": "^1.0.0" 483 | } 484 | }, 485 | "process-nextick-args": { 486 | "version": "2.0.0", 487 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", 488 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" 489 | }, 490 | "prr": { 491 | "version": "1.0.1", 492 | "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", 493 | "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" 494 | }, 495 | "pull-cat": { 496 | "version": "1.1.11", 497 | "resolved": "https://registry.npmjs.org/pull-cat/-/pull-cat-1.1.11.tgz", 498 | "integrity": "sha1-tkLdElXaN2pwa220+pYvX9t0wxs=" 499 | }, 500 | "pull-flatmap": { 501 | "version": "0.0.1", 502 | "resolved": "https://registry.npmjs.org/pull-flatmap/-/pull-flatmap-0.0.1.tgz", 503 | "integrity": "sha1-E9SURT6PbUeOe7+t5vj+AZf6a7c=" 504 | }, 505 | "pull-level": { 506 | "version": "2.0.4", 507 | "resolved": "https://registry.npmjs.org/pull-level/-/pull-level-2.0.4.tgz", 508 | "integrity": "sha512-fW6pljDeUThpq5KXwKbRG3X7Ogk3vc75d5OQU/TvXXui65ykm+Bn+fiktg+MOx2jJ85cd+sheufPL+rw9QSVZg==", 509 | "requires": { 510 | "level-post": "^1.0.7", 511 | "pull-cat": "^1.1.9", 512 | "pull-live": "^1.0.1", 513 | "pull-pushable": "^2.0.0", 514 | "pull-stream": "^3.4.0", 515 | "pull-window": "^2.1.4", 516 | "stream-to-pull-stream": "^1.7.1" 517 | } 518 | }, 519 | "pull-live": { 520 | "version": "1.0.1", 521 | "resolved": "https://registry.npmjs.org/pull-live/-/pull-live-1.0.1.tgz", 522 | "integrity": "sha1-pOzuAeMwFV6RJLu89HYfIbOPUfU=", 523 | "requires": { 524 | "pull-cat": "^1.1.9", 525 | "pull-stream": "^3.4.0" 526 | } 527 | }, 528 | "pull-paramap": { 529 | "version": "1.2.2", 530 | "resolved": "https://registry.npmjs.org/pull-paramap/-/pull-paramap-1.2.2.tgz", 531 | "integrity": "sha1-UaQZPOnI1yFdla2tReK824STsjo=", 532 | "requires": { 533 | "looper": "^4.0.0" 534 | }, 535 | "dependencies": { 536 | "looper": { 537 | "version": "4.0.0", 538 | "resolved": "https://registry.npmjs.org/looper/-/looper-4.0.0.tgz", 539 | "integrity": "sha1-dwat7VmpntygbmtUu4bI7BnJUVU=" 540 | } 541 | } 542 | }, 543 | "pull-pushable": { 544 | "version": "2.2.0", 545 | "resolved": "https://registry.npmjs.org/pull-pushable/-/pull-pushable-2.2.0.tgz", 546 | "integrity": "sha1-Xy867UethpGfAbEqLpnW8b13ZYE=" 547 | }, 548 | "pull-sink-through": { 549 | "version": "0.0.0", 550 | "resolved": "http://registry.npmjs.org/pull-sink-through/-/pull-sink-through-0.0.0.tgz", 551 | "integrity": "sha1-08BJLzqAtO0gSvZ8S0+TVoD8Wx8=" 552 | }, 553 | "pull-stream": { 554 | "version": "3.6.9", 555 | "resolved": "https://registry.npmjs.org/pull-stream/-/pull-stream-3.6.9.tgz", 556 | "integrity": "sha512-hJn4POeBrkttshdNl0AoSCVjMVSuBwuHocMerUdoZ2+oIUzrWHFTwJMlbHND7OiKLVgvz6TFj8ZUVywUMXccbw==" 557 | }, 558 | "pull-window": { 559 | "version": "2.1.4", 560 | "resolved": "https://registry.npmjs.org/pull-window/-/pull-window-2.1.4.tgz", 561 | "integrity": "sha1-/DuG/uvRkgx64pdpHiP3BfiFUvA=", 562 | "requires": { 563 | "looper": "^2.0.0" 564 | } 565 | }, 566 | "pull-write": { 567 | "version": "1.1.4", 568 | "resolved": "https://registry.npmjs.org/pull-write/-/pull-write-1.1.4.tgz", 569 | "integrity": "sha1-3d6jFJO0j2douEooHQHrO1Mf4Lg=", 570 | "requires": { 571 | "looper": "^4.0.0", 572 | "pull-cat": "^1.1.11", 573 | "pull-stream": "^3.4.5" 574 | }, 575 | "dependencies": { 576 | "looper": { 577 | "version": "4.0.0", 578 | "resolved": "https://registry.npmjs.org/looper/-/looper-4.0.0.tgz", 579 | "integrity": "sha1-dwat7VmpntygbmtUu4bI7BnJUVU=" 580 | } 581 | } 582 | }, 583 | "pump": { 584 | "version": "2.0.1", 585 | "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", 586 | "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", 587 | "requires": { 588 | "end-of-stream": "^1.1.0", 589 | "once": "^1.3.1" 590 | } 591 | }, 592 | "rc": { 593 | "version": "1.2.8", 594 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", 595 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", 596 | "requires": { 597 | "deep-extend": "^0.6.0", 598 | "ini": "~1.3.0", 599 | "minimist": "^1.2.0", 600 | "strip-json-comments": "~2.0.1" 601 | } 602 | }, 603 | "readable-stream": { 604 | "version": "2.3.6", 605 | "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 606 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 607 | "requires": { 608 | "core-util-is": "~1.0.0", 609 | "inherits": "~2.0.3", 610 | "isarray": "~1.0.0", 611 | "process-nextick-args": "~2.0.0", 612 | "safe-buffer": "~5.1.1", 613 | "string_decoder": "~1.1.1", 614 | "util-deprecate": "~1.0.1" 615 | } 616 | }, 617 | "safe-buffer": { 618 | "version": "5.1.2", 619 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 620 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 621 | }, 622 | "semver": { 623 | "version": "5.5.1", 624 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", 625 | "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==" 626 | }, 627 | "set-blocking": { 628 | "version": "2.0.0", 629 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 630 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" 631 | }, 632 | "signal-exit": { 633 | "version": "3.0.2", 634 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 635 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" 636 | }, 637 | "simple-concat": { 638 | "version": "1.0.0", 639 | "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", 640 | "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" 641 | }, 642 | "simple-get": { 643 | "version": "2.8.1", 644 | "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz", 645 | "integrity": "sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==", 646 | "requires": { 647 | "decompress-response": "^3.3.0", 648 | "once": "^1.3.1", 649 | "simple-concat": "^1.0.0" 650 | } 651 | }, 652 | "ssb-msgs": { 653 | "version": "5.2.0", 654 | "resolved": "https://registry.npmjs.org/ssb-msgs/-/ssb-msgs-5.2.0.tgz", 655 | "integrity": "sha1-xoHaXNcMV0ySLcpPA8UhU4E1wkM=", 656 | "requires": { 657 | "ssb-ref": "^2.0.0" 658 | } 659 | }, 660 | "ssb-ref": { 661 | "version": "2.11.2", 662 | "resolved": "https://registry.npmjs.org/ssb-ref/-/ssb-ref-2.11.2.tgz", 663 | "integrity": "sha512-40A+o3iNAgr/sMH4V6/f3l2dhzUb5ZhTwZdrlKFu1ti+uZrKNUkH/E8j5NIZpj2rDq0PDXkACSVJgPGwltfQRA==", 664 | "requires": { 665 | "ip": "^1.1.3", 666 | "is-valid-domain": "~0.0.1" 667 | } 668 | }, 669 | "stream-to-pull-stream": { 670 | "version": "1.7.2", 671 | "resolved": "https://registry.npmjs.org/stream-to-pull-stream/-/stream-to-pull-stream-1.7.2.tgz", 672 | "integrity": "sha1-dXYJrhzr0zx0MtSvvjH/eGULnd4=", 673 | "requires": { 674 | "looper": "^3.0.0", 675 | "pull-stream": "^3.2.3" 676 | }, 677 | "dependencies": { 678 | "looper": { 679 | "version": "3.0.0", 680 | "resolved": "https://registry.npmjs.org/looper/-/looper-3.0.0.tgz", 681 | "integrity": "sha1-LvpUw7HLq6m5Su4uWRSwvlf7t0k=" 682 | } 683 | } 684 | }, 685 | "string-width": { 686 | "version": "1.0.2", 687 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 688 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 689 | "requires": { 690 | "code-point-at": "^1.0.0", 691 | "is-fullwidth-code-point": "^1.0.0", 692 | "strip-ansi": "^3.0.0" 693 | } 694 | }, 695 | "string_decoder": { 696 | "version": "1.1.1", 697 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 698 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 699 | "requires": { 700 | "safe-buffer": "~5.1.0" 701 | } 702 | }, 703 | "strip-ansi": { 704 | "version": "3.0.1", 705 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 706 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 707 | "requires": { 708 | "ansi-regex": "^2.0.0" 709 | } 710 | }, 711 | "strip-json-comments": { 712 | "version": "2.0.1", 713 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 714 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" 715 | }, 716 | "tar-fs": { 717 | "version": "1.16.3", 718 | "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.3.tgz", 719 | "integrity": "sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw==", 720 | "requires": { 721 | "chownr": "^1.0.1", 722 | "mkdirp": "^0.5.1", 723 | "pump": "^1.0.0", 724 | "tar-stream": "^1.1.2" 725 | }, 726 | "dependencies": { 727 | "pump": { 728 | "version": "1.0.3", 729 | "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", 730 | "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", 731 | "requires": { 732 | "end-of-stream": "^1.1.0", 733 | "once": "^1.3.1" 734 | } 735 | } 736 | } 737 | }, 738 | "tar-stream": { 739 | "version": "1.6.1", 740 | "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.1.tgz", 741 | "integrity": "sha512-IFLM5wp3QrJODQFPm6/to3LJZrONdBY/otxcvDIQzu217zKye6yVR3hhi9lAjrC2Z+m/j5oDxMPb1qcd8cIvpA==", 742 | "requires": { 743 | "bl": "^1.0.0", 744 | "buffer-alloc": "^1.1.0", 745 | "end-of-stream": "^1.0.0", 746 | "fs-constants": "^1.0.0", 747 | "readable-stream": "^2.3.0", 748 | "to-buffer": "^1.1.0", 749 | "xtend": "^4.0.0" 750 | } 751 | }, 752 | "to-buffer": { 753 | "version": "1.1.1", 754 | "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", 755 | "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" 756 | }, 757 | "tunnel-agent": { 758 | "version": "0.6.0", 759 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 760 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 761 | "requires": { 762 | "safe-buffer": "^5.0.1" 763 | } 764 | }, 765 | "typewiselite": { 766 | "version": "1.0.0", 767 | "resolved": "https://registry.npmjs.org/typewiselite/-/typewiselite-1.0.0.tgz", 768 | "integrity": "sha1-yIgvobsQksBgBal/NO9chQjjZk4=" 769 | }, 770 | "util-deprecate": { 771 | "version": "1.0.2", 772 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 773 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 774 | }, 775 | "which-pm-runs": { 776 | "version": "1.0.0", 777 | "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", 778 | "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=" 779 | }, 780 | "wide-align": { 781 | "version": "1.1.3", 782 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", 783 | "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", 784 | "requires": { 785 | "string-width": "^1.0.2 || 2" 786 | } 787 | }, 788 | "wrappy": { 789 | "version": "1.0.2", 790 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 791 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 792 | }, 793 | "xtend": { 794 | "version": "4.0.1", 795 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", 796 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" 797 | } 798 | } 799 | } 800 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ssb-links", 3 | "description": "index links in ssb messages", 4 | "version": "3.0.10", 5 | "homepage": "https://github.com/dominictarr/ssb-links", 6 | "repository": { 7 | "type": "git", 8 | "url": "git://github.com/dominictarr/ssb-links.git" 9 | }, 10 | "dependencies": { 11 | "flumeview-links": "^1.0.1", 12 | "map-filter-reduce": "^2.0.0", 13 | "ssb-msgs": "^5.2.0" 14 | }, 15 | "devDependencies": {}, 16 | "scripts": { 17 | "test": "set -e; for t in test/*.js; do node $t; done" 18 | }, 19 | "author": "Dominic Tarr (http://dominictarr.com)", 20 | "license": "MIT" 21 | } 22 | --------------------------------------------------------------------------------