├── .eslintrc ├── .gitignore ├── .travis.yml ├── LICENSE ├── README.md ├── index.js ├── package-lock.json ├── package.json ├── service.js ├── services.js ├── services ├── __generic.js ├── adfly.js ├── adfoc.js ├── bc.vc.js ├── link5s.com.js ├── linkbucks.js ├── linkshrink.net.js ├── nowvideo.js ├── p.pw.js └── shortest.js ├── test ├── bypass.js └── match.js └── tonic-example.js /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "rules": { 3 | "indent": [2, "tab"], 4 | "quotes": [2, "single"], 5 | "semi": [2, "always"], 6 | "keyword-spacing": 2, 7 | "no-unused-vars": [1, { "vars": "all", "args": "none" }], 8 | "no-console": 0, 9 | "no-mixed-spaces-and-tabs": [2, "smart-tabs"], 10 | "space-before-blocks": [2, "always"], 11 | "space-before-function-paren": [2, "never"], 12 | "space-in-parens": [2, "never"], 13 | "space-infix-ops": 2, 14 | "space-unary-ops": [2, { "words": true, "nonwords": false }], 15 | "object-curly-spacing": [2, "always"], 16 | "array-bracket-spacing": [2, "never"], 17 | "guard-for-in": 2, 18 | "no-spaced-func": 2, 19 | "no-trailing-spaces": [2, { "skipBlankLines": true }], 20 | "handle-callback-err": 2, 21 | "comma-spacing": [2, {"before": false, "after": true}], 22 | "one-var": [2, "never"], 23 | "no-redeclare": 0, 24 | "comma-dangle": [1, "never"] 25 | }, 26 | "env": { 27 | "node": true, 28 | "mocha": true, 29 | "es6": true 30 | }, 31 | "extends": "eslint:recommended" 32 | } 33 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | 6 | # Runtime data 7 | pids 8 | *.pid 9 | *.seed 10 | 11 | # Directory for instrumented libs generated by jscoverage/JSCover 12 | lib-cov 13 | 14 | # Coverage directory used by tools like istanbul 15 | coverage 16 | 17 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 18 | .grunt 19 | 20 | # node-waf configuration 21 | .lock-wscript 22 | 23 | # Compiled binary addons (http://nodejs.org/api/addons.html) 24 | build/Release 25 | 26 | # Dependency directory 27 | # https://docs.npmjs.com/misc/faq#should-i-check-my-node-modules-folder-into-git 28 | node_modules 29 | 30 | # Optional npm cache directory 31 | .npm 32 | 33 | # Optional REPL history 34 | .node_repl_history 35 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "8" 4 | - "6" 5 | - "5" 6 | - "4" 7 | script: 8 | - npm run test 9 | - npm run lint 10 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Matteo Contrini 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 all 13 | 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 THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # node-bypasser 2 | [![Build Status](https://travis-ci.org/matteocontrini/node-bypasser.svg?branch=master)](https://travis-ci.org/matteocontrini/node-bypasser) 3 | [![npm version](https://badge.fury.io/js/node-bypasser.svg)](https://badge.fury.io/js/node-bypasser) 4 | 5 | Bypass URL shortener websites 6 | 7 | ## Install 8 | 9 | ```bash 10 | npm install --save node-bypasser 11 | ``` 12 | 13 | ## Example: 14 | 15 | [Try on Tonic](https://tonicdev.com/npm/node-bypasser) 16 | 17 | ```javascript 18 | var Bypasser = require('node-bypasser'); 19 | 20 | var w = new Bypasser('http://adf.ly/1DX0XD'); 21 | w.decrypt(function(err, result) { 22 | console.log('Decrypted: ' + result); 23 | }); 24 | ``` 25 | 26 | The output will be 27 | ``` 28 | Decrypted: https://github.com/matteocontrini/node-bypasser/ 29 | ``` 30 | 31 | ## Testing 32 | 33 | ```bash 34 | npm run test 35 | ``` 36 | 37 | ### Travis CI build is failing? 38 | 39 | Unit tests may occasionally fail when there are network connectivity issues or when services' servers give bad temporary responses. 40 | 41 | ## Supported websites 42 | * Adf.ly 43 | * Linkbucks.com (all alternative domains) 44 | * Shorte.st (sh.st, u2ks.com, jnw0.com, digg.to, dh10thbvu.com) 45 | * AdFoc.us 46 | * Smsh.me 47 | * P.pw 48 | * LinkShrink.net 49 | * Link5s.com 50 | * Bc.vc 51 | * NowVideo and AuroraVid (MP4/FLV video direct link will be extracted) 52 | * All generic services that use simple 301/302 redirect (goo.gl, bit.ly, t.co,...) 53 | 54 | ## [Request a new service](https://github.com/matteocontrini/node-bypasser/issues) 55 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const _url = require('url'); 2 | const services = require('./services.js'); 3 | 4 | /** 5 | * Bypasser class which handles expansion for one link 6 | * @param {String} url - URL to be expanded 7 | */ 8 | function Bypasser(url) { 9 | this.url = url; 10 | this.service = null; 11 | 12 | // Try to find which service the URL belongs to 13 | this.findService(); 14 | } 15 | 16 | /** 17 | * Invoke _findService and set the result, if any 18 | * @return {Boolean} - Whether a matching service has been found 19 | */ 20 | Bypasser.prototype.findService = function() { 21 | var serv = Bypasser._findService(this.url); 22 | 23 | if (serv) { 24 | this.service = serv; 25 | return true; 26 | } 27 | else { 28 | return false; 29 | } 30 | }; 31 | 32 | /** 33 | * Find a service matching the given URL 34 | * @param {String} url - URL to be checked 35 | * @return {Service} Found service, or null 36 | * @private 37 | */ 38 | Bypasser._findService = function(url) { 39 | // Check if the URL is a valid URL 40 | var parsedUrl = _url.parse(url); 41 | if (parsedUrl.hostname == null) return null; 42 | 43 | var found = false; 44 | var genericService = null; 45 | var serv = null; 46 | 47 | // Loop through services until a match is found 48 | for (var i = 0; i < services.length && !found; i++) { 49 | serv = services[i]; 50 | 51 | // Find matching hostnames 52 | for (var j = 0; j < serv.hosts.length && !found; j++) { 53 | if (parsedUrl.hostname.endsWith(serv.hosts[j])) { 54 | found = true; 55 | } 56 | } 57 | 58 | // Assign Generic Service 59 | if (serv.name == 'Generic') { 60 | genericService = serv; 61 | } 62 | } 63 | 64 | // If a service is found, return it 65 | if (found) { 66 | return serv; 67 | } 68 | // Otherwise return the generic one 69 | else { 70 | return genericService; 71 | } 72 | }; 73 | 74 | /** 75 | * Decrypt the URL 76 | * @param {Function} callback - Called when a result is ready 77 | */ 78 | Bypasser.prototype.decrypt = function(callback) { 79 | // No service means that the URL is not valid 80 | if (!this.service) { 81 | callback('This is not a valid url'); 82 | return; 83 | } 84 | 85 | this.callback = callback; 86 | 87 | this.service.run(this.url, handleResponse.bind(this)); 88 | }; 89 | 90 | function handleResponse(err, res) { 91 | // Something went wrong while fetching the URL 92 | if (err) { 93 | this.callback(err); 94 | return; 95 | } 96 | 97 | // If the service was generic (normal URL redirect) 98 | // check if the found new URL needs to be fetched again 99 | if (this.service.name == 'Generic') { 100 | // Search a new service 101 | this.url = res; 102 | this.findService(); 103 | 104 | // Fetch again with the newly found service 105 | if (this.service.name != 'Generic') { 106 | this.service.run(this.url, handleResponse.bind(this)); 107 | return; 108 | } 109 | } 110 | 111 | // Ok we have a result! 112 | this.callback(null, res); 113 | } 114 | 115 | module.exports = Bypasser; 116 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "node-bypasser", 3 | "version": "1.8.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "abab": { 8 | "version": "1.0.4", 9 | "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", 10 | "integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4=", 11 | "optional": true 12 | }, 13 | "acorn": { 14 | "version": "2.7.0", 15 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz", 16 | "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc=" 17 | }, 18 | "acorn-globals": { 19 | "version": "1.0.9", 20 | "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-1.0.9.tgz", 21 | "integrity": "sha1-VbtemGkVB7dFedBRNBMhfDgMVM8=", 22 | "optional": true, 23 | "requires": { 24 | "acorn": "2.7.0" 25 | } 26 | }, 27 | "acorn-jsx": { 28 | "version": "3.0.1", 29 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", 30 | "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", 31 | "dev": true, 32 | "requires": { 33 | "acorn": "3.3.0" 34 | }, 35 | "dependencies": { 36 | "acorn": { 37 | "version": "3.3.0", 38 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", 39 | "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", 40 | "dev": true 41 | } 42 | } 43 | }, 44 | "ajv": { 45 | "version": "5.4.0", 46 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.4.0.tgz", 47 | "integrity": "sha1-MtHPCNvIDEMvQm8S4QslEfa0ZHQ=", 48 | "requires": { 49 | "co": "4.6.0", 50 | "fast-deep-equal": "1.0.0", 51 | "fast-json-stable-stringify": "2.0.0", 52 | "json-schema-traverse": "0.3.1" 53 | } 54 | }, 55 | "ajv-keywords": { 56 | "version": "1.5.1", 57 | "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", 58 | "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", 59 | "dev": true 60 | }, 61 | "ansi-escapes": { 62 | "version": "1.4.0", 63 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", 64 | "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", 65 | "dev": true 66 | }, 67 | "ansi-regex": { 68 | "version": "2.1.1", 69 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 70 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 71 | "dev": true 72 | }, 73 | "ansi-styles": { 74 | "version": "2.2.1", 75 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 76 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", 77 | "dev": true 78 | }, 79 | "argparse": { 80 | "version": "1.0.9", 81 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", 82 | "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", 83 | "dev": true, 84 | "requires": { 85 | "sprintf-js": "1.0.3" 86 | } 87 | }, 88 | "array-union": { 89 | "version": "1.0.2", 90 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", 91 | "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", 92 | "dev": true, 93 | "requires": { 94 | "array-uniq": "1.0.3" 95 | } 96 | }, 97 | "array-uniq": { 98 | "version": "1.0.3", 99 | "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", 100 | "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", 101 | "dev": true 102 | }, 103 | "arrify": { 104 | "version": "1.0.1", 105 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", 106 | "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", 107 | "dev": true 108 | }, 109 | "asn1": { 110 | "version": "0.2.3", 111 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", 112 | "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" 113 | }, 114 | "assert-plus": { 115 | "version": "1.0.0", 116 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 117 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 118 | }, 119 | "assertion-error": { 120 | "version": "1.0.2", 121 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.2.tgz", 122 | "integrity": "sha1-E8pRXYYgbaC6xm6DTdOX2HWBCUw=", 123 | "dev": true 124 | }, 125 | "asynckit": { 126 | "version": "0.4.0", 127 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 128 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 129 | }, 130 | "aws-sign2": { 131 | "version": "0.7.0", 132 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 133 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" 134 | }, 135 | "aws4": { 136 | "version": "1.6.0", 137 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", 138 | "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" 139 | }, 140 | "babel-code-frame": { 141 | "version": "6.26.0", 142 | "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", 143 | "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", 144 | "dev": true, 145 | "requires": { 146 | "chalk": "1.1.3", 147 | "esutils": "2.0.2", 148 | "js-tokens": "3.0.2" 149 | } 150 | }, 151 | "balanced-match": { 152 | "version": "1.0.0", 153 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 154 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 155 | "dev": true 156 | }, 157 | "bcrypt-pbkdf": { 158 | "version": "1.0.1", 159 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", 160 | "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", 161 | "optional": true, 162 | "requires": { 163 | "tweetnacl": "0.14.5" 164 | } 165 | }, 166 | "boolbase": { 167 | "version": "1.0.0", 168 | "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", 169 | "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" 170 | }, 171 | "boom": { 172 | "version": "4.3.1", 173 | "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", 174 | "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", 175 | "requires": { 176 | "hoek": "4.2.0" 177 | } 178 | }, 179 | "brace-expansion": { 180 | "version": "1.1.8", 181 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", 182 | "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", 183 | "dev": true, 184 | "requires": { 185 | "balanced-match": "1.0.0", 186 | "concat-map": "0.0.1" 187 | } 188 | }, 189 | "caller-path": { 190 | "version": "0.1.0", 191 | "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", 192 | "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", 193 | "dev": true, 194 | "requires": { 195 | "callsites": "0.2.0" 196 | } 197 | }, 198 | "callsites": { 199 | "version": "0.2.0", 200 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", 201 | "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", 202 | "dev": true 203 | }, 204 | "caseless": { 205 | "version": "0.12.0", 206 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 207 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 208 | }, 209 | "chai": { 210 | "version": "3.5.0", 211 | "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz", 212 | "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=", 213 | "dev": true, 214 | "requires": { 215 | "assertion-error": "1.0.2", 216 | "deep-eql": "0.1.3", 217 | "type-detect": "1.0.0" 218 | } 219 | }, 220 | "chalk": { 221 | "version": "1.1.3", 222 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 223 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 224 | "dev": true, 225 | "requires": { 226 | "ansi-styles": "2.2.1", 227 | "escape-string-regexp": "1.0.5", 228 | "has-ansi": "2.0.0", 229 | "strip-ansi": "3.0.1", 230 | "supports-color": "2.0.0" 231 | } 232 | }, 233 | "cheerio": { 234 | "version": "0.20.0", 235 | "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.20.0.tgz", 236 | "integrity": "sha1-XHEPK6uVZTJyhCugHG6mGzVF7DU=", 237 | "requires": { 238 | "css-select": "1.2.0", 239 | "dom-serializer": "0.1.0", 240 | "entities": "1.1.1", 241 | "htmlparser2": "3.8.3", 242 | "jsdom": "7.2.2", 243 | "lodash": "4.17.4" 244 | } 245 | }, 246 | "circular-json": { 247 | "version": "0.3.3", 248 | "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", 249 | "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", 250 | "dev": true 251 | }, 252 | "cli-cursor": { 253 | "version": "1.0.2", 254 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", 255 | "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", 256 | "dev": true, 257 | "requires": { 258 | "restore-cursor": "1.0.1" 259 | } 260 | }, 261 | "cli-width": { 262 | "version": "2.2.0", 263 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", 264 | "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", 265 | "dev": true 266 | }, 267 | "co": { 268 | "version": "4.6.0", 269 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 270 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" 271 | }, 272 | "code-point-at": { 273 | "version": "1.1.0", 274 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 275 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", 276 | "dev": true 277 | }, 278 | "combined-stream": { 279 | "version": "1.0.5", 280 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", 281 | "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", 282 | "requires": { 283 | "delayed-stream": "1.0.0" 284 | } 285 | }, 286 | "commander": { 287 | "version": "2.3.0", 288 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.3.0.tgz", 289 | "integrity": "sha1-/UMOiJgy7DU7ms0d4hfBHLPu+HM=", 290 | "dev": true 291 | }, 292 | "concat-map": { 293 | "version": "0.0.1", 294 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 295 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 296 | "dev": true 297 | }, 298 | "concat-stream": { 299 | "version": "1.6.0", 300 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", 301 | "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", 302 | "dev": true, 303 | "requires": { 304 | "inherits": "2.0.3", 305 | "readable-stream": "2.3.3", 306 | "typedarray": "0.0.6" 307 | }, 308 | "dependencies": { 309 | "isarray": { 310 | "version": "1.0.0", 311 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 312 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 313 | "dev": true 314 | }, 315 | "readable-stream": { 316 | "version": "2.3.3", 317 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", 318 | "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", 319 | "dev": true, 320 | "requires": { 321 | "core-util-is": "1.0.2", 322 | "inherits": "2.0.3", 323 | "isarray": "1.0.0", 324 | "process-nextick-args": "1.0.7", 325 | "safe-buffer": "5.1.1", 326 | "string_decoder": "1.0.3", 327 | "util-deprecate": "1.0.2" 328 | } 329 | }, 330 | "string_decoder": { 331 | "version": "1.0.3", 332 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", 333 | "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", 334 | "dev": true, 335 | "requires": { 336 | "safe-buffer": "5.1.1" 337 | } 338 | } 339 | } 340 | }, 341 | "core-util-is": { 342 | "version": "1.0.2", 343 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 344 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 345 | }, 346 | "cryptiles": { 347 | "version": "3.1.2", 348 | "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", 349 | "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", 350 | "requires": { 351 | "boom": "5.2.0" 352 | }, 353 | "dependencies": { 354 | "boom": { 355 | "version": "5.2.0", 356 | "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", 357 | "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", 358 | "requires": { 359 | "hoek": "4.2.0" 360 | } 361 | } 362 | } 363 | }, 364 | "css-select": { 365 | "version": "1.2.0", 366 | "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", 367 | "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", 368 | "requires": { 369 | "boolbase": "1.0.0", 370 | "css-what": "2.1.0", 371 | "domutils": "1.5.1", 372 | "nth-check": "1.0.1" 373 | } 374 | }, 375 | "css-what": { 376 | "version": "2.1.0", 377 | "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", 378 | "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=" 379 | }, 380 | "cssom": { 381 | "version": "0.3.2", 382 | "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.2.tgz", 383 | "integrity": "sha1-uANhcMefB6kP8vFuIihAJ6JDhIs=" 384 | }, 385 | "cssstyle": { 386 | "version": "0.2.37", 387 | "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", 388 | "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=", 389 | "optional": true, 390 | "requires": { 391 | "cssom": "0.3.2" 392 | } 393 | }, 394 | "d": { 395 | "version": "1.0.0", 396 | "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", 397 | "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", 398 | "dev": true, 399 | "requires": { 400 | "es5-ext": "0.10.37" 401 | } 402 | }, 403 | "dashdash": { 404 | "version": "1.14.1", 405 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 406 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 407 | "requires": { 408 | "assert-plus": "1.0.0" 409 | } 410 | }, 411 | "debug": { 412 | "version": "2.6.9", 413 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 414 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 415 | "dev": true, 416 | "requires": { 417 | "ms": "2.0.0" 418 | } 419 | }, 420 | "deep-eql": { 421 | "version": "0.1.3", 422 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", 423 | "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", 424 | "dev": true, 425 | "requires": { 426 | "type-detect": "0.1.1" 427 | }, 428 | "dependencies": { 429 | "type-detect": { 430 | "version": "0.1.1", 431 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", 432 | "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=", 433 | "dev": true 434 | } 435 | } 436 | }, 437 | "deep-is": { 438 | "version": "0.1.3", 439 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 440 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" 441 | }, 442 | "del": { 443 | "version": "2.2.2", 444 | "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", 445 | "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", 446 | "dev": true, 447 | "requires": { 448 | "globby": "5.0.0", 449 | "is-path-cwd": "1.0.0", 450 | "is-path-in-cwd": "1.0.0", 451 | "object-assign": "4.1.1", 452 | "pify": "2.3.0", 453 | "pinkie-promise": "2.0.1", 454 | "rimraf": "2.6.2" 455 | } 456 | }, 457 | "delayed-stream": { 458 | "version": "1.0.0", 459 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 460 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 461 | }, 462 | "diff": { 463 | "version": "1.4.0", 464 | "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", 465 | "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=", 466 | "dev": true 467 | }, 468 | "doctrine": { 469 | "version": "2.0.0", 470 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz", 471 | "integrity": "sha1-xz2NKQnSIpHhoAejlYBNqLZl/mM=", 472 | "dev": true, 473 | "requires": { 474 | "esutils": "2.0.2", 475 | "isarray": "1.0.0" 476 | }, 477 | "dependencies": { 478 | "isarray": { 479 | "version": "1.0.0", 480 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 481 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 482 | "dev": true 483 | } 484 | } 485 | }, 486 | "dom-serializer": { 487 | "version": "0.1.0", 488 | "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", 489 | "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", 490 | "requires": { 491 | "domelementtype": "1.1.3", 492 | "entities": "1.1.1" 493 | }, 494 | "dependencies": { 495 | "domelementtype": { 496 | "version": "1.1.3", 497 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", 498 | "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=" 499 | } 500 | } 501 | }, 502 | "domelementtype": { 503 | "version": "1.3.0", 504 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", 505 | "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=" 506 | }, 507 | "domhandler": { 508 | "version": "2.3.0", 509 | "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", 510 | "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", 511 | "requires": { 512 | "domelementtype": "1.3.0" 513 | } 514 | }, 515 | "domutils": { 516 | "version": "1.5.1", 517 | "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", 518 | "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", 519 | "requires": { 520 | "dom-serializer": "0.1.0", 521 | "domelementtype": "1.3.0" 522 | } 523 | }, 524 | "ecc-jsbn": { 525 | "version": "0.1.1", 526 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", 527 | "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", 528 | "optional": true, 529 | "requires": { 530 | "jsbn": "0.1.1" 531 | } 532 | }, 533 | "entities": { 534 | "version": "1.1.1", 535 | "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", 536 | "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=" 537 | }, 538 | "es5-ext": { 539 | "version": "0.10.37", 540 | "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.37.tgz", 541 | "integrity": "sha1-DudB0Ui4AGm6J9AgOTdWryV978M=", 542 | "dev": true, 543 | "requires": { 544 | "es6-iterator": "2.0.3", 545 | "es6-symbol": "3.1.1" 546 | } 547 | }, 548 | "es6-iterator": { 549 | "version": "2.0.3", 550 | "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", 551 | "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", 552 | "dev": true, 553 | "requires": { 554 | "d": "1.0.0", 555 | "es5-ext": "0.10.37", 556 | "es6-symbol": "3.1.1" 557 | } 558 | }, 559 | "es6-map": { 560 | "version": "0.1.5", 561 | "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", 562 | "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", 563 | "dev": true, 564 | "requires": { 565 | "d": "1.0.0", 566 | "es5-ext": "0.10.37", 567 | "es6-iterator": "2.0.3", 568 | "es6-set": "0.1.5", 569 | "es6-symbol": "3.1.1", 570 | "event-emitter": "0.3.5" 571 | } 572 | }, 573 | "es6-set": { 574 | "version": "0.1.5", 575 | "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", 576 | "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", 577 | "dev": true, 578 | "requires": { 579 | "d": "1.0.0", 580 | "es5-ext": "0.10.37", 581 | "es6-iterator": "2.0.3", 582 | "es6-symbol": "3.1.1", 583 | "event-emitter": "0.3.5" 584 | } 585 | }, 586 | "es6-symbol": { 587 | "version": "3.1.1", 588 | "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", 589 | "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", 590 | "dev": true, 591 | "requires": { 592 | "d": "1.0.0", 593 | "es5-ext": "0.10.37" 594 | } 595 | }, 596 | "es6-weak-map": { 597 | "version": "2.0.2", 598 | "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", 599 | "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", 600 | "dev": true, 601 | "requires": { 602 | "d": "1.0.0", 603 | "es5-ext": "0.10.37", 604 | "es6-iterator": "2.0.3", 605 | "es6-symbol": "3.1.1" 606 | } 607 | }, 608 | "escape-string-regexp": { 609 | "version": "1.0.5", 610 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 611 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 612 | "dev": true 613 | }, 614 | "escodegen": { 615 | "version": "1.9.0", 616 | "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.0.tgz", 617 | "integrity": "sha512-v0MYvNQ32bzwoG2OSFzWAkuahDQHK92JBN0pTAALJ4RIxEZe766QJPDR8Hqy7XNUy5K3fnVL76OqYAdc4TZEIw==", 618 | "optional": true, 619 | "requires": { 620 | "esprima": "3.1.3", 621 | "estraverse": "4.2.0", 622 | "esutils": "2.0.2", 623 | "optionator": "0.8.2", 624 | "source-map": "0.5.7" 625 | } 626 | }, 627 | "escope": { 628 | "version": "3.6.0", 629 | "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", 630 | "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", 631 | "dev": true, 632 | "requires": { 633 | "es6-map": "0.1.5", 634 | "es6-weak-map": "2.0.2", 635 | "esrecurse": "4.2.0", 636 | "estraverse": "4.2.0" 637 | } 638 | }, 639 | "eslint": { 640 | "version": "3.19.0", 641 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz", 642 | "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=", 643 | "dev": true, 644 | "requires": { 645 | "babel-code-frame": "6.26.0", 646 | "chalk": "1.1.3", 647 | "concat-stream": "1.6.0", 648 | "debug": "2.6.9", 649 | "doctrine": "2.0.0", 650 | "escope": "3.6.0", 651 | "espree": "3.5.2", 652 | "esquery": "1.0.0", 653 | "estraverse": "4.2.0", 654 | "esutils": "2.0.2", 655 | "file-entry-cache": "2.0.0", 656 | "glob": "7.1.2", 657 | "globals": "9.18.0", 658 | "ignore": "3.3.7", 659 | "imurmurhash": "0.1.4", 660 | "inquirer": "0.12.0", 661 | "is-my-json-valid": "2.16.1", 662 | "is-resolvable": "1.0.0", 663 | "js-yaml": "3.10.0", 664 | "json-stable-stringify": "1.0.1", 665 | "levn": "0.3.0", 666 | "lodash": "4.17.4", 667 | "mkdirp": "0.5.1", 668 | "natural-compare": "1.4.0", 669 | "optionator": "0.8.2", 670 | "path-is-inside": "1.0.2", 671 | "pluralize": "1.2.1", 672 | "progress": "1.1.8", 673 | "require-uncached": "1.0.3", 674 | "shelljs": "0.7.8", 675 | "strip-bom": "3.0.0", 676 | "strip-json-comments": "2.0.1", 677 | "table": "3.8.3", 678 | "text-table": "0.2.0", 679 | "user-home": "2.0.0" 680 | } 681 | }, 682 | "espree": { 683 | "version": "3.5.2", 684 | "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.2.tgz", 685 | "integrity": "sha512-sadKeYwaR/aJ3stC2CdvgXu1T16TdYN+qwCpcWbMnGJ8s0zNWemzrvb2GbD4OhmJ/fwpJjudThAlLobGbWZbCQ==", 686 | "dev": true, 687 | "requires": { 688 | "acorn": "5.2.1", 689 | "acorn-jsx": "3.0.1" 690 | }, 691 | "dependencies": { 692 | "acorn": { 693 | "version": "5.2.1", 694 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.2.1.tgz", 695 | "integrity": "sha512-jG0u7c4Ly+3QkkW18V+NRDN+4bWHdln30NL1ZL2AvFZZmQe/BfopYCtghCKKVBUSetZ4QKcyA0pY6/4Gw8Pv8w==", 696 | "dev": true 697 | } 698 | } 699 | }, 700 | "esprima": { 701 | "version": "3.1.3", 702 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", 703 | "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", 704 | "optional": true 705 | }, 706 | "esquery": { 707 | "version": "1.0.0", 708 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", 709 | "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", 710 | "dev": true, 711 | "requires": { 712 | "estraverse": "4.2.0" 713 | } 714 | }, 715 | "esrecurse": { 716 | "version": "4.2.0", 717 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", 718 | "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", 719 | "dev": true, 720 | "requires": { 721 | "estraverse": "4.2.0", 722 | "object-assign": "4.1.1" 723 | } 724 | }, 725 | "estraverse": { 726 | "version": "4.2.0", 727 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", 728 | "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" 729 | }, 730 | "esutils": { 731 | "version": "2.0.2", 732 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", 733 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" 734 | }, 735 | "event-emitter": { 736 | "version": "0.3.5", 737 | "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", 738 | "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", 739 | "dev": true, 740 | "requires": { 741 | "d": "1.0.0", 742 | "es5-ext": "0.10.37" 743 | } 744 | }, 745 | "exit-hook": { 746 | "version": "1.1.1", 747 | "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", 748 | "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", 749 | "dev": true 750 | }, 751 | "extend": { 752 | "version": "3.0.1", 753 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", 754 | "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" 755 | }, 756 | "extsprintf": { 757 | "version": "1.3.0", 758 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 759 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" 760 | }, 761 | "fast-deep-equal": { 762 | "version": "1.0.0", 763 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", 764 | "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=" 765 | }, 766 | "fast-json-stable-stringify": { 767 | "version": "2.0.0", 768 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 769 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" 770 | }, 771 | "fast-levenshtein": { 772 | "version": "2.0.6", 773 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 774 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" 775 | }, 776 | "figures": { 777 | "version": "1.7.0", 778 | "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", 779 | "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", 780 | "dev": true, 781 | "requires": { 782 | "escape-string-regexp": "1.0.5", 783 | "object-assign": "4.1.1" 784 | } 785 | }, 786 | "file-entry-cache": { 787 | "version": "2.0.0", 788 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", 789 | "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", 790 | "dev": true, 791 | "requires": { 792 | "flat-cache": "1.3.0", 793 | "object-assign": "4.1.1" 794 | } 795 | }, 796 | "flat-cache": { 797 | "version": "1.3.0", 798 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", 799 | "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", 800 | "dev": true, 801 | "requires": { 802 | "circular-json": "0.3.3", 803 | "del": "2.2.2", 804 | "graceful-fs": "4.1.11", 805 | "write": "0.2.1" 806 | } 807 | }, 808 | "forever-agent": { 809 | "version": "0.6.1", 810 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 811 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" 812 | }, 813 | "form-data": { 814 | "version": "2.3.1", 815 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz", 816 | "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", 817 | "requires": { 818 | "asynckit": "0.4.0", 819 | "combined-stream": "1.0.5", 820 | "mime-types": "2.1.17" 821 | } 822 | }, 823 | "fs.realpath": { 824 | "version": "1.0.0", 825 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 826 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 827 | "dev": true 828 | }, 829 | "generate-function": { 830 | "version": "2.0.0", 831 | "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", 832 | "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", 833 | "dev": true 834 | }, 835 | "generate-object-property": { 836 | "version": "1.2.0", 837 | "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", 838 | "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", 839 | "dev": true, 840 | "requires": { 841 | "is-property": "1.0.2" 842 | } 843 | }, 844 | "getpass": { 845 | "version": "0.1.7", 846 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 847 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 848 | "requires": { 849 | "assert-plus": "1.0.0" 850 | } 851 | }, 852 | "glob": { 853 | "version": "7.1.2", 854 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 855 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", 856 | "dev": true, 857 | "requires": { 858 | "fs.realpath": "1.0.0", 859 | "inflight": "1.0.6", 860 | "inherits": "2.0.3", 861 | "minimatch": "3.0.4", 862 | "once": "1.4.0", 863 | "path-is-absolute": "1.0.1" 864 | } 865 | }, 866 | "globals": { 867 | "version": "9.18.0", 868 | "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", 869 | "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", 870 | "dev": true 871 | }, 872 | "globby": { 873 | "version": "5.0.0", 874 | "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", 875 | "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", 876 | "dev": true, 877 | "requires": { 878 | "array-union": "1.0.2", 879 | "arrify": "1.0.1", 880 | "glob": "7.1.2", 881 | "object-assign": "4.1.1", 882 | "pify": "2.3.0", 883 | "pinkie-promise": "2.0.1" 884 | } 885 | }, 886 | "graceful-fs": { 887 | "version": "4.1.11", 888 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", 889 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", 890 | "dev": true 891 | }, 892 | "growl": { 893 | "version": "1.9.2", 894 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", 895 | "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", 896 | "dev": true 897 | }, 898 | "har-schema": { 899 | "version": "2.0.0", 900 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 901 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" 902 | }, 903 | "har-validator": { 904 | "version": "5.0.3", 905 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", 906 | "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", 907 | "requires": { 908 | "ajv": "5.4.0", 909 | "har-schema": "2.0.0" 910 | } 911 | }, 912 | "has-ansi": { 913 | "version": "2.0.0", 914 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 915 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 916 | "dev": true, 917 | "requires": { 918 | "ansi-regex": "2.1.1" 919 | } 920 | }, 921 | "hawk": { 922 | "version": "6.0.2", 923 | "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", 924 | "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", 925 | "requires": { 926 | "boom": "4.3.1", 927 | "cryptiles": "3.1.2", 928 | "hoek": "4.2.0", 929 | "sntp": "2.1.0" 930 | } 931 | }, 932 | "hoek": { 933 | "version": "4.2.0", 934 | "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", 935 | "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==" 936 | }, 937 | "htmlparser2": { 938 | "version": "3.8.3", 939 | "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", 940 | "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", 941 | "requires": { 942 | "domelementtype": "1.3.0", 943 | "domhandler": "2.3.0", 944 | "domutils": "1.5.1", 945 | "entities": "1.0.0", 946 | "readable-stream": "1.1.14" 947 | }, 948 | "dependencies": { 949 | "entities": { 950 | "version": "1.0.0", 951 | "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", 952 | "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=" 953 | } 954 | } 955 | }, 956 | "http-signature": { 957 | "version": "1.2.0", 958 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 959 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 960 | "requires": { 961 | "assert-plus": "1.0.0", 962 | "jsprim": "1.4.1", 963 | "sshpk": "1.13.1" 964 | } 965 | }, 966 | "ignore": { 967 | "version": "3.3.7", 968 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", 969 | "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==", 970 | "dev": true 971 | }, 972 | "imurmurhash": { 973 | "version": "0.1.4", 974 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 975 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 976 | "dev": true 977 | }, 978 | "inflight": { 979 | "version": "1.0.6", 980 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 981 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 982 | "dev": true, 983 | "requires": { 984 | "once": "1.4.0", 985 | "wrappy": "1.0.2" 986 | } 987 | }, 988 | "inherits": { 989 | "version": "2.0.3", 990 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 991 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 992 | }, 993 | "inquirer": { 994 | "version": "0.12.0", 995 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", 996 | "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", 997 | "dev": true, 998 | "requires": { 999 | "ansi-escapes": "1.4.0", 1000 | "ansi-regex": "2.1.1", 1001 | "chalk": "1.1.3", 1002 | "cli-cursor": "1.0.2", 1003 | "cli-width": "2.2.0", 1004 | "figures": "1.7.0", 1005 | "lodash": "4.17.4", 1006 | "readline2": "1.0.1", 1007 | "run-async": "0.1.0", 1008 | "rx-lite": "3.1.2", 1009 | "string-width": "1.0.2", 1010 | "strip-ansi": "3.0.1", 1011 | "through": "2.3.8" 1012 | } 1013 | }, 1014 | "interpret": { 1015 | "version": "1.0.4", 1016 | "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.4.tgz", 1017 | "integrity": "sha1-ggzdWIuGj/sZGoCVBtbJyPISsbA=", 1018 | "dev": true 1019 | }, 1020 | "is-fullwidth-code-point": { 1021 | "version": "1.0.0", 1022 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 1023 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 1024 | "dev": true, 1025 | "requires": { 1026 | "number-is-nan": "1.0.1" 1027 | } 1028 | }, 1029 | "is-my-json-valid": { 1030 | "version": "2.16.1", 1031 | "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz", 1032 | "integrity": "sha512-ochPsqWS1WXj8ZnMIV0vnNXooaMhp7cyL4FMSIPKTtnV0Ha/T19G2b9kkhcNsabV9bxYkze7/aLZJb/bYuFduQ==", 1033 | "dev": true, 1034 | "requires": { 1035 | "generate-function": "2.0.0", 1036 | "generate-object-property": "1.2.0", 1037 | "jsonpointer": "4.0.1", 1038 | "xtend": "4.0.1" 1039 | } 1040 | }, 1041 | "is-path-cwd": { 1042 | "version": "1.0.0", 1043 | "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", 1044 | "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", 1045 | "dev": true 1046 | }, 1047 | "is-path-in-cwd": { 1048 | "version": "1.0.0", 1049 | "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", 1050 | "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", 1051 | "dev": true, 1052 | "requires": { 1053 | "is-path-inside": "1.0.0" 1054 | } 1055 | }, 1056 | "is-path-inside": { 1057 | "version": "1.0.0", 1058 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", 1059 | "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", 1060 | "dev": true, 1061 | "requires": { 1062 | "path-is-inside": "1.0.2" 1063 | } 1064 | }, 1065 | "is-property": { 1066 | "version": "1.0.2", 1067 | "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", 1068 | "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", 1069 | "dev": true 1070 | }, 1071 | "is-resolvable": { 1072 | "version": "1.0.0", 1073 | "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz", 1074 | "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=", 1075 | "dev": true, 1076 | "requires": { 1077 | "tryit": "1.0.3" 1078 | } 1079 | }, 1080 | "is-typedarray": { 1081 | "version": "1.0.0", 1082 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 1083 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 1084 | }, 1085 | "isarray": { 1086 | "version": "0.0.1", 1087 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 1088 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" 1089 | }, 1090 | "isstream": { 1091 | "version": "0.1.2", 1092 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 1093 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 1094 | }, 1095 | "jade": { 1096 | "version": "0.26.3", 1097 | "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", 1098 | "integrity": "sha1-jxDXl32NefL2/4YqgbBRPMslaGw=", 1099 | "dev": true, 1100 | "requires": { 1101 | "commander": "0.6.1", 1102 | "mkdirp": "0.3.0" 1103 | }, 1104 | "dependencies": { 1105 | "commander": { 1106 | "version": "0.6.1", 1107 | "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", 1108 | "integrity": "sha1-+mihT2qUXVTbvlDYzbMyDp47GgY=", 1109 | "dev": true 1110 | }, 1111 | "mkdirp": { 1112 | "version": "0.3.0", 1113 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", 1114 | "integrity": "sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=", 1115 | "dev": true 1116 | } 1117 | } 1118 | }, 1119 | "js-tokens": { 1120 | "version": "3.0.2", 1121 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", 1122 | "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", 1123 | "dev": true 1124 | }, 1125 | "js-yaml": { 1126 | "version": "3.10.0", 1127 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", 1128 | "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", 1129 | "dev": true, 1130 | "requires": { 1131 | "argparse": "1.0.9", 1132 | "esprima": "4.0.0" 1133 | }, 1134 | "dependencies": { 1135 | "esprima": { 1136 | "version": "4.0.0", 1137 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", 1138 | "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", 1139 | "dev": true 1140 | } 1141 | } 1142 | }, 1143 | "jsbn": { 1144 | "version": "0.1.1", 1145 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 1146 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", 1147 | "optional": true 1148 | }, 1149 | "jsdom": { 1150 | "version": "7.2.2", 1151 | "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-7.2.2.tgz", 1152 | "integrity": "sha1-QLQCdwwr2iNGkJa+6Rq2deOx/G4=", 1153 | "optional": true, 1154 | "requires": { 1155 | "abab": "1.0.4", 1156 | "acorn": "2.7.0", 1157 | "acorn-globals": "1.0.9", 1158 | "cssom": "0.3.2", 1159 | "cssstyle": "0.2.37", 1160 | "escodegen": "1.9.0", 1161 | "nwmatcher": "1.4.3", 1162 | "parse5": "1.5.1", 1163 | "request": "2.83.0", 1164 | "sax": "1.2.4", 1165 | "symbol-tree": "3.2.2", 1166 | "tough-cookie": "2.3.3", 1167 | "webidl-conversions": "2.0.1", 1168 | "whatwg-url-compat": "0.6.5", 1169 | "xml-name-validator": "2.0.1" 1170 | } 1171 | }, 1172 | "json-schema": { 1173 | "version": "0.2.3", 1174 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 1175 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" 1176 | }, 1177 | "json-schema-traverse": { 1178 | "version": "0.3.1", 1179 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", 1180 | "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" 1181 | }, 1182 | "json-stable-stringify": { 1183 | "version": "1.0.1", 1184 | "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", 1185 | "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", 1186 | "dev": true, 1187 | "requires": { 1188 | "jsonify": "0.0.0" 1189 | } 1190 | }, 1191 | "json-stringify-safe": { 1192 | "version": "5.0.1", 1193 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 1194 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 1195 | }, 1196 | "jsonify": { 1197 | "version": "0.0.0", 1198 | "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", 1199 | "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", 1200 | "dev": true 1201 | }, 1202 | "jsonpointer": { 1203 | "version": "4.0.1", 1204 | "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", 1205 | "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", 1206 | "dev": true 1207 | }, 1208 | "jsprim": { 1209 | "version": "1.4.1", 1210 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 1211 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 1212 | "requires": { 1213 | "assert-plus": "1.0.0", 1214 | "extsprintf": "1.3.0", 1215 | "json-schema": "0.2.3", 1216 | "verror": "1.10.0" 1217 | } 1218 | }, 1219 | "levn": { 1220 | "version": "0.3.0", 1221 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 1222 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 1223 | "requires": { 1224 | "prelude-ls": "1.1.2", 1225 | "type-check": "0.3.2" 1226 | } 1227 | }, 1228 | "lodash": { 1229 | "version": "4.17.4", 1230 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", 1231 | "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" 1232 | }, 1233 | "lru-cache": { 1234 | "version": "2.7.3", 1235 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", 1236 | "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", 1237 | "dev": true 1238 | }, 1239 | "mime-db": { 1240 | "version": "1.30.0", 1241 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", 1242 | "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" 1243 | }, 1244 | "mime-types": { 1245 | "version": "2.1.17", 1246 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", 1247 | "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", 1248 | "requires": { 1249 | "mime-db": "1.30.0" 1250 | } 1251 | }, 1252 | "minimatch": { 1253 | "version": "3.0.4", 1254 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1255 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1256 | "dev": true, 1257 | "requires": { 1258 | "brace-expansion": "1.1.8" 1259 | } 1260 | }, 1261 | "minimist": { 1262 | "version": "0.0.8", 1263 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 1264 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 1265 | "dev": true 1266 | }, 1267 | "mkdirp": { 1268 | "version": "0.5.1", 1269 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 1270 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 1271 | "dev": true, 1272 | "requires": { 1273 | "minimist": "0.0.8" 1274 | } 1275 | }, 1276 | "mocha": { 1277 | "version": "2.5.3", 1278 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-2.5.3.tgz", 1279 | "integrity": "sha1-FhvlvetJZ3HrmzV0UFC2IrWu/Fg=", 1280 | "dev": true, 1281 | "requires": { 1282 | "commander": "2.3.0", 1283 | "debug": "2.2.0", 1284 | "diff": "1.4.0", 1285 | "escape-string-regexp": "1.0.2", 1286 | "glob": "3.2.11", 1287 | "growl": "1.9.2", 1288 | "jade": "0.26.3", 1289 | "mkdirp": "0.5.1", 1290 | "supports-color": "1.2.0", 1291 | "to-iso-string": "0.0.2" 1292 | }, 1293 | "dependencies": { 1294 | "debug": { 1295 | "version": "2.2.0", 1296 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", 1297 | "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", 1298 | "dev": true, 1299 | "requires": { 1300 | "ms": "0.7.1" 1301 | } 1302 | }, 1303 | "escape-string-regexp": { 1304 | "version": "1.0.2", 1305 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz", 1306 | "integrity": "sha1-Tbwv5nTnGUnK8/smlc5/LcHZqNE=", 1307 | "dev": true 1308 | }, 1309 | "glob": { 1310 | "version": "3.2.11", 1311 | "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", 1312 | "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", 1313 | "dev": true, 1314 | "requires": { 1315 | "inherits": "2.0.3", 1316 | "minimatch": "0.3.0" 1317 | } 1318 | }, 1319 | "minimatch": { 1320 | "version": "0.3.0", 1321 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", 1322 | "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", 1323 | "dev": true, 1324 | "requires": { 1325 | "lru-cache": "2.7.3", 1326 | "sigmund": "1.0.1" 1327 | } 1328 | }, 1329 | "ms": { 1330 | "version": "0.7.1", 1331 | "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", 1332 | "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", 1333 | "dev": true 1334 | }, 1335 | "supports-color": { 1336 | "version": "1.2.0", 1337 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.2.0.tgz", 1338 | "integrity": "sha1-/x7R5hFp0Gs88tWI4YixjYhH4X4=", 1339 | "dev": true 1340 | } 1341 | } 1342 | }, 1343 | "ms": { 1344 | "version": "2.0.0", 1345 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1346 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 1347 | "dev": true 1348 | }, 1349 | "mute-stream": { 1350 | "version": "0.0.5", 1351 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", 1352 | "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", 1353 | "dev": true 1354 | }, 1355 | "natural-compare": { 1356 | "version": "1.4.0", 1357 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1358 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 1359 | "dev": true 1360 | }, 1361 | "nth-check": { 1362 | "version": "1.0.1", 1363 | "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", 1364 | "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", 1365 | "requires": { 1366 | "boolbase": "1.0.0" 1367 | } 1368 | }, 1369 | "number-is-nan": { 1370 | "version": "1.0.1", 1371 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 1372 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", 1373 | "dev": true 1374 | }, 1375 | "nwmatcher": { 1376 | "version": "1.4.3", 1377 | "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.3.tgz", 1378 | "integrity": "sha512-IKdSTiDWCarf2JTS5e9e2+5tPZGdkRJ79XjYV0pzK8Q9BpsFyBq1RGKxzs7Q8UBushGw7m6TzVKz6fcY99iSWw==", 1379 | "optional": true 1380 | }, 1381 | "oauth-sign": { 1382 | "version": "0.8.2", 1383 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", 1384 | "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" 1385 | }, 1386 | "object-assign": { 1387 | "version": "4.1.1", 1388 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1389 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 1390 | "dev": true 1391 | }, 1392 | "once": { 1393 | "version": "1.4.0", 1394 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1395 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1396 | "dev": true, 1397 | "requires": { 1398 | "wrappy": "1.0.2" 1399 | } 1400 | }, 1401 | "onetime": { 1402 | "version": "1.1.0", 1403 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", 1404 | "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", 1405 | "dev": true 1406 | }, 1407 | "optionator": { 1408 | "version": "0.8.2", 1409 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", 1410 | "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", 1411 | "requires": { 1412 | "deep-is": "0.1.3", 1413 | "fast-levenshtein": "2.0.6", 1414 | "levn": "0.3.0", 1415 | "prelude-ls": "1.1.2", 1416 | "type-check": "0.3.2", 1417 | "wordwrap": "1.0.0" 1418 | } 1419 | }, 1420 | "os-homedir": { 1421 | "version": "1.0.2", 1422 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", 1423 | "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", 1424 | "dev": true 1425 | }, 1426 | "parse5": { 1427 | "version": "1.5.1", 1428 | "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz", 1429 | "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ=", 1430 | "optional": true 1431 | }, 1432 | "path-is-absolute": { 1433 | "version": "1.0.1", 1434 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1435 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1436 | "dev": true 1437 | }, 1438 | "path-is-inside": { 1439 | "version": "1.0.2", 1440 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", 1441 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", 1442 | "dev": true 1443 | }, 1444 | "path-parse": { 1445 | "version": "1.0.5", 1446 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", 1447 | "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", 1448 | "dev": true 1449 | }, 1450 | "performance-now": { 1451 | "version": "2.1.0", 1452 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 1453 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" 1454 | }, 1455 | "pify": { 1456 | "version": "2.3.0", 1457 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 1458 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", 1459 | "dev": true 1460 | }, 1461 | "pinkie": { 1462 | "version": "2.0.4", 1463 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", 1464 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", 1465 | "dev": true 1466 | }, 1467 | "pinkie-promise": { 1468 | "version": "2.0.1", 1469 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", 1470 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", 1471 | "dev": true, 1472 | "requires": { 1473 | "pinkie": "2.0.4" 1474 | } 1475 | }, 1476 | "pluralize": { 1477 | "version": "1.2.1", 1478 | "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", 1479 | "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", 1480 | "dev": true 1481 | }, 1482 | "prelude-ls": { 1483 | "version": "1.1.2", 1484 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 1485 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" 1486 | }, 1487 | "process-nextick-args": { 1488 | "version": "1.0.7", 1489 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", 1490 | "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", 1491 | "dev": true 1492 | }, 1493 | "progress": { 1494 | "version": "1.1.8", 1495 | "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", 1496 | "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", 1497 | "dev": true 1498 | }, 1499 | "punycode": { 1500 | "version": "1.4.1", 1501 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 1502 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" 1503 | }, 1504 | "qs": { 1505 | "version": "6.5.1", 1506 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", 1507 | "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" 1508 | }, 1509 | "readable-stream": { 1510 | "version": "1.1.14", 1511 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", 1512 | "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", 1513 | "requires": { 1514 | "core-util-is": "1.0.2", 1515 | "inherits": "2.0.3", 1516 | "isarray": "0.0.1", 1517 | "string_decoder": "0.10.31" 1518 | } 1519 | }, 1520 | "readline2": { 1521 | "version": "1.0.1", 1522 | "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", 1523 | "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", 1524 | "dev": true, 1525 | "requires": { 1526 | "code-point-at": "1.1.0", 1527 | "is-fullwidth-code-point": "1.0.0", 1528 | "mute-stream": "0.0.5" 1529 | } 1530 | }, 1531 | "rechoir": { 1532 | "version": "0.6.2", 1533 | "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", 1534 | "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", 1535 | "dev": true, 1536 | "requires": { 1537 | "resolve": "1.5.0" 1538 | } 1539 | }, 1540 | "request": { 1541 | "version": "2.83.0", 1542 | "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", 1543 | "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", 1544 | "requires": { 1545 | "aws-sign2": "0.7.0", 1546 | "aws4": "1.6.0", 1547 | "caseless": "0.12.0", 1548 | "combined-stream": "1.0.5", 1549 | "extend": "3.0.1", 1550 | "forever-agent": "0.6.1", 1551 | "form-data": "2.3.1", 1552 | "har-validator": "5.0.3", 1553 | "hawk": "6.0.2", 1554 | "http-signature": "1.2.0", 1555 | "is-typedarray": "1.0.0", 1556 | "isstream": "0.1.2", 1557 | "json-stringify-safe": "5.0.1", 1558 | "mime-types": "2.1.17", 1559 | "oauth-sign": "0.8.2", 1560 | "performance-now": "2.1.0", 1561 | "qs": "6.5.1", 1562 | "safe-buffer": "5.1.1", 1563 | "stringstream": "0.0.5", 1564 | "tough-cookie": "2.3.3", 1565 | "tunnel-agent": "0.6.0", 1566 | "uuid": "3.1.0" 1567 | } 1568 | }, 1569 | "require-uncached": { 1570 | "version": "1.0.3", 1571 | "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", 1572 | "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", 1573 | "dev": true, 1574 | "requires": { 1575 | "caller-path": "0.1.0", 1576 | "resolve-from": "1.0.1" 1577 | } 1578 | }, 1579 | "resolve": { 1580 | "version": "1.5.0", 1581 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", 1582 | "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", 1583 | "dev": true, 1584 | "requires": { 1585 | "path-parse": "1.0.5" 1586 | } 1587 | }, 1588 | "resolve-from": { 1589 | "version": "1.0.1", 1590 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", 1591 | "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", 1592 | "dev": true 1593 | }, 1594 | "restore-cursor": { 1595 | "version": "1.0.1", 1596 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", 1597 | "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", 1598 | "dev": true, 1599 | "requires": { 1600 | "exit-hook": "1.1.1", 1601 | "onetime": "1.1.0" 1602 | } 1603 | }, 1604 | "rimraf": { 1605 | "version": "2.6.2", 1606 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", 1607 | "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", 1608 | "dev": true, 1609 | "requires": { 1610 | "glob": "7.1.2" 1611 | } 1612 | }, 1613 | "run-async": { 1614 | "version": "0.1.0", 1615 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", 1616 | "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", 1617 | "dev": true, 1618 | "requires": { 1619 | "once": "1.4.0" 1620 | } 1621 | }, 1622 | "rx-lite": { 1623 | "version": "3.1.2", 1624 | "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", 1625 | "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", 1626 | "dev": true 1627 | }, 1628 | "safe-buffer": { 1629 | "version": "5.1.1", 1630 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", 1631 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" 1632 | }, 1633 | "sax": { 1634 | "version": "1.2.4", 1635 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", 1636 | "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", 1637 | "optional": true 1638 | }, 1639 | "shelljs": { 1640 | "version": "0.7.8", 1641 | "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", 1642 | "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", 1643 | "dev": true, 1644 | "requires": { 1645 | "glob": "7.1.2", 1646 | "interpret": "1.0.4", 1647 | "rechoir": "0.6.2" 1648 | } 1649 | }, 1650 | "sigmund": { 1651 | "version": "1.0.1", 1652 | "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", 1653 | "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", 1654 | "dev": true 1655 | }, 1656 | "slice-ansi": { 1657 | "version": "0.0.4", 1658 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", 1659 | "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", 1660 | "dev": true 1661 | }, 1662 | "sntp": { 1663 | "version": "2.1.0", 1664 | "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", 1665 | "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", 1666 | "requires": { 1667 | "hoek": "4.2.0" 1668 | } 1669 | }, 1670 | "source-map": { 1671 | "version": "0.5.7", 1672 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 1673 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", 1674 | "optional": true 1675 | }, 1676 | "sprintf-js": { 1677 | "version": "1.0.3", 1678 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 1679 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 1680 | "dev": true 1681 | }, 1682 | "sshpk": { 1683 | "version": "1.13.1", 1684 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", 1685 | "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", 1686 | "requires": { 1687 | "asn1": "0.2.3", 1688 | "assert-plus": "1.0.0", 1689 | "bcrypt-pbkdf": "1.0.1", 1690 | "dashdash": "1.14.1", 1691 | "ecc-jsbn": "0.1.1", 1692 | "getpass": "0.1.7", 1693 | "jsbn": "0.1.1", 1694 | "tweetnacl": "0.14.5" 1695 | } 1696 | }, 1697 | "string-width": { 1698 | "version": "1.0.2", 1699 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 1700 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 1701 | "dev": true, 1702 | "requires": { 1703 | "code-point-at": "1.1.0", 1704 | "is-fullwidth-code-point": "1.0.0", 1705 | "strip-ansi": "3.0.1" 1706 | } 1707 | }, 1708 | "string_decoder": { 1709 | "version": "0.10.31", 1710 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 1711 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" 1712 | }, 1713 | "stringstream": { 1714 | "version": "0.0.5", 1715 | "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", 1716 | "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" 1717 | }, 1718 | "strip-ansi": { 1719 | "version": "3.0.1", 1720 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 1721 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 1722 | "dev": true, 1723 | "requires": { 1724 | "ansi-regex": "2.1.1" 1725 | } 1726 | }, 1727 | "strip-bom": { 1728 | "version": "3.0.0", 1729 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", 1730 | "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", 1731 | "dev": true 1732 | }, 1733 | "strip-json-comments": { 1734 | "version": "2.0.1", 1735 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 1736 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 1737 | "dev": true 1738 | }, 1739 | "supports-color": { 1740 | "version": "2.0.0", 1741 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 1742 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 1743 | "dev": true 1744 | }, 1745 | "symbol-tree": { 1746 | "version": "3.2.2", 1747 | "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", 1748 | "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=", 1749 | "optional": true 1750 | }, 1751 | "table": { 1752 | "version": "3.8.3", 1753 | "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", 1754 | "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", 1755 | "dev": true, 1756 | "requires": { 1757 | "ajv": "4.11.8", 1758 | "ajv-keywords": "1.5.1", 1759 | "chalk": "1.1.3", 1760 | "lodash": "4.17.4", 1761 | "slice-ansi": "0.0.4", 1762 | "string-width": "2.1.1" 1763 | }, 1764 | "dependencies": { 1765 | "ajv": { 1766 | "version": "4.11.8", 1767 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", 1768 | "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", 1769 | "dev": true, 1770 | "requires": { 1771 | "co": "4.6.0", 1772 | "json-stable-stringify": "1.0.1" 1773 | } 1774 | }, 1775 | "ansi-regex": { 1776 | "version": "3.0.0", 1777 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 1778 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 1779 | "dev": true 1780 | }, 1781 | "is-fullwidth-code-point": { 1782 | "version": "2.0.0", 1783 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 1784 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 1785 | "dev": true 1786 | }, 1787 | "string-width": { 1788 | "version": "2.1.1", 1789 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 1790 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 1791 | "dev": true, 1792 | "requires": { 1793 | "is-fullwidth-code-point": "2.0.0", 1794 | "strip-ansi": "4.0.0" 1795 | } 1796 | }, 1797 | "strip-ansi": { 1798 | "version": "4.0.0", 1799 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 1800 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 1801 | "dev": true, 1802 | "requires": { 1803 | "ansi-regex": "3.0.0" 1804 | } 1805 | } 1806 | } 1807 | }, 1808 | "text-table": { 1809 | "version": "0.2.0", 1810 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 1811 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 1812 | "dev": true 1813 | }, 1814 | "through": { 1815 | "version": "2.3.8", 1816 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1817 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 1818 | "dev": true 1819 | }, 1820 | "to-iso-string": { 1821 | "version": "0.0.2", 1822 | "resolved": "https://registry.npmjs.org/to-iso-string/-/to-iso-string-0.0.2.tgz", 1823 | "integrity": "sha1-TcGeZk38y+Jb2NtQiwDG2hWCVdE=", 1824 | "dev": true 1825 | }, 1826 | "tough-cookie": { 1827 | "version": "2.3.3", 1828 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", 1829 | "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", 1830 | "requires": { 1831 | "punycode": "1.4.1" 1832 | } 1833 | }, 1834 | "tr46": { 1835 | "version": "0.0.3", 1836 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 1837 | "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", 1838 | "optional": true 1839 | }, 1840 | "tryit": { 1841 | "version": "1.0.3", 1842 | "resolved": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", 1843 | "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=", 1844 | "dev": true 1845 | }, 1846 | "tunnel-agent": { 1847 | "version": "0.6.0", 1848 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 1849 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 1850 | "requires": { 1851 | "safe-buffer": "5.1.1" 1852 | } 1853 | }, 1854 | "tweetnacl": { 1855 | "version": "0.14.5", 1856 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 1857 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", 1858 | "optional": true 1859 | }, 1860 | "type-check": { 1861 | "version": "0.3.2", 1862 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 1863 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 1864 | "requires": { 1865 | "prelude-ls": "1.1.2" 1866 | } 1867 | }, 1868 | "type-detect": { 1869 | "version": "1.0.0", 1870 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz", 1871 | "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=", 1872 | "dev": true 1873 | }, 1874 | "typedarray": { 1875 | "version": "0.0.6", 1876 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 1877 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", 1878 | "dev": true 1879 | }, 1880 | "user-home": { 1881 | "version": "2.0.0", 1882 | "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", 1883 | "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", 1884 | "dev": true, 1885 | "requires": { 1886 | "os-homedir": "1.0.2" 1887 | } 1888 | }, 1889 | "util-deprecate": { 1890 | "version": "1.0.2", 1891 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1892 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 1893 | "dev": true 1894 | }, 1895 | "uuid": { 1896 | "version": "3.1.0", 1897 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", 1898 | "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" 1899 | }, 1900 | "verror": { 1901 | "version": "1.10.0", 1902 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 1903 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 1904 | "requires": { 1905 | "assert-plus": "1.0.0", 1906 | "core-util-is": "1.0.2", 1907 | "extsprintf": "1.3.0" 1908 | } 1909 | }, 1910 | "webidl-conversions": { 1911 | "version": "2.0.1", 1912 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-2.0.1.tgz", 1913 | "integrity": "sha1-O/glj30xjHRDw28uFpQCoaZwNQY=", 1914 | "optional": true 1915 | }, 1916 | "whatwg-url-compat": { 1917 | "version": "0.6.5", 1918 | "resolved": "https://registry.npmjs.org/whatwg-url-compat/-/whatwg-url-compat-0.6.5.tgz", 1919 | "integrity": "sha1-AImBEa9om7CXVBzVpFymyHmERb8=", 1920 | "optional": true, 1921 | "requires": { 1922 | "tr46": "0.0.3" 1923 | } 1924 | }, 1925 | "wordwrap": { 1926 | "version": "1.0.0", 1927 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", 1928 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" 1929 | }, 1930 | "wrappy": { 1931 | "version": "1.0.2", 1932 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1933 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1934 | "dev": true 1935 | }, 1936 | "write": { 1937 | "version": "0.2.1", 1938 | "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", 1939 | "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", 1940 | "dev": true, 1941 | "requires": { 1942 | "mkdirp": "0.5.1" 1943 | } 1944 | }, 1945 | "xml-name-validator": { 1946 | "version": "2.0.1", 1947 | "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz", 1948 | "integrity": "sha1-TYuPHszTQZqjYgYb7O9RXh5VljU=", 1949 | "optional": true 1950 | }, 1951 | "xtend": { 1952 | "version": "4.0.1", 1953 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", 1954 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", 1955 | "dev": true 1956 | } 1957 | } 1958 | } 1959 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "node-bypasser", 3 | "version": "1.8.0", 4 | "description": "A module for expanding shortened URLs and bypassing ads", 5 | "main": "index.js", 6 | "keywords": [ 7 | "bypasser", 8 | "ads", 9 | "shortener", 10 | "adf.ly", 11 | "shorte.st", 12 | "linkbucks.com", 13 | "bc.vc" 14 | ], 15 | "author": "Matteo Contrini ", 16 | "contributors": [ 17 | "Khoa Nguyen" 18 | ], 19 | "license": "MIT", 20 | "dependencies": { 21 | "cheerio": "^0.20.0", 22 | "request": "^2.74.0" 23 | }, 24 | "repository": "matteocontrini/node-bypasser", 25 | "bugs": { 26 | "url": "https://github.com/matteocontrini/node-bypasser/issues" 27 | }, 28 | "devDependencies": { 29 | "chai": "^3.4.1", 30 | "eslint": "^3.2.0", 31 | "mocha": "^2.3.3" 32 | }, 33 | "scripts": { 34 | "test": "mocha", 35 | "lint": "eslint ." 36 | }, 37 | "tonicExampleFilename": "tonic-example.js" 38 | } 39 | -------------------------------------------------------------------------------- /service.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Service entity with the implementation of link expansion 3 | * @param {String} name - Name of the service 4 | */ 5 | function Service(name) { 6 | this.name = name || null; 7 | this.hosts = null; 8 | this.run = null; 9 | } 10 | 11 | module.exports = Service; 12 | -------------------------------------------------------------------------------- /services.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | const path = require('path'); 3 | 4 | // Loop through file and create a services array 5 | var files = fs.readdirSync(path.join(__dirname, 'services')); 6 | var services = []; 7 | 8 | files.forEach(function(file) { 9 | if (file.match(/.*\.js/i)) { 10 | var mod = require('./services/' + file); 11 | services.push(mod); 12 | } 13 | }); 14 | 15 | module.exports = services; 16 | -------------------------------------------------------------------------------- /services/__generic.js: -------------------------------------------------------------------------------- 1 | /* 2 | Generic / Unknown services 3 | */ 4 | 5 | var request = require('request'); 6 | 7 | var Service = require('../service.js'); 8 | 9 | var service = new Service('Generic'); 10 | service.hosts = []; 11 | 12 | service.run = function(url, callback) { 13 | var options = { 14 | url: url, 15 | followRedirect: false 16 | }; 17 | 18 | request(options, function(error, response, body) { 19 | if (error || [301, 302].indexOf(response.statusCode) == -1) { 20 | callback('URL not recognized as supported'); 21 | return; 22 | } 23 | 24 | callback(null, response.headers.location); 25 | }); 26 | }; 27 | 28 | module.exports = service; 29 | -------------------------------------------------------------------------------- /services/adfly.js: -------------------------------------------------------------------------------- 1 | /* 2 | Adf.ly 3 | Hosts: adf.ly 4 | */ 5 | 6 | var request = require('request'); 7 | 8 | var Service = require('../service.js'); 9 | 10 | var service = new Service('Adf.ly'); 11 | service.hosts = ['adf.ly']; 12 | 13 | service.run = function(url, callback) { 14 | request(url, function(error, response, body) { 15 | if (error || response.statusCode != 200) { 16 | callback('Error while fetching the given URL. Response code: ' + response.statusCode); 17 | return; 18 | } 19 | 20 | var match = body.match(/var ysmm = '(.*?)';/); 21 | if (match) { 22 | var ysmm = match[1]; 23 | var a = ''; 24 | var b = ''; 25 | for (var i = 0; i < ysmm.length; ++i) { 26 | if (i % 2 === 0) { 27 | a = a + ysmm.charAt(i); 28 | } else { 29 | b = ysmm.charAt(i) + b; 30 | } 31 | } 32 | ysmm = a + b; 33 | a = ysmm.split(''); 34 | for (var i = 0; i < a.length; ++i) { 35 | if (/\d/.test(a[i])) { 36 | for (var j = i + 1; j < a.length; ++j) { 37 | if (/\d/.test(a[j])) { 38 | b = a[i] ^ a[j]; 39 | if (b < 10) { 40 | a[i] = b; 41 | } 42 | i = j; 43 | j = a.length; 44 | } 45 | } 46 | } 47 | } 48 | 49 | ysmm = a.join(''); 50 | ysmm = new Buffer(ysmm, 'base64').toString('ascii'); 51 | ysmm = ysmm.substring(16); 52 | ysmm = ysmm.substring(0, ysmm.length - 16); 53 | 54 | callback(null, ysmm); 55 | } 56 | else { 57 | callback('The URL cannot be decrypted'); 58 | return; 59 | } 60 | }); 61 | }; 62 | 63 | module.exports = service; 64 | -------------------------------------------------------------------------------- /services/adfoc.js: -------------------------------------------------------------------------------- 1 | /* 2 | AdFoc.us 3 | Hosts: adfoc.us 4 | */ 5 | 6 | var request = require('request'); 7 | 8 | var Service = require('../service.js'); 9 | 10 | var service = new Service('AdFoc.us'); 11 | service.hosts = ['adfoc.us']; 12 | 13 | service.run = function(url, callback) { 14 | var options = { 15 | uri: url, 16 | headers: { 17 | Accept: 'text/html' 18 | } 19 | }; 20 | 21 | request(options, function(error, response, body) { 22 | if (error || response.statusCode != 200) { 23 | callback('Error while fetching the given URL. Response code: ' + response.statusCode); 24 | return; 25 | } 26 | 27 | var match = body.match(/click_url = "(.+?)";/); 28 | if (!match) { 29 | callback('The URL cannot be decrypted'); 30 | return; 31 | } 32 | 33 | callback(null, match[1]); 34 | }); 35 | }; 36 | 37 | module.exports = service; 38 | -------------------------------------------------------------------------------- /services/bc.vc.js: -------------------------------------------------------------------------------- 1 | /* 2 | Bc.vc 3 | Hosts: bc.vc 4 | */ 5 | 6 | var request = require('request'); 7 | 8 | var Service = require('../service.js'); 9 | 10 | var service = new Service('Bc.vc'); 11 | service.hosts = ['bc.vc']; 12 | 13 | service.run = function(url, callback) { 14 | request = request.defaults({ jar: true }); 15 | 16 | request(url, function(error, response, body) { 17 | if (error || response.statusCode != 200) { 18 | callback('Error while fetching the given URL. Response code: ' + response.statusCode); 19 | return; 20 | } 21 | 22 | var match = body.match(/{\s*opt:\s*'make_log',\s*args:\s*{[:,\'\w\s]+}\s*}/); 23 | if (!match) { 24 | callback('The URL cannot be decrypted'); 25 | return; 26 | } 27 | 28 | // Fix JSON response (http://qr.ae/d4PoJ) 29 | var payload = match[0]; 30 | var toReplace = ['tZ', 'cW', 'cH', 'sW', 'sH']; 31 | toReplace.forEach(function(k) { 32 | payload = payload.replace(k, '""'); 33 | }); 34 | 35 | payload = payload.replace(/'/g, '"').replace(/(['"])?([a-zA-Z0-9_]+)(['"])?:/g, '"$2": '); 36 | 37 | var params = JSON.parse(payload); 38 | 39 | var postUrl = 'http://bc.vc/fly/ajax.fly.php'; 40 | var headers = { 41 | Host: 'bc.vc', 42 | Origin: 'http://bc.vc', 43 | Referer: url 44 | }; 45 | 46 | var checks_log_option = { 47 | url: postUrl, 48 | form: { opt: 'checks_log' }, 49 | headers: headers 50 | }; 51 | 52 | var check_log_options = function() { 53 | params['opt'] = 'check_log'; 54 | return { 55 | url: postUrl, 56 | form: params, 57 | headers: headers 58 | }; 59 | }; 60 | 61 | var make_log_options = function() { 62 | params['opt'] = 'make_log'; 63 | return { 64 | url: postUrl, 65 | form: params, 66 | headers: headers 67 | }; 68 | }; 69 | 70 | var t = setInterval(function() { 71 | request.post(checks_log_option, function(error, response, body) { 72 | if (error || response.statusCode != 200) { 73 | callback('Error while fetching the given URL. Response code: ' + response.statusCode); 74 | clearInterval(t); 75 | return; 76 | } 77 | 78 | request.post(check_log_options(), function(error, response, body) { 79 | if (error || response.statusCode != 200) { 80 | callback('Error while fetching the given URL. Response code: ' + response.statusCode); 81 | clearInterval(t); 82 | return; 83 | } 84 | 85 | request.post(make_log_options(), function(error, response, body) { 86 | if (error || response.statusCode != 200) { 87 | callback('Error while fetching the given URL. Response code: ' + response.statusCode); 88 | clearInterval(t); 89 | return; 90 | } 91 | 92 | var res = JSON.parse(body); 93 | if (res.message && res.message.url.length > 1) 94 | { 95 | clearInterval(t); 96 | callback(null, res.message.url); 97 | return; 98 | } 99 | }); 100 | }); 101 | }); 102 | }, 2000); 103 | }); 104 | }; 105 | 106 | module.exports = service; 107 | -------------------------------------------------------------------------------- /services/link5s.com.js: -------------------------------------------------------------------------------- 1 | /* 2 | Link5s.com 3 | Hosts: link5s.com 4 | */ 5 | 6 | var request = require('request'); 7 | 8 | var Service = require('../service.js'); 9 | var cheerio = require('cheerio'); 10 | var _url = require('url'); 11 | 12 | var service = new Service('Link5s.com'); 13 | service.hosts = ['link5s.com']; 14 | 15 | service.run = function(url, callback) { 16 | // Enable cookies 17 | request = request.defaults({ jar: true }); 18 | 19 | request(url, function(error, response, body) { 20 | if (error || response.statusCode != 200) { 21 | callback('Error while fetching the given URL. Response code: ' + response.statusCode); 22 | return; 23 | } 24 | 25 | var $ = cheerio.load(body); 26 | 27 | var seconds = 6; 28 | var cmpID = $('#iframeID').attr('data-cmp'); 29 | var user = $('#iframeID').attr('data-u'); 30 | var postUrl = 'http://link5s.com/ajax/r.php'; 31 | // Get url path without slash 32 | var page = _url.parse(url).pathname.slice(1); 33 | 34 | var options = { 35 | url: postUrl, 36 | form: { page: page, advID: cmpID, u: user }, 37 | method: 'POST' 38 | }; 39 | 40 | setTimeout(updateCountdown, 1000); 41 | 42 | function updateCountdown() { 43 | seconds--; 44 | if (seconds >= 0) { 45 | request(options, function(error, response, body) { 46 | if (error || response.statusCode != 200) { 47 | callback('Error while fetching the given URL. Response code: ' + response.statusCode); 48 | return; 49 | } 50 | 51 | // If we get final result 52 | if (body.length > 1) { 53 | 54 | $ = cheerio.load(body); 55 | var link = $('a').attr('href'); 56 | 57 | if (link) { 58 | callback(null, link); 59 | } 60 | else { 61 | callback('The URL cannot be decrypted'); 62 | } 63 | } 64 | }); 65 | 66 | setTimeout(updateCountdown, 1000); 67 | } 68 | } 69 | }); 70 | }; 71 | 72 | module.exports = service; 73 | -------------------------------------------------------------------------------- /services/linkbucks.js: -------------------------------------------------------------------------------- 1 | /* 2 | Linkbucks 3 | Hosts: linkbucks.com and another one that changes sometimes 4 | NOTE: there is a bunch of other domains, but they usually 5 | just redirect to linkbucks.com or the other domain 6 | */ 7 | 8 | var request = require('request'); 9 | 10 | var Service = require('../service.js'); 11 | 12 | var service = new Service('Linkbucks'); 13 | service.hosts = ['linkbucks.com', 'zatnawqy.net', 'zytpirwai.net']; 14 | 15 | service.run = function(url, callback) { 16 | request(url, function(error, response, body) { 17 | if (error || response.statusCode != 200) { 18 | callback('Error while fetching the given URL. Response code: ' + response.statusCode); 19 | return; 20 | } 21 | 22 | var lines = body.match(/[^\r\n]+/g); 23 | var startLine = -1; 24 | var endLine = -1; 25 | var found = false; 26 | var line = null; 27 | 28 | for (var i = 0; i < lines.length; i++) { 29 | line = lines[i]; 30 | if (line.trim().startsWith('(function() {')) { 31 | startLine = i; 32 | continue; 33 | } 34 | if (line.trim().startsWith('})();')) { 35 | if (found) { 36 | // Found the right function block; exit 37 | endLine = i; 38 | break; 39 | } 40 | else { 41 | // Restart search... 42 | startLine = -1; 43 | continue; 44 | } 45 | } 46 | if (startLine == -1) { 47 | continue; 48 | } 49 | 50 | if (line.trim().startsWith('var f = window[\'init\' + \'Lb\' + \'js\' + \'\'];')) { 51 | found = true; 52 | } 53 | } 54 | 55 | if (startLine == -1 || endLine == -1) { 56 | callback('The URL cannot be decrypted'); 57 | return; 58 | } 59 | 60 | var block = lines.slice(startLine, endLine); 61 | var token = null; 62 | var authKey = null; 63 | var adUrl = null; 64 | var step = 1; 65 | 66 | for (i = 0; i < block.length && step <= 2; i++) { 67 | line = block[i].trim(); 68 | 69 | // Find token 70 | if (token == null && line.startsWith('Token')) { 71 | token = line.match(/Token: '([a-z0-9]+)',/)[1]; 72 | 73 | continue; 74 | } 75 | 76 | // Find the ad url 77 | if (adUrl == null && line.startsWith('AdUrl')) { 78 | adUrl = line.match(/AdUrl: '(.+?)',/)[1]; 79 | 80 | continue; 81 | } 82 | 83 | // Find auth key 84 | if (authKey == null && line.startsWith('params')) { 85 | authKey = +line.match(/ = (\d+)/)[1]; 86 | 87 | // Next step is getting the salt 88 | step = 2; 89 | continue; 90 | } 91 | 92 | // Find auth key salt 93 | if (step == 2 && line.startsWith('params')) { 94 | var salt = +line.match(/ \+ (\d+);/)[1]; 95 | authKey = authKey + salt; 96 | 97 | // This makes the loop stop 98 | step = 3; 99 | continue; 100 | } 101 | } 102 | 103 | // Request the ad URL and pass the server-side check 104 | request(adUrl); 105 | 106 | // Wait 5 seconds and make the call 107 | setTimeout(function() { 108 | 109 | var call = 'http://www.linkbucks.com/intermission/loadTargetUrl?t=' + token + '&aK=' + authKey + '&a_b=false'; 110 | 111 | request(call, function(error, response, body) { 112 | if (error || response.statusCode != 200) { 113 | callback('The URL cannot be decrypted. Response code: ' + response.statusCode); 114 | return; 115 | } 116 | 117 | // Parse the JSON response 118 | response = JSON.parse(body); 119 | if (response['Success'] === true && 120 | !response['AdBlockSpotted'] && 121 | response['Url'] 122 | ) { 123 | callback(null, response['Url']); 124 | } 125 | else { 126 | callback('The URL cannot be decrypted: ' + body); 127 | } 128 | }); 129 | }, 5000); 130 | 131 | }); 132 | }; 133 | 134 | module.exports = service; 135 | -------------------------------------------------------------------------------- /services/linkshrink.net.js: -------------------------------------------------------------------------------- 1 | /* 2 | LinkShrink.net 3 | Hosts: p.pw 4 | */ 5 | 6 | var request = require('request'); 7 | 8 | var Service = require('../service.js'); 9 | 10 | var service = new Service('LinkShrink.net'); 11 | service.hosts = ['linkshrink.net']; 12 | 13 | service.run = function(url, callback) { 14 | var options = { 15 | url: url, 16 | followRedirect: false 17 | }; 18 | 19 | request(options, function(error, response, body) { 20 | if (error || response.statusCode != 200) { 21 | callback('Unexpected response status code. Response code: ' + response.statusCode); 22 | return; 23 | } 24 | 25 | var match = body.match(/\.href = revC\("(.*?)"\)/); 26 | if (!match) { 27 | callback('Cannot find the target URL'); 28 | return; 29 | } 30 | 31 | var redirectUrl = 'https://linkshrink.net/' + new Buffer(match[1], 'base64').toString(); 32 | 33 | //TODO : Retractor this 34 | request({ url: redirectUrl, followRedirect: false }, function(error, response, body) { 35 | if (error || response.statusCode != 302) { 36 | callback('Unexpected response status code. Response code: ' + response.statusCode); 37 | return; 38 | } 39 | callback(null, response.headers.location); 40 | }); 41 | }); 42 | }; 43 | 44 | module.exports = service; 45 | -------------------------------------------------------------------------------- /services/nowvideo.js: -------------------------------------------------------------------------------- 1 | /* 2 | NowVideo 3 | Hosts: nowvideo.li, nowvideo.eu, nowvideo.ch, 4 | nowvideo.sx, nowvideo.co, nowvideo.ag, 5 | nowvideo.ec, novamov.com 6 | */ 7 | 8 | var request = require('request'); 9 | 10 | var Service = require('../service.js'); 11 | 12 | var service = new Service('NowVideo'); 13 | service.hosts = ['nowvideo.li', 'nowvideo.eu', 'nowvideo.ch', 'nowvideo.sx', 14 | 'nowvideo.co', 'nowvideo.ag', 'nowvideo.ec', 15 | 'auroravid.to']; 16 | 17 | service.run = function(url, callback) { 18 | // Switch to mobile page 19 | // http://www.auroravid.to/video/94f6df18e053e 20 | // http://www.auroravid.to/mobile/video.php?id=94f6df18e053e 21 | url = url.replace('video/', 'mobile/video.php?id='); 22 | 23 | request(url, function(error, response, body) { 24 | if (error || response.statusCode != 200) { 25 | callback('Error while fetching the given URL. Response code: ' + response.statusCode); 26 | return; 27 | } 28 | 29 | var match = body.match(/ Linkbucks', function(done) { 37 | var b = new Bypasser('http://www.cash4files.com/AAnqF'); 38 | b.decrypt(function(err, result) { 39 | expect(err).to.be.null; 40 | expect(result).to.equal('http://github.com'); 41 | done(); 42 | }); 43 | }); 44 | 45 | it('Shorte.st', function(done) { 46 | var b = new Bypasser('http://sh.st/gS8XD'); 47 | b.decrypt(function(err, result) { 48 | expect(err).to.be.null; 49 | expect(result).to.equal('http://github.com'); 50 | done(); 51 | }); 52 | }); 53 | 54 | it('AdFoc.us', function(done) { 55 | var b = new Bypasser('http://adfoc.us/x57045654'); 56 | b.decrypt(function(err, result) { 57 | expect(err).to.be.null; 58 | expect(result).to.equal('http://github.com'); 59 | done(); 60 | }); 61 | }); 62 | 63 | it('P.pw', function(done) { 64 | var b = new Bypasser('http://p.pw/bai1hN'); 65 | b.decrypt(function(err, result) { 66 | expect(err).to.be.null; 67 | expect(result).to.equal('http://github.com'); 68 | done(); 69 | }); 70 | }); 71 | 72 | it('LinkShrink.net', function(done) { 73 | var b = new Bypasser('http://linkshrink.net/7bzlRS'); 74 | b.decrypt(function(err, result) { 75 | expect(err).to.be.null; 76 | expect(result).to.equal('http://github.com'); 77 | done(); 78 | }); 79 | }); 80 | 81 | it('Link5s.com', function(done) { 82 | var b = new Bypasser('http://link5s.com/Gmq'); 83 | b.decrypt(function(err, result) { 84 | expect(err).to.be.null; 85 | expect(result).to.equal('http://github.com'); 86 | done(); 87 | }); 88 | }); 89 | 90 | it('Generic goo.gl', function(done) { 91 | var b = new Bypasser('http://goo.gl/NWt4Es'); 92 | b.decrypt(function(err, result) { 93 | expect(err).to.be.null; 94 | expect(result).to.equal('http://github.com/'); 95 | done(); 96 | }); 97 | }); 98 | 99 | it('Generic custom bit.ly', function(done) { 100 | var b = new Bypasser('http://l.khoanguyen.me/1HBv4tx'); 101 | b.decrypt(function(err, result) { 102 | expect(err).to.be.null; 103 | expect(result).to.equal('http://github.com/'); 104 | done(); 105 | }); 106 | }); 107 | 108 | it('NowVideo', function(done) { 109 | var b = new Bypasser('http://www.nowvideo.li/video/9f86b7f7f0a31'); 110 | b.decrypt(function(err, result) { 111 | expect(err).to.be.null; 112 | expect(result.slice(-4)).to.equal('.mp4'); 113 | done(); 114 | }); 115 | }); 116 | 117 | it('AuroraVid', function(done) { 118 | var b = new Bypasser('http://www.auroravid.to/video/94f6df18e053e'); 119 | b.decrypt(function(err, result) { 120 | expect(err).to.be.null; 121 | expect(result.slice(-4)).to.equal('.flv'); 122 | done(); 123 | }); 124 | }); 125 | 126 | it('Throw error when receive invalid URL', function(done) { 127 | var b = new Bypasser('github.com'); 128 | b.decrypt(function(err, result) { 129 | expect(result).to.be.undefined; 130 | expect(err).to.equal('This is not a valid url'); 131 | done(); 132 | }); 133 | }); 134 | 135 | it('Bc.vc', function(done) { 136 | var b = new Bypasser('http://bc.vc/Eu0Oiv'); 137 | b.decrypt(function(err, result) { 138 | expect(err).to.be.null; 139 | expect(result).to.equal('http://github.com'); 140 | done(); 141 | }); 142 | }); 143 | }); 144 | -------------------------------------------------------------------------------- /test/match.js: -------------------------------------------------------------------------------- 1 | /*jshint expr: true*/ 2 | var expect = require('chai').expect; 3 | 4 | var Bypasser = require('../index.js'); 5 | 6 | describe('Match URL to host', function() { 7 | it('Adf.ly', function() { 8 | var b = new Bypasser('http://adf.ly/pVVXg'); 9 | expect(b.service.name).to.equal('Adf.ly'); 10 | }); 11 | 12 | it('Linkbucks', function() { 13 | var b = new Bypasser('http://www.linkbucks.com/Kutv'); 14 | expect(b.service.name).to.equal('Linkbucks'); 15 | }); 16 | 17 | it('Linkbucks (alternate)', function() { 18 | var b = new Bypasser('http://www.zatnawqy.net/LLMl'); 19 | expect(b.service.name).to.equal('Linkbucks'); 20 | }); 21 | 22 | it('Generic --> Linkbucks', function() { 23 | var b = new Bypasser('http://www.yyv.co/LLMl'); 24 | expect(b.service.name).to.equal('Generic'); 25 | }); 26 | 27 | it('Shorte.st', function() { 28 | var b = new Bypasser('http://sh.st/gS8XD'); 29 | expect(b.service.name).to.equal('Shorte.st'); 30 | }); 31 | 32 | it('AdFoc.us', function() { 33 | var b = new Bypasser('http://adfoc.us/x57045654'); 34 | expect(b.service.name).to.equal('AdFoc.us'); 35 | }); 36 | 37 | it('P.pw', function() { 38 | var b = new Bypasser('http://p.pw/bai1hN'); 39 | expect(b.service.name).to.equal('P.pw'); 40 | }); 41 | 42 | it('LinkShrink.net', function() { 43 | var b = new Bypasser('http://linkshrink.net/7znHwW'); 44 | expect(b.service.name).to.equal('LinkShrink.net'); 45 | }); 46 | 47 | it('Link5s.com', function() { 48 | var b = new Bypasser('http://link5s.com/Gmq'); 49 | expect(b.service.name).to.equal('Link5s.com'); 50 | }); 51 | 52 | it('Generic goo.gl', function() { 53 | var b = new Bypasser('http://goo.gl/NWt4Es'); 54 | expect(b.service.name).to.equal('Generic'); 55 | }); 56 | 57 | it('Generic custom bit.ly', function() { 58 | var b = new Bypasser('http://l.khoanguyen.me/1HBv4tx'); 59 | expect(b.service.name).to.equal('Generic'); 60 | }); 61 | 62 | it('NowVideo', function() { 63 | var b = new Bypasser('http://www.nowvideo.li/video/6b3032d85873d'); 64 | expect(b.service.name).to.equal('NowVideo'); 65 | }); 66 | 67 | it('AuroraVid', function() { 68 | var b = new Bypasser('http://www.auroravid.to/video/t1j3cls50rumq'); 69 | expect(b.service.name).to.equal('NowVideo'); 70 | }); 71 | 72 | it('Return null service when receive invalid URL', function() { 73 | var b = new Bypasser('github.com'); 74 | expect(b.service).to.be.null; 75 | }); 76 | 77 | it('Bc.vc', function() { 78 | var b = new Bypasser('http://bc.vc/Eu0Oiv'); 79 | expect(b.service.name).to.equal('Bc.vc'); 80 | }); 81 | }); 82 | -------------------------------------------------------------------------------- /tonic-example.js: -------------------------------------------------------------------------------- 1 | const Bypasser = require('node-bypasser'); 2 | 3 | var w = new Bypasser('http://adf.ly/1DX0XD'); 4 | w.decrypt(function(err, result) { 5 | if (err) { 6 | console.log(err); 7 | return; 8 | } 9 | 10 | console.log('Decrypted: ' + result); 11 | }); 12 | --------------------------------------------------------------------------------