├── .gitignore ├── README.md ├── config-example.js ├── index.js ├── package.json ├── processor.js ├── server.js └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | config.js 3 | .idea 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Imgproxy 2 | 3 | https://websecret.by/blog/optimizaciya-izobrazhenij-na-krupnyh-proektah 4 | 5 | # Install 6 | 7 | - `yarn` 8 | 9 | - `cp config-example.js config.js` и указываем путь к конфигу картинок 10 | 11 | - `mkdir projects && cd mkdir && ln -s ~/site.by/images.js site.js` - создаем symbol ссылку к конфигам 12 | 13 | ``` 14 | small: { 15 | width: 211, 16 | height: 130, 17 | quality: 100, 18 | } 19 | ``` 20 | 21 | - Настраиваем nginx и запускаем pm2 22 | 23 | ``` 24 | server { 25 | listen 80; 26 | server_name imgproxy.localhost; 27 | 28 | location / { 29 | proxy_cache imgproxy; 30 | proxy_cache_valid 200 30d; 31 | expires 30d; 32 | proxy_pass http://127.0.0.1:1337; 33 | } 34 | } 35 | ``` 36 | 37 | - Стартуем pm2 `cd ../ && pm2 start npm --name "imgproxy" -- start` 38 | -------------------------------------------------------------------------------- /config-example.js: -------------------------------------------------------------------------------- 1 | const siteConfig = require('./projects/site') 2 | 3 | module.exports = { 4 | basePath: '/path/to/images', 5 | port: 1337, 6 | site: siteConfig 7 | } 8 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const startServer = require('./server') 2 | 3 | startServer() 4 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "debug": "^2.6.8", 4 | "sharp": "^0.21.3" 5 | }, 6 | "scripts": { 7 | "start": "node index.js", 8 | "dev": "DEBUG=app node index.js" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /processor.js: -------------------------------------------------------------------------------- 1 | const sharp = require('sharp') 2 | const config = require('./config') 3 | 4 | module.exports = async ({ type, path }) => { 5 | if (!type || !path || !config[type]) { 6 | return null 7 | } 8 | 9 | const imagePath = `${config.basePath}/${path}` 10 | console.log(imagePath) 11 | const imageConfig = config[type] 12 | 13 | const image = sharp(imagePath) 14 | let metadata = await image.metadata() 15 | 16 | if (imageConfig.width && imageConfig.height) { 17 | image.resize(imageConfig.width, imageConfig.height, { fit: 'inside', withoutEnlargement: !imageConfig.upsize }) 18 | } 19 | 20 | if (imageConfig.quality && ['jpeg', 'tiff', 'webp'].includes(metadata.format)) { 21 | image[metadata.format]({ quality : imageConfig.quality }) 22 | } 23 | 24 | return image 25 | } 26 | -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | const process = require('./processor') 2 | const config = require('./config') 3 | const debug = require('debug')('app') 4 | const http = require('http') 5 | 6 | module.exports = () => { 7 | const server = http.createServer(async (req, res) => { 8 | log(req, res) 9 | 10 | const options = parseUrl(req.url) 11 | try { 12 | const result = await process(options) 13 | respond(res, result) 14 | } catch (e) { 15 | respond(res, null) 16 | } 17 | }) 18 | 19 | server.listen(config.port) 20 | } 21 | 22 | const notFound = res => { 23 | res.writeHead(404) 24 | res.end() 25 | } 26 | 27 | const log = (req, res) => { 28 | debug(`GET ${req.url}`) 29 | 30 | res.on('finish', function () { 31 | debug(res.statusCode == 404 ? '404' : 'OK') 32 | }) 33 | } 34 | 35 | const parseUrl = url => { 36 | let [_, type, ...path] = url.split('/') 37 | path = path.join('/') 38 | 39 | return { type, path } 40 | } 41 | 42 | const respond = (res, result) => { 43 | if (!result) { 44 | notFound(res) 45 | return 46 | } 47 | 48 | result.on('error', function () { 49 | notFound(res) 50 | }) 51 | 52 | result.pipe(res) 53 | } 54 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | ansi-regex@^2.0.0: 6 | version "2.1.1" 7 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 8 | integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= 9 | 10 | ansi-regex@^3.0.0: 11 | version "3.0.0" 12 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 13 | integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= 14 | 15 | aproba@^1.0.3: 16 | version "1.2.0" 17 | resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" 18 | integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== 19 | 20 | are-we-there-yet@~1.1.2: 21 | version "1.1.5" 22 | resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" 23 | integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== 24 | dependencies: 25 | delegates "^1.0.0" 26 | readable-stream "^2.0.6" 27 | 28 | bindings@^1.3.1: 29 | version "1.4.0" 30 | resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.4.0.tgz#909efa49f2ebe07ecd3cb136778f665052040127" 31 | integrity sha512-7znEVX22Djn+nYjxCWKDne0RRloa9XfYa84yk3s+HkE3LpDYZmhArYr9O9huBoHY3/oXispx5LorIX7Sl2CgSQ== 32 | dependencies: 33 | file-uri-to-path "1.0.0" 34 | 35 | bl@^1.0.0: 36 | version "1.2.2" 37 | resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c" 38 | integrity sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA== 39 | dependencies: 40 | readable-stream "^2.3.5" 41 | safe-buffer "^5.1.1" 42 | 43 | buffer-alloc-unsafe@^1.1.0: 44 | version "1.1.0" 45 | resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" 46 | integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== 47 | 48 | buffer-alloc@^1.2.0: 49 | version "1.2.0" 50 | resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" 51 | integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== 52 | dependencies: 53 | buffer-alloc-unsafe "^1.1.0" 54 | buffer-fill "^1.0.0" 55 | 56 | buffer-fill@^1.0.0: 57 | version "1.0.0" 58 | resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" 59 | integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= 60 | 61 | chownr@^1.0.1, chownr@^1.1.1: 62 | version "1.1.1" 63 | resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" 64 | integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== 65 | 66 | code-point-at@^1.0.0: 67 | version "1.1.0" 68 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 69 | integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= 70 | 71 | color-convert@^1.9.1: 72 | version "1.9.3" 73 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 74 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 75 | dependencies: 76 | color-name "1.1.3" 77 | 78 | color-name@1.1.3: 79 | version "1.1.3" 80 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 81 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 82 | 83 | color-name@^1.0.0: 84 | version "1.1.2" 85 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.2.tgz#5c8ab72b64bd2215d617ae9559ebb148475cf98d" 86 | 87 | color-string@^1.5.2: 88 | version "1.5.3" 89 | resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc" 90 | integrity sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw== 91 | dependencies: 92 | color-name "^1.0.0" 93 | simple-swizzle "^0.2.2" 94 | 95 | color@^3.1.0: 96 | version "3.1.0" 97 | resolved "https://registry.yarnpkg.com/color/-/color-3.1.0.tgz#d8e9fb096732875774c84bf922815df0308d0ffc" 98 | integrity sha512-CwyopLkuRYO5ei2EpzpIh6LqJMt6Mt+jZhO5VI5f/wJLZriXQE32/SSqzmrh+QB+AZT81Cj8yv+7zwToW8ahZg== 99 | dependencies: 100 | color-convert "^1.9.1" 101 | color-string "^1.5.2" 102 | 103 | console-control-strings@^1.0.0, console-control-strings@~1.1.0: 104 | version "1.1.0" 105 | resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" 106 | integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= 107 | 108 | core-util-is@~1.0.0: 109 | version "1.0.2" 110 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 111 | integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= 112 | 113 | debug@^2.6.8: 114 | version "2.6.8" 115 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" 116 | dependencies: 117 | ms "2.0.0" 118 | 119 | decompress-response@^3.3.0: 120 | version "3.3.0" 121 | resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" 122 | integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= 123 | dependencies: 124 | mimic-response "^1.0.0" 125 | 126 | deep-extend@^0.6.0: 127 | version "0.6.0" 128 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" 129 | integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== 130 | 131 | delegates@^1.0.0: 132 | version "1.0.0" 133 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 134 | integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= 135 | 136 | detect-libc@^1.0.3: 137 | version "1.0.3" 138 | resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" 139 | integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= 140 | 141 | end-of-stream@^1.0.0, end-of-stream@^1.1.0: 142 | version "1.4.1" 143 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" 144 | integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== 145 | dependencies: 146 | once "^1.4.0" 147 | 148 | expand-template@^2.0.3: 149 | version "2.0.3" 150 | resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" 151 | integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== 152 | 153 | file-uri-to-path@1.0.0: 154 | version "1.0.0" 155 | resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" 156 | integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== 157 | 158 | fs-constants@^1.0.0: 159 | version "1.0.0" 160 | resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" 161 | integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== 162 | 163 | fs-copy-file-sync@^1.1.1: 164 | version "1.1.1" 165 | resolved "https://registry.yarnpkg.com/fs-copy-file-sync/-/fs-copy-file-sync-1.1.1.tgz#11bf32c096c10d126e5f6b36d06eece776062918" 166 | integrity sha512-2QY5eeqVv4m2PfyMiEuy9adxNP+ajf+8AR05cEi+OAzPcOj90hvFImeZhTmKLBgSd9EvG33jsD7ZRxsx9dThkQ== 167 | 168 | fs-minipass@^1.2.5: 169 | version "1.2.5" 170 | resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" 171 | integrity sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ== 172 | dependencies: 173 | minipass "^2.2.1" 174 | 175 | gauge@~2.7.3: 176 | version "2.7.4" 177 | resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" 178 | integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= 179 | dependencies: 180 | aproba "^1.0.3" 181 | console-control-strings "^1.0.0" 182 | has-unicode "^2.0.0" 183 | object-assign "^4.1.0" 184 | signal-exit "^3.0.0" 185 | string-width "^1.0.1" 186 | strip-ansi "^3.0.1" 187 | wide-align "^1.1.0" 188 | 189 | github-from-package@0.0.0: 190 | version "0.0.0" 191 | resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" 192 | integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4= 193 | 194 | has-unicode@^2.0.0: 195 | version "2.0.1" 196 | resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" 197 | integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= 198 | 199 | inherits@~2.0.3: 200 | version "2.0.3" 201 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 202 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 203 | 204 | ini@~1.3.0: 205 | version "1.3.4" 206 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" 207 | 208 | is-arrayish@^0.3.1: 209 | version "0.3.1" 210 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.1.tgz#c2dfc386abaa0c3e33c48db3fe87059e69065efd" 211 | 212 | is-fullwidth-code-point@^1.0.0: 213 | version "1.0.0" 214 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 215 | integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= 216 | dependencies: 217 | number-is-nan "^1.0.0" 218 | 219 | is-fullwidth-code-point@^2.0.0: 220 | version "2.0.0" 221 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 222 | integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= 223 | 224 | isarray@~1.0.0: 225 | version "1.0.0" 226 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 227 | integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= 228 | 229 | mimic-response@^1.0.0: 230 | version "1.0.0" 231 | resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.0.tgz#df3d3652a73fded6b9b0b24146e6fd052353458e" 232 | 233 | minimist@0.0.8: 234 | version "0.0.8" 235 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 236 | 237 | minimist@^1.2.0: 238 | version "1.2.0" 239 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 240 | 241 | minipass@^2.2.1, minipass@^2.3.4: 242 | version "2.3.5" 243 | resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" 244 | integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== 245 | dependencies: 246 | safe-buffer "^5.1.2" 247 | yallist "^3.0.0" 248 | 249 | minizlib@^1.1.1: 250 | version "1.2.1" 251 | resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614" 252 | integrity sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA== 253 | dependencies: 254 | minipass "^2.2.1" 255 | 256 | mkdirp@^0.5.0, mkdirp@^0.5.1: 257 | version "0.5.1" 258 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 259 | dependencies: 260 | minimist "0.0.8" 261 | 262 | ms@2.0.0: 263 | version "2.0.0" 264 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 265 | 266 | nan@^2.12.1: 267 | version "2.12.1" 268 | resolved "https://registry.yarnpkg.com/nan/-/nan-2.12.1.tgz#7b1aa193e9aa86057e3c7bbd0ac448e770925552" 269 | integrity sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw== 270 | 271 | napi-build-utils@^1.0.1: 272 | version "1.0.1" 273 | resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.1.tgz#1381a0f92c39d66bf19852e7873432fc2123e508" 274 | integrity sha512-boQj1WFgQH3v4clhu3mTNfP+vOBxorDlE8EKiMjUlLG3C4qAESnn9AxIOkFgTR2c9LtzNjPrjS60cT27ZKBhaA== 275 | 276 | node-abi@^2.7.0: 277 | version "2.7.1" 278 | resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.7.1.tgz#a8997ae91176a5fbaa455b194976e32683cda643" 279 | integrity sha512-OV8Bq1OrPh6z+Y4dqwo05HqrRL9YNF7QVMRfq1/pguwKLG+q9UB/Lk0x5qXjO23JjJg+/jqCHSTaG1P3tfKfuw== 280 | dependencies: 281 | semver "^5.4.1" 282 | 283 | noop-logger@^0.1.1: 284 | version "0.1.1" 285 | resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2" 286 | integrity sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI= 287 | 288 | npmlog@^4.0.1, npmlog@^4.1.2: 289 | version "4.1.2" 290 | resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" 291 | integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== 292 | dependencies: 293 | are-we-there-yet "~1.1.2" 294 | console-control-strings "~1.1.0" 295 | gauge "~2.7.3" 296 | set-blocking "~2.0.0" 297 | 298 | number-is-nan@^1.0.0: 299 | version "1.0.1" 300 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 301 | integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= 302 | 303 | object-assign@^4.1.0: 304 | version "4.1.1" 305 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 306 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 307 | 308 | once@^1.3.1, once@^1.4.0: 309 | version "1.4.0" 310 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 311 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 312 | dependencies: 313 | wrappy "1" 314 | 315 | os-homedir@^1.0.1: 316 | version "1.0.2" 317 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 318 | integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= 319 | 320 | prebuild-install@^5.2.2: 321 | version "5.2.4" 322 | resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-5.2.4.tgz#8cc41a217ef778a31d3a876fe6668d05406db750" 323 | integrity sha512-CG3JnpTZXdmr92GW4zbcba4jkDha6uHraJ7hW4Fn8j0mExxwOKK20hqho8ZuBDCKYCHYIkFM1P2jhtG+KpP4fg== 324 | dependencies: 325 | detect-libc "^1.0.3" 326 | expand-template "^2.0.3" 327 | github-from-package "0.0.0" 328 | minimist "^1.2.0" 329 | mkdirp "^0.5.1" 330 | napi-build-utils "^1.0.1" 331 | node-abi "^2.7.0" 332 | noop-logger "^0.1.1" 333 | npmlog "^4.0.1" 334 | os-homedir "^1.0.1" 335 | pump "^2.0.1" 336 | rc "^1.2.7" 337 | simple-get "^2.7.0" 338 | tar-fs "^1.13.0" 339 | tunnel-agent "^0.6.0" 340 | which-pm-runs "^1.0.0" 341 | 342 | process-nextick-args@~2.0.0: 343 | version "2.0.0" 344 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" 345 | integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== 346 | 347 | pump@^1.0.0: 348 | version "1.0.3" 349 | resolved "https://registry.yarnpkg.com/pump/-/pump-1.0.3.tgz#5dfe8311c33bbf6fc18261f9f34702c47c08a954" 350 | integrity sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw== 351 | dependencies: 352 | end-of-stream "^1.1.0" 353 | once "^1.3.1" 354 | 355 | pump@^2.0.1: 356 | version "2.0.1" 357 | resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" 358 | integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== 359 | dependencies: 360 | end-of-stream "^1.1.0" 361 | once "^1.3.1" 362 | 363 | rc@^1.2.7: 364 | version "1.2.8" 365 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" 366 | integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== 367 | dependencies: 368 | deep-extend "^0.6.0" 369 | ini "~1.3.0" 370 | minimist "^1.2.0" 371 | strip-json-comments "~2.0.1" 372 | 373 | readable-stream@^2.0.6, readable-stream@^2.3.0, readable-stream@^2.3.5: 374 | version "2.3.6" 375 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" 376 | integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== 377 | dependencies: 378 | core-util-is "~1.0.0" 379 | inherits "~2.0.3" 380 | isarray "~1.0.0" 381 | process-nextick-args "~2.0.0" 382 | safe-buffer "~5.1.1" 383 | string_decoder "~1.1.1" 384 | util-deprecate "~1.0.1" 385 | 386 | safe-buffer@^5.0.1: 387 | version "5.1.1" 388 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" 389 | 390 | safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: 391 | version "5.1.2" 392 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 393 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 394 | 395 | semver@^5.4.1, semver@^5.6.0: 396 | version "5.6.0" 397 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" 398 | integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== 399 | 400 | set-blocking@~2.0.0: 401 | version "2.0.0" 402 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 403 | integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= 404 | 405 | sharp@^0.21.3: 406 | version "0.21.3" 407 | resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.21.3.tgz#381937de66c123687f2ac7186f85921c6bb19cdd" 408 | integrity sha512-5qZk8r+YgfyztLEKkNez20Wynq/Uh1oNyP5T/3gTYwt2lBYGs9iDs5m0yVsZEPm8eVBbAJhS08J1wp/g+Ai1Qw== 409 | dependencies: 410 | bindings "^1.3.1" 411 | color "^3.1.0" 412 | detect-libc "^1.0.3" 413 | fs-copy-file-sync "^1.1.1" 414 | nan "^2.12.1" 415 | npmlog "^4.1.2" 416 | prebuild-install "^5.2.2" 417 | semver "^5.6.0" 418 | simple-get "^3.0.3" 419 | tar "^4.4.8" 420 | tunnel-agent "^0.6.0" 421 | 422 | signal-exit@^3.0.0: 423 | version "3.0.2" 424 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 425 | integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= 426 | 427 | simple-concat@^1.0.0: 428 | version "1.0.0" 429 | resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.0.tgz#7344cbb8b6e26fb27d66b2fc86f9f6d5997521c6" 430 | integrity sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY= 431 | 432 | simple-get@^2.7.0: 433 | version "2.8.1" 434 | resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-2.8.1.tgz#0e22e91d4575d87620620bc91308d57a77f44b5d" 435 | integrity sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw== 436 | dependencies: 437 | decompress-response "^3.3.0" 438 | once "^1.3.1" 439 | simple-concat "^1.0.0" 440 | 441 | simple-get@^3.0.3: 442 | version "3.0.3" 443 | resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.0.3.tgz#924528ac3f9d7718ce5e9ec1b1a69c0be4d62efa" 444 | integrity sha512-Wvre/Jq5vgoz31Z9stYWPLn0PqRqmBDpFSdypAnHu5AvRVCYPRYGnvryNLiXu8GOBNDH82J2FRHUGMjjHUpXFw== 445 | dependencies: 446 | decompress-response "^3.3.0" 447 | once "^1.3.1" 448 | simple-concat "^1.0.0" 449 | 450 | simple-swizzle@^0.2.2: 451 | version "0.2.2" 452 | resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" 453 | dependencies: 454 | is-arrayish "^0.3.1" 455 | 456 | string-width@^1.0.1: 457 | version "1.0.2" 458 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 459 | integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= 460 | dependencies: 461 | code-point-at "^1.0.0" 462 | is-fullwidth-code-point "^1.0.0" 463 | strip-ansi "^3.0.0" 464 | 465 | "string-width@^1.0.2 || 2": 466 | version "2.1.1" 467 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 468 | integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== 469 | dependencies: 470 | is-fullwidth-code-point "^2.0.0" 471 | strip-ansi "^4.0.0" 472 | 473 | string_decoder@~1.1.1: 474 | version "1.1.1" 475 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 476 | integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== 477 | dependencies: 478 | safe-buffer "~5.1.0" 479 | 480 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 481 | version "3.0.1" 482 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 483 | integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= 484 | dependencies: 485 | ansi-regex "^2.0.0" 486 | 487 | strip-ansi@^4.0.0: 488 | version "4.0.0" 489 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 490 | integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= 491 | dependencies: 492 | ansi-regex "^3.0.0" 493 | 494 | strip-json-comments@~2.0.1: 495 | version "2.0.1" 496 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 497 | 498 | tar-fs@^1.13.0: 499 | version "1.16.3" 500 | resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-1.16.3.tgz#966a628841da2c4010406a82167cbd5e0c72d509" 501 | integrity sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw== 502 | dependencies: 503 | chownr "^1.0.1" 504 | mkdirp "^0.5.1" 505 | pump "^1.0.0" 506 | tar-stream "^1.1.2" 507 | 508 | tar-stream@^1.1.2: 509 | version "1.6.2" 510 | resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555" 511 | integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A== 512 | dependencies: 513 | bl "^1.0.0" 514 | buffer-alloc "^1.2.0" 515 | end-of-stream "^1.0.0" 516 | fs-constants "^1.0.0" 517 | readable-stream "^2.3.0" 518 | to-buffer "^1.1.1" 519 | xtend "^4.0.0" 520 | 521 | tar@^4.4.8: 522 | version "4.4.8" 523 | resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d" 524 | integrity sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ== 525 | dependencies: 526 | chownr "^1.1.1" 527 | fs-minipass "^1.2.5" 528 | minipass "^2.3.4" 529 | minizlib "^1.1.1" 530 | mkdirp "^0.5.0" 531 | safe-buffer "^5.1.2" 532 | yallist "^3.0.2" 533 | 534 | to-buffer@^1.1.1: 535 | version "1.1.1" 536 | resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80" 537 | integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg== 538 | 539 | tunnel-agent@^0.6.0: 540 | version "0.6.0" 541 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" 542 | integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= 543 | dependencies: 544 | safe-buffer "^5.0.1" 545 | 546 | util-deprecate@~1.0.1: 547 | version "1.0.2" 548 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 549 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 550 | 551 | which-pm-runs@^1.0.0: 552 | version "1.0.0" 553 | resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb" 554 | integrity sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs= 555 | 556 | wide-align@^1.1.0: 557 | version "1.1.3" 558 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" 559 | integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== 560 | dependencies: 561 | string-width "^1.0.2 || 2" 562 | 563 | wrappy@1: 564 | version "1.0.2" 565 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 566 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 567 | 568 | xtend@^4.0.0: 569 | version "4.0.1" 570 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" 571 | integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= 572 | 573 | yallist@^3.0.0, yallist@^3.0.2: 574 | version "3.0.2" 575 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" 576 | --------------------------------------------------------------------------------