]> git.immae.eu Git - github/wallabag/wallabag.git/commitdiff
Copy client info to clipboard
authorJeremy Benoist <jeremy.benoist@gmail.com>
Tue, 9 Jul 2019 11:22:50 +0000 (13:22 +0200)
committerJeremy Benoist <jeremy.benoist@gmail.com>
Tue, 9 Jul 2019 11:46:02 +0000 (13:46 +0200)
From the listing page and the create summary page, you can now copy client info to the clipboard using dedicated buttons.

20 files changed:
app/Resources/static/themes/_global/index.js
package.json
src/Wallabag/CoreBundle/Resources/translations/messages.da.yml
src/Wallabag/CoreBundle/Resources/translations/messages.de.yml
src/Wallabag/CoreBundle/Resources/translations/messages.en.yml
src/Wallabag/CoreBundle/Resources/translations/messages.es.yml
src/Wallabag/CoreBundle/Resources/translations/messages.fa.yml
src/Wallabag/CoreBundle/Resources/translations/messages.fr.yml
src/Wallabag/CoreBundle/Resources/translations/messages.it.yml
src/Wallabag/CoreBundle/Resources/translations/messages.oc.yml
src/Wallabag/CoreBundle/Resources/translations/messages.pl.yml
src/Wallabag/CoreBundle/Resources/translations/messages.pt.yml
src/Wallabag/CoreBundle/Resources/translations/messages.ro.yml
src/Wallabag/CoreBundle/Resources/translations/messages.ru.yml
src/Wallabag/CoreBundle/Resources/translations/messages.th.yml
src/Wallabag/CoreBundle/Resources/translations/messages.tr.yml
src/Wallabag/CoreBundle/Resources/views/themes/common/Developer/client_parameters.html.twig
src/Wallabag/CoreBundle/Resources/views/themes/common/Developer/index.html.twig
web/wallassets/public.js
yarn.lock

index 9ad96fc020487d888aabd8f330a7351c1767b529..66ac063bc97961ad4bac4d9629b62ad41a372979 100644 (file)
@@ -4,6 +4,8 @@ import $ from 'jquery';
 /* Annotations */
 import annotator from 'annotator';
 
+import ClipboardJS from 'clipboard';
+
 /* Fonts */
 import 'material-design-icons-iconfont/dist/material-design-icons.css';
 import 'lato-font/css/lato-font.css';
@@ -107,4 +109,12 @@ $(document).ready(() => {
   $('#user_emailTwoFactor').on('change', () => {
     $('#user_googleTwoFactor').prop('checked', false);
   });
+
+  // handle copy to clipboard for developer stuff
+  const clipboard = new ClipboardJS('.btn');
+  clipboard.on('success', (e) => {
+    console.info(e.text);
+
+    e.clearSelection();
+  });
 });
index ac894e7978e7434e5b4ade38b881d07448e27c9c..61f44714927071cbca2c0d7269ca5b66decc5c41 100644 (file)
@@ -64,6 +64,7 @@
   },
   "dependencies": {
     "annotator": "git://github.com/wallabag/annotator.git#0f076c7d371ed25eb0793346f46982d90f2c4c85",
+    "clipboard": "^2.0.4",
     "hammerjs": "^2.0.8",
     "highlight.js": "^9.12.0",
     "icomoon-free-npm": "^0.0.0",
index 2db283ae6705859af02e508750e12b75f5f6ec3e..c504bddc8c658328f63c0cac95a3b575dc805179 100644 (file)
@@ -518,6 +518,7 @@ developer:
     #         redirect_uris_label: 'Redirect URIs'
     #         save_label: 'Create a new client'
     #     action_back: 'Back'
+    #     copy_to_clipboard: Copy to clipboard
     # client_parameter:
     #     page_title: 'API clients management > Client parameters'
     #     page_description: 'Here are your client parameters.'
index db01272f4468da9f6cc0cb022508353ad5dbca10..b2d1a09da0551c6ff65584136c76d73705cdc1a4 100644 (file)
@@ -518,6 +518,7 @@ developer:
             redirect_uris_label: 'Weiterleitungs-URIs'
             save_label: 'Neuen Client erstellen'
         action_back: 'Zurück'
+        # copy_to_clipboard: Copy to clipboard
     client_parameter:
         page_title: 'API-Client-Verwaltung > Client-Parameter'
         page_description: 'Dies sind deine Client-Parameter.'
index 6d00631085b01c8ae6c2c4494e1d1924f6d2c060..6874e924bfdbe2941e1d2b8d255c62dead4b8d97 100644 (file)
@@ -518,6 +518,7 @@ developer:
             redirect_uris_label: 'Redirect URIs (optional)'
             save_label: 'Create a new client'
         action_back: 'Back'
+        copy_to_clipboard: Copy to clipboard
     client_parameter:
         page_title: 'API clients management > Client parameters'
         page_description: 'Here are your client parameters.'
index 0eb743964c2edfedc9b74c8aaac6d7a88f1d7b00..13e96e0fd38141e6c62645a7b2af49c528fc6ee9 100644 (file)
@@ -518,6 +518,7 @@ developer:
             redirect_uris_label: 'URIs de redirección'
             save_label: 'Crear un nuevo cliente'
         action_back: 'Volver'
+        # copy_to_clipboard: Copy to clipboard
     client_parameter:
         page_title: 'Gestión de clientes API > Parámetros del cliente'
         page_description: 'Aquí están los parámetros del cliente.'
index 35afdbf43f6e4417b36c750ef719e8d777278ee4..425d3a6a8e2d045559fe655ec42ddb5fb3aafb06 100644 (file)
@@ -518,6 +518,7 @@ developer:
     #         redirect_uris_label: 'Redirect URIs'
     #         save_label: 'Create a new client'
     #     action_back: 'بازگشت'
+    #     copy_to_clipboard: Copy to clipboard
     # client_parameter:
     #     page_title: 'API clients management > Client parameters'
     #     page_description: 'Here are your client parameters.'
index 8a79b02ff31233f7c0e8ab8b55c9d8d30c24521b..2c1a91a8dc1d14160a5ea372d268ef47283e22b5 100644 (file)
@@ -518,6 +518,7 @@ developer:
             redirect_uris_label: "Adresses de redirection (optionnel)"
             save_label: "Créer un nouveau client"
         action_back: "Retour"
+        copy_to_clipboard: Copier dans le presse-papier
     client_parameter:
         page_title: "Gestion des clients API > Les paramètres de votre client"
         page_description: "Voilà les paramètres de votre client"
index 859bbb146d30eb49cefea5c8c47333b484401293..b8b37301eaa054f6333a911719e45c84455124d8 100644 (file)
@@ -518,6 +518,7 @@ developer:
             redirect_uris_label: 'Redirect URI'
             save_label: 'Crea un nuovo client'
         action_back: 'Indietro'
+        # copy_to_clipboard: Copy to clipboard
     client_parameter:
         page_title: 'Gestione client API > Parametri Client'
         page_description: 'Questi sono i tuoi parametri del client.'
index 7d92861319d29a0caa2b8700a006748adba7f2fd..c887fe2947f027cfca152df522bfcf9084bb7ccf 100644 (file)
@@ -518,6 +518,7 @@ developer:
             redirect_uris_label: 'URLs de redireccion'
             save_label: 'Crear un novèl client'
         action_back: 'Retorn'
+        # copy_to_clipboard: Copy to clipboard
     client_parameter:
         page_title: 'Gestion dels clients API > Los paramètres de vòstre client'
         page_description: 'Vaquí los paramètres de vòstre client.'
index 8e7ad7f2566aad7ac205a418e4f1d7121ca9b6b6..3a2073d3b8ac33a308b37029930a41a461664aa7 100644 (file)
@@ -518,6 +518,7 @@ developer:
             redirect_uris_label: 'Przekieruj adresy URI'
             save_label: 'Stwórz nowego klienta'
         action_back: 'Cofnij'
+        # copy_to_clipboard: Copy to clipboard
     client_parameter:
         page_title: 'Zarządzanie klientami API > Parametry klienta'
         page_description: 'Tutaj znajdują się parametry klienta.'
index ee45c0857022f0786e12705b5ea0c7d9e4a144ee..50bc246c33dc79dbed658e4af73686f54b1cd151 100644 (file)
@@ -518,6 +518,7 @@ developer:
             redirect_uris_label: 'URIs de redirecionamento'
             save_label: 'Criar um novo cliente'
         action_back: 'Voltar'
+        # copy_to_clipboard: Copy to clipboard
     client_parameter:
         # page_title: 'API clients management > Parâmetros de clientes'
         page_description: 'Aqui estão os parâmetros de seus clientes.'
index edfc77a25a60c629d0dcb2b280175a4977eb2c90..a0da329983db1b3c9f30bc7a4f803a30b2139c48 100644 (file)
@@ -518,6 +518,7 @@ developer:
     #         redirect_uris_label: 'Redirect URIs'
     #         save_label: 'Create a new client'
     #     action_back: 'Back'
+    #     copy_to_clipboard: Copy to clipboard
     # client_parameter:
     #     page_title: 'API clients management > Client parameters'
     #     page_description: 'Here are your client parameters.'
index c99da444f9e1915bab6eab1e5a19204a32f8cc47..7aedc29092b29f3f41262f532fc2ac1d45126144 100644 (file)
@@ -518,6 +518,7 @@ developer:
             redirect_uris_label: 'Ссылка перенаправления (опционально)'
             save_label: 'Создать нового клиента'
         action_back: 'Назад'
+        # copy_to_clipboard: Copy to clipboard
     client_parameter:
         page_title: 'Управление клиентским API > Параметры клиента'
         page_description: 'Здесь ваши параметры клиента.'
index 9927d059878bba961c4d24dd600ba14e9bd7bbdc..924a85d9c3aa9cbee7095c9317ddaad2e5742de0 100644 (file)
@@ -518,6 +518,7 @@ developer:
             redirect_uris_label: 'เส้นทางใหม่ของ URIs (ให้เลือกได้)'
             save_label: 'สร่้างลูกข่ายใหม'
         action_back: 'กลับ'
+        # copy_to_clipboard: Copy to clipboard
     client_parameter:
         page_title: 'การจัดการลูกข่ายของ API > พารามิเตอร์ของลูกข่าย'
         page_description: 'ที่นี้เป็นพารามิเตอร์ของลูกข่ายของคุณ'
index 60fa44d5945a6278a3cd3caa526d538447081526..e81c1974c76dda885e89fa433115709ec9f0e2f1 100644 (file)
@@ -518,6 +518,7 @@ developer:
     #         redirect_uris_label: 'Redirect URIs'
     #         save_label: 'Create a new client'
     #     action_back: 'Back'
+    #     copy_to_clipboard: Copy to clipboard
     # client_parameter:
     #     page_title: 'API clients management > Client parameters'
     #     page_description: 'Here are your client parameters.'
index b498cceb4863ed3e0c8462bdf92616a8bf2011f0..3a3ba0c971146bd54b05c3532f2e35cf218515e4 100644 (file)
@@ -8,11 +8,29 @@
         <div class="card-panel settings">
             <div class="row">
                 <p>{{ 'developer.client_parameter.page_description'|trans }}</p>
-                <ul>
-                    <li>{{ 'developer.client_parameter.field_name'|trans }}: <strong><pre>{{ client_name }}</pre></strong></li>
-                    <li>{{ 'developer.client_parameter.field_id'|trans }}: <strong><pre>{{ client_id }}</pre></strong></li>
-                    <li>{{ 'developer.client_parameter.field_secret'|trans }}: <strong><pre>{{ client_secret }}</pre></strong></li>
-                </ul>
+
+                <table class="striped">
+                    <tr>
+                        <td>{{ 'developer.client_parameter.field_name'|trans }}</td>
+                        <td><strong><code>{{ client_name }}</code></strong></td>
+                    </tr>
+                    <tr>
+                        <td>{{ 'developer.client_parameter.field_id'|trans }}</td>
+                        <td>
+                            <strong><code>{{ client_id }}</code></strong>
+                            <button class="btn" data-clipboard-text="{{ client_id }}">{{ 'developer.client.copy_to_clipboard'|trans }}</button>
+                        </td>
+                    </tr>
+                    <tr>
+                        <td>{{ 'developer.client_parameter.field_secret'|trans }}</td>
+                        <td>
+                            <strong><code>{{ client_secret }}</code></strong>
+                            <button class="btn" data-clipboard-text="{{ client_secret }}">{{ 'developer.client.copy_to_clipboard'|trans }}</button>
+                        </td>
+                    </tr>
+                </table>
+
+                <br/>
 
                 <a href="{{ path('developer') }}" class="waves-effect waves-light grey btn">{{ 'developer.client_parameter.back'|trans }}</a>
                 <a href="{{ path('developer_howto_firstapp') }}" class="btn waves-effect waves-light">{{ 'developer.client_parameter.read_howto'|trans }}</a>
index be04cddb77dd387bd13de30efe6a4c9dda3cce85..b83bf96faa82b84c80b10163fe171cd0881f0342 100644 (file)
                                     <table class="striped">
                                         <tr>
                                             <td>{{ 'developer.existing_clients.field_id'|trans }}</td>
-                                            <td><strong><code>{{ client.clientId }}</code></strong></td>
+                                            <td>
+                                                <strong><code>{{ client.clientId }}</code></strong>
+                                                <button class="btn" data-clipboard-text="{{ client.clientId }}">{{ 'developer.client.copy_to_clipboard'|trans }}</button>
+                                            </td>
                                         </tr>
                                         <tr>
                                             <td>{{ 'developer.existing_clients.field_secret'|trans }}</td>
-                                            <td><strong><code>{{ client.secret }}</code></strong></td>
+                                            <td>
+                                                <strong><code>{{ client.secret }}</code></strong>
+                                                <button class="btn" data-clipboard-text="{{ client.secret }}">{{ 'developer.client.copy_to_clipboard'|trans }}</button>
+                                            </td>
                                         </tr>
                                         <tr>
                                             <td>{{ 'developer.existing_clients.field_uris'|trans }}</td>
                                             <td><strong><code>{{ client.allowedGrantTypes|json_encode() }}</code></strong></td>
                                         </tr>
                                     </table>
+
+                                    <p>{{ 'developer.remove.warn_message_1'|trans({'%name%': client.name }) }}</p>
+                                    <p>{{ 'developer.remove.warn_message_2'|trans({'%name%': client.name }) }}</p>
                                     <p>
-                                        {{ 'developer.remove.warn_message_1'|trans({'%name%': client.name }) }}<br/>
-                                        {{ 'developer.remove.warn_message_2'|trans({'%name%': client.name }) }}<br/>
                                         <a class="waves-effect waves-light red btn" href="{{ path('developer_delete_client', {'id': client.id}) }}">{{ 'developer.remove.action'|trans({'%name%': client.name }) }}</a>
                                     </p>
                                 </div>
index 6755ba8f2f86c590d4d6b93d0cdead490026a567..caaccd90b307e4cde177c10d78e92bd720a063e8 100644 (file)
@@ -1 +1 @@
-!function(o){function __webpack_require__(e){if(n[e])return n[e].exports;var p=n[e]={i:e,l:!1,exports:{}};return o[e].call(p.exports,p,p.exports,__webpack_require__),p.l=!0,p.exports}var n={};__webpack_require__.m=o,__webpack_require__.c=n,__webpack_require__.i=function(o){return o},__webpack_require__.d=function(o,n,e){__webpack_require__.o(o,n)||Object.defineProperty(o,n,{configurable:!1,enumerable:!0,get:e})},__webpack_require__.n=function(o){var n=o&&o.__esModule?function(){return o.default}:function(){return o};return __webpack_require__.d(n,"a",n),n},__webpack_require__.o=function(o,n){return Object.prototype.hasOwnProperty.call(o,n)},__webpack_require__.p="",__webpack_require__(__webpack_require__.s=232)}({220:function(o,n,e){function webpackContext(o){return e(webpackContextResolve(o))}function webpackContextResolve(o){var n=p[o];if(!(n+1))throw new Error("Cannot find module '"+o+"'.");return n}var p={"./appicon/apple-touch-icon-114.png":235,"./appicon/apple-touch-icon-120.png":236,"./appicon/apple-touch-icon-144.png":237,"./appicon/apple-touch-icon-152.png":238,"./appicon/apple-touch-icon-57.png":239,"./appicon/apple-touch-icon-72.png":240,"./appicon/apple-touch-icon-76.png":241,"./appicon/apple-touch-icon.png":242,"./appicon/favicon.ico":243,"./bg-select.png":244,"./icons/Diaspora-asterisk.svg":245,"./icons/carrot-icon--black.png":246,"./icons/carrot-icon--white.png":247,"./icons/diaspora-icon--black.png":248,"./icons/diaspora-icon--white.png":249,"./icons/scuttle.png":250,"./icons/shaarli.png":251,"./icons/unmark-icon--black.png":252,"./list.png":253,"./logo-square.svg":254,"./logo-w.png":255,"./logo-wallabag.svg":256,"./table.png":257};webpackContext.keys=function(){return Object.keys(p)},webpackContext.resolve=webpackContextResolve,o.exports=webpackContext,webpackContext.id=220},227:function(o,n){},232:function(o,n,e){"use strict";e(227),function(o){o.keys().forEach(o)}(e(220))},235:function(o,n,e){o.exports=e.p+"themes/_global/img/appicon/apple-touch-icon-114.png"},236:function(o,n,e){o.exports=e.p+"themes/_global/img/appicon/apple-touch-icon-120.png"},237:function(o,n,e){o.exports=e.p+"themes/_global/img/appicon/apple-touch-icon-144.png"},238:function(o,n,e){o.exports=e.p+"themes/_global/img/appicon/apple-touch-icon-152.png"},239:function(o,n,e){o.exports=e.p+"themes/_global/img/appicon/apple-touch-icon-57.png"},240:function(o,n,e){o.exports=e.p+"themes/_global/img/appicon/apple-touch-icon-72.png"},241:function(o,n,e){o.exports=e.p+"themes/_global/img/appicon/apple-touch-icon-76.png"},242:function(o,n,e){o.exports=e.p+"themes/_global/img/appicon/apple-touch-icon.png"},243:function(o,n,e){o.exports=e.p+"themes/_global/img/appicon/favicon.ico"},244:function(o,n,e){o.exports=e.p+"themes/_global/img/bg-select.png"},245:function(o,n,e){o.exports=e.p+"themes/_global/img/icons/Diaspora-asterisk.svg"},246:function(o,n,e){o.exports=e.p+"themes/_global/img/icons/carrot-icon--black.png"},247:function(o,n,e){o.exports=e.p+"themes/_global/img/icons/carrot-icon--white.png"},248:function(o,n,e){o.exports=e.p+"themes/_global/img/icons/diaspora-icon--black.png"},249:function(o,n,e){o.exports=e.p+"themes/_global/img/icons/diaspora-icon--white.png"},250:function(o,n,e){o.exports=e.p+"themes/_global/img/icons/scuttle.png"},251:function(o,n,e){o.exports=e.p+"themes/_global/img/icons/shaarli.png"},252:function(o,n,e){o.exports=e.p+"themes/_global/img/icons/unmark-icon--black.png"},253:function(o,n,e){o.exports=e.p+"themes/_global/img/list.png"},254:function(o,n,e){o.exports=e.p+"themes/_global/img/logo-square.svg"},255:function(o,n,e){o.exports=e.p+"themes/_global/img/logo-w.png"},256:function(o,n,e){o.exports=e.p+"themes/_global/img/logo-wallabag.svg"},257:function(o,n,e){o.exports=e.p+"themes/_global/img/table.png"}});
\ No newline at end of file
+!function(o){function __webpack_require__(e){if(n[e])return n[e].exports;var p=n[e]={i:e,l:!1,exports:{}};return o[e].call(p.exports,p,p.exports,__webpack_require__),p.l=!0,p.exports}var n={};__webpack_require__.m=o,__webpack_require__.c=n,__webpack_require__.i=function(o){return o},__webpack_require__.d=function(o,n,e){__webpack_require__.o(o,n)||Object.defineProperty(o,n,{configurable:!1,enumerable:!0,get:e})},__webpack_require__.n=function(o){var n=o&&o.__esModule?function(){return o.default}:function(){return o};return __webpack_require__.d(n,"a",n),n},__webpack_require__.o=function(o,n){return Object.prototype.hasOwnProperty.call(o,n)},__webpack_require__.p="",__webpack_require__(__webpack_require__.s=242)}({230:function(o,n,e){function webpackContext(o){return e(webpackContextResolve(o))}function webpackContextResolve(o){var n=p[o];if(!(n+1))throw new Error("Cannot find module '"+o+"'.");return n}var p={"./appicon/apple-touch-icon-114.png":245,"./appicon/apple-touch-icon-120.png":246,"./appicon/apple-touch-icon-144.png":247,"./appicon/apple-touch-icon-152.png":248,"./appicon/apple-touch-icon-57.png":249,"./appicon/apple-touch-icon-72.png":250,"./appicon/apple-touch-icon-76.png":251,"./appicon/apple-touch-icon.png":252,"./appicon/favicon.ico":253,"./bg-select.png":254,"./icons/Diaspora-asterisk.svg":255,"./icons/carrot-icon--black.png":256,"./icons/carrot-icon--white.png":257,"./icons/diaspora-icon--black.png":258,"./icons/diaspora-icon--white.png":259,"./icons/scuttle.png":260,"./icons/shaarli.png":261,"./icons/unmark-icon--black.png":262,"./list.png":263,"./logo-square.svg":264,"./logo-w.png":265,"./logo-wallabag.svg":266,"./table.png":267};webpackContext.keys=function(){return Object.keys(p)},webpackContext.resolve=webpackContextResolve,o.exports=webpackContext,webpackContext.id=230},237:function(o,n){},242:function(o,n,e){"use strict";e(237),function(o){o.keys().forEach(o)}(e(230))},245:function(o,n,e){o.exports=e.p+"themes/_global/img/appicon/apple-touch-icon-114.png"},246:function(o,n,e){o.exports=e.p+"themes/_global/img/appicon/apple-touch-icon-120.png"},247:function(o,n,e){o.exports=e.p+"themes/_global/img/appicon/apple-touch-icon-144.png"},248:function(o,n,e){o.exports=e.p+"themes/_global/img/appicon/apple-touch-icon-152.png"},249:function(o,n,e){o.exports=e.p+"themes/_global/img/appicon/apple-touch-icon-57.png"},250:function(o,n,e){o.exports=e.p+"themes/_global/img/appicon/apple-touch-icon-72.png"},251:function(o,n,e){o.exports=e.p+"themes/_global/img/appicon/apple-touch-icon-76.png"},252:function(o,n,e){o.exports=e.p+"themes/_global/img/appicon/apple-touch-icon.png"},253:function(o,n,e){o.exports=e.p+"themes/_global/img/appicon/favicon.ico"},254:function(o,n,e){o.exports=e.p+"themes/_global/img/bg-select.png"},255:function(o,n,e){o.exports=e.p+"themes/_global/img/icons/Diaspora-asterisk.svg"},256:function(o,n,e){o.exports=e.p+"themes/_global/img/icons/carrot-icon--black.png"},257:function(o,n,e){o.exports=e.p+"themes/_global/img/icons/carrot-icon--white.png"},258:function(o,n,e){o.exports=e.p+"themes/_global/img/icons/diaspora-icon--black.png"},259:function(o,n,e){o.exports=e.p+"themes/_global/img/icons/diaspora-icon--white.png"},260:function(o,n,e){o.exports=e.p+"themes/_global/img/icons/scuttle.png"},261:function(o,n,e){o.exports=e.p+"themes/_global/img/icons/shaarli.png"},262:function(o,n,e){o.exports=e.p+"themes/_global/img/icons/unmark-icon--black.png"},263:function(o,n,e){o.exports=e.p+"themes/_global/img/list.png"},264:function(o,n,e){o.exports=e.p+"themes/_global/img/logo-square.svg"},265:function(o,n,e){o.exports=e.p+"themes/_global/img/logo-w.png"},266:function(o,n,e){o.exports=e.p+"themes/_global/img/logo-wallabag.svg"},267:function(o,n,e){o.exports=e.p+"themes/_global/img/table.png"}});
\ No newline at end of file
index addfd19bf2d6c8c5f567a1f0ab308bd4d6799ed7..efdf61e670fc131244eee937febd15e6110e83be 100644 (file)
--- a/yarn.lock
+++ b/yarn.lock
@@ -1330,6 +1330,15 @@ cli-width@^2.0.0:
   resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639"
   integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=
 
+clipboard@^2.0.4:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/clipboard/-/clipboard-2.0.4.tgz#836dafd66cf0fea5d71ce5d5b0bf6e958009112d"
+  integrity sha512-Vw26VSLRpJfBofiVaFb/I8PVfdI1OxKcYShe6fm0sP/DtmiWQNCjhM/okTvdCo0G+lMMm1rMYbk4IK4x1X+kgQ==
+  dependencies:
+    good-listener "^1.2.2"
+    select "^1.1.2"
+    tiny-emitter "^2.0.0"
+
 cliui@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1"
@@ -1909,6 +1918,11 @@ delayed-stream@~1.0.0:
   resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
   integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
 
+delegate@^3.1.2:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/delegate/-/delegate-3.2.0.tgz#b66b71c3158522e8ab5744f720d8ca0c2af59166"
+  integrity sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==
+
 delegates@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
@@ -2843,6 +2857,13 @@ globule@^1.0.0:
     lodash "~4.17.10"
     minimatch "~3.0.2"
 
+good-listener@^1.2.2:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/good-listener/-/good-listener-1.2.2.tgz#d53b30cdf9313dffb7dc9a0d477096aa6d145c50"
+  integrity sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=
+  dependencies:
+    delegate "^3.1.2"
+
 graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9:
   version "4.1.15"
   resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00"
@@ -5758,6 +5779,11 @@ select-hose@^2.0.0:
   resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca"
   integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=
 
+select@^1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d"
+  integrity sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=
+
 selfsigned@^1.9.1:
   version "1.10.4"
   resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.4.tgz#cdd7eccfca4ed7635d47a08bf2d5d3074092e2cd"
@@ -6443,6 +6469,11 @@ timers-browserify@^2.0.4:
   dependencies:
     setimmediate "^1.0.4"
 
+tiny-emitter@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423"
+  integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==
+
 tmp@^0.0.33:
   version "0.0.33"
   resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"