├── .gitignore ├── example.js ├── .vscode └── settings.json ├── install.js ├── src └── index.ts ├── tsconfig.json ├── tslint.json ├── README.md ├── binding.gyp ├── package.json ├── LICENSE ├── lib ├── addon.mm └── addon.cc └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | /build/ 2 | /node_modules/ 3 | .vscode/ipch 4 | dist -------------------------------------------------------------------------------- /example.js: -------------------------------------------------------------------------------- 1 | const getFileIcon = require("./dist/index"); 2 | 3 | console.log(getFileIcon("C:\\Windows\\System32\\cmd.exe")); 4 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "files.associations": { 3 | "initializer_list": "cpp", 4 | "type_traits": "cpp", 5 | "xutility": "cpp" 6 | } 7 | } -------------------------------------------------------------------------------- /install.js: -------------------------------------------------------------------------------- 1 | const os = require("os"); 2 | const { spawn } = require("child_process"); 3 | 4 | if (os.platform() === "win32") { 5 | spawn("npm.cmd", ["run", "build-win32"], { cwd: __dirname }); 6 | } 7 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { platform } from "os"; 2 | 3 | let getIcon: any; 4 | 5 | if (platform() === "win32" || platform() === 'darwin') { 6 | getIcon = require("../build/Release/addon.node").getIcon; 7 | } 8 | 9 | const getFileIcon = (path: string, size: 16 | 32 | 64 | 256 = 64): Buffer => { 10 | if (!getIcon) return; 11 | return getIcon(path, size); 12 | }; 13 | 14 | export = getFileIcon; 15 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "outDir": "./dist/", 4 | "noImplicitAny": true, 5 | "module": "commonjs", 6 | "target": "es2015", 7 | "sourceMap": true, 8 | "moduleResolution": "node", 9 | "allowSyntheticDefaultImports": true, 10 | "declaration": true, 11 | "types": ["node"] 12 | }, 13 | "include": ["./src/index.ts"], 14 | "exclude": ["node_modules/**/*"] 15 | } 16 | -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["tslint-config-airbnb"], 3 | "rules": { 4 | "no-increment-decrement": false, 5 | "max-line-length": false, 6 | "variable-name": [ 7 | true, 8 | "ban-keywords", 9 | "check-format", 10 | "allow-pascal-case", 11 | "allow-leading-underscore" 12 | ], 13 | "import-name": false, 14 | "ter-arrow-parens": false, 15 | "no-parameter-reassignment": false, 16 | "object-shorthand-properties-first": false, 17 | "semicolon": false, 18 | "align": false, 19 | "no-this-assignment": false 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # extract-file-icon 2 | 3 | Get associated file icon for Node.js. 4 | 5 | # Installation 6 | 7 | To install this package, just run 8 | 9 | ```bash 10 | $ npm install extract-file-icon 11 | ``` 12 | 13 | # Quick start 14 | 15 | The following example shows how to get the currently focused window's title and hide it. 16 | 17 | ```javascript 18 | const fileIcon = require("extract-file-icon"); 19 | 20 | const icon = fileIcon('path', 32); // Returns PNG buffer of 32x32 file icon at given path. 21 | ``` 22 | 23 | # Documentation 24 | 25 | ## Default exported method `getFileIcon(path: string, size: number)` 26 | - `path` string 27 | - `size` number - by default its value is 64. On Windows it can be only 16, 32, 64 or 256. 28 | -------------------------------------------------------------------------------- /binding.gyp: -------------------------------------------------------------------------------- 1 | { 2 | "targets": [ 3 | { 4 | "target_name": "addon", 5 | "cflags!": [ "-fno-exceptions" ], 6 | "cflags_cc!": [ "-fno-exceptions" ], 7 | 'conditions': [ 8 | ['OS=="win"', { 9 | 'link_settings': { 10 | 'libraries': [ 11 | 'Gdiplus.lib', 12 | ], 13 | }, 14 | 'sources': [ 15 | 'lib/addon.cc', 16 | ], 17 | }], 18 | ['OS=="mac"', { 19 | 'link_settings': { 20 | 'libraries': [ 21 | '-framework AppKit', 22 | ], 23 | }, 24 | 'sources': [ 25 | 'lib/addon.mm', 26 | ], 27 | }], 28 | ], 29 | "include_dirs": [ 30 | " 2 | #include 3 | #include 4 | 5 | std::vector imageToPng(NSImage* image) { 6 | auto imageRef = [image CGImageForProposedRect:nil context:nil hints:nil]; 7 | auto imageRep = [[NSBitmapImageRep alloc] initWithCGImage:imageRef]; 8 | [imageRep setSize:[image size]]; 9 | auto imageData = [imageRep representationUsingType:NSPNGFileType properties:[[NSDictionary alloc] init]]; 10 | auto p = static_cast([imageData bytes]); 11 | return std::vector{p, p + [imageData length]}; 12 | } 13 | 14 | Napi::Buffer getIcon(const Napi::CallbackInfo &info) { 15 | Napi::Env env{info.Env()}; 16 | 17 | auto path{info[0].As().Utf8Value()}; 18 | auto size{info[1].As().Int32Value()}; 19 | 20 | auto image = [[NSWorkspace sharedWorkspace] iconForFile:[NSString stringWithUTF8String:path.c_str()]]; 21 | [image setSize:NSMakeSize(size, size)]; 22 | 23 | auto data = imageToPng(image); 24 | uint8_t *arr = &data[0]; 25 | 26 | return Napi::Buffer::Copy( 27 | env, static_cast(static_cast(arr)), data.size()); 28 | } 29 | 30 | Napi::Object Init(Napi::Env env, Napi::Object exports) { 31 | exports.Set(Napi::String::New(env, "getIcon"), 32 | Napi::Function::New(env, getIcon)); 33 | 34 | return exports; 35 | } 36 | 37 | NODE_API_MODULE(addon, Init) -------------------------------------------------------------------------------- /lib/addon.cc: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | 12 | namespace Gdiplus { 13 | using std::max; 14 | using std::min; 15 | } // namespace Gdiplus 16 | #include 17 | 18 | class ComInit { 19 | public: 20 | ComInit() { CoInitializeEx(0, COINIT_MULTITHREADED); } 21 | 22 | ~ComInit() { CoUninitialize(); } 23 | 24 | private: 25 | ComInit(const ComInit &); 26 | ComInit &operator=(const ComInit &); 27 | }; 28 | 29 | class GdiPlusInit { 30 | public: 31 | GdiPlusInit() { 32 | Gdiplus::GdiplusStartupInput startupInput; 33 | Gdiplus::GdiplusStartup(std::addressof(this->token), 34 | std::addressof(startupInput), nullptr); 35 | } 36 | 37 | ~GdiPlusInit() { Gdiplus::GdiplusShutdown(this->token); } 38 | 39 | private: 40 | GdiPlusInit(const GdiPlusInit &); 41 | GdiPlusInit &operator=(const GdiPlusInit &); 42 | 43 | ULONG_PTR token; 44 | }; 45 | 46 | struct IStreamDeleter { 47 | void operator()(IStream *pStream) const { pStream->Release(); } 48 | }; 49 | 50 | std::unique_ptr CreateBitmapFromIcon( 51 | HICON hIcon, std::vector &buffer) { 52 | ICONINFO iconInfo = {0}; 53 | GetIconInfo(hIcon, std::addressof(iconInfo)); 54 | 55 | BITMAP bm = {0}; 56 | GetObject(iconInfo.hbmColor, sizeof(bm), std::addressof(bm)); 57 | 58 | std::unique_ptr bitmap; 59 | 60 | if (bm.bmBitsPixel == 32) { 61 | auto hDC = GetDC(nullptr); 62 | 63 | BITMAPINFO bmi = {0}; 64 | bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 65 | bmi.bmiHeader.biWidth = bm.bmWidth; 66 | bmi.bmiHeader.biHeight = -bm.bmHeight; 67 | bmi.bmiHeader.biPlanes = 1; 68 | bmi.bmiHeader.biBitCount = 32; 69 | bmi.bmiHeader.biCompression = BI_RGB; 70 | 71 | auto nBits = bm.bmWidth * bm.bmHeight; 72 | buffer.resize(nBits); 73 | GetDIBits(hDC, iconInfo.hbmColor, 0, bm.bmHeight, 74 | std::addressof(buffer[0]), std::addressof(bmi), 75 | DIB_RGB_COLORS); 76 | 77 | auto hasAlpha = false; 78 | for (std::int32_t i = 0; i < nBits; i++) { 79 | if ((buffer[i] & 0xFF000000) != 0) { 80 | hasAlpha = true; 81 | break; 82 | } 83 | } 84 | 85 | if (!hasAlpha) { 86 | std::vector maskBits(nBits); 87 | GetDIBits(hDC, iconInfo.hbmMask, 0, bm.bmHeight, 88 | std::addressof(maskBits[0]), std::addressof(bmi), 89 | DIB_RGB_COLORS); 90 | 91 | for (std::int32_t i = 0; i < nBits; i++) { 92 | if (maskBits[i] == 0) { 93 | buffer[i] |= 0xFF000000; 94 | } 95 | } 96 | } 97 | 98 | bitmap.reset(new Gdiplus::Bitmap( 99 | bm.bmWidth, bm.bmHeight, bm.bmWidth * sizeof(std::int32_t), 100 | PixelFormat32bppARGB, 101 | static_cast( 102 | static_cast(std::addressof(buffer[0]))))); 103 | 104 | ReleaseDC(nullptr, hDC); 105 | } else { 106 | bitmap.reset(Gdiplus::Bitmap::FromHICON(hIcon)); 107 | } 108 | 109 | DeleteObject(iconInfo.hbmColor); 110 | DeleteObject(iconInfo.hbmMask); 111 | 112 | return bitmap; 113 | } 114 | 115 | int GetEncoderClsid(const WCHAR *format, CLSID *pClsid) { 116 | UINT num = 0u; 117 | UINT size = 0u; 118 | 119 | Gdiplus::GetImageEncodersSize(std::addressof(num), std::addressof(size)); 120 | 121 | if (size == 0u) { 122 | return -1; 123 | } 124 | 125 | std::unique_ptr pImageCodecInfo( 126 | static_cast( 127 | static_cast(new BYTE[size]))); 128 | 129 | if (pImageCodecInfo == nullptr) { 130 | return -1; 131 | } 132 | 133 | GetImageEncoders(num, size, pImageCodecInfo.get()); 134 | 135 | for (UINT i = 0u; i < num; i++) { 136 | if (std::wcscmp(pImageCodecInfo.get()[i].MimeType, format) == 0) { 137 | *pClsid = pImageCodecInfo.get()[i].Clsid; 138 | return i; 139 | } 140 | } 141 | 142 | return -1; 143 | } 144 | 145 | std::vector HIconToPNG(HICON hIcon) { 146 | GdiPlusInit init; 147 | 148 | std::vector buffer; 149 | auto bitmap = CreateBitmapFromIcon(hIcon, buffer); 150 | 151 | CLSID encoder; 152 | if (GetEncoderClsid(L"image/png", std::addressof(encoder)) == -1) { 153 | return std::vector{}; 154 | } 155 | 156 | IStream *tmp; 157 | if (CreateStreamOnHGlobal(nullptr, TRUE, std::addressof(tmp)) != S_OK) { 158 | return std::vector{}; 159 | } 160 | 161 | std::unique_ptr pStream{tmp}; 162 | 163 | if (bitmap->Save(pStream.get(), std::addressof(encoder), nullptr) != 164 | Gdiplus::Status::Ok) { 165 | return std::vector{}; 166 | } 167 | 168 | STATSTG stg = {0}; 169 | LARGE_INTEGER offset = {0}; 170 | 171 | if (pStream->Stat(std::addressof(stg), STATFLAG_NONAME) != S_OK || 172 | pStream->Seek(offset, STREAM_SEEK_SET, nullptr) != S_OK) { 173 | return std::vector{}; 174 | } 175 | 176 | std::vector result( 177 | static_cast(stg.cbSize.QuadPart)); 178 | ULONG ul; 179 | 180 | if (pStream->Read(std::addressof(result[0]), 181 | static_cast(stg.cbSize.QuadPart), 182 | std::addressof(ul)) != S_OK || 183 | stg.cbSize.QuadPart != ul) { 184 | return std::vector{}; 185 | } 186 | 187 | return result; 188 | } 189 | 190 | std::wstring Utf8ToWide(const std::string &src) { 191 | const auto size = 192 | MultiByteToWideChar(CP_UTF8, 0u, src.data(), -1, nullptr, 0u); 193 | std::vector dest(size, L'\0'); 194 | 195 | if (MultiByteToWideChar(CP_UTF8, 0u, src.data(), -1, dest.data(), 196 | dest.size()) == 0) { 197 | throw std::system_error{static_cast(GetLastError()), 198 | std::system_category()}; 199 | } 200 | 201 | return std::wstring{dest.begin(), dest.end()}; 202 | } 203 | 204 | std::vector GetIcon(const std::string &name, int size, 205 | UINT flag) { 206 | ComInit init; 207 | 208 | flag |= SHGFI_ICON; 209 | 210 | switch (size) { 211 | case 16: 212 | flag |= SHGFI_SMALLICON; 213 | break; 214 | case 32: 215 | flag |= SHGFI_LARGEICON; 216 | break; 217 | case 64: 218 | case 256: 219 | flag |= SHGFI_SYSICONINDEX; 220 | break; 221 | } 222 | 223 | SHFILEINFOW sfi = {0}; 224 | auto hr = SHGetFileInfoW(Utf8ToWide(name).c_str(), 0, std::addressof(sfi), 225 | sizeof(sfi), flag); 226 | HICON hIcon; 227 | 228 | if (FAILED(hr)) { 229 | return std::vector{}; 230 | } 231 | 232 | if (size == 16 || size == 32) { 233 | hIcon = sfi.hIcon; 234 | } else { 235 | HIMAGELIST *imageList; 236 | hr = SHGetImageList( 237 | size == 64 ? SHIL_EXTRALARGE : SHIL_JUMBO, IID_IImageList, 238 | static_cast( 239 | static_cast(std::addressof(imageList)))); 240 | 241 | if (FAILED(hr)) { 242 | return std::vector{}; 243 | } 244 | 245 | hr = static_cast(static_cast(imageList)) 246 | ->GetIcon(sfi.iIcon, ILD_TRANSPARENT, std::addressof(hIcon)); 247 | 248 | if (FAILED(hr)) { 249 | return std::vector{}; 250 | } 251 | } 252 | 253 | auto buffer = HIconToPNG(hIcon); 254 | DestroyIcon(hIcon); 255 | return buffer; 256 | } 257 | 258 | Napi::Buffer getIcon(const Napi::CallbackInfo &info) { 259 | Napi::Env env{info.Env()}; 260 | 261 | auto path{info[0].As().Utf8Value()}; 262 | auto data = GetIcon(path, info[1].As().Int32Value(), 0); 263 | 264 | uint8_t *arr = &data[0]; 265 | 266 | return Napi::Buffer::Copy( 267 | env, static_cast(static_cast(arr)), data.size()); 268 | } 269 | 270 | Napi::Object Init(Napi::Env env, Napi::Object exports) { 271 | exports.Set(Napi::String::New(env, "getIcon"), 272 | Napi::Function::New(env, getIcon)); 273 | 274 | return exports; 275 | } 276 | 277 | NODE_API_MODULE(addon, Init) -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@types/node@11.9.5": 6 | version "11.9.5" 7 | resolved "https://registry.yarnpkg.com/@types/node/-/node-11.9.5.tgz#011eece9d3f839a806b63973e228f85967b79ed3" 8 | 9 | abbrev@1: 10 | version "1.1.1" 11 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" 12 | 13 | ajv@^6.5.5: 14 | version "6.9.2" 15 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.9.2.tgz#4927adb83e7f48e5a32b45729744c71ec39c9c7b" 16 | dependencies: 17 | fast-deep-equal "^2.0.1" 18 | fast-json-stable-stringify "^2.0.0" 19 | json-schema-traverse "^0.4.1" 20 | uri-js "^4.2.2" 21 | 22 | ansi-regex@^2.0.0: 23 | version "2.1.1" 24 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 25 | 26 | ansi-regex@^3.0.0: 27 | version "3.0.0" 28 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 29 | 30 | ansi-styles@^2.2.1: 31 | version "2.2.1" 32 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 33 | 34 | ansi-styles@^3.2.1: 35 | version "3.2.1" 36 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 37 | dependencies: 38 | color-convert "^1.9.0" 39 | 40 | aproba@^1.0.3: 41 | version "1.2.0" 42 | resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" 43 | 44 | are-we-there-yet@~1.1.2: 45 | version "1.1.5" 46 | resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" 47 | dependencies: 48 | delegates "^1.0.0" 49 | readable-stream "^2.0.6" 50 | 51 | argparse@^1.0.7: 52 | version "1.0.10" 53 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 54 | dependencies: 55 | sprintf-js "~1.0.2" 56 | 57 | asn1@~0.2.3: 58 | version "0.2.4" 59 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" 60 | dependencies: 61 | safer-buffer "~2.1.0" 62 | 63 | assert-plus@1.0.0, assert-plus@^1.0.0: 64 | version "1.0.0" 65 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" 66 | 67 | asynckit@^0.4.0: 68 | version "0.4.0" 69 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 70 | 71 | aws-sign2@~0.7.0: 72 | version "0.7.0" 73 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" 74 | 75 | aws4@^1.8.0: 76 | version "1.8.0" 77 | resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" 78 | 79 | babel-code-frame@^6.22.0: 80 | version "6.26.0" 81 | resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" 82 | dependencies: 83 | chalk "^1.1.3" 84 | esutils "^2.0.2" 85 | js-tokens "^3.0.2" 86 | 87 | balanced-match@^1.0.0: 88 | version "1.0.0" 89 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 90 | 91 | bcrypt-pbkdf@^1.0.0: 92 | version "1.0.2" 93 | resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" 94 | dependencies: 95 | tweetnacl "^0.14.3" 96 | 97 | bindings@1.4.0: 98 | version "1.4.0" 99 | resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.4.0.tgz#909efa49f2ebe07ecd3cb136778f665052040127" 100 | dependencies: 101 | file-uri-to-path "1.0.0" 102 | 103 | block-stream@*: 104 | version "0.0.9" 105 | resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" 106 | dependencies: 107 | inherits "~2.0.0" 108 | 109 | brace-expansion@^1.1.7: 110 | version "1.1.11" 111 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 112 | dependencies: 113 | balanced-match "^1.0.0" 114 | concat-map "0.0.1" 115 | 116 | builtin-modules@^1.1.1: 117 | version "1.1.1" 118 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" 119 | 120 | caseless@~0.12.0: 121 | version "0.12.0" 122 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" 123 | 124 | chalk@^1.1.3: 125 | version "1.1.3" 126 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 127 | dependencies: 128 | ansi-styles "^2.2.1" 129 | escape-string-regexp "^1.0.2" 130 | has-ansi "^2.0.0" 131 | strip-ansi "^3.0.0" 132 | supports-color "^2.0.0" 133 | 134 | chalk@^2.3.0: 135 | version "2.4.2" 136 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 137 | dependencies: 138 | ansi-styles "^3.2.1" 139 | escape-string-regexp "^1.0.5" 140 | supports-color "^5.3.0" 141 | 142 | code-point-at@^1.0.0: 143 | version "1.1.0" 144 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 145 | 146 | color-convert@^1.9.0: 147 | version "1.9.3" 148 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 149 | dependencies: 150 | color-name "1.1.3" 151 | 152 | color-name@1.1.3: 153 | version "1.1.3" 154 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 155 | 156 | combined-stream@^1.0.6, combined-stream@~1.0.6: 157 | version "1.0.7" 158 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828" 159 | dependencies: 160 | delayed-stream "~1.0.0" 161 | 162 | commander@^2.12.1: 163 | version "2.19.0" 164 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" 165 | 166 | concat-map@0.0.1: 167 | version "0.0.1" 168 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 169 | 170 | console-control-strings@^1.0.0, console-control-strings@~1.1.0: 171 | version "1.1.0" 172 | resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" 173 | 174 | core-util-is@1.0.2, core-util-is@~1.0.0: 175 | version "1.0.2" 176 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 177 | 178 | dashdash@^1.12.0: 179 | version "1.14.1" 180 | resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" 181 | dependencies: 182 | assert-plus "^1.0.0" 183 | 184 | delayed-stream@~1.0.0: 185 | version "1.0.0" 186 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 187 | 188 | delegates@^1.0.0: 189 | version "1.0.0" 190 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 191 | 192 | diff@^3.2.0: 193 | version "3.5.0" 194 | resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" 195 | 196 | ecc-jsbn@~0.1.1: 197 | version "0.1.2" 198 | resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" 199 | dependencies: 200 | jsbn "~0.1.0" 201 | safer-buffer "^2.1.0" 202 | 203 | escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: 204 | version "1.0.5" 205 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 206 | 207 | esprima@^4.0.0: 208 | version "4.0.1" 209 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 210 | 211 | esutils@^2.0.2: 212 | version "2.0.2" 213 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 214 | 215 | extend@~3.0.2: 216 | version "3.0.2" 217 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" 218 | 219 | extsprintf@1.3.0: 220 | version "1.3.0" 221 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" 222 | 223 | extsprintf@^1.2.0: 224 | version "1.4.0" 225 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" 226 | 227 | fast-deep-equal@^2.0.1: 228 | version "2.0.1" 229 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" 230 | 231 | fast-json-stable-stringify@^2.0.0: 232 | version "2.0.0" 233 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" 234 | 235 | file-uri-to-path@1.0.0: 236 | version "1.0.0" 237 | resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" 238 | 239 | forever-agent@~0.6.1: 240 | version "0.6.1" 241 | resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" 242 | 243 | form-data@~2.3.2: 244 | version "2.3.3" 245 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" 246 | dependencies: 247 | asynckit "^0.4.0" 248 | combined-stream "^1.0.6" 249 | mime-types "^2.1.12" 250 | 251 | fs.realpath@^1.0.0: 252 | version "1.0.0" 253 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 254 | 255 | fstream@^1.0.0, fstream@^1.0.12: 256 | version "1.0.12" 257 | resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" 258 | dependencies: 259 | graceful-fs "^4.1.2" 260 | inherits "~2.0.0" 261 | mkdirp ">=0.5 0" 262 | rimraf "2" 263 | 264 | gauge@~2.7.3: 265 | version "2.7.4" 266 | resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" 267 | dependencies: 268 | aproba "^1.0.3" 269 | console-control-strings "^1.0.0" 270 | has-unicode "^2.0.0" 271 | object-assign "^4.1.0" 272 | signal-exit "^3.0.0" 273 | string-width "^1.0.1" 274 | strip-ansi "^3.0.1" 275 | wide-align "^1.1.0" 276 | 277 | getpass@^0.1.1: 278 | version "0.1.7" 279 | resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" 280 | dependencies: 281 | assert-plus "^1.0.0" 282 | 283 | glob@^7.0.3, glob@^7.1.1: 284 | version "7.1.3" 285 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" 286 | dependencies: 287 | fs.realpath "^1.0.0" 288 | inflight "^1.0.4" 289 | inherits "2" 290 | minimatch "^3.0.4" 291 | once "^1.3.0" 292 | path-is-absolute "^1.0.0" 293 | 294 | glob@^7.1.3: 295 | version "7.1.4" 296 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" 297 | dependencies: 298 | fs.realpath "^1.0.0" 299 | inflight "^1.0.4" 300 | inherits "2" 301 | minimatch "^3.0.4" 302 | once "^1.3.0" 303 | path-is-absolute "^1.0.0" 304 | 305 | graceful-fs@^4.1.2: 306 | version "4.1.15" 307 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" 308 | 309 | har-schema@^2.0.0: 310 | version "2.0.0" 311 | resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" 312 | 313 | har-validator@~5.1.0: 314 | version "5.1.3" 315 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" 316 | dependencies: 317 | ajv "^6.5.5" 318 | har-schema "^2.0.0" 319 | 320 | has-ansi@^2.0.0: 321 | version "2.0.0" 322 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 323 | dependencies: 324 | ansi-regex "^2.0.0" 325 | 326 | has-flag@^3.0.0: 327 | version "3.0.0" 328 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 329 | 330 | has-unicode@^2.0.0: 331 | version "2.0.1" 332 | resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" 333 | 334 | http-signature@~1.2.0: 335 | version "1.2.0" 336 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" 337 | dependencies: 338 | assert-plus "^1.0.0" 339 | jsprim "^1.2.2" 340 | sshpk "^1.7.0" 341 | 342 | inflight@^1.0.4: 343 | version "1.0.6" 344 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 345 | dependencies: 346 | once "^1.3.0" 347 | wrappy "1" 348 | 349 | inherits@2, inherits@~2.0.0, inherits@~2.0.3: 350 | version "2.0.3" 351 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 352 | 353 | is-fullwidth-code-point@^1.0.0: 354 | version "1.0.0" 355 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 356 | dependencies: 357 | number-is-nan "^1.0.0" 358 | 359 | is-fullwidth-code-point@^2.0.0: 360 | version "2.0.0" 361 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 362 | 363 | is-typedarray@~1.0.0: 364 | version "1.0.0" 365 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 366 | 367 | isarray@~1.0.0: 368 | version "1.0.0" 369 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 370 | 371 | isexe@^2.0.0: 372 | version "2.0.0" 373 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 374 | 375 | isstream@~0.1.2: 376 | version "0.1.2" 377 | resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 378 | 379 | js-tokens@^3.0.2: 380 | version "3.0.2" 381 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" 382 | 383 | js-yaml@^3.7.0: 384 | version "3.13.1" 385 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" 386 | dependencies: 387 | argparse "^1.0.7" 388 | esprima "^4.0.0" 389 | 390 | jsbn@~0.1.0: 391 | version "0.1.1" 392 | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" 393 | 394 | json-schema-traverse@^0.4.1: 395 | version "0.4.1" 396 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 397 | 398 | json-schema@0.2.3: 399 | version "0.2.3" 400 | resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" 401 | 402 | json-stringify-safe@~5.0.1: 403 | version "5.0.1" 404 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 405 | 406 | jsprim@^1.2.2: 407 | version "1.4.1" 408 | resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" 409 | dependencies: 410 | assert-plus "1.0.0" 411 | extsprintf "1.3.0" 412 | json-schema "0.2.3" 413 | verror "1.10.0" 414 | 415 | mime-db@~1.38.0: 416 | version "1.38.0" 417 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.38.0.tgz#1a2aab16da9eb167b49c6e4df2d9c68d63d8e2ad" 418 | 419 | mime-types@^2.1.12, mime-types@~2.1.19: 420 | version "2.1.22" 421 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.22.tgz#fe6b355a190926ab7698c9a0556a11199b2199bd" 422 | dependencies: 423 | mime-db "~1.38.0" 424 | 425 | minimatch@^3.0.4: 426 | version "3.0.4" 427 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 428 | dependencies: 429 | brace-expansion "^1.1.7" 430 | 431 | minimist@0.0.8: 432 | version "0.0.8" 433 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 434 | 435 | "mkdirp@>=0.5 0", mkdirp@^0.5.0: 436 | version "0.5.1" 437 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 438 | dependencies: 439 | minimist "0.0.8" 440 | 441 | nan@2.12.1: 442 | version "2.12.1" 443 | resolved "https://registry.yarnpkg.com/nan/-/nan-2.12.1.tgz#7b1aa193e9aa86057e3c7bbd0ac448e770925552" 444 | 445 | node-gyp@3.8.0: 446 | version "3.8.0" 447 | resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c" 448 | dependencies: 449 | fstream "^1.0.0" 450 | glob "^7.0.3" 451 | graceful-fs "^4.1.2" 452 | mkdirp "^0.5.0" 453 | nopt "2 || 3" 454 | npmlog "0 || 1 || 2 || 3 || 4" 455 | osenv "0" 456 | request "^2.87.0" 457 | rimraf "2" 458 | semver "~5.3.0" 459 | tar "^2.0.0" 460 | which "1" 461 | 462 | "nopt@2 || 3": 463 | version "3.0.6" 464 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" 465 | dependencies: 466 | abbrev "1" 467 | 468 | "npmlog@0 || 1 || 2 || 3 || 4": 469 | version "4.1.2" 470 | resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" 471 | dependencies: 472 | are-we-there-yet "~1.1.2" 473 | console-control-strings "~1.1.0" 474 | gauge "~2.7.3" 475 | set-blocking "~2.0.0" 476 | 477 | number-is-nan@^1.0.0: 478 | version "1.0.1" 479 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 480 | 481 | oauth-sign@~0.9.0: 482 | version "0.9.0" 483 | resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" 484 | 485 | object-assign@^4.1.0: 486 | version "4.1.1" 487 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 488 | 489 | once@^1.3.0: 490 | version "1.4.0" 491 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 492 | dependencies: 493 | wrappy "1" 494 | 495 | os-homedir@^1.0.0: 496 | version "1.0.2" 497 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 498 | 499 | os-tmpdir@^1.0.0: 500 | version "1.0.2" 501 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 502 | 503 | osenv@0: 504 | version "0.1.5" 505 | resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" 506 | dependencies: 507 | os-homedir "^1.0.0" 508 | os-tmpdir "^1.0.0" 509 | 510 | path-is-absolute@^1.0.0: 511 | version "1.0.1" 512 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 513 | 514 | path-parse@^1.0.6: 515 | version "1.0.6" 516 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" 517 | 518 | performance-now@^2.1.0: 519 | version "2.1.0" 520 | resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" 521 | 522 | process-nextick-args@~2.0.0: 523 | version "2.0.0" 524 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" 525 | 526 | psl@^1.1.24: 527 | version "1.1.31" 528 | resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.31.tgz#e9aa86d0101b5b105cbe93ac6b784cd547276184" 529 | 530 | punycode@^1.4.1: 531 | version "1.4.1" 532 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" 533 | 534 | punycode@^2.1.0: 535 | version "2.1.1" 536 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 537 | 538 | qs@~6.5.2: 539 | version "6.5.2" 540 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" 541 | 542 | readable-stream@^2.0.6: 543 | version "2.3.6" 544 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" 545 | dependencies: 546 | core-util-is "~1.0.0" 547 | inherits "~2.0.3" 548 | isarray "~1.0.0" 549 | process-nextick-args "~2.0.0" 550 | safe-buffer "~5.1.1" 551 | string_decoder "~1.1.1" 552 | util-deprecate "~1.0.1" 553 | 554 | request@^2.87.0: 555 | version "2.88.0" 556 | resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" 557 | dependencies: 558 | aws-sign2 "~0.7.0" 559 | aws4 "^1.8.0" 560 | caseless "~0.12.0" 561 | combined-stream "~1.0.6" 562 | extend "~3.0.2" 563 | forever-agent "~0.6.1" 564 | form-data "~2.3.2" 565 | har-validator "~5.1.0" 566 | http-signature "~1.2.0" 567 | is-typedarray "~1.0.0" 568 | isstream "~0.1.2" 569 | json-stringify-safe "~5.0.1" 570 | mime-types "~2.1.19" 571 | oauth-sign "~0.9.0" 572 | performance-now "^2.1.0" 573 | qs "~6.5.2" 574 | safe-buffer "^5.1.2" 575 | tough-cookie "~2.4.3" 576 | tunnel-agent "^0.6.0" 577 | uuid "^3.3.2" 578 | 579 | resolve@^1.3.2: 580 | version "1.10.0" 581 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.0.tgz#3bdaaeaf45cc07f375656dfd2e54ed0810b101ba" 582 | dependencies: 583 | path-parse "^1.0.6" 584 | 585 | rimraf@2: 586 | version "2.6.3" 587 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" 588 | dependencies: 589 | glob "^7.1.3" 590 | 591 | safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: 592 | version "5.1.2" 593 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 594 | 595 | safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: 596 | version "2.1.2" 597 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 598 | 599 | semver@^5.3.0: 600 | version "5.6.0" 601 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" 602 | 603 | semver@~5.3.0: 604 | version "5.3.0" 605 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" 606 | 607 | set-blocking@~2.0.0: 608 | version "2.0.0" 609 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 610 | 611 | signal-exit@^3.0.0: 612 | version "3.0.2" 613 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 614 | 615 | sprintf-js@~1.0.2: 616 | version "1.0.3" 617 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 618 | 619 | sshpk@^1.7.0: 620 | version "1.16.1" 621 | resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" 622 | dependencies: 623 | asn1 "~0.2.3" 624 | assert-plus "^1.0.0" 625 | bcrypt-pbkdf "^1.0.0" 626 | dashdash "^1.12.0" 627 | ecc-jsbn "~0.1.1" 628 | getpass "^0.1.1" 629 | jsbn "~0.1.0" 630 | safer-buffer "^2.0.2" 631 | tweetnacl "~0.14.0" 632 | 633 | string-width@^1.0.1: 634 | version "1.0.2" 635 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 636 | dependencies: 637 | code-point-at "^1.0.0" 638 | is-fullwidth-code-point "^1.0.0" 639 | strip-ansi "^3.0.0" 640 | 641 | "string-width@^1.0.2 || 2": 642 | version "2.1.1" 643 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 644 | dependencies: 645 | is-fullwidth-code-point "^2.0.0" 646 | strip-ansi "^4.0.0" 647 | 648 | string_decoder@~1.1.1: 649 | version "1.1.1" 650 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 651 | dependencies: 652 | safe-buffer "~5.1.0" 653 | 654 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 655 | version "3.0.1" 656 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 657 | dependencies: 658 | ansi-regex "^2.0.0" 659 | 660 | strip-ansi@^4.0.0: 661 | version "4.0.0" 662 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 663 | dependencies: 664 | ansi-regex "^3.0.0" 665 | 666 | supports-color@^2.0.0: 667 | version "2.0.0" 668 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 669 | 670 | supports-color@^5.3.0: 671 | version "5.5.0" 672 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 673 | dependencies: 674 | has-flag "^3.0.0" 675 | 676 | tar@^2.0.0: 677 | version "2.2.2" 678 | resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.2.tgz#0ca8848562c7299b8b446ff6a4d60cdbb23edc40" 679 | dependencies: 680 | block-stream "*" 681 | fstream "^1.0.12" 682 | inherits "2" 683 | 684 | tough-cookie@~2.4.3: 685 | version "2.4.3" 686 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" 687 | dependencies: 688 | psl "^1.1.24" 689 | punycode "^1.4.1" 690 | 691 | tslib@^1.8.0, tslib@^1.8.1: 692 | version "1.9.3" 693 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" 694 | 695 | tslint@5.12.1: 696 | version "5.12.1" 697 | resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.12.1.tgz#8cec9d454cf8a1de9b0a26d7bdbad6de362e52c1" 698 | dependencies: 699 | babel-code-frame "^6.22.0" 700 | builtin-modules "^1.1.1" 701 | chalk "^2.3.0" 702 | commander "^2.12.1" 703 | diff "^3.2.0" 704 | glob "^7.1.1" 705 | js-yaml "^3.7.0" 706 | minimatch "^3.0.4" 707 | resolve "^1.3.2" 708 | semver "^5.3.0" 709 | tslib "^1.8.0" 710 | tsutils "^2.27.2" 711 | 712 | tsutils@^2.27.2: 713 | version "2.29.0" 714 | resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" 715 | dependencies: 716 | tslib "^1.8.1" 717 | 718 | tunnel-agent@^0.6.0: 719 | version "0.6.0" 720 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" 721 | dependencies: 722 | safe-buffer "^5.0.1" 723 | 724 | tweetnacl@^0.14.3, tweetnacl@~0.14.0: 725 | version "0.14.5" 726 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" 727 | 728 | typescript@3.3.3333: 729 | version "3.3.3333" 730 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.3.3333.tgz#171b2c5af66c59e9431199117a3bcadc66fdcfd6" 731 | 732 | uri-js@^4.2.2: 733 | version "4.2.2" 734 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" 735 | dependencies: 736 | punycode "^2.1.0" 737 | 738 | util-deprecate@~1.0.1: 739 | version "1.0.2" 740 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 741 | 742 | uuid@^3.3.2: 743 | version "3.3.2" 744 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" 745 | 746 | verror@1.10.0: 747 | version "1.10.0" 748 | resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" 749 | dependencies: 750 | assert-plus "^1.0.0" 751 | core-util-is "1.0.2" 752 | extsprintf "^1.2.0" 753 | 754 | which@1: 755 | version "1.3.1" 756 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 757 | dependencies: 758 | isexe "^2.0.0" 759 | 760 | wide-align@^1.1.0: 761 | version "1.1.3" 762 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" 763 | dependencies: 764 | string-width "^1.0.2 || 2" 765 | 766 | wrappy@1: 767 | version "1.0.2" 768 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 769 | --------------------------------------------------------------------------------