├── .gitignore ├── store.png ├── src ├── images │ ├── jpop-bg.png │ ├── kanna.gif │ ├── kpop-bg.jpg │ ├── logo128.png │ ├── logo16.png │ ├── logo24.png │ ├── logo32.png │ └── logo48.png ├── options │ ├── options.css │ ├── options.js │ └── options.html ├── manifest.json ├── popup.html ├── icons.svg ├── css │ └── style.css └── js │ ├── popup.js │ └── background.js ├── .editorconfig ├── .github └── ISSUE_TEMPLATE.md ├── package.json ├── LICENSE ├── README.md └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | project_files 3 | yarn-error.log 4 | -------------------------------------------------------------------------------- /store.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LISTEN-moe/browser-extension/HEAD/store.png -------------------------------------------------------------------------------- /src/images/jpop-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LISTEN-moe/browser-extension/HEAD/src/images/jpop-bg.png -------------------------------------------------------------------------------- /src/images/kanna.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LISTEN-moe/browser-extension/HEAD/src/images/kanna.gif -------------------------------------------------------------------------------- /src/images/kpop-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LISTEN-moe/browser-extension/HEAD/src/images/kpop-bg.jpg -------------------------------------------------------------------------------- /src/images/logo128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LISTEN-moe/browser-extension/HEAD/src/images/logo128.png -------------------------------------------------------------------------------- /src/images/logo16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LISTEN-moe/browser-extension/HEAD/src/images/logo16.png -------------------------------------------------------------------------------- /src/images/logo24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LISTEN-moe/browser-extension/HEAD/src/images/logo24.png -------------------------------------------------------------------------------- /src/images/logo32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LISTEN-moe/browser-extension/HEAD/src/images/logo32.png -------------------------------------------------------------------------------- /src/images/logo48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LISTEN-moe/browser-extension/HEAD/src/images/logo48.png -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | indent_size = 4 7 | indent_style = tab 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.md] 12 | trim_trailing_whitespace = false 13 | -------------------------------------------------------------------------------- /src/options/options.css: -------------------------------------------------------------------------------- 1 | input[type='checkbox'] { 2 | vertical-align: middle; 3 | } 4 | 5 | label { 6 | display: block; 7 | margin-bottom: 0.5em; 8 | } 9 | 10 | label:hover { 11 | cursor: help; 12 | } 13 | 14 | a:hover { 15 | cursor: pointer; 16 | } 17 | 18 | #shortcuts { 19 | display: block; 20 | margin-top: 1em; 21 | text-align: center; 22 | } 23 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | 6 | 7 | **Please describe the problem you are having in as much detail as possible:** 8 | 9 | **Further details:** 10 | 11 | - Browser version: 12 | - Operating system: 13 | - Priority this should have – please be realistic and elaborate if possible: 14 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "listen-moe-extension", 3 | "version": "1.0.0", 4 | "description": "Anime/Japanese Radio powered by LISTEN.moe!", 5 | "main": "index.js", 6 | "repository": "https://github.com/LISTEN-moe/chrome-extension.git", 7 | "author": "pilar6195 (https://github.com/pilar6195)", 8 | "license": "MIT", 9 | "engines": { 10 | "node": ">=8.0.0" 11 | }, 12 | "devDependencies": { 13 | "eslint": "^4.19.1", 14 | "eslint-config-aqua": "^3.0.0" 15 | }, 16 | "eslintConfig": { 17 | "extends": [ 18 | "aqua" 19 | ], 20 | "env": { 21 | "browser": true, 22 | "es6": true, 23 | "webextensions": true 24 | }, 25 | "rules": { 26 | "func-names": 0, 27 | "curly": 0, 28 | "max-len": 0, 29 | "id-length": 0, 30 | "no-invalid-this": 0, 31 | "no-console": 0, 32 | "padded-blocks": 0, 33 | "no-unused-expressions": [ 34 | "error", { "allowTernary": true } 35 | ] 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/options/options.js: -------------------------------------------------------------------------------- 1 | chrome.storage.local.get({ 2 | enableAutoplay: false, 3 | enableNotifications: true, 4 | enableEventNotifications: true 5 | }, (items) => { 6 | document.getElementById('enableAutoplay').checked = items.enableAutoplay; 7 | document.getElementById('enableNotifications').checked = items.enableNotifications; 8 | document.getElementById('enableEventNotifications').checked = items.enableEventNotifications; 9 | }); 10 | 11 | document.querySelectorAll('input[type="checkbox"]').forEach((element) => { 12 | element.addEventListener('change', function() { 13 | chrome.storage.local.set({ [this.id]: this.checked }); 14 | }); 15 | }); 16 | 17 | document.getElementById('shortcuts').addEventListener('click', () => { 18 | chrome.tabs.update({ url: 'chrome://extensions/configureCommands' }); 19 | }); 20 | 21 | if (typeof InstallTrigger !== 'undefined') // Is Firefox 22 | document.getElementById('shortcuts').style.display = 'none'; -------------------------------------------------------------------------------- /src/options/options.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 12 | 13 | 16 | 17 | 20 |
21 | Configure Keyboard Shortcuts 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 pilar6195 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | 3 | "manifest_version": 2, 4 | 5 | "author": "pilar6195", 6 | "name": "LISTEN.moe", 7 | "description": "Anime/Japanese Radio powered by LISTEN.moe!", 8 | 9 | "version": "2019.8.7.1", 10 | "version_name": "Itsuki", 11 | 12 | "minimum_chrome_version": "55.0.2883", 13 | 14 | "options_ui": { 15 | "page": "options/options.html", 16 | "chrome_style": true 17 | }, 18 | 19 | "icons": { 20 | "16": "images/logo16.png", 21 | "48": "images/logo48.png", 22 | "128": "images/logo128.png" 23 | }, 24 | 25 | "permissions": [ 26 | "*://*.listen.moe/*", 27 | "cookies", 28 | "storage", 29 | "webRequest", 30 | "webRequestBlocking", 31 | "notifications" 32 | ], 33 | 34 | "browser_action": { 35 | "default_popup": "popup.html", 36 | "default_icon": { 37 | "16": "images/logo16.png", 38 | "24": "images/logo24.png", 39 | "32": "images/logo32.png" 40 | } 41 | }, 42 | 43 | "background": { 44 | "scripts": ["js/background.js"] 45 | }, 46 | 47 | "commands": { 48 | "toggle_radio": { 49 | "suggested_key": { 50 | "default": "Ctrl+Shift+Space" 51 | }, 52 | "description": "Toggle Radio" 53 | }, 54 | "now_playing": { 55 | "description": "Display Now Playing" 56 | }, 57 | "vol_up": { 58 | "description": "Raise Radio Volume" 59 | }, 60 | "vol_down": { 61 | "description": "Lower Radio Volume" 62 | } 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /src/popup.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 |
12 | 13 |
14 | 15 |
16 | 17 | 18 | 19 | N/A 20 |
21 | 22 |
23 | 24 |
25 | 26 |
27 | Loading... 28 |
29 | 30 |
31 | Requested by 32 |
33 | 34 |
35 | ♫♪.ılılıll llılılı.♫♪ 36 |
37 | 38 |
39 | 40 |
41 | 42 |
43 | 44 | 45 | 46 | 47 |
48 | 49 |
50 | 51 |
52 | 53 |
54 | 55 | 56 | 57 | 58 |
59 | 60 |
61 | 62 |
63 | 64 | Switch to J-POP 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 |
73 | 74 | 75 | 76 | 77 | 78 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 |

3 | 4 |

5 |
6 |

7 | 8 | Chrome Web Store 9 | 10 | 11 | Firefox Addons 12 | 13 |

14 |
15 | 16 | # Official LISTEN.moe Extension 17 | 18 | ## Changelog 19 | 20 | ### 002 (v2018.4.3.1) 21 | - Added support for KPOP version of the radio. 22 | - Now displays the cover art (when available) in the Now Playing notification. 23 | - Now displays the artist name in romaji (when available). 24 | - Updated styling of extension. Now matches with the style of the site. 25 | - Fixed few issues with the Now Playing notification and the Keyboard Shortcuts. 26 | 27 | ### 002 (v2018.1.22.1) 28 | - Updated extension to support LISTEN.moe v3.0+1.0 (v4) 29 | 30 | ### RO-500 (v2018.1.9.1) 31 | - You can now adjust the volume with your mouse wheel by scrolling on the volume bar. 32 | - Removed unused files. Reduced filesize to ~200KB. 33 | 34 | ### RO-500 (v2017.12.7.2) 35 | - Fixed issue where defaults weren't being set within the options page. 36 | 37 | ### RO-500 (v2017.12.7.1) 38 | - Firefox support. 39 | - No longer using jQuery. 40 | - Removed the random request feature since it will soon be part of the site. 41 | - Event notifications will now only display once if the radio is not playing. 42 | 43 | ### RO-500 (v2017.5.29.1) 44 | - Added options page. 45 | - Keyboard Shortcuts. Access them via the options page. 46 | - Moved all web request stuff to the background page. 47 | - Websocket is now always connected allowing Now Playing notifications. 48 | - Updated icons. 49 | - Removed unused CSS. 50 | 51 | **Firefox version of the extension is now deprecated.** 52 | 53 | ### v2017.2.13.1 54 | 55 | - Updated most of the endpoints 56 | - We're now using WebSockets for song info 57 | - Added a random request button to the site 58 | - Removed unused code 59 | 60 | ### v2016.10.5.2 61 | 62 | - Either Rem or Ram will now be displayed when opening the popup 63 | - Minor CSS changes 64 | - Reverted back to polling for info. SSE didn't really work out... 65 | 66 | ### v2016.9.28.1 67 | 68 | - Commented out a few console.logs 69 | - Minor CSS changes 70 | - No longer using setInterval to check for stats.json changes. Site is now using SSE. 71 | - Added LISTEN.moe Favorites support into the extension 72 | 73 | ### v2016.8.26.1 74 | 75 | - Minor CSS changes. 76 | - Removed most console.logs() 77 | - Made changes to how the "Requested by" appears. No longer using jQuery.html() since it posed as a major security risk. 78 | - Base for History and Favorites features. 79 | 80 | ### v2016.8.22.1 81 | 82 | - Firefox Compatibility 83 | 84 | Requires Firefox version 48 or higher 85 | 86 | ### v2016.8.21.2 87 | 88 | - Added webRequest and webRequestBlocking permissions 89 | 90 | This will allow the extension to modify the UserAgent for requests coming from the extension so the Server can identify Extension users from normal site users. 91 | 92 | ### v2016.8.21.1 93 | 94 | - Removed Custom Checkbox since I didn't like how it looked 95 | - Made CSS changes that @kanadeko requested 96 | - Made some ajustments to the JS to accommodate the CSS changes 97 | 98 | ### v2016.8.20.1 99 | 100 | - Initial Release 101 | -------------------------------------------------------------------------------- /src/icons.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /src/css/style.css: -------------------------------------------------------------------------------- 1 | @import url(https://fonts.googleapis.com/css?family=Nunito:300,400,600,700); 2 | 3 | :root { 4 | --jpop-color: #ff015b; 5 | --jpop-color2: #c40447; 6 | --kpop-color: #30a9ed; 7 | --kpop-color2: #1587c9; 8 | --bg: #262838; 9 | } 10 | 11 | * { 12 | text-rendering: optimizeLegibility; 13 | } 14 | 15 | html { 16 | height: 145px; 17 | -moz-osx-font-smoothing: grayscale; 18 | -webkit-font-smoothing: antialiased; 19 | overflow: hidden; 20 | } 21 | 22 | html, body { 23 | margin: 0; 24 | padding: 0; 25 | color: #c7ccd8; 26 | font-size: 0.88rem; 27 | font-family: 'Nunito', sans-serif; 28 | /* font: 400 12px 'Nunito', sans-serif; */ 29 | } 30 | 31 | body { 32 | display: flex; 33 | height: 100%; 34 | } 35 | 36 | a { 37 | color: var(--jpop-color); 38 | cursor: pointer; 39 | text-decoration: none; 40 | } 41 | 42 | a:hover { 43 | color: #fff !important; 44 | } 45 | 46 | svg { 47 | fill: rgb(199, 204, 216); 48 | cursor: auto; 49 | } 50 | 51 | /* Background */ 52 | 53 | #background { 54 | position: fixed; 55 | background-image: url('/images/jpop-bg.png'); 56 | background-size: cover; 57 | top: -50px; 58 | left: -50px; 59 | height: calc(100% + 100px); 60 | width: calc(100% + 100px); 61 | filter: blur(10px); 62 | -webkit-filter: blur(10px); 63 | z-index: -1; 64 | } 65 | 66 | /* Character */ 67 | 68 | #character { 69 | background-image: url('/images/kanna.gif'); 70 | background-position-x: -3px; 71 | background-size: cover; 72 | height: 145px; 73 | /* height: 100%; */ 74 | width: 110px; 75 | bottom: 0px; 76 | left: 5px; 77 | } 78 | 79 | /* Container */ 80 | 81 | #container { 82 | display: flex; 83 | justify-content: center; 84 | position: relative; 85 | /* height: 145px; */ 86 | height: 100%; 87 | width: 375px; 88 | } 89 | 90 | /* Listeners */ 91 | 92 | #listeners { 93 | position: absolute; 94 | top: 5px; 95 | right: 5px; 96 | } 97 | 98 | #listeners svg { 99 | width: 15px; 100 | transform: translate3d(0px, 2px, 0px); 101 | margin-right: 2px; 102 | } 103 | 104 | /* Player Container */ 105 | 106 | #player-container { 107 | text-align: center; 108 | align-self: center; 109 | width: 100%; 110 | } 111 | 112 | #player-container svg { 113 | cursor: pointer; 114 | width: 20px; 115 | } 116 | 117 | #player-container svg:hover { 118 | fill: var(--jpop-color); 119 | } 120 | 121 | /* Player Info */ 122 | 123 | #now-playing { 124 | width: 80%; 125 | margin: auto; 126 | } 127 | 128 | #now-playing-request, 129 | #now-playing-event { 130 | display: none; 131 | margin-top: 5px; 132 | } 133 | 134 | #now-playing-text .artist, 135 | #now-playing-request a, 136 | #now-playing-event span { 137 | font-weight: bold; 138 | } 139 | 140 | #now-playing-text { 141 | white-space: nowrap; 142 | overflow-x: hidden; 143 | margin: auto 10px; 144 | text-overflow: ellipsis; 145 | } 146 | 147 | #now-playing-text span { 148 | position: relative; 149 | } 150 | 151 | /* Controls */ 152 | 153 | #radio-controls { 154 | margin: 10px 0px 10px 0px; 155 | } 156 | 157 | #radio-controls > div { 158 | display: inline-block; 159 | } 160 | 161 | /* Play/Pause */ 162 | 163 | #radio-toggle svg.active :not(.icon-alt), 164 | #radio-toggle svg:not(.active) .icon-alt { 165 | display: none; 166 | } 167 | 168 | /* Volume Slider */ 169 | 170 | #radio-volume { 171 | margin: 0 3px; 172 | } 173 | 174 | #volume-slider { 175 | background: none; 176 | appearance: none; 177 | -webkit-appearance: none; 178 | border-radius: 5px; 179 | vertical-align: super; 180 | width: 200px; 181 | } 182 | 183 | #volume-slider::-webkit-slider-runnable-track { 184 | background: var(--bg); 185 | background-image: linear-gradient( 186 | to right, 187 | var(--jpop-color) var(--volume, 0%), 188 | transparent var(--volume, 0%) 189 | ); 190 | border: none; 191 | border-radius: 5px; 192 | height: 6px; 193 | } 194 | 195 | #volume-slider::-moz-range-track { 196 | background: var(--bg); 197 | background-image: linear-gradient( 198 | to right, 199 | var(--jpop-color) var(--volume, 0%), 200 | transparent var(--volume, 0%) 201 | ); 202 | border: none; 203 | border-radius: 5px; 204 | height: 6px; 205 | } 206 | 207 | #volume-slider::-webkit-slider-thumb { 208 | appearance: none; 209 | -webkit-appearance: none; 210 | background: var(--jpop-color2); 211 | border-radius: 50%; 212 | border: none; 213 | height: 16px; 214 | margin-top: -5px; 215 | width: 16px; 216 | box-shadow: 0.5px 0.5px 2px 1px rgba(0,0,0,.32); 217 | } 218 | 219 | #volume-slider::-moz-range-thumb { 220 | background: var(--jpop-color2); 221 | border-radius: 50%; 222 | border: none; 223 | height: 16px; 224 | margin-top: -6px; 225 | width: 16px; 226 | box-shadow: 0.5px 0.5px 2px 1px rgba(0,0,0,.32); 227 | } 228 | 229 | #volume-slider:focus { 230 | outline: none; 231 | } 232 | 233 | /* Favorite */ 234 | 235 | #favorite-toggle svg.active :not(.icon-alt), 236 | #favorite-toggle svg:not(.active) .icon-alt { 237 | display: none; 238 | } 239 | 240 | /* Login */ 241 | 242 | #favorite-toggle.login:before { 243 | content: ''; 244 | position: absolute; 245 | margin-top: -20px; 246 | margin-left: 3px; 247 | transform: rotate(45deg); 248 | border-bottom: 13px solid var(--jpop-color2); 249 | border-left: 13px solid transparent; 250 | display: none; 251 | } 252 | 253 | #favorite-toggle.login:after { 254 | content: 'Click to Login'; 255 | position: absolute; 256 | margin-top: -40px; 257 | margin-left: -55px; 258 | background-color: var(--jpop-color2); 259 | padding: 5px; 260 | border-radius: 3px; 261 | display: none; 262 | } 263 | 264 | #favorite-toggle.login:hover:after, 265 | #favorite-toggle.login:hover:before { 266 | display: initial; 267 | } 268 | 269 | /* Radio Type Toggle */ 270 | 271 | #radio-type-toggle { 272 | position: absolute; 273 | left: 5px; 274 | bottom: 5px; 275 | cursor: pointer; 276 | font-weight: 600; 277 | } 278 | 279 | /* Settings */ 280 | 281 | #settings { 282 | position: absolute; 283 | bottom: 2px; 284 | right: 5px; 285 | } 286 | 287 | #settings svg { 288 | cursor: pointer; 289 | width: 15px; 290 | } 291 | 292 | #settings svg:hover { 293 | fill: var(--jpop-color); 294 | } 295 | 296 | /* Kpop Styles */ 297 | 298 | body.kpop #background { 299 | position: absolute; 300 | background: url(/images/kpop-bg.jpg); 301 | background-position: 70% 90%; 302 | } 303 | 304 | body.kpop #character { 305 | display: none; 306 | } 307 | 308 | body.kpop #player-container svg:hover { 309 | fill: var(--kpop-color); 310 | } 311 | 312 | body.kpop a { 313 | color: var(--kpop-color); 314 | } 315 | 316 | body.kpop #volume-slider::-webkit-slider-runnable-track { 317 | background-image: linear-gradient( 318 | to right, 319 | var(--kpop-color) var(--volume, 0%), 320 | transparent var(--volume, 0%) 321 | ); 322 | } 323 | 324 | body.kpop #volume-slider::-moz-range-track { 325 | background-image: linear-gradient( 326 | to right, 327 | var(--kpop-color) var(--volume, 0%), 328 | transparent var(--volume, 0%) 329 | ); 330 | } 331 | 332 | body.kpop #volume-slider::-webkit-slider-thumb { 333 | background: var(--kpop-color2); 334 | } 335 | 336 | body.kpop #volume-slider::-moz-range-thumb { 337 | background: var(--kpop-color2); 338 | } 339 | 340 | body.kpop #settings svg:hover { 341 | fill: var(--kpop-color); 342 | } 343 | -------------------------------------------------------------------------------- /src/js/popup.js: -------------------------------------------------------------------------------- 1 | /* Shortcut for chrome.extension.getBackgroundPage(). Allows me to execute background.js functions */ 2 | const background = chrome.extension.getBackgroundPage(); 3 | 4 | /* Because firefox is retarded */ 5 | if (typeof InstallTrigger !== 'undefined') { 6 | document.querySelector('#volume-slider').style['vertical-align'] = 'sub'; 7 | } 8 | 9 | if (!background && typeof InstallTrigger !== 'undefined') { 10 | document.querySelector('#now-playing-text span').innerText = 'Extension is currently not supported in private mode.'; 11 | throw Error('Extension not supported in private mode'); 12 | } 13 | 14 | const { radio } = background; 15 | 16 | function setInfo() { 17 | 18 | let { data } = radio; 19 | 20 | /* Sets Current Listners */ 21 | document.querySelector('#listeners span').innerText = typeof data.listeners !== 'undefined' ? data.listeners : 'N/A'; 22 | 23 | const npElement = document.querySelector('#now-playing-text span'); 24 | 25 | while (npElement.hasChildNodes()) { 26 | npElement.removeChild(npElement.lastChild); 27 | } 28 | 29 | for (let index in data.song.artists) { 30 | 31 | let artist = data.song.artists[index]; 32 | 33 | let artistLink = background.createElement('a', { 34 | class: 'artist', 35 | href: `https://listen.moe/artists/${artist.id}`, 36 | target: '_blank' 37 | }); 38 | 39 | const artistName = artist.nameRomaji || artist.name; 40 | 41 | artistLink.appendChild(document.createTextNode(artistName)); 42 | npElement.appendChild(artistLink); 43 | 44 | if (index < data.song.artists.length - 1) { 45 | npElement.appendChild(document.createTextNode(', ')); 46 | } 47 | 48 | } 49 | 50 | if (data.song.artists.length) { 51 | npElement.appendChild(document.createTextNode(' - ')); 52 | } 53 | 54 | npElement.appendChild(document.createTextNode(data.song.title || 'No data')); 55 | 56 | /* Sets Requester Info */ 57 | if (data.event) { 58 | 59 | document.querySelector('#now-playing-request a').innerText = ''; 60 | document.querySelector('#now-playing-request a').setAttribute('href', ''); 61 | document.querySelector('#now-playing-request').style.display = 'none'; 62 | 63 | document.querySelector('#now-playing-event span').innerText = data.event.name; 64 | document.querySelector('#now-playing-event').style.display = 'block'; 65 | 66 | } else { 67 | 68 | document.querySelector('#now-playing-event span').innerText = ''; 69 | document.querySelector('#now-playing-event').style.display = 'none'; 70 | 71 | if (data.requester) { 72 | document.querySelector('#now-playing-request a').innerText = data.requester.displayName; 73 | document.querySelector('#now-playing-request a').setAttribute('href', `https://listen.moe/u/${data.requester.username}`); 74 | document.querySelector('#now-playing-request').style.display = 'block'; 75 | } else { 76 | document.querySelector('#now-playing-request a').innerText = ''; 77 | document.querySelector('#now-playing-request a').setAttribute('href', ''); 78 | document.querySelector('#now-playing-request').style.display = 'none'; 79 | } 80 | 81 | } 82 | 83 | if (radio.token) { 84 | 85 | document.querySelector('#favorite-toggle').classList.remove('login'); 86 | 87 | if (data.song.favorite) { 88 | document.querySelector('#favorite-toggle svg').classList.add('active'); 89 | } else { 90 | document.querySelector('#favorite-toggle svg').classList.remove('active'); 91 | } 92 | 93 | } else { 94 | 95 | document.querySelector('#favorite-toggle').classList.add('login'); 96 | document.querySelector('#favorite-toggle svg').classList.remove('active'); 97 | 98 | } 99 | 100 | } 101 | 102 | /* Does Scrolling Text */ 103 | let timeout = setTimeout(autoScroll, 1000); 104 | 105 | function getElWidth(el) { 106 | el = document.querySelector(el); 107 | let elementCS = getComputedStyle(el); 108 | return el.offsetWidth - (parseFloat(elementCS.paddingLeft) + parseFloat(elementCS.paddingRight)); 109 | } 110 | 111 | function autoScroll() { 112 | let time = (Math.floor(document.querySelector('#now-playing-text span').innerText.length) / 10) * 500; 113 | if (getElWidth('#now-playing-text span') > getElWidth('#now-playing-text')) { 114 | clearTimeout(timeout); 115 | let offset = (getElWidth('#now-playing-text span') + 1) - getElWidth('#now-playing-text'); 116 | document.querySelector('#now-playing-text span').style.transition = `margin ${time}ms ease-in-out`; 117 | document.querySelector('#now-playing-text span').style.marginLeft = `${-offset}px`; 118 | timeout = setTimeout(() => { 119 | document.querySelector('#now-playing-text span').style.transition = `margin ${time / 4}ms ease-in-out`; 120 | document.querySelector('#now-playing-text span').style.marginLeft = '0px'; 121 | setTimeout(() => { 122 | timeout = setTimeout(autoScroll, 10000); 123 | }, time / 4); 124 | }, time + 3000); 125 | } 126 | } 127 | 128 | document.querySelector('#now-playing-text').addEventListener('mouseenter', () => { 129 | let time = (Math.floor(document.querySelector('#now-playing-text span').innerText.length) / 10) * 500; 130 | let offset = (getElWidth('#now-playing-text span') + 1) - getElWidth('#now-playing-text'); 131 | if (getElWidth('#now-playing-text span') > getElWidth('#now-playing-text')) { 132 | clearTimeout(timeout); 133 | document.querySelector('#now-playing-text span').style.transition = `margin ${time}ms ease-in-out`; 134 | document.querySelector('#now-playing-text span').style.marginLeft = `${-offset}px`; 135 | } 136 | }); 137 | 138 | document.querySelector('#now-playing-text').addEventListener('mouseleave', () => { 139 | let time = (Math.floor(document.querySelector('#now-playing-text span').innerText.length) / 10) * 500; 140 | document.querySelector('#now-playing-text span').style.transition = `margin ${time / 4}ms ease-in-out`; 141 | document.querySelector('#now-playing-text span').style.marginLeft = '0px'; 142 | setTimeout(() => { 143 | timeout = setTimeout(autoScroll, 10000); 144 | }, time / 4); 145 | }); 146 | 147 | /* Copy Artist and Song Title to Clipboard */ 148 | document.querySelector('#now-playing-text span').addEventListener('click', function() { 149 | window.getSelection().selectAllChildren(this); 150 | }); 151 | 152 | /* Initialize Volume Slider */ 153 | const volumeElement = document.querySelector('#volume-slider'); 154 | 155 | volumeElement.value = radio.getVol; 156 | volumeElement.parentElement.setAttribute('style', `--volume: ${radio.getVol}%`); 157 | 158 | volumeElement.addEventListener('input', e => { 159 | radio.setVol(+e.target.value); 160 | volumeElement.parentElement.setAttribute('style', `--volume: ${e.target.value}%`); 161 | }); 162 | 163 | document.querySelector('#radio-volume').addEventListener('wheel', e => { 164 | volumeElement.value = e.deltaY < 0 165 | ? +volumeElement.value + 5 166 | : +volumeElement.value - 5; 167 | radio.setVol(+volumeElement.value); 168 | volumeElement.parentElement.setAttribute('style', `--volume: ${volumeElement.value}%`); 169 | }); 170 | 171 | /* Sets Play/Pause depending on player status */ 172 | if (radio.isPlaying) { 173 | document.querySelector('#radio-toggle svg').classList.add('active'); 174 | } 175 | 176 | /* Enable/Disable Player */ 177 | document.querySelector('#radio-toggle svg').addEventListener('click', function() { 178 | if (radio.isPlaying) { 179 | this.classList.remove('active'); 180 | radio.disable(); 181 | } else { 182 | this.classList.add('active'); 183 | radio.enable(); 184 | } 185 | }); 186 | 187 | /* Favorites Button */ 188 | document.querySelector('#favorite-toggle').addEventListener('click', function() { 189 | if (this.classList.contains('login')) { 190 | window.open('https://listen.moe', '_blank'); 191 | } else { 192 | radio.toggleFavorite().catch(console.error); 193 | } 194 | }); 195 | 196 | /* Toggles Radio Type */ 197 | document.querySelector('#radio-type-toggle').addEventListener('click', function() { 198 | radio.toggleType().then(status => { 199 | if (status === 'KPOP') { 200 | this.innerText = 'Switch to J-POP'; 201 | document.body.classList.add('kpop'); 202 | } else { 203 | this.innerText = 'Switch to K-POP'; 204 | document.body.classList.remove('kpop'); 205 | } 206 | }); 207 | }); 208 | 209 | document.querySelector('#radio-type-toggle').innerText = `Switch to ${background.storageItems.radioType === 'JPOP' ? 'K-POP' : 'J-POP'}`; 210 | 211 | if (background.storageItems.radioType === 'KPOP') { 212 | document.body.classList.add('kpop'); 213 | } else { 214 | document.body.classList.remove('kpop'); 215 | } 216 | 217 | /* Opens Settings */ 218 | document.querySelector('#settings').addEventListener('click', () => { 219 | chrome.runtime.openOptionsPage(); 220 | }); 221 | 222 | radio.player.addEventListener('songChanged', setInfo); 223 | 224 | setInfo(); 225 | -------------------------------------------------------------------------------- /src/js/background.js: -------------------------------------------------------------------------------- 1 | /* Shortcut for chrome.storage.local api */ 2 | var storage = chrome.storage.local; 3 | 4 | /* Browser Detection */ 5 | var isFirefox = typeof InstallTrigger !== 'undefined'; 6 | 7 | /* On Install */ 8 | chrome.runtime.onInstalled.addListener(details => { 9 | if (details.reason === 'update') { 10 | createNotification('LISTEN.moe', `Extension has updated to v${chrome.runtime.getManifest().version}`); 11 | } 12 | }); 13 | 14 | const radioType = { 15 | JPOP: { 16 | stream: 'https://listen.moe/stream', 17 | gateway: 'wss://listen.moe/gateway_v2' 18 | }, 19 | KPOP: { 20 | stream: 'https://listen.moe/kpop/stream', 21 | gateway: 'wss://listen.moe/kpop/gateway_v2' 22 | } 23 | }; 24 | 25 | /* Storage Items */ 26 | var storageItems = {}; 27 | 28 | /* Gets stored values if any and applies them */ 29 | storage.get({ 30 | volume: 50, 31 | enableAutoplay: false, 32 | enableNotifications: true, 33 | enableEventNotifications: true, 34 | radioType: 'JPOP' 35 | }, items => { 36 | if (typeof items.volume !== 'undefined') { 37 | radio.setVol(items.volume); 38 | } 39 | 40 | if (items.enableAutoplay) { 41 | radio.enable(); 42 | } 43 | 44 | storageItems = items; 45 | 46 | radio.socket.init(); 47 | }); 48 | 49 | chrome.storage.onChanged.addListener(changes => { 50 | for (let item in changes) { 51 | storageItems[item] = changes[item].newValue; 52 | if (item === 'radioType') { 53 | radio.socket.ws.close(4069, 'Closed to switch radio type'); 54 | if (radio.player.getAttribute('src')) { 55 | radio.player.setAttribute('src', radioType[storageItems.radioType].stream); 56 | } 57 | } 58 | } 59 | }); 60 | 61 | /* Radio Functions */ 62 | 63 | var radio = { 64 | player: createElement('audio', { 65 | id: 'listen-moe', 66 | autoplay: true 67 | }), 68 | enable() { 69 | return this.player.setAttribute('src', radioType[storageItems.radioType].stream); 70 | }, 71 | disable() { 72 | return this.player.setAttribute('src', ''); 73 | }, 74 | toggle() { 75 | return this.isPlaying ? this.disable() : this.enable(); 76 | }, 77 | toggleType() { 78 | return new Promise(resolve => { 79 | const type = storageItems.radioType === 'JPOP' ? 'KPOP' : 'JPOP'; 80 | storage.set({ radioType: type }, () => { 81 | resolve(type); 82 | }); 83 | }); 84 | }, 85 | get isPlaying() { 86 | return !this.player.paused; 87 | }, 88 | setVol(volume) { 89 | if (Number.isInteger(volume) && (volume >= 0 || volume <= 100)) { 90 | this.player.volume = volume / 100; 91 | storage.set({ volume }); 92 | } 93 | }, 94 | get getVol() { 95 | return this.player.volume * 100; 96 | }, 97 | data: {}, 98 | token: null, 99 | socket: { 100 | ws: null, 101 | event: new Event('songChanged'), 102 | data: { lastSongID: -1 }, 103 | init() { 104 | 105 | radio.socket.ws = new WebSocket(radioType[storageItems.radioType].gateway); 106 | 107 | radio.socket.ws.onopen = () => { 108 | console.info('%cWebsocket connection established.', 'color: #ff015b;'); 109 | clearInterval(radio.socket.sendHeartbeat); 110 | }; 111 | 112 | radio.socket.ws.onerror = err => { 113 | console.error(err); 114 | }; 115 | 116 | radio.socket.ws.onclose = err => { 117 | console.info('%cWebsocket connection closed. Reconnecting...', 'color: #ff015b;', err.reason); 118 | clearInterval(radio.socket.sendHeartbeat); 119 | setTimeout(radio.socket.init, err.code === 4069 ? 500 : 5000); 120 | }; 121 | 122 | radio.socket.ws.onmessage = async message => { 123 | 124 | if (!message.data.length) return; 125 | 126 | let response; 127 | 128 | try { 129 | response = JSON.parse(message.data); 130 | } catch (err) { 131 | console.error(err); 132 | return; 133 | } 134 | 135 | if (response.op === 0) { 136 | radio.socket.heartbeat(response.d.heartbeat); 137 | return; 138 | } 139 | 140 | if (response.op === 1) { 141 | 142 | if (response.t !== 'TRACK_UPDATE' && response.t !== 'TRACK_UPDATE_REQUEST') return; 143 | 144 | radio.data = response.d; 145 | 146 | radio.data.song.favorite = await radio.checkFavorite(radio.data.song.id); 147 | 148 | radio.player.dispatchEvent(radio.socket.event); 149 | 150 | if (radio.data.song.albums.length && radio.data.song.albums[0].image) { 151 | 152 | const cover = await fetch(`https://cdn.listen.moe/covers/${radio.data.song.albums[0].image}`).then(data => data.blob()); 153 | 154 | const fileReader = new FileReader(); 155 | 156 | fileReader.onload = e => { 157 | radio.data.song.coverData = e.target.result; 158 | }; 159 | 160 | fileReader.readAsDataURL(cover); 161 | 162 | } else { 163 | 164 | radio.data.song.coverData = null; 165 | 166 | } 167 | 168 | if (radio.data.song.id !== radio.socket.data.lastSongID) { 169 | 170 | if (radio.socket.data.lastSongID !== -1 && radio.isPlaying && storageItems.enableNotifications) { 171 | createNotification('Now Playing', radio.data.song.title, radio.data.song.artists.map(a => a.nameRomaji || a.name).join(', '), false, !!radio.token); 172 | } 173 | 174 | radio.socket.data.lastSongID = radio.data.song.id; 175 | 176 | } 177 | 178 | } 179 | 180 | }; 181 | 182 | }, 183 | heartbeat(heartbeat) { 184 | radio.socket.sendHeartbeat = setInterval(() => { 185 | radio.socket.ws.send(JSON.stringify({ op: 9 })); 186 | }, heartbeat); 187 | } 188 | }, 189 | toggleFavorite() { 190 | return new Promise((resolve, reject) => { 191 | if (!radio.token) return; 192 | 193 | const headers = new Headers({ 194 | Authorization: `Bearer ${radio.token}`, 195 | 'Content-Type': 'application/json' 196 | }); 197 | 198 | const { id } = radio.data.song; 199 | 200 | fetch('https://listen.moe/graphql', { 201 | method: 'POST', headers, 202 | body: JSON.stringify({ 203 | operationName: 'favoriteSong', 204 | query: ` 205 | mutation favoriteSong($id: Int!) { 206 | favoriteSong(id: $id) { 207 | id 208 | } 209 | } 210 | `, 211 | variables: { id } 212 | }) 213 | }) 214 | .then(res => res.json()) 215 | .then(data => { 216 | if (data.data) { 217 | radio.data.song.favorite = !radio.data.song.favorite; 218 | radio.player.dispatchEvent(radio.socket.event); 219 | resolve(radio.data.song.favorite); 220 | } else if (data.errors) { 221 | console.error(data.errors); 222 | reject(data.errors); 223 | } 224 | }) 225 | .catch(err => { 226 | reject(err); 227 | }); 228 | 229 | }); 230 | }, 231 | checkFavorite(id) { 232 | return new Promise(resolve => { 233 | if (!radio.token) { 234 | resolve(false); 235 | return; 236 | } 237 | 238 | const headers = new Headers({ 239 | Authorization: `Bearer ${radio.token}`, 240 | 'Content-Type': 'application/json' 241 | }); 242 | 243 | const songs = [radio.data.song.id]; 244 | 245 | fetch('https://listen.moe/graphql', { 246 | method: 'POST', headers, 247 | body: JSON.stringify({ 248 | operationName: 'checkFavorite', 249 | query: ` 250 | query checkFavorite($songs: [Int!]!) { 251 | checkFavorite(songs: $songs) 252 | } 253 | `, 254 | variables: { songs } 255 | }) 256 | }) 257 | .then(res => res.json()) 258 | .then(data => { 259 | if (data.data) { 260 | resolve(data.data.checkFavorite.includes(id)); 261 | } else if (data.errors) { 262 | console.error(data.errors); 263 | resolve(false); 264 | } 265 | }) 266 | .catch(err => { 267 | console.error(err); 268 | resolve(false); 269 | }); 270 | }); 271 | } 272 | }; 273 | 274 | /* Get token */ 275 | 276 | chrome.cookies.onChanged.addListener(details => { 277 | if (details.cookie.name === 'token') { 278 | if (details.removed) { 279 | radio.token = null; 280 | } else { 281 | radio.token = details.cookie.value; 282 | } 283 | } 284 | }); 285 | 286 | chrome.cookies.get({ 287 | url: 'https://listen.moe', 288 | name: 'token' 289 | }, data => { 290 | radio.token = data ? data.value : null; 291 | }); 292 | 293 | /* Keyboard Shortcuts */ 294 | 295 | chrome.commands.onCommand.addListener(command => { 296 | if (command === 'toggle_radio') { 297 | radio.toggle(); 298 | } else if (command === 'vol_up') { 299 | radio.getVol > 95 300 | ? radio.setVol(100) 301 | : radio.setVol(Math.floor(radio.getVol + 5)); 302 | } else if (command === 'vol_down') { 303 | radio.getVol < 5 304 | ? radio.setVol(0) 305 | : radio.setVol(Math.floor(radio.getVol - 5)); 306 | } else if (command === 'now_playing') { 307 | createNotification('Now Playing', radio.data.song.title, radio.data.song.artists.map(a => a.nameRomaji || a.name).join(', '), false, !!radio.token); 308 | } else if (command === 'toggle_type') { 309 | radio.toggleType(); 310 | } 311 | }); 312 | 313 | /* Modify Request Header to change UserAgent */ 314 | chrome.webRequest.onBeforeSendHeaders.addListener(details => { 315 | if (details.tabId === -1) { 316 | for (let header of details.requestHeaders) { 317 | if (header.name === 'User-Agent') { 318 | header.value = `${chrome.runtime.getManifest().name} ${isFirefox ? 'Firefox' : 'Chrome'} Extension v${chrome.runtime.getManifest().version} (https://github.com/LISTEN-moe/browser-extension)`; 319 | } 320 | } 321 | } 322 | return { requestHeaders: details.requestHeaders }; 323 | }, { 324 | urls: [ 325 | '*://listen.moe/graphql', 326 | '*://listen.moe/stream', 327 | '*://listen.moe/kpop/stream' 328 | ] 329 | }, ['blocking', 'requestHeaders']); 330 | 331 | function createNotification(title, message, altText, sticky, showFavoriteButton) { 332 | 333 | if (!title || !message) return; 334 | 335 | const iconUrl = title === 'Now Playing' 336 | ? radio.data.song.coverData || 'images/logo128.png' 337 | : 'images/logo128.png'; 338 | 339 | let notificationContent = { 340 | type: 'basic', 341 | title, message, iconUrl 342 | }; 343 | 344 | if (!isFirefox) { 345 | notificationContent.requireInteraction = sticky || false; 346 | } 347 | 348 | if (altText && typeof altText === 'string') { 349 | /* Firefox does not have contentMessage support yet. */ 350 | if (isFirefox) { 351 | notificationContent.message += `\n ${altText}`; 352 | } else { 353 | notificationContent.contextMessage = altText; 354 | } 355 | } 356 | 357 | if (!isFirefox && showFavoriteButton) { 358 | notificationContent.buttons = [{ title: radio.data.song.favorite ? 'Remove from Favorites' : 'Add to Favorites' }]; 359 | } 360 | 361 | chrome.notifications.create(`notification_${Date.now()}`, notificationContent); 362 | 363 | } 364 | 365 | chrome.notifications.onButtonClicked.addListener(id => { 366 | radio.toggleFavorite().then(favorited => { 367 | chrome.notifications.clear(id); 368 | createNotification('Updated Favorites!', `${favorited ? 'Added' : 'Removed'} '${radio.data.song.title}' ${favorited ? 'to' : 'from'} favorites!`); 369 | }).catch(() => { 370 | chrome.notifications.clear(id); 371 | createNotification('Error Updating Favorites!', 'An error has occured while trying to update your favorites!'); 372 | }); 373 | }); 374 | 375 | chrome.notifications.onClicked.addListener(id => { 376 | chrome.notifications.clear(id); 377 | }); 378 | 379 | function createElement(tag, attrs, styles) { 380 | let element = document.createElement(tag); 381 | for (let key in attrs) { 382 | element.setAttribute(key, attrs[key]); 383 | } 384 | for (let key in styles) { 385 | element.style[key] = styles[key]; 386 | } 387 | return element; 388 | } 389 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | acorn-jsx@^3.0.0: 6 | version "3.0.1" 7 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" 8 | integrity sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s= 9 | dependencies: 10 | acorn "^3.0.4" 11 | 12 | acorn@^3.0.4: 13 | version "3.3.0" 14 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" 15 | integrity sha1-ReN/s56No/JbruP/U2niu18iAXo= 16 | 17 | acorn@^5.5.0: 18 | version "5.7.3" 19 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" 20 | integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== 21 | 22 | ajv-keywords@^2.1.0: 23 | version "2.1.1" 24 | resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" 25 | integrity sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I= 26 | 27 | ajv@^5.2.3, ajv@^5.3.0: 28 | version "5.5.2" 29 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" 30 | integrity sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU= 31 | dependencies: 32 | co "^4.6.0" 33 | fast-deep-equal "^1.0.0" 34 | fast-json-stable-stringify "^2.0.0" 35 | json-schema-traverse "^0.3.0" 36 | 37 | ansi-escapes@^3.0.0: 38 | version "3.2.0" 39 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" 40 | integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== 41 | 42 | ansi-regex@^2.0.0: 43 | version "2.1.1" 44 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 45 | integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= 46 | 47 | ansi-regex@^3.0.0: 48 | version "3.0.0" 49 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 50 | integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= 51 | 52 | ansi-styles@^2.2.1: 53 | version "2.2.1" 54 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 55 | integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= 56 | 57 | ansi-styles@^3.2.1: 58 | version "3.2.1" 59 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 60 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 61 | dependencies: 62 | color-convert "^1.9.0" 63 | 64 | argparse@^1.0.7: 65 | version "1.0.10" 66 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 67 | integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== 68 | dependencies: 69 | sprintf-js "~1.0.2" 70 | 71 | babel-code-frame@^6.22.0: 72 | version "6.26.0" 73 | resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" 74 | integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= 75 | dependencies: 76 | chalk "^1.1.3" 77 | esutils "^2.0.2" 78 | js-tokens "^3.0.2" 79 | 80 | balanced-match@^1.0.0: 81 | version "1.0.0" 82 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 83 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 84 | 85 | brace-expansion@^1.1.7: 86 | version "1.1.11" 87 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 88 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 89 | dependencies: 90 | balanced-match "^1.0.0" 91 | concat-map "0.0.1" 92 | 93 | buffer-from@^1.0.0: 94 | version "1.1.1" 95 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" 96 | integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== 97 | 98 | caller-path@^0.1.0: 99 | version "0.1.0" 100 | resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" 101 | integrity sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8= 102 | dependencies: 103 | callsites "^0.2.0" 104 | 105 | callsites@^0.2.0: 106 | version "0.2.0" 107 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" 108 | integrity sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo= 109 | 110 | chalk@^1.1.3: 111 | version "1.1.3" 112 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 113 | integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= 114 | dependencies: 115 | ansi-styles "^2.2.1" 116 | escape-string-regexp "^1.0.2" 117 | has-ansi "^2.0.0" 118 | strip-ansi "^3.0.0" 119 | supports-color "^2.0.0" 120 | 121 | chalk@^2.0.0, chalk@^2.1.0: 122 | version "2.4.2" 123 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 124 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 125 | dependencies: 126 | ansi-styles "^3.2.1" 127 | escape-string-regexp "^1.0.5" 128 | supports-color "^5.3.0" 129 | 130 | chardet@^0.4.0: 131 | version "0.4.2" 132 | resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" 133 | integrity sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I= 134 | 135 | circular-json@^0.3.1: 136 | version "0.3.3" 137 | resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" 138 | integrity sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A== 139 | 140 | cli-cursor@^2.1.0: 141 | version "2.1.0" 142 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" 143 | integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= 144 | dependencies: 145 | restore-cursor "^2.0.0" 146 | 147 | cli-width@^2.0.0: 148 | version "2.2.0" 149 | resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" 150 | integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= 151 | 152 | co@^4.6.0: 153 | version "4.6.0" 154 | resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" 155 | integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= 156 | 157 | color-convert@^1.9.0: 158 | version "1.9.3" 159 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 160 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 161 | dependencies: 162 | color-name "1.1.3" 163 | 164 | color-name@1.1.3: 165 | version "1.1.3" 166 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 167 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 168 | 169 | concat-map@0.0.1: 170 | version "0.0.1" 171 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 172 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 173 | 174 | concat-stream@^1.6.0: 175 | version "1.6.2" 176 | resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" 177 | integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== 178 | dependencies: 179 | buffer-from "^1.0.0" 180 | inherits "^2.0.3" 181 | readable-stream "^2.2.2" 182 | typedarray "^0.0.6" 183 | 184 | core-util-is@~1.0.0: 185 | version "1.0.2" 186 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 187 | integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= 188 | 189 | cross-spawn@^5.1.0: 190 | version "5.1.0" 191 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" 192 | integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= 193 | dependencies: 194 | lru-cache "^4.0.1" 195 | shebang-command "^1.2.0" 196 | which "^1.2.9" 197 | 198 | debug@^3.1.0: 199 | version "3.2.6" 200 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" 201 | integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== 202 | dependencies: 203 | ms "^2.1.1" 204 | 205 | deep-is@~0.1.3: 206 | version "0.1.3" 207 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" 208 | integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= 209 | 210 | doctrine@^2.1.0: 211 | version "2.1.0" 212 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" 213 | integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== 214 | dependencies: 215 | esutils "^2.0.2" 216 | 217 | escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: 218 | version "1.0.5" 219 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 220 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 221 | 222 | eslint-config-aqua@^3.0.0: 223 | version "3.0.0" 224 | resolved "https://registry.yarnpkg.com/eslint-config-aqua/-/eslint-config-aqua-3.0.0.tgz#67a86d8c836c83090566a48667682389ee663b5c" 225 | integrity sha1-Z6htjINsgwkFZqSGZ2gjie5mO1w= 226 | 227 | eslint-scope@^3.7.1: 228 | version "3.7.3" 229 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.3.tgz#bb507200d3d17f60247636160b4826284b108535" 230 | integrity sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA== 231 | dependencies: 232 | esrecurse "^4.1.0" 233 | estraverse "^4.1.1" 234 | 235 | eslint-visitor-keys@^1.0.0: 236 | version "1.0.0" 237 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" 238 | integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ== 239 | 240 | eslint@^4.19.1: 241 | version "4.19.1" 242 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300" 243 | integrity sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ== 244 | dependencies: 245 | ajv "^5.3.0" 246 | babel-code-frame "^6.22.0" 247 | chalk "^2.1.0" 248 | concat-stream "^1.6.0" 249 | cross-spawn "^5.1.0" 250 | debug "^3.1.0" 251 | doctrine "^2.1.0" 252 | eslint-scope "^3.7.1" 253 | eslint-visitor-keys "^1.0.0" 254 | espree "^3.5.4" 255 | esquery "^1.0.0" 256 | esutils "^2.0.2" 257 | file-entry-cache "^2.0.0" 258 | functional-red-black-tree "^1.0.1" 259 | glob "^7.1.2" 260 | globals "^11.0.1" 261 | ignore "^3.3.3" 262 | imurmurhash "^0.1.4" 263 | inquirer "^3.0.6" 264 | is-resolvable "^1.0.0" 265 | js-yaml "^3.9.1" 266 | json-stable-stringify-without-jsonify "^1.0.1" 267 | levn "^0.3.0" 268 | lodash "^4.17.4" 269 | minimatch "^3.0.2" 270 | mkdirp "^0.5.1" 271 | natural-compare "^1.4.0" 272 | optionator "^0.8.2" 273 | path-is-inside "^1.0.2" 274 | pluralize "^7.0.0" 275 | progress "^2.0.0" 276 | regexpp "^1.0.1" 277 | require-uncached "^1.0.3" 278 | semver "^5.3.0" 279 | strip-ansi "^4.0.0" 280 | strip-json-comments "~2.0.1" 281 | table "4.0.2" 282 | text-table "~0.2.0" 283 | 284 | espree@^3.5.4: 285 | version "3.5.4" 286 | resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" 287 | integrity sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A== 288 | dependencies: 289 | acorn "^5.5.0" 290 | acorn-jsx "^3.0.0" 291 | 292 | esprima@^4.0.0: 293 | version "4.0.1" 294 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 295 | integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== 296 | 297 | esquery@^1.0.0: 298 | version "1.0.1" 299 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" 300 | integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== 301 | dependencies: 302 | estraverse "^4.0.0" 303 | 304 | esrecurse@^4.1.0: 305 | version "4.2.1" 306 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" 307 | integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== 308 | dependencies: 309 | estraverse "^4.1.0" 310 | 311 | estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: 312 | version "4.2.0" 313 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" 314 | integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= 315 | 316 | esutils@^2.0.2: 317 | version "2.0.3" 318 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" 319 | integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 320 | 321 | external-editor@^2.0.4: 322 | version "2.2.0" 323 | resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" 324 | integrity sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A== 325 | dependencies: 326 | chardet "^0.4.0" 327 | iconv-lite "^0.4.17" 328 | tmp "^0.0.33" 329 | 330 | fast-deep-equal@^1.0.0: 331 | version "1.1.0" 332 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" 333 | integrity sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ= 334 | 335 | fast-json-stable-stringify@^2.0.0: 336 | version "2.0.0" 337 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" 338 | integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= 339 | 340 | fast-levenshtein@~2.0.4: 341 | version "2.0.6" 342 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 343 | integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= 344 | 345 | figures@^2.0.0: 346 | version "2.0.0" 347 | resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" 348 | integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= 349 | dependencies: 350 | escape-string-regexp "^1.0.5" 351 | 352 | file-entry-cache@^2.0.0: 353 | version "2.0.0" 354 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" 355 | integrity sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E= 356 | dependencies: 357 | flat-cache "^1.2.1" 358 | object-assign "^4.0.1" 359 | 360 | flat-cache@^1.2.1: 361 | version "1.3.4" 362 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.4.tgz#2c2ef77525cc2929007dfffa1dd314aa9c9dee6f" 363 | integrity sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg== 364 | dependencies: 365 | circular-json "^0.3.1" 366 | graceful-fs "^4.1.2" 367 | rimraf "~2.6.2" 368 | write "^0.2.1" 369 | 370 | fs.realpath@^1.0.0: 371 | version "1.0.0" 372 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 373 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 374 | 375 | functional-red-black-tree@^1.0.1: 376 | version "1.0.1" 377 | resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" 378 | integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= 379 | 380 | glob@^7.1.2, glob@^7.1.3: 381 | version "7.1.4" 382 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" 383 | integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== 384 | dependencies: 385 | fs.realpath "^1.0.0" 386 | inflight "^1.0.4" 387 | inherits "2" 388 | minimatch "^3.0.4" 389 | once "^1.3.0" 390 | path-is-absolute "^1.0.0" 391 | 392 | globals@^11.0.1: 393 | version "11.12.0" 394 | resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" 395 | integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== 396 | 397 | graceful-fs@^4.1.2: 398 | version "4.2.1" 399 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.1.tgz#1c1f0c364882c868f5bff6512146328336a11b1d" 400 | integrity sha512-b9usnbDGnD928gJB3LrCmxoibr3VE4U2SMo5PBuBnokWyDADTqDPXg4YpwKF1trpH+UbGp7QLicO3+aWEy0+mw== 401 | 402 | has-ansi@^2.0.0: 403 | version "2.0.0" 404 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 405 | integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= 406 | dependencies: 407 | ansi-regex "^2.0.0" 408 | 409 | has-flag@^3.0.0: 410 | version "3.0.0" 411 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 412 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 413 | 414 | iconv-lite@^0.4.17: 415 | version "0.4.24" 416 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 417 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 418 | dependencies: 419 | safer-buffer ">= 2.1.2 < 3" 420 | 421 | ignore@^3.3.3: 422 | version "3.3.10" 423 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" 424 | integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== 425 | 426 | imurmurhash@^0.1.4: 427 | version "0.1.4" 428 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 429 | integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= 430 | 431 | inflight@^1.0.4: 432 | version "1.0.6" 433 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 434 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 435 | dependencies: 436 | once "^1.3.0" 437 | wrappy "1" 438 | 439 | inherits@2, inherits@^2.0.3, inherits@~2.0.3: 440 | version "2.0.4" 441 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 442 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 443 | 444 | inquirer@^3.0.6: 445 | version "3.3.0" 446 | resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" 447 | integrity sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ== 448 | dependencies: 449 | ansi-escapes "^3.0.0" 450 | chalk "^2.0.0" 451 | cli-cursor "^2.1.0" 452 | cli-width "^2.0.0" 453 | external-editor "^2.0.4" 454 | figures "^2.0.0" 455 | lodash "^4.3.0" 456 | mute-stream "0.0.7" 457 | run-async "^2.2.0" 458 | rx-lite "^4.0.8" 459 | rx-lite-aggregates "^4.0.8" 460 | string-width "^2.1.0" 461 | strip-ansi "^4.0.0" 462 | through "^2.3.6" 463 | 464 | is-fullwidth-code-point@^2.0.0: 465 | version "2.0.0" 466 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 467 | integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= 468 | 469 | is-promise@^2.1.0: 470 | version "2.1.0" 471 | resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" 472 | integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= 473 | 474 | is-resolvable@^1.0.0: 475 | version "1.1.0" 476 | resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" 477 | integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== 478 | 479 | isarray@~1.0.0: 480 | version "1.0.0" 481 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 482 | integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= 483 | 484 | isexe@^2.0.0: 485 | version "2.0.0" 486 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 487 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 488 | 489 | js-tokens@^3.0.2: 490 | version "3.0.2" 491 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" 492 | integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= 493 | 494 | js-yaml@^3.9.1: 495 | version "3.13.1" 496 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" 497 | integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== 498 | dependencies: 499 | argparse "^1.0.7" 500 | esprima "^4.0.0" 501 | 502 | json-schema-traverse@^0.3.0: 503 | version "0.3.1" 504 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" 505 | integrity sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A= 506 | 507 | json-stable-stringify-without-jsonify@^1.0.1: 508 | version "1.0.1" 509 | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 510 | integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= 511 | 512 | levn@^0.3.0, levn@~0.3.0: 513 | version "0.3.0" 514 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" 515 | integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= 516 | dependencies: 517 | prelude-ls "~1.1.2" 518 | type-check "~0.3.2" 519 | 520 | lodash@^4.17.4, lodash@^4.3.0: 521 | version "4.17.15" 522 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" 523 | integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== 524 | 525 | lru-cache@^4.0.1: 526 | version "4.1.5" 527 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" 528 | integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== 529 | dependencies: 530 | pseudomap "^1.0.2" 531 | yallist "^2.1.2" 532 | 533 | mimic-fn@^1.0.0: 534 | version "1.2.0" 535 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" 536 | integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== 537 | 538 | minimatch@^3.0.2, minimatch@^3.0.4: 539 | version "3.0.4" 540 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 541 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 542 | dependencies: 543 | brace-expansion "^1.1.7" 544 | 545 | minimist@0.0.8: 546 | version "0.0.8" 547 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 548 | integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= 549 | 550 | mkdirp@^0.5.1: 551 | version "0.5.1" 552 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 553 | integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= 554 | dependencies: 555 | minimist "0.0.8" 556 | 557 | ms@^2.1.1: 558 | version "2.1.2" 559 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 560 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 561 | 562 | mute-stream@0.0.7: 563 | version "0.0.7" 564 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" 565 | integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= 566 | 567 | natural-compare@^1.4.0: 568 | version "1.4.0" 569 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 570 | integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= 571 | 572 | object-assign@^4.0.1: 573 | version "4.1.1" 574 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 575 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 576 | 577 | once@^1.3.0: 578 | version "1.4.0" 579 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 580 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 581 | dependencies: 582 | wrappy "1" 583 | 584 | onetime@^2.0.0: 585 | version "2.0.1" 586 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" 587 | integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= 588 | dependencies: 589 | mimic-fn "^1.0.0" 590 | 591 | optionator@^0.8.2: 592 | version "0.8.2" 593 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" 594 | integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= 595 | dependencies: 596 | deep-is "~0.1.3" 597 | fast-levenshtein "~2.0.4" 598 | levn "~0.3.0" 599 | prelude-ls "~1.1.2" 600 | type-check "~0.3.2" 601 | wordwrap "~1.0.0" 602 | 603 | os-tmpdir@~1.0.2: 604 | version "1.0.2" 605 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 606 | integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= 607 | 608 | path-is-absolute@^1.0.0: 609 | version "1.0.1" 610 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 611 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 612 | 613 | path-is-inside@^1.0.2: 614 | version "1.0.2" 615 | resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" 616 | integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= 617 | 618 | pluralize@^7.0.0: 619 | version "7.0.0" 620 | resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" 621 | integrity sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow== 622 | 623 | prelude-ls@~1.1.2: 624 | version "1.1.2" 625 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" 626 | integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= 627 | 628 | process-nextick-args@~2.0.0: 629 | version "2.0.1" 630 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" 631 | integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== 632 | 633 | progress@^2.0.0: 634 | version "2.0.3" 635 | resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" 636 | integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== 637 | 638 | pseudomap@^1.0.2: 639 | version "1.0.2" 640 | resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" 641 | integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= 642 | 643 | readable-stream@^2.2.2: 644 | version "2.3.6" 645 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" 646 | integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== 647 | dependencies: 648 | core-util-is "~1.0.0" 649 | inherits "~2.0.3" 650 | isarray "~1.0.0" 651 | process-nextick-args "~2.0.0" 652 | safe-buffer "~5.1.1" 653 | string_decoder "~1.1.1" 654 | util-deprecate "~1.0.1" 655 | 656 | regexpp@^1.0.1: 657 | version "1.1.0" 658 | resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab" 659 | integrity sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw== 660 | 661 | require-uncached@^1.0.3: 662 | version "1.0.3" 663 | resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" 664 | integrity sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM= 665 | dependencies: 666 | caller-path "^0.1.0" 667 | resolve-from "^1.0.0" 668 | 669 | resolve-from@^1.0.0: 670 | version "1.0.1" 671 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" 672 | integrity sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY= 673 | 674 | restore-cursor@^2.0.0: 675 | version "2.0.0" 676 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" 677 | integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= 678 | dependencies: 679 | onetime "^2.0.0" 680 | signal-exit "^3.0.2" 681 | 682 | rimraf@~2.6.2: 683 | version "2.6.3" 684 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" 685 | integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== 686 | dependencies: 687 | glob "^7.1.3" 688 | 689 | run-async@^2.2.0: 690 | version "2.3.0" 691 | resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" 692 | integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= 693 | dependencies: 694 | is-promise "^2.1.0" 695 | 696 | rx-lite-aggregates@^4.0.8: 697 | version "4.0.8" 698 | resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" 699 | integrity sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74= 700 | dependencies: 701 | rx-lite "*" 702 | 703 | rx-lite@*, rx-lite@^4.0.8: 704 | version "4.0.8" 705 | resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" 706 | integrity sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ= 707 | 708 | safe-buffer@~5.1.0, safe-buffer@~5.1.1: 709 | version "5.1.2" 710 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 711 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 712 | 713 | "safer-buffer@>= 2.1.2 < 3": 714 | version "2.1.2" 715 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 716 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 717 | 718 | semver@^5.3.0: 719 | version "5.7.0" 720 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" 721 | integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== 722 | 723 | shebang-command@^1.2.0: 724 | version "1.2.0" 725 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 726 | integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= 727 | dependencies: 728 | shebang-regex "^1.0.0" 729 | 730 | shebang-regex@^1.0.0: 731 | version "1.0.0" 732 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 733 | integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= 734 | 735 | signal-exit@^3.0.2: 736 | version "3.0.2" 737 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 738 | integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= 739 | 740 | slice-ansi@1.0.0: 741 | version "1.0.0" 742 | resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" 743 | integrity sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg== 744 | dependencies: 745 | is-fullwidth-code-point "^2.0.0" 746 | 747 | sprintf-js@~1.0.2: 748 | version "1.0.3" 749 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 750 | integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= 751 | 752 | string-width@^2.1.0, string-width@^2.1.1: 753 | version "2.1.1" 754 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 755 | integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== 756 | dependencies: 757 | is-fullwidth-code-point "^2.0.0" 758 | strip-ansi "^4.0.0" 759 | 760 | string_decoder@~1.1.1: 761 | version "1.1.1" 762 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 763 | integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== 764 | dependencies: 765 | safe-buffer "~5.1.0" 766 | 767 | strip-ansi@^3.0.0: 768 | version "3.0.1" 769 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 770 | integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= 771 | dependencies: 772 | ansi-regex "^2.0.0" 773 | 774 | strip-ansi@^4.0.0: 775 | version "4.0.0" 776 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 777 | integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= 778 | dependencies: 779 | ansi-regex "^3.0.0" 780 | 781 | strip-json-comments@~2.0.1: 782 | version "2.0.1" 783 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 784 | integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= 785 | 786 | supports-color@^2.0.0: 787 | version "2.0.0" 788 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 789 | integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= 790 | 791 | supports-color@^5.3.0: 792 | version "5.5.0" 793 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 794 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 795 | dependencies: 796 | has-flag "^3.0.0" 797 | 798 | table@4.0.2: 799 | version "4.0.2" 800 | resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" 801 | integrity sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA== 802 | dependencies: 803 | ajv "^5.2.3" 804 | ajv-keywords "^2.1.0" 805 | chalk "^2.1.0" 806 | lodash "^4.17.4" 807 | slice-ansi "1.0.0" 808 | string-width "^2.1.1" 809 | 810 | text-table@~0.2.0: 811 | version "0.2.0" 812 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 813 | integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= 814 | 815 | through@^2.3.6: 816 | version "2.3.8" 817 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 818 | integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= 819 | 820 | tmp@^0.0.33: 821 | version "0.0.33" 822 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" 823 | integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== 824 | dependencies: 825 | os-tmpdir "~1.0.2" 826 | 827 | type-check@~0.3.2: 828 | version "0.3.2" 829 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" 830 | integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= 831 | dependencies: 832 | prelude-ls "~1.1.2" 833 | 834 | typedarray@^0.0.6: 835 | version "0.0.6" 836 | resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" 837 | integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= 838 | 839 | util-deprecate@~1.0.1: 840 | version "1.0.2" 841 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 842 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 843 | 844 | which@^1.2.9: 845 | version "1.3.1" 846 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 847 | integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== 848 | dependencies: 849 | isexe "^2.0.0" 850 | 851 | wordwrap@~1.0.0: 852 | version "1.0.0" 853 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" 854 | integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= 855 | 856 | wrappy@1: 857 | version "1.0.2" 858 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 859 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 860 | 861 | write@^0.2.1: 862 | version "0.2.1" 863 | resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" 864 | integrity sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c= 865 | dependencies: 866 | mkdirp "^0.5.1" 867 | 868 | yallist@^2.1.2: 869 | version "2.1.2" 870 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" 871 | integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= 872 | --------------------------------------------------------------------------------