├── .gitignore ├── LICENSE.md ├── README.md ├── cli.js ├── index.js ├── package-lock.json ├── package.json └── report.json /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | Copyright 2019 GitHub, Inc. 2 | 3 | Permission to use, copy, modify, and/or distribute this software for any purpose 4 | with or without fee is hereby granted, provided that the above copyright notice 5 | and this permission notice appear in all copies. 6 | 7 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH 8 | REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND 9 | FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, 10 | INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS 11 | OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 12 | TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF 13 | THIS SOFTWARE. 14 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # lightcrawler 2 | Crawl a website and run it through Google lighthouse 3 | 4 | ```bash 5 | npm install --save-dev lightcrawler 6 | 7 | lightcrawler --url https://atom.io/ --config lightcrawler-config.json 8 | ``` 9 | 10 | where `lightcrawler-config.json` looks something like this: 11 | ```json 12 | { 13 | "extends": "lighthouse:default", 14 | "settings": { 15 | "crawler": { 16 | "maxDepth": 2, 17 | "maxChromeInstances": 5 18 | }, 19 | "onlyCategories": [ 20 | "Accessibility", 21 | "Performance", 22 | "Best Practices" 23 | ], 24 | "onlyAudits": [ 25 | "accesskeys", 26 | "aria-allowed-attr", 27 | "external-anchors-use-rel-noopener", 28 | "geolocation-on-start", 29 | "no-document-write", 30 | "no-mutation-events", 31 | "no-old-flexbox", 32 | "time-to-interactive", 33 | "user-timings", 34 | "viewport", 35 | "without-javascript" 36 | ] 37 | } 38 | } 39 | ``` 40 | 41 | Enjoy! 42 | -------------------------------------------------------------------------------- /cli.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const yargs = require('yargs') 4 | const lightcrawler = require('.') 5 | 6 | const options = yargs.demandOption(['c', 'u']) 7 | .alias('u', 'url').describe('url', 'URL to crawl') 8 | .alias('h', 'help').help('h') 9 | .alias('c', 'config').describe('config', 'Options for lighthouse') 10 | .argv 11 | 12 | lightcrawler(options) 13 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const cheerio = require('cheerio') 2 | const ChildProcess = require('child_process') 3 | const Crawler = require('simplecrawler') 4 | const path = require('path') 5 | const queue = require('async/queue') 6 | const fs = require('fs') 7 | const colors = require('colors') 8 | 9 | const stats = { 10 | pageCount: 0, 11 | violationCounts: {}, 12 | passedAuditsCount: 0, 13 | startTime: null, 14 | auditTimesByPageUrl: {} 15 | } 16 | 17 | module.exports = (options) => { 18 | stats.startTime = new Date() 19 | const configPath = path.resolve(options.config) 20 | const config = JSON.parse(fs.readFileSync(configPath)) 21 | 22 | const crawler = new Crawler(options.url) 23 | crawler.respectRobotsTxt = false 24 | crawler.parseHTMLComments = false 25 | crawler.parseScriptTags = false 26 | crawler.maxDepth = config.settings.crawler.maxDepth || 1 27 | 28 | crawler.discoverResources = (buffer, item) => { 29 | const page = cheerio.load(buffer.toString('utf8')) 30 | const links = page('a[href]').map(function () { 31 | return page(this).attr('href') 32 | }).get() 33 | 34 | return links 35 | } 36 | 37 | let totalErrorCount = 0 38 | 39 | const lighthouseQueue = queue((url, callback) => { 40 | runLighthouse(url, configPath, (errorCount) => { 41 | totalErrorCount += errorCount 42 | callback() 43 | }) 44 | }, config.settings.crawler.maxChromeInstances) 45 | 46 | crawler.on('fetchcomplete', (queueItem, responseBuffer, response) => { 47 | lighthouseQueue.push(queueItem.url) 48 | }) 49 | crawler.once('complete', () => { 50 | lighthouseQueue.drain = () => { 51 | printStats() 52 | if (totalErrorCount > 0) { 53 | process.exit(1) 54 | } 55 | } 56 | }) 57 | 58 | crawler.start() 59 | } 60 | 61 | function runLighthouse (url, configPath, callback) { 62 | stats.pageCount++ 63 | const args = [ 64 | url, 65 | '--output=json', 66 | '--output-path=stdout', 67 | '--disable-device-emulation', 68 | '--disable-cpu-throttling', 69 | '--disable-network-throttling', 70 | '--chrome-flags=--headless --disable-gpu', 71 | `--config-path=${configPath}` 72 | ] 73 | 74 | const lighthousePath = require.resolve('lighthouse/lighthouse-cli/index.js') 75 | const lighthouse = ChildProcess.spawn(lighthousePath, args) 76 | 77 | let output = '' 78 | lighthouse.stdout.on('data', (data) => { 79 | output += data 80 | }) 81 | 82 | stats.auditTimesByPageUrl[url] = {startTime: new Date()} 83 | lighthouse.once('close', () => { 84 | stats.auditTimesByPageUrl[url].endTime = new Date() 85 | let errorCount = 0 86 | 87 | let report 88 | try { 89 | report = JSON.parse(output) 90 | } catch (parseError) { 91 | console.error(`Parsing JSON report output failed: ${output}`) 92 | callback(1) 93 | return 94 | } 95 | 96 | report.reportCategories.forEach((category) => { 97 | let displayedCategory = false 98 | category.audits.forEach((audit) => { 99 | if (audit.score === 100) { 100 | stats.passedAuditsCount++ 101 | } else { 102 | if (!displayedCategory) { 103 | console.log(); 104 | console.log(category.name.bold.underline); 105 | displayedCategory = true 106 | } 107 | errorCount++ 108 | console.log(url.replace(/\/$/, ''), '\u2717'.red, audit.id.bold, '-', audit.result.description.italic) 109 | 110 | if (stats.violationCounts[category.name] === undefined) { 111 | stats.violationCounts[category.name] = 0 112 | } 113 | 114 | if (audit.result.extendedInfo) { 115 | const {value} = audit.result.extendedInfo 116 | if (Array.isArray(value)) { 117 | stats.violationCounts[category.name] += value.length 118 | value.forEach((result) => { 119 | if (result.url) { 120 | console.log(` ${result.url}`) 121 | } 122 | }) 123 | } else if (Array.isArray(value.nodes)) { 124 | stats.violationCounts[category.name] += value.nodes.length 125 | const messagesToNodes = {} 126 | value.nodes.forEach((result) => { 127 | let message = result.failureSummary 128 | message = message.replace(/^Fix any of the following:/g, '').trim() 129 | if (messagesToNodes[message]) { 130 | messagesToNodes[message].push(result.html) 131 | } else { 132 | messagesToNodes[message] = [result.html] 133 | } 134 | }) 135 | Object.keys(messagesToNodes).forEach((message) => { 136 | console.log(` ${message}`) 137 | messagesToNodes[message].forEach(node => { 138 | console.log(` ${node}`.gray) 139 | }) 140 | }) 141 | } else { 142 | stats.violationCounts[category.name]++ 143 | } 144 | } 145 | } 146 | }) 147 | }) 148 | 149 | callback(errorCount) 150 | }) 151 | } 152 | 153 | function printStats() { 154 | console.log(); 155 | console.log(); 156 | console.log('Lighthouse Summary'.bold.underline); 157 | console.log(` Total Pages Scanned: ${stats.pageCount}`); 158 | console.log(` Total Auditing Time: ${new Date() - stats.startTime} ms`); 159 | const totalTime = Object.keys(stats.auditTimesByPageUrl).reduce((sum, url) => { 160 | const {endTime, startTime} = stats.auditTimesByPageUrl[url] 161 | return (endTime - startTime) + sum 162 | }, 0) 163 | console.log(` Average Page Audit Time: ${Math.round(totalTime/stats.pageCount)} ms`); 164 | console.log(` Total Audits Passed: ${stats.passedAuditsCount}`, '\u2713'.green); 165 | if (Object.keys(stats.violationCounts).length === 0) { 166 | console.log(` Total Violations: None! \\o/ 🎉`); 167 | } else { 168 | console.log(` Total Violations:`); 169 | Object.keys(stats.violationCounts).forEach(category => { 170 | console.log(` ${category}: ${stats.violationCounts[category]}`, '\u2717'.red); 171 | }) 172 | } 173 | } 174 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "lightcrawler", 3 | "version": "0.0.9", 4 | "lockfileVersion": 1, 5 | "dependencies": { 6 | "@types/node": { 7 | "version": "6.0.78", 8 | "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.78.tgz", 9 | "integrity": "sha512-+vD6E8ixntRzzZukoF3uP1iV+ZjVN3koTcaeK+BEoc/kSfGbLDIGC7RmCaUgVpUfN6cWvfczFRERCyKM9mkvXg==" 10 | }, 11 | "align-text": { 12 | "version": "0.1.4", 13 | "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", 14 | "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=" 15 | }, 16 | "amdefine": { 17 | "version": "1.0.1", 18 | "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", 19 | "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" 20 | }, 21 | "ansi-align": { 22 | "version": "2.0.0", 23 | "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", 24 | "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=" 25 | }, 26 | "ansi-regex": { 27 | "version": "2.1.1", 28 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 29 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 30 | }, 31 | "ansi-styles": { 32 | "version": "2.2.1", 33 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 34 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" 35 | }, 36 | "array-find-index": { 37 | "version": "1.0.2", 38 | "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", 39 | "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" 40 | }, 41 | "async": { 42 | "version": "1.5.2", 43 | "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", 44 | "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" 45 | }, 46 | "axe-core": { 47 | "version": "2.2.1", 48 | "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-2.2.1.tgz", 49 | "integrity": "sha1-2P574T4tgOQH+W0zdO1k1fscPlQ=" 50 | }, 51 | "babar": { 52 | "version": "0.0.3", 53 | "resolved": "https://registry.npmjs.org/babar/-/babar-0.0.3.tgz", 54 | "integrity": "sha1-LzlNSlkY9+GunlQI6alvP5Ne4eI=" 55 | }, 56 | "boolbase": { 57 | "version": "1.0.0", 58 | "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", 59 | "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" 60 | }, 61 | "boxen": { 62 | "version": "1.1.0", 63 | "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.1.0.tgz", 64 | "integrity": "sha1-sbad1SIwXoB6md7ud329blFnsQI=", 65 | "dependencies": { 66 | "camelcase": { 67 | "version": "4.1.0", 68 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", 69 | "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" 70 | } 71 | } 72 | }, 73 | "builtin-modules": { 74 | "version": "1.1.1", 75 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", 76 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" 77 | }, 78 | "camelcase": { 79 | "version": "1.2.1", 80 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", 81 | "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", 82 | "optional": true 83 | }, 84 | "camelcase-keys": { 85 | "version": "2.1.0", 86 | "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", 87 | "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", 88 | "dependencies": { 89 | "camelcase": { 90 | "version": "2.1.1", 91 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", 92 | "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" 93 | } 94 | } 95 | }, 96 | "capture-stack-trace": { 97 | "version": "1.0.0", 98 | "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", 99 | "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=" 100 | }, 101 | "center-align": { 102 | "version": "0.1.3", 103 | "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", 104 | "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", 105 | "optional": true 106 | }, 107 | "chalk": { 108 | "version": "1.1.3", 109 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 110 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=" 111 | }, 112 | "cheerio": { 113 | "version": "1.0.0-rc.1", 114 | "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.1.tgz", 115 | "integrity": "sha1-KvNzOeq3E+9rcs3pjO+mcrh2Qf4=" 116 | }, 117 | "chrome-devtools-frontend": { 118 | "version": "1.0.422034", 119 | "resolved": "https://registry.npmjs.org/chrome-devtools-frontend/-/chrome-devtools-frontend-1.0.422034.tgz", 120 | "integrity": "sha1-BxyM4URmt2UwMvzRrRpKaNXjy9k=" 121 | }, 122 | "cli-boxes": { 123 | "version": "1.0.0", 124 | "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", 125 | "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" 126 | }, 127 | "cliui": { 128 | "version": "2.1.0", 129 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", 130 | "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", 131 | "optional": true, 132 | "dependencies": { 133 | "wordwrap": { 134 | "version": "0.0.2", 135 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", 136 | "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", 137 | "optional": true 138 | } 139 | } 140 | }, 141 | "code-point-at": { 142 | "version": "1.1.0", 143 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 144 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" 145 | }, 146 | "colors": { 147 | "version": "0.6.2", 148 | "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", 149 | "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=" 150 | }, 151 | "configstore": { 152 | "version": "3.1.0", 153 | "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.0.tgz", 154 | "integrity": "sha1-Rd+QcHPibfoc9LLVL1tgVF6qEdE=" 155 | }, 156 | "core-util-is": { 157 | "version": "1.0.2", 158 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 159 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 160 | }, 161 | "create-error-class": { 162 | "version": "3.0.2", 163 | "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", 164 | "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=" 165 | }, 166 | "cross-spawn-async": { 167 | "version": "2.2.5", 168 | "resolved": "https://registry.npmjs.org/cross-spawn-async/-/cross-spawn-async-2.2.5.tgz", 169 | "integrity": "sha1-hF/wwINKPe2dFg2sptOQkGuyiMw=" 170 | }, 171 | "crypto-random-string": { 172 | "version": "1.0.0", 173 | "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", 174 | "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" 175 | }, 176 | "css-select": { 177 | "version": "1.2.0", 178 | "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", 179 | "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=" 180 | }, 181 | "css-what": { 182 | "version": "2.1.0", 183 | "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", 184 | "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=" 185 | }, 186 | "currently-unhandled": { 187 | "version": "0.4.1", 188 | "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", 189 | "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=" 190 | }, 191 | "debug": { 192 | "version": "2.2.0", 193 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", 194 | "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=" 195 | }, 196 | "decamelize": { 197 | "version": "1.2.0", 198 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 199 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" 200 | }, 201 | "deep-extend": { 202 | "version": "0.4.2", 203 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", 204 | "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=" 205 | }, 206 | "devtools-timeline-model": { 207 | "version": "1.1.6", 208 | "resolved": "https://registry.npmjs.org/devtools-timeline-model/-/devtools-timeline-model-1.1.6.tgz", 209 | "integrity": "sha1-e+Uac7VdcntZe7MN0e0ujiEGOaU=", 210 | "dependencies": { 211 | "chrome-devtools-frontend": { 212 | "version": "1.0.401423", 213 | "resolved": "https://registry.npmjs.org/chrome-devtools-frontend/-/chrome-devtools-frontend-1.0.401423.tgz", 214 | "integrity": "sha1-MqibjQTjeKSUvjyNYycXA74cBOo=" 215 | } 216 | } 217 | }, 218 | "dom-serializer": { 219 | "version": "0.1.0", 220 | "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", 221 | "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", 222 | "dependencies": { 223 | "domelementtype": { 224 | "version": "1.1.3", 225 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", 226 | "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=" 227 | } 228 | } 229 | }, 230 | "domelementtype": { 231 | "version": "1.3.0", 232 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", 233 | "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=" 234 | }, 235 | "domhandler": { 236 | "version": "2.4.1", 237 | "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.1.tgz", 238 | "integrity": "sha1-iS5HAAqZvlW783dP/qBWHYh5wlk=" 239 | }, 240 | "domutils": { 241 | "version": "1.5.1", 242 | "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", 243 | "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=" 244 | }, 245 | "dot-prop": { 246 | "version": "4.1.1", 247 | "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.1.1.tgz", 248 | "integrity": "sha1-qEk/C3te7sglJbXHWH+n3nyoWcE=" 249 | }, 250 | "duplexer3": { 251 | "version": "0.1.4", 252 | "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", 253 | "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" 254 | }, 255 | "entities": { 256 | "version": "1.1.1", 257 | "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", 258 | "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=" 259 | }, 260 | "error-ex": { 261 | "version": "1.3.1", 262 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", 263 | "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=" 264 | }, 265 | "escape-string-regexp": { 266 | "version": "1.0.5", 267 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 268 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 269 | }, 270 | "execa": { 271 | "version": "0.4.0", 272 | "resolved": "https://registry.npmjs.org/execa/-/execa-0.4.0.tgz", 273 | "integrity": "sha1-TrZGejaglfq7KXD/nV4/t7zm68M=" 274 | }, 275 | "find-up": { 276 | "version": "1.1.2", 277 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", 278 | "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=" 279 | }, 280 | "get-stdin": { 281 | "version": "4.0.1", 282 | "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", 283 | "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" 284 | }, 285 | "get-stream": { 286 | "version": "3.0.0", 287 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", 288 | "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" 289 | }, 290 | "gl-matrix": { 291 | "version": "2.3.2", 292 | "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-2.3.2.tgz", 293 | "integrity": "sha1-qsgIx0r31dsF/gTLYMoaD8sXTXQ=" 294 | }, 295 | "got": { 296 | "version": "6.7.1", 297 | "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", 298 | "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=" 299 | }, 300 | "graceful-fs": { 301 | "version": "4.1.11", 302 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", 303 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" 304 | }, 305 | "handlebars": { 306 | "version": "4.0.5", 307 | "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.5.tgz", 308 | "integrity": "sha1-ksbta7FkEQxQ1NjQ+93HCAbG+Oc=" 309 | }, 310 | "has-ansi": { 311 | "version": "2.0.0", 312 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 313 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=" 314 | }, 315 | "hosted-git-info": { 316 | "version": "2.4.2", 317 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.4.2.tgz", 318 | "integrity": "sha1-AHa59GonBQbduq6lZJaJdGBhKmc=" 319 | }, 320 | "htmlparser2": { 321 | "version": "3.9.2", 322 | "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", 323 | "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=" 324 | }, 325 | "iconv-lite": { 326 | "version": "0.4.18", 327 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.18.tgz", 328 | "integrity": "sha512-sr1ZQph3UwHTR0XftSbK85OvBbxe/abLGzEnPENCQwmHf7sck8Oyu4ob3LgBxWWxRoM+QszeUyl7jbqapu2TqA==" 329 | }, 330 | "image-ssim": { 331 | "version": "0.2.0", 332 | "resolved": "https://registry.npmjs.org/image-ssim/-/image-ssim-0.2.0.tgz", 333 | "integrity": "sha1-g7Qsei5uS4VQVHf+aRf128VkIOU=" 334 | }, 335 | "import-lazy": { 336 | "version": "2.1.0", 337 | "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", 338 | "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" 339 | }, 340 | "imurmurhash": { 341 | "version": "0.1.4", 342 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 343 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" 344 | }, 345 | "indent-string": { 346 | "version": "2.1.0", 347 | "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", 348 | "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=" 349 | }, 350 | "inherits": { 351 | "version": "2.0.3", 352 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 353 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 354 | }, 355 | "ini": { 356 | "version": "1.3.4", 357 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", 358 | "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=" 359 | }, 360 | "invert-kv": { 361 | "version": "1.0.0", 362 | "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", 363 | "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" 364 | }, 365 | "is-arrayish": { 366 | "version": "0.2.1", 367 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 368 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" 369 | }, 370 | "is-buffer": { 371 | "version": "1.1.5", 372 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", 373 | "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=" 374 | }, 375 | "is-builtin-module": { 376 | "version": "1.0.0", 377 | "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", 378 | "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=" 379 | }, 380 | "is-finite": { 381 | "version": "1.0.2", 382 | "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", 383 | "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=" 384 | }, 385 | "is-fullwidth-code-point": { 386 | "version": "2.0.0", 387 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 388 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" 389 | }, 390 | "is-npm": { 391 | "version": "1.0.0", 392 | "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", 393 | "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=" 394 | }, 395 | "is-obj": { 396 | "version": "1.0.1", 397 | "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", 398 | "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" 399 | }, 400 | "is-redirect": { 401 | "version": "1.0.0", 402 | "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", 403 | "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" 404 | }, 405 | "is-retry-allowed": { 406 | "version": "1.1.0", 407 | "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", 408 | "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" 409 | }, 410 | "is-stream": { 411 | "version": "1.1.0", 412 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 413 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" 414 | }, 415 | "is-utf8": { 416 | "version": "0.2.1", 417 | "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", 418 | "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" 419 | }, 420 | "isarray": { 421 | "version": "1.0.0", 422 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 423 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 424 | }, 425 | "isexe": { 426 | "version": "2.0.0", 427 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 428 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" 429 | }, 430 | "jpeg-js": { 431 | "version": "0.1.2", 432 | "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.1.2.tgz", 433 | "integrity": "sha1-E1uZLAV1yYXPoPSUoyJ+0jhYPs4=" 434 | }, 435 | "json-stringify-safe": { 436 | "version": "5.0.1", 437 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 438 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 439 | }, 440 | "kind-of": { 441 | "version": "3.2.2", 442 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 443 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=" 444 | }, 445 | "latest-version": { 446 | "version": "3.1.0", 447 | "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", 448 | "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=" 449 | }, 450 | "lazy-cache": { 451 | "version": "1.0.4", 452 | "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", 453 | "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", 454 | "optional": true 455 | }, 456 | "lcid": { 457 | "version": "1.0.0", 458 | "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", 459 | "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=" 460 | }, 461 | "lighthouse": { 462 | "version": "2.1.0", 463 | "resolved": "https://registry.npmjs.org/lighthouse/-/lighthouse-2.1.0.tgz", 464 | "integrity": "sha1-yqajmT47IgmPgvL3ReFs2oTHGqM=" 465 | }, 466 | "load-json-file": { 467 | "version": "1.1.0", 468 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", 469 | "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=" 470 | }, 471 | "lodash": { 472 | "version": "4.17.4", 473 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", 474 | "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" 475 | }, 476 | "longest": { 477 | "version": "1.0.1", 478 | "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", 479 | "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" 480 | }, 481 | "loud-rejection": { 482 | "version": "1.6.0", 483 | "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", 484 | "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=" 485 | }, 486 | "lowercase-keys": { 487 | "version": "1.0.0", 488 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", 489 | "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" 490 | }, 491 | "lru-cache": { 492 | "version": "4.1.1", 493 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", 494 | "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==" 495 | }, 496 | "make-dir": { 497 | "version": "1.0.0", 498 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.0.0.tgz", 499 | "integrity": "sha1-l6ARdR6R3YfPre9Ygy67BJNt6Xg=" 500 | }, 501 | "map-obj": { 502 | "version": "1.0.1", 503 | "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", 504 | "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" 505 | }, 506 | "marked": { 507 | "version": "0.3.6", 508 | "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.6.tgz", 509 | "integrity": "sha1-ssbGGPzOzk74bE/Gy4p8v1rtqNc=" 510 | }, 511 | "meow": { 512 | "version": "3.7.0", 513 | "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", 514 | "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", 515 | "dependencies": { 516 | "minimist": { 517 | "version": "1.2.0", 518 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 519 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" 520 | } 521 | } 522 | }, 523 | "metaviewport-parser": { 524 | "version": "0.0.1", 525 | "resolved": "https://registry.npmjs.org/metaviewport-parser/-/metaviewport-parser-0.0.1.tgz", 526 | "integrity": "sha1-mygXllm3b/nSHehK4lWDJXkJsgY=" 527 | }, 528 | "minimist": { 529 | "version": "0.0.10", 530 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", 531 | "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" 532 | }, 533 | "mkdirp": { 534 | "version": "0.5.1", 535 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 536 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 537 | "dependencies": { 538 | "minimist": { 539 | "version": "0.0.8", 540 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 541 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" 542 | } 543 | } 544 | }, 545 | "ms": { 546 | "version": "0.7.1", 547 | "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", 548 | "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" 549 | }, 550 | "normalize-package-data": { 551 | "version": "2.3.8", 552 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.3.8.tgz", 553 | "integrity": "sha1-2Bntoqne29H/pWPqQHHZNngilbs=" 554 | }, 555 | "npm-run-path": { 556 | "version": "1.0.0", 557 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-1.0.0.tgz", 558 | "integrity": "sha1-9cMr9ZX+ga6Sfa7FLoL4sACsPI8=" 559 | }, 560 | "nth-check": { 561 | "version": "1.0.1", 562 | "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", 563 | "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=" 564 | }, 565 | "number-is-nan": { 566 | "version": "1.0.1", 567 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 568 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" 569 | }, 570 | "object-assign": { 571 | "version": "4.1.1", 572 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 573 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 574 | }, 575 | "opn": { 576 | "version": "4.0.2", 577 | "resolved": "https://registry.npmjs.org/opn/-/opn-4.0.2.tgz", 578 | "integrity": "sha1-erwi5kTf9jsKltWrfyeQwPAavJU=" 579 | }, 580 | "optimist": { 581 | "version": "0.6.1", 582 | "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", 583 | "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=" 584 | }, 585 | "options": { 586 | "version": "0.0.6", 587 | "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", 588 | "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=" 589 | }, 590 | "os-locale": { 591 | "version": "1.4.0", 592 | "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", 593 | "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=" 594 | }, 595 | "package-json": { 596 | "version": "4.0.1", 597 | "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", 598 | "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=" 599 | }, 600 | "parse-json": { 601 | "version": "2.2.0", 602 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", 603 | "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=" 604 | }, 605 | "parse5": { 606 | "version": "3.0.2", 607 | "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.2.tgz", 608 | "integrity": "sha1-Be/1fw70V3+xRKefi5qWemzERRA=" 609 | }, 610 | "path-exists": { 611 | "version": "2.1.0", 612 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", 613 | "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=" 614 | }, 615 | "path-key": { 616 | "version": "1.0.0", 617 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-1.0.0.tgz", 618 | "integrity": "sha1-XVPVeAGWRsDWiADbThRua9wqx68=" 619 | }, 620 | "path-type": { 621 | "version": "1.1.0", 622 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", 623 | "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=" 624 | }, 625 | "pify": { 626 | "version": "2.3.0", 627 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 628 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" 629 | }, 630 | "pinkie": { 631 | "version": "2.0.4", 632 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", 633 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" 634 | }, 635 | "pinkie-promise": { 636 | "version": "2.0.1", 637 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", 638 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=" 639 | }, 640 | "prepend-http": { 641 | "version": "1.0.4", 642 | "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", 643 | "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" 644 | }, 645 | "process-nextick-args": { 646 | "version": "1.0.7", 647 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", 648 | "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" 649 | }, 650 | "pseudomap": { 651 | "version": "1.0.2", 652 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", 653 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" 654 | }, 655 | "rc": { 656 | "version": "1.2.1", 657 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", 658 | "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", 659 | "dependencies": { 660 | "minimist": { 661 | "version": "1.2.0", 662 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 663 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" 664 | } 665 | } 666 | }, 667 | "read-pkg": { 668 | "version": "1.1.0", 669 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", 670 | "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=" 671 | }, 672 | "read-pkg-up": { 673 | "version": "1.0.1", 674 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", 675 | "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=" 676 | }, 677 | "readable-stream": { 678 | "version": "2.3.0", 679 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.0.tgz", 680 | "integrity": "sha512-c7KMXGd4b48nN3OJ1U9qOsn6pXNzf6kLd3kdZCkg2sxAcoiufInqF0XckwEnlrcwuaYwonlNK8GQUIOC/WC7sg==" 681 | }, 682 | "redent": { 683 | "version": "1.0.0", 684 | "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", 685 | "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=" 686 | }, 687 | "registry-auth-token": { 688 | "version": "3.3.1", 689 | "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.1.tgz", 690 | "integrity": "sha1-+w0yie4Nmtosu1KvXf5mywcNMAY=" 691 | }, 692 | "registry-url": { 693 | "version": "3.1.0", 694 | "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", 695 | "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=" 696 | }, 697 | "repeat-string": { 698 | "version": "1.6.1", 699 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 700 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" 701 | }, 702 | "repeating": { 703 | "version": "2.0.1", 704 | "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", 705 | "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=" 706 | }, 707 | "resolve": { 708 | "version": "1.1.7", 709 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", 710 | "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" 711 | }, 712 | "right-align": { 713 | "version": "0.1.3", 714 | "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", 715 | "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", 716 | "optional": true 717 | }, 718 | "rimraf": { 719 | "version": "2.2.8", 720 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", 721 | "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=" 722 | }, 723 | "robots-parser": { 724 | "version": "1.0.1", 725 | "resolved": "https://registry.npmjs.org/robots-parser/-/robots-parser-1.0.1.tgz", 726 | "integrity": "sha1-eeMuPly0Bm3lAUBCB6jrEjKXACA=" 727 | }, 728 | "safe-buffer": { 729 | "version": "5.1.0", 730 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.0.tgz", 731 | "integrity": "sha512-aSLEDudu6OoRr/2rU609gRmnYboRLxgDG1z9o2Q0os7236FwvcqIOO8r8U5JUEwivZOhDaKlFO4SbPTJYyBEyQ==" 732 | }, 733 | "semver": { 734 | "version": "5.3.0", 735 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", 736 | "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=" 737 | }, 738 | "semver-diff": { 739 | "version": "2.1.0", 740 | "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", 741 | "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=" 742 | }, 743 | "signal-exit": { 744 | "version": "3.0.2", 745 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 746 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" 747 | }, 748 | "simplecrawler": { 749 | "version": "1.1.3", 750 | "resolved": "https://registry.npmjs.org/simplecrawler/-/simplecrawler-1.1.3.tgz", 751 | "integrity": "sha512-ON5i7LlzD2eenXrzGpfXE2+mNT52TyoGD7fJ6Sk3qibyzqhnvBBqXk+F9E0O+msUtPPLb7zUYKy45QqIc3CP0A==", 752 | "dependencies": { 753 | "async": { 754 | "version": "2.4.1", 755 | "resolved": "https://registry.npmjs.org/async/-/async-2.4.1.tgz", 756 | "integrity": "sha1-YqVrJ5yYoR0JhwlqAcw+6463u9c=" 757 | } 758 | } 759 | }, 760 | "slide": { 761 | "version": "1.1.6", 762 | "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", 763 | "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=" 764 | }, 765 | "source-map": { 766 | "version": "0.4.4", 767 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", 768 | "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=" 769 | }, 770 | "spdx-correct": { 771 | "version": "1.0.2", 772 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", 773 | "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=" 774 | }, 775 | "spdx-expression-parse": { 776 | "version": "1.0.4", 777 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", 778 | "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=" 779 | }, 780 | "spdx-license-ids": { 781 | "version": "1.2.2", 782 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", 783 | "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=" 784 | }, 785 | "speedline": { 786 | "version": "1.2.0", 787 | "resolved": "https://registry.npmjs.org/speedline/-/speedline-1.2.0.tgz", 788 | "integrity": "sha1-9YKNz46blqn2wdqKsphTiCDGZo0=" 789 | }, 790 | "string_decoder": { 791 | "version": "1.0.2", 792 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.2.tgz", 793 | "integrity": "sha1-sp4fThEl+pehA4K4pTNze3SR4Xk=", 794 | "dependencies": { 795 | "safe-buffer": { 796 | "version": "5.0.1", 797 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", 798 | "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=" 799 | } 800 | } 801 | }, 802 | "string-width": { 803 | "version": "2.0.0", 804 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.0.0.tgz", 805 | "integrity": "sha1-Y1xUNsxypuDDh87KJ41OLuxSaH4=" 806 | }, 807 | "strip-ansi": { 808 | "version": "3.0.1", 809 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 810 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=" 811 | }, 812 | "strip-bom": { 813 | "version": "2.0.0", 814 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", 815 | "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=" 816 | }, 817 | "strip-eof": { 818 | "version": "1.0.0", 819 | "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", 820 | "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" 821 | }, 822 | "strip-indent": { 823 | "version": "1.0.1", 824 | "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", 825 | "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=" 826 | }, 827 | "strip-json-comments": { 828 | "version": "2.0.1", 829 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 830 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" 831 | }, 832 | "supports-color": { 833 | "version": "2.0.0", 834 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 835 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" 836 | }, 837 | "term-size": { 838 | "version": "0.1.1", 839 | "resolved": "https://registry.npmjs.org/term-size/-/term-size-0.1.1.tgz", 840 | "integrity": "sha1-hzYLljlsq1dgljcUzaDQy+7K2co=" 841 | }, 842 | "timed-out": { 843 | "version": "4.0.1", 844 | "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", 845 | "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" 846 | }, 847 | "tr46": { 848 | "version": "0.0.3", 849 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 850 | "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" 851 | }, 852 | "trim-newlines": { 853 | "version": "1.0.0", 854 | "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", 855 | "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" 856 | }, 857 | "uglify-js": { 858 | "version": "2.8.29", 859 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", 860 | "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", 861 | "optional": true, 862 | "dependencies": { 863 | "source-map": { 864 | "version": "0.5.6", 865 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", 866 | "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", 867 | "optional": true 868 | }, 869 | "yargs": { 870 | "version": "3.10.0", 871 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", 872 | "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", 873 | "optional": true 874 | } 875 | } 876 | }, 877 | "uglify-to-browserify": { 878 | "version": "1.0.2", 879 | "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", 880 | "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", 881 | "optional": true 882 | }, 883 | "ultron": { 884 | "version": "1.0.2", 885 | "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", 886 | "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=" 887 | }, 888 | "unique-string": { 889 | "version": "1.0.0", 890 | "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", 891 | "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=" 892 | }, 893 | "unzip-response": { 894 | "version": "2.0.1", 895 | "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", 896 | "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=" 897 | }, 898 | "update-notifier": { 899 | "version": "2.2.0", 900 | "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.2.0.tgz", 901 | "integrity": "sha1-G1g3z5DAc22IYncytmHBOPht5y8=" 902 | }, 903 | "urijs": { 904 | "version": "1.18.10", 905 | "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.18.10.tgz", 906 | "integrity": "sha1-uURj6rpZoaeWA2pGe7YzxmfyIas=" 907 | }, 908 | "url-parse-lax": { 909 | "version": "1.0.0", 910 | "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", 911 | "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=" 912 | }, 913 | "util-deprecate": { 914 | "version": "1.0.2", 915 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 916 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 917 | }, 918 | "validate-npm-package-license": { 919 | "version": "3.0.1", 920 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", 921 | "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=" 922 | }, 923 | "webidl-conversions": { 924 | "version": "3.0.1", 925 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 926 | "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" 927 | }, 928 | "whatwg-url": { 929 | "version": "4.0.0", 930 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-4.0.0.tgz", 931 | "integrity": "sha1-W+Ni8Lbi+HYPcmDfbg4d9Tb1R5w=" 932 | }, 933 | "which": { 934 | "version": "1.2.14", 935 | "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", 936 | "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=" 937 | }, 938 | "widest-line": { 939 | "version": "1.0.0", 940 | "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-1.0.0.tgz", 941 | "integrity": "sha1-DAnIXCqUaD0Nfq+O4JfVZL8OEFw=", 942 | "dependencies": { 943 | "is-fullwidth-code-point": { 944 | "version": "1.0.0", 945 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 946 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=" 947 | }, 948 | "string-width": { 949 | "version": "1.0.2", 950 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 951 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=" 952 | } 953 | } 954 | }, 955 | "window-size": { 956 | "version": "0.1.0", 957 | "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", 958 | "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", 959 | "optional": true 960 | }, 961 | "wordwrap": { 962 | "version": "0.0.3", 963 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", 964 | "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" 965 | }, 966 | "wrap-ansi": { 967 | "version": "2.1.0", 968 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", 969 | "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", 970 | "dependencies": { 971 | "is-fullwidth-code-point": { 972 | "version": "1.0.0", 973 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 974 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=" 975 | }, 976 | "string-width": { 977 | "version": "1.0.2", 978 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 979 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=" 980 | } 981 | } 982 | }, 983 | "write-file-atomic": { 984 | "version": "2.1.0", 985 | "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.1.0.tgz", 986 | "integrity": "sha512-0TZ20a+xcIl4u0+Mj5xDH2yOWdmQiXlKf9Hm+TgDXjTMsEYb+gDrmb8e8UNAzMCitX8NBqG4Z/FUQIyzv/R1JQ==" 987 | }, 988 | "ws": { 989 | "version": "1.1.1", 990 | "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.1.tgz", 991 | "integrity": "sha1-CC3bbGQehdS7RR8D1S8G6r2x8Bg=" 992 | }, 993 | "xdg-basedir": { 994 | "version": "3.0.0", 995 | "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", 996 | "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" 997 | }, 998 | "y18n": { 999 | "version": "3.2.1", 1000 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", 1001 | "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" 1002 | }, 1003 | "yallist": { 1004 | "version": "2.1.2", 1005 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", 1006 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" 1007 | }, 1008 | "yargs": { 1009 | "version": "3.32.0", 1010 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", 1011 | "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", 1012 | "dependencies": { 1013 | "camelcase": { 1014 | "version": "2.1.1", 1015 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", 1016 | "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" 1017 | }, 1018 | "cliui": { 1019 | "version": "3.2.0", 1020 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", 1021 | "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=" 1022 | }, 1023 | "is-fullwidth-code-point": { 1024 | "version": "1.0.0", 1025 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 1026 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=" 1027 | }, 1028 | "string-width": { 1029 | "version": "1.0.2", 1030 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 1031 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=" 1032 | }, 1033 | "window-size": { 1034 | "version": "0.1.4", 1035 | "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", 1036 | "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=" 1037 | } 1038 | } 1039 | } 1040 | } 1041 | } 1042 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "lightcrawler", 3 | "version": "0.0.9", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "bin": { 10 | "lightcrawler": "./cli.js" 11 | }, 12 | "keywords": [], 13 | "author": "", 14 | "license": "ISC", 15 | "dependencies": { 16 | "async": "^2.4.1", 17 | "cheerio": "^1.0.0-rc.1", 18 | "colors": "^1.1.2", 19 | "lighthouse": "^2.1.0", 20 | "simplecrawler": "^1.1.3", 21 | "yargs": "^8.0.2" 22 | } 23 | } 24 | --------------------------------------------------------------------------------