├── .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 |
19 | N/A
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 | Loading...
28 |
29 |
30 |
33 |
34 |
35 | ♫♪.ılılıll llılılı.♫♪
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
Switch to J-POP
65 |
66 |
67 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
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 |
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 |
--------------------------------------------------------------------------------