├── .github ├── FUNDING.yml ├── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md └── workflows │ └── unit-tests.yml ├── .gitignore ├── .npmignore ├── .travis.yml ├── LICENSE ├── README.md ├── bower.json ├── dist ├── keyboard.js └── keyboard.min.js ├── index.js ├── lib ├── key-combo.js ├── keyboard.js └── locale.js ├── locales └── us.js ├── package.json ├── rollup.config.js ├── test ├── fixtures │ ├── document.js │ └── window.js ├── key-combo.spec.js ├── keyboard.spec.js └── locale.spec.js └── yarn.lock /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: [RobertWHurst] 2 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | 14 | 15 | **Describe the bug** 16 | 17 | 18 | **Example code** 19 | ```js 20 | // paste and example of your binding here or relevant code here 21 | ``` 22 | 23 | **Expected behavior** 24 | 25 | 26 | **Enviroment (please include the following info):** 27 | - OS: [e.g. Windows, macOS, Linux] 28 | - Browser [e.g. Chrome, Safari, Edge] 29 | - Version [e.g. 2.6.0] 30 | 31 | **Additional context** 32 | Add anything else you'd like to mention. 33 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | 14 | 15 | **What would you like to see added to KeyboardJS?** 16 | 17 | 18 | **What problem are you trying to solve?** 19 | 20 | 21 | **Additional comments** 22 | 23 | -------------------------------------------------------------------------------- /.github/workflows/unit-tests.yml: -------------------------------------------------------------------------------- 1 | name: Unit Tests 2 | 3 | on: push 4 | 5 | jobs: 6 | test: 7 | runs-on: ubuntu-latest 8 | 9 | steps: 10 | - uses: actions/checkout@v2 11 | - uses: actions/setup-node@v1 12 | - run: npm i 13 | - run: npm run test 14 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store 3 | yarn-error.log 4 | npm-debug.log 5 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | test 2 | .travis.yml 3 | bower.json 4 | rollup.config.js 5 | yarn-error.log 6 | npm-debug.log 7 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "stable" 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Robert Hurst 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 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | KeyboardJS 3 | ========== 4 | 5 | --- 6 | 7 | > **Note** 8 | > Please Note: I've create a new libary called 9 | > [Keystrokes](https://github.com/RobertWHurst/Keystrokes) which serves the same purpose 10 | > as KeyboardJS, but is more refined, and takes full advantage of modern browsers. If you are 11 | > considering using KeyboardJS in a new project, I recommend checking out 12 | > [Keystrokes](https://github.com/RobertWHurst/Keystrokes) first. 13 | 14 | --- 15 | 16 | [![Build Status](http://img.shields.io/github/workflow/status/RobertWHurst/KeyboardJS/Unit%20Tests.svg?style=flat)](https://github.com/RobertWHurst/KeyboardJS/actions) 17 | [![NPM Version](http://img.shields.io/npm/v/keyboardjs.svg?style=flat)](https://www.npmjs.org/package/keyboardjs) 18 | [![Downloads This Week](http://img.shields.io/npm/dm/keyboardjs.svg?style=flat)](https://www.npmjs.org/package/keyboardjs) 19 | [![License](http://img.shields.io/npm/l/keyboardjs.svg?style=flat)](https://www.npmjs.org/package/keyboardjs) 20 | 21 | KeyboardJS is a library for use in the browser (node.js compatible). It Allows 22 | developers to easily setup key bindings. Use key combos to setup complex 23 | bindings. KeyboardJS also provides contexts. Contexts are great for single page 24 | applications. They allow you to scope your bindings to various parts of your 25 | application. Out of the box keyboardJS uses a US keyboard locale. If you need 26 | support for a different type of keyboard KeyboardJS provides custom locale 27 | support so you can create with a locale that better matches your needs. 28 | 29 | KeyboardJS is available as a NPM module. If you're not using a build system 30 | like webpack, simply add 31 | [keyboard.js](https://github.com/RobertWHurst/KeyboardJS/blob/master/dist/keyboard.js) 32 | or 33 | [keyboard.min.js](https://github.com/RobertWHurst/KeyboardJS/blob/master/dist/keyboard.min.js) 34 | from the dist folder in this repo to your project via a script tag. 35 | 36 | ```shell 37 | npm install keyboardjs 38 | ``` 39 | 40 | Note that all key names can be found in [./locales/us.js](https://github.com/RobertWHurst/KeyboardJS/blob/master/locales/us.js). 41 | 42 | __Setting up bindings is easy__ 43 | 44 | ```javascript 45 | keyboardJS.bind('a', (e) => { 46 | console.log('a is pressed'); 47 | }); 48 | keyboardJS.bind('a + b', (e) => { 49 | console.log('a and b is pressed'); 50 | }); 51 | keyboardJS.bind('a + b > c', (e) => { 52 | console.log('a and b then c is pressed'); 53 | }); 54 | keyboardJS.bind(['a + b > c', 'z + y > z'], (e) => { 55 | console.log('a and b then c or z and y then z is pressed'); 56 | }); 57 | keyboardJS.bind('', (e) => { 58 | console.log('any key was pressed'); 59 | }); 60 | //alt, shift, ctrl, etc must be lowercase 61 | keyboardJS.bind('alt + shift > a', (e) => { 62 | console.log('alt, shift and a is pressed'); 63 | }); 64 | 65 | // keyboardJS.bind === keyboardJS.on === keyboardJS.addListener 66 | ``` 67 | 68 | 69 | __keydown vs a keyup__ 70 | 71 | ```javascript 72 | keyboardJS.bind('a', (e) => { 73 | console.log('a is pressed'); 74 | }, (e) => { 75 | console.log('a is released'); 76 | }); 77 | keyboardJS.bind('a', null, (e) => { 78 | console.log('a is released'); 79 | }); 80 | ``` 81 | 82 | 83 | __Prevent keydown repeat__ 84 | 85 | ```javascript 86 | keyboardJS.bind('a', (e) => { 87 | // this will run once even if a is held 88 | e.preventRepeat(); 89 | console.log('a is pressed'); 90 | }); 91 | ``` 92 | 93 | 94 | __Unbind things__ 95 | 96 | ```javascript 97 | keyboardJS.unbind('a', previouslyBoundHandler); 98 | // keyboardJS.unbind === keyboardJS.off === keyboardJS.removeListener 99 | ``` 100 | 101 | 102 | __Using contexts__ 103 | 104 | ```javascript 105 | 106 | // these will execute in all contexts 107 | keyboardJS.bind('a', (e) => {}); 108 | keyboardJS.bind('b', (e) => {}); 109 | keyboardJS.bind('c', (e) => {}); 110 | 111 | // these will execute in the index context 112 | keyboardJS.setContext('index'); 113 | keyboardJS.bind('1', (e) => {}); 114 | keyboardJS.bind('2', (e) => {}); 115 | keyboardJS.bind('3', (e) => {}); 116 | 117 | // these will execute in the foo context 118 | keyboardJS.setContext('foo'); 119 | keyboardJS.bind('x', (e) => {}); 120 | keyboardJS.bind('y', (e) => {}); 121 | keyboardJS.bind('z', (e) => {}); 122 | 123 | // if we have a router we can activate these contexts when appropriate 124 | myRouter.on('/', (e) => { 125 | keyboardJS.setContext('index'); 126 | }); 127 | myRouter.on('/foo', (e) => { 128 | keyboardJS.setContext('foo'); 129 | }); 130 | 131 | // you can always figure out your context too 132 | const contextName = keyboardJS.getContext(); 133 | 134 | // you can also set up handlers for a context without losing the current context 135 | keyboardJS.withContext('bar', () =>{ 136 | // these will execute in the bar context 137 | keyboardJS.bind('7', (e) => {}); 138 | keyboardJS.bind('8', (e) => {}); 139 | keyboardJS.bind('9', (e) => {}); 140 | }); 141 | ``` 142 | 143 | 144 | __pause, resume, and reset__ 145 | 146 | ```javascript 147 | 148 | // the keyboard will no longer trigger bindings 149 | keyboardJS.pause(); 150 | 151 | // the keyboard will once again trigger bindings 152 | keyboardJS.resume(); 153 | 154 | // all active bindings will released and unbound, 155 | // pressed keys will be cleared 156 | keyboardJS.reset(); 157 | ``` 158 | 159 | 160 | __pressKey, releaseKey, and releaseAllKeys__ 161 | 162 | ```javascript 163 | 164 | // pressKey 165 | keyboardJS.pressKey('a'); 166 | // or 167 | keyboardJS.pressKey(65); 168 | 169 | // releaseKey 170 | keyboardJS.releaseKey('a'); 171 | // or 172 | keyboardJS.releaseKey(65); 173 | 174 | // releaseAllKeys 175 | keyboardJS.releaseAllKeys(); 176 | ``` 177 | 178 | 179 | __watch and stop__ 180 | 181 | ```javascript 182 | // bind to the window and document in the current window 183 | keyboardJS.watch(); 184 | 185 | // or pass your own window and document 186 | keyboardJS.watch(myDoc); 187 | keyboardJS.watch(myWin, myDoc); 188 | 189 | // or scope to a specific element 190 | keyboardJS.watch(myForm); 191 | keyboardJS.watch(myWin, myForm); 192 | 193 | // detach KeyboardJS from the window and document/element 194 | keyboardJS.stop(); 195 | ``` 196 | -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "keyboardjs", 3 | "homepage": "https://github.com/RobertWHurst/KeyboardJS", 4 | "main": "dist/keyboard.js" 5 | } 6 | -------------------------------------------------------------------------------- /dist/keyboard.min.js: -------------------------------------------------------------------------------- 1 | !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).keyboardJS=t()}(this,(function(){"use strict";function e(t){return(e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(t)}function t(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(e,t){for(var n=0;ne.length)&&(t=e.length);for(var n=0,i=new Array(t);n-1&&o.splice(d,1)}if(0!==o.length)return!1}return!0}},{key:"_checkSubCombo",value:function(e,t,i){e=e.slice(0),i=i.slice(t);for(var r=t,s=0;s-1&&(e.splice(s,1),s-=1,l>r&&(r=l),0===e.length))return r}return-1}}]),n}();o.comboDeliminator=">",o.keyDeliminator="+",o.parseComboStr=function(e){for(var t=o._splitStr(e,o.comboDeliminator),n=[],i=0;i0&&n[o]===i&&"\\"!==n[o-1]&&(s.push(r.trim()),r="",o+=1),r+=n[o];return r&&s.push(r.trim()),s};var a=function(){function e(n){t(this,e),this.localeName=n,this.activeTargetKeys=[],this.pressedKeys=[],this._appliedMacros=[],this._keyMap={},this._killKeyCodes=[],this._macros=[]}return i(e,[{key:"bindKeyCode",value:function(e,t){"string"==typeof t&&(t=[t]),this._keyMap[e]=t}},{key:"bindMacro",value:function(e,t){"string"==typeof t&&(t=[t]);var n=null;"function"==typeof t&&(n=t,t=null);var i={keyCombo:new o(e),keyNames:t,handler:n};this._macros.push(i)}},{key:"getKeyCodes",value:function(e){var t=[];for(var n in this._keyMap){this._keyMap[n].indexOf(e)>-1&&t.push(0|n)}return t}},{key:"getKeyNames",value:function(e){return this._keyMap[e]||[]}},{key:"setKillKey",value:function(e){if("string"!=typeof e)this._killKeyCodes.push(e);else for(var t=this.getKeyCodes(e),n=0;n-1&&this.pressedKeys.splice(s,1)}this.activeTargetKeys.length=0,this._clearMacros()}}},{key:"_applyMacros",value:function(){for(var e=this._macros.slice(0),t=0;t-1&&this.pressedKeys.splice(i,1)}t.handler&&(t.keyNames=null),this._appliedMacros.splice(e,1),e-=1}}}}]),e}(),l=function(){function n(e,i,r,s){t(this,n),this._locale=null,this._currentContext="",this._contexts={},this._listeners=[],this._appliedListeners=[],this._locales={},this._targetElement=null,this._targetWindow=null,this._targetPlatform="",this._targetUserAgent="",this._isModernBrowser=!1,this._targetKeyDownBinding=null,this._targetKeyUpBinding=null,this._targetResetBinding=null,this._paused=!1,this._contexts.global={listeners:this._listeners,targetWindow:e,targetElement:i,targetPlatform:r,targetUserAgent:s},this.setContext("global")}return i(n,[{key:"setLocale",value:function(e,t){var n=null;return"string"==typeof e?t?t(n=new a(e),this._targetPlatform,this._targetUserAgent):n=this._locales[e]||null:e=(n=e)._localeName,this._locale=n,this._locales[e]=n,n&&(this._locale.pressedKeys=n.pressedKeys),this}},{key:"getLocale",value:function(e){return e||(e=this._locale.localeName),this._locales[e]||null}},{key:"bind",value:function(t,n,i,r){if(null!==t&&"function"!=typeof t||(r=i,i=n,n=t,t=null),t&&"object"===e(t)&&"number"==typeof t.length){for(var s=0;s"]),e.bindMacro("shift + /",["questionmark","?"]),t.match("Mac")?e.bindMacro("command",["mod","modifier"]):e.bindMacro("ctrl",["mod","modifier"]);for(var i=65;i<=90;i+=1){var r=String.fromCharCode(i+32),s=String.fromCharCode(i);e.bindKeyCode(i,r),e.bindMacro("shift + "+r,s),e.bindMacro("capslock + "+r,s)}var o,a,l=n.match("Firefox")?59:186,d=n.match("Firefox")?173:189,u=n.match("Firefox")?61:187;t.match("Mac")&&(n.match("Safari")||n.match("Chrome"))?(o=91,a=93):t.match("Mac")&&n.match("Opera")?(o=17,a=17):t.match("Mac")&&n.match("Firefox")&&(o=224,a=224),e.bindKeyCode(l,["semicolon",";"]),e.bindKeyCode(d,["dash","-"]),e.bindKeyCode(u,["equal","equalsign","="]),e.bindKeyCode(o,["command","windows","win","super","leftcommand","leftwindows","leftwin","leftsuper"]),e.bindKeyCode(a,["command","windows","win","super","rightcommand","rightwindows","rightwin","rightsuper"]),e.setKillKey("command")})),d.Keyboard=l,d.Locale=a,d.KeyCombo=o,d})); 2 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | import { Keyboard } from './lib/keyboard'; 2 | import { Locale } from './lib/locale'; 3 | import { KeyCombo } from './lib/key-combo'; 4 | import { us } from './locales/us'; 5 | 6 | const keyboard = new Keyboard(); 7 | 8 | keyboard.setLocale('us', us); 9 | 10 | keyboard.Keyboard = Keyboard; 11 | keyboard.Locale = Locale; 12 | keyboard.KeyCombo = KeyCombo; 13 | 14 | export default keyboard; 15 | -------------------------------------------------------------------------------- /lib/key-combo.js: -------------------------------------------------------------------------------- 1 | 2 | export class KeyCombo { 3 | constructor(keyComboStr) { 4 | this.sourceStr = keyComboStr; 5 | this.subCombos = KeyCombo.parseComboStr(keyComboStr); 6 | this.keyNames = this.subCombos.reduce((memo, nextSubCombo) => 7 | memo.concat(nextSubCombo), []); 8 | } 9 | 10 | check(pressedKeyNames) { 11 | let startingKeyNameIndex = 0; 12 | for (let i = 0; i < this.subCombos.length; i += 1) { 13 | startingKeyNameIndex = this._checkSubCombo( 14 | this.subCombos[i], 15 | startingKeyNameIndex, 16 | pressedKeyNames 17 | ); 18 | if (startingKeyNameIndex === -1) { return false; } 19 | } 20 | return true; 21 | }; 22 | 23 | isEqual(otherKeyCombo) { 24 | if ( 25 | !otherKeyCombo || 26 | typeof otherKeyCombo !== 'string' && 27 | typeof otherKeyCombo !== 'object' 28 | ) { return false; } 29 | 30 | if (typeof otherKeyCombo === 'string') { 31 | otherKeyCombo = new KeyCombo(otherKeyCombo); 32 | } 33 | 34 | if (this.subCombos.length !== otherKeyCombo.subCombos.length) { 35 | return false; 36 | } 37 | for (let i = 0; i < this.subCombos.length; i += 1) { 38 | if (this.subCombos[i].length !== otherKeyCombo.subCombos[i].length) { 39 | return false; 40 | } 41 | } 42 | 43 | for (let i = 0; i < this.subCombos.length; i += 1) { 44 | const subCombo = this.subCombos[i]; 45 | const otherSubCombo = otherKeyCombo.subCombos[i].slice(0); 46 | 47 | for (let j = 0; j < subCombo.length; j += 1) { 48 | const keyName = subCombo[j]; 49 | const index = otherSubCombo.indexOf(keyName); 50 | 51 | if (index > -1) { 52 | otherSubCombo.splice(index, 1); 53 | } 54 | } 55 | if (otherSubCombo.length !== 0) { 56 | return false; 57 | } 58 | } 59 | 60 | return true; 61 | }; 62 | 63 | _checkSubCombo(subCombo, startingKeyNameIndex, pressedKeyNames) { 64 | subCombo = subCombo.slice(0); 65 | pressedKeyNames = pressedKeyNames.slice(startingKeyNameIndex); 66 | 67 | let endIndex = startingKeyNameIndex; 68 | for (let i = 0; i < subCombo.length; i += 1) { 69 | 70 | let keyName = subCombo[i]; 71 | if (keyName[0] === '\\') { 72 | const escapedKeyName = keyName.slice(1); 73 | if ( 74 | escapedKeyName === KeyCombo.comboDeliminator || 75 | escapedKeyName === KeyCombo.keyDeliminator 76 | ) { 77 | keyName = escapedKeyName; 78 | } 79 | } 80 | 81 | const index = pressedKeyNames.indexOf(keyName); 82 | if (index > -1) { 83 | subCombo.splice(i, 1); 84 | i -= 1; 85 | if (index > endIndex) { 86 | endIndex = index; 87 | } 88 | if (subCombo.length === 0) { 89 | return endIndex; 90 | } 91 | } 92 | } 93 | return -1; 94 | }; 95 | } 96 | 97 | KeyCombo.comboDeliminator = '>'; 98 | KeyCombo.keyDeliminator = '+'; 99 | 100 | KeyCombo.parseComboStr = function(keyComboStr) { 101 | const subComboStrs = KeyCombo._splitStr(keyComboStr, KeyCombo.comboDeliminator); 102 | const combo = []; 103 | 104 | for (let i = 0 ; i < subComboStrs.length; i += 1) { 105 | combo.push(KeyCombo._splitStr(subComboStrs[i], KeyCombo.keyDeliminator)); 106 | } 107 | return combo; 108 | } 109 | 110 | KeyCombo._splitStr = function(str, deliminator) { 111 | const s = str; 112 | const d = deliminator; 113 | let c = ''; 114 | const ca = []; 115 | 116 | for (let ci = 0; ci < s.length; ci += 1) { 117 | if (ci > 0 && s[ci] === d && s[ci - 1] !== '\\') { 118 | ca.push(c.trim()); 119 | c = ''; 120 | ci += 1; 121 | } 122 | c += s[ci]; 123 | } 124 | if (c) { ca.push(c.trim()); } 125 | 126 | return ca; 127 | }; 128 | -------------------------------------------------------------------------------- /lib/keyboard.js: -------------------------------------------------------------------------------- 1 | import { Locale } from './locale'; 2 | import { KeyCombo } from './key-combo'; 3 | 4 | 5 | export class Keyboard { 6 | constructor(targetWindow, targetElement, targetPlatform, targetUserAgent) { 7 | this._locale = null; 8 | this._currentContext = ''; 9 | this._contexts = {}; 10 | this._listeners = []; 11 | this._appliedListeners = []; 12 | this._locales = {}; 13 | this._targetElement = null; 14 | this._targetWindow = null; 15 | this._targetPlatform = ''; 16 | this._targetUserAgent = ''; 17 | this._isModernBrowser = false; 18 | this._targetKeyDownBinding = null; 19 | this._targetKeyUpBinding = null; 20 | this._targetResetBinding = null; 21 | this._paused = false; 22 | 23 | this._contexts.global = { 24 | listeners: this._listeners, 25 | targetWindow, 26 | targetElement, 27 | targetPlatform, 28 | targetUserAgent 29 | }; 30 | 31 | this.setContext('global'); 32 | } 33 | 34 | setLocale(localeName, localeBuilder) { 35 | let locale = null; 36 | if (typeof localeName === 'string') { 37 | 38 | if (localeBuilder) { 39 | locale = new Locale(localeName); 40 | localeBuilder(locale, this._targetPlatform, this._targetUserAgent); 41 | } else { 42 | locale = this._locales[localeName] || null; 43 | } 44 | } else { 45 | locale = localeName; 46 | localeName = locale._localeName; 47 | } 48 | 49 | this._locale = locale; 50 | this._locales[localeName] = locale; 51 | if (locale) { 52 | this._locale.pressedKeys = locale.pressedKeys; 53 | } 54 | 55 | return this; 56 | } 57 | 58 | getLocale(localName) { 59 | localName || (localName = this._locale.localeName); 60 | return this._locales[localName] || null; 61 | } 62 | 63 | bind(keyComboStr, pressHandler, releaseHandler, preventRepeatByDefault) { 64 | if (keyComboStr === null || typeof keyComboStr === 'function') { 65 | preventRepeatByDefault = releaseHandler; 66 | releaseHandler = pressHandler; 67 | pressHandler = keyComboStr; 68 | keyComboStr = null; 69 | } 70 | 71 | if ( 72 | keyComboStr && 73 | typeof keyComboStr === 'object' && 74 | typeof keyComboStr.length === 'number' 75 | ) { 76 | for (let i = 0; i < keyComboStr.length; i += 1) { 77 | this.bind(keyComboStr[i], pressHandler, releaseHandler); 78 | } 79 | return this; 80 | } 81 | 82 | this._listeners.push({ 83 | keyCombo : keyComboStr ? new KeyCombo(keyComboStr) : null, 84 | pressHandler : pressHandler || null, 85 | releaseHandler : releaseHandler || null, 86 | preventRepeat : false, 87 | preventRepeatByDefault: preventRepeatByDefault || false, 88 | executingHandler : false 89 | }); 90 | 91 | return this; 92 | } 93 | 94 | addListener(keyComboStr, pressHandler, releaseHandler, preventRepeatByDefault) { 95 | return this.bind(keyComboStr, pressHandler, releaseHandler, preventRepeatByDefault); 96 | } 97 | 98 | on(keyComboStr, pressHandler, releaseHandler, preventRepeatByDefault) { 99 | return this.bind(keyComboStr, pressHandler, releaseHandler, preventRepeatByDefault); 100 | } 101 | 102 | bindPress(keyComboStr, pressHandler, preventRepeatByDefault) { 103 | return this.bind(keyComboStr, pressHandler, null, preventRepeatByDefault); 104 | } 105 | 106 | bindRelease(keyComboStr, releaseHandler) { 107 | return this.bind(keyComboStr, null, releaseHandler, preventRepeatByDefault); 108 | } 109 | 110 | unbind(keyComboStr, pressHandler, releaseHandler) { 111 | if (keyComboStr === null || typeof keyComboStr === 'function') { 112 | releaseHandler = pressHandler; 113 | pressHandler = keyComboStr; 114 | keyComboStr = null; 115 | } 116 | 117 | if ( 118 | keyComboStr && 119 | typeof keyComboStr === 'object' && 120 | typeof keyComboStr.length === 'number' 121 | ) { 122 | for (let i = 0; i < keyComboStr.length; i += 1) { 123 | this.unbind(keyComboStr[i], pressHandler, releaseHandler); 124 | } 125 | return this; 126 | } 127 | 128 | for (let i = 0; i < this._listeners.length; i += 1) { 129 | const listener = this._listeners[i]; 130 | 131 | const comboMatches = !keyComboStr && !listener.keyCombo || 132 | listener.keyCombo && listener.keyCombo.isEqual(keyComboStr); 133 | const pressHandlerMatches = !pressHandler && !releaseHandler || 134 | !pressHandler && !listener.pressHandler || 135 | pressHandler === listener.pressHandler; 136 | const releaseHandlerMatches = !pressHandler && !releaseHandler || 137 | !releaseHandler && !listener.releaseHandler || 138 | releaseHandler === listener.releaseHandler; 139 | 140 | if (comboMatches && pressHandlerMatches && releaseHandlerMatches) { 141 | this._listeners.splice(i, 1); 142 | i -= 1; 143 | } 144 | } 145 | 146 | return this; 147 | } 148 | 149 | removeListener(keyComboStr, pressHandler, releaseHandler) { 150 | return this.unbind(keyComboStr, pressHandler, releaseHandler); 151 | } 152 | 153 | off(keyComboStr, pressHandler, releaseHandler) { 154 | return this.unbind(keyComboStr, pressHandler, releaseHandler); 155 | } 156 | 157 | setContext(contextName) { 158 | if(this._locale) { this.releaseAllKeys(); } 159 | 160 | if (!this._contexts[contextName]) { 161 | const globalContext = this._contexts.global; 162 | this._contexts[contextName] = { 163 | listeners : [], 164 | targetWindow : globalContext.targetWindow, 165 | targetElement : globalContext.targetElement, 166 | targetPlatform : globalContext.targetPlatform, 167 | targetUserAgent: globalContext.targetUserAgent 168 | }; 169 | } 170 | 171 | const context = this._contexts[contextName]; 172 | this._currentContext = contextName; 173 | this._listeners = context.listeners; 174 | 175 | this.stop(); 176 | this.watch( 177 | context.targetWindow, 178 | context.targetElement, 179 | context.targetPlatform, 180 | context.targetUserAgent 181 | ); 182 | 183 | return this; 184 | } 185 | 186 | getContext() { 187 | return this._currentContext; 188 | } 189 | 190 | withContext(contextName, callback) { 191 | const previousContextName = this.getContext(); 192 | this.setContext(contextName); 193 | 194 | callback(); 195 | 196 | this.setContext(previousContextName); 197 | 198 | return this; 199 | } 200 | 201 | watch(targetWindow, targetElement, targetPlatform, targetUserAgent) { 202 | this.stop(); 203 | 204 | const win = typeof globalThis !== 'undefined' ? globalThis : 205 | typeof global !== 'undefined' ? global : 206 | typeof window !== 'undefined' ? window : 207 | {}; 208 | 209 | if (!targetWindow) { 210 | if (!win.addEventListener && !win.attachEvent) { 211 | // This was added so when using things like JSDOM watch can be used to configure watch 212 | // for the global namespace manually. 213 | if (this._currentContext === 'global') { 214 | return 215 | } 216 | throw new Error('Cannot find window functions addEventListener or attachEvent.'); 217 | } 218 | targetWindow = win; 219 | } 220 | 221 | // Handle element bindings where a target window is not passed 222 | if (typeof targetWindow.nodeType === 'number') { 223 | targetUserAgent = targetPlatform; 224 | targetPlatform = targetElement; 225 | targetElement = targetWindow; 226 | targetWindow = win; 227 | } 228 | 229 | if (!targetWindow.addEventListener && !targetWindow.attachEvent) { 230 | throw new Error('Cannot find addEventListener or attachEvent methods on targetWindow.'); 231 | } 232 | 233 | this._isModernBrowser = !!targetWindow.addEventListener; 234 | 235 | const userAgent = targetWindow.navigator && targetWindow.navigator.userAgent || ''; 236 | const platform = targetWindow.navigator && targetWindow.navigator.platform || ''; 237 | 238 | targetElement && targetElement !== null || (targetElement = targetWindow.document); 239 | targetPlatform && targetPlatform !== null || (targetPlatform = platform); 240 | targetUserAgent && targetUserAgent !== null || (targetUserAgent = userAgent); 241 | 242 | this._targetKeyDownBinding = (event) => { 243 | this.pressKey(event.keyCode, event); 244 | this._handleCommandBug(event, platform); 245 | }; 246 | this._targetKeyUpBinding = (event) => { 247 | this.releaseKey(event.keyCode, event); 248 | }; 249 | this._targetResetBinding = (event) => { 250 | this.releaseAllKeys(event); 251 | }; 252 | 253 | this._bindEvent(targetElement, 'keydown', this._targetKeyDownBinding); 254 | this._bindEvent(targetElement, 'keyup', this._targetKeyUpBinding); 255 | this._bindEvent(targetWindow, 'focus', this._targetResetBinding); 256 | this._bindEvent(targetWindow, 'blur', this._targetResetBinding); 257 | 258 | this._targetElement = targetElement; 259 | this._targetWindow = targetWindow; 260 | this._targetPlatform = targetPlatform; 261 | this._targetUserAgent = targetUserAgent; 262 | 263 | const currentContext = this._contexts[this._currentContext]; 264 | currentContext.targetWindow = this._targetWindow; 265 | currentContext.targetElement = this._targetElement; 266 | currentContext.targetPlatform = this._targetPlatform; 267 | currentContext.targetUserAgent = this._targetUserAgent; 268 | 269 | return this; 270 | } 271 | 272 | stop() { 273 | if (!this._targetElement || !this._targetWindow) { return; } 274 | 275 | this._unbindEvent(this._targetElement, 'keydown', this._targetKeyDownBinding); 276 | this._unbindEvent(this._targetElement, 'keyup', this._targetKeyUpBinding); 277 | this._unbindEvent(this._targetWindow, 'focus', this._targetResetBinding); 278 | this._unbindEvent(this._targetWindow, 'blur', this._targetResetBinding); 279 | 280 | this._targetWindow = null; 281 | this._targetElement = null; 282 | 283 | return this; 284 | } 285 | 286 | pressKey(keyCode, event) { 287 | if (this._paused) { return this; } 288 | if (!this._locale) { throw new Error('Locale not set'); } 289 | 290 | this._locale.pressKey(keyCode); 291 | this._applyBindings(event); 292 | 293 | return this; 294 | } 295 | 296 | releaseKey(keyCode, event) { 297 | if (this._paused) { return this; } 298 | if (!this._locale) { throw new Error('Locale not set'); } 299 | 300 | this._locale.releaseKey(keyCode); 301 | this._clearBindings(event); 302 | 303 | return this; 304 | } 305 | 306 | releaseAllKeys(event) { 307 | if (this._paused) { return this; } 308 | if (!this._locale) { throw new Error('Locale not set'); } 309 | 310 | this._locale.pressedKeys.length = 0; 311 | this._clearBindings(event); 312 | 313 | return this; 314 | } 315 | 316 | pause() { 317 | if (this._paused) { return this; } 318 | if (this._locale) { this.releaseAllKeys(); } 319 | this._paused = true; 320 | 321 | return this; 322 | } 323 | 324 | resume() { 325 | this._paused = false; 326 | 327 | return this; 328 | } 329 | 330 | reset() { 331 | this.releaseAllKeys(); 332 | this._listeners.length = 0; 333 | 334 | return this; 335 | } 336 | 337 | _bindEvent(targetElement, eventName, handler) { 338 | return this._isModernBrowser ? 339 | targetElement.addEventListener(eventName, handler, false) : 340 | targetElement.attachEvent('on' + eventName, handler); 341 | } 342 | 343 | _unbindEvent(targetElement, eventName, handler) { 344 | return this._isModernBrowser ? 345 | targetElement.removeEventListener(eventName, handler, false) : 346 | targetElement.detachEvent('on' + eventName, handler); 347 | } 348 | 349 | _getGroupedListeners() { 350 | const listenerGroups = []; 351 | const listenerGroupMap = []; 352 | 353 | let listeners = this._listeners; 354 | if (this._currentContext !== 'global') { 355 | listeners = [...listeners, ...this._contexts.global.listeners]; 356 | } 357 | 358 | listeners.sort( 359 | (a, b) => 360 | (b.keyCombo ? b.keyCombo.keyNames.length : 0) - 361 | (a.keyCombo ? a.keyCombo.keyNames.length : 0) 362 | ).forEach((l) => { 363 | let mapIndex = -1; 364 | for (let i = 0; i < listenerGroupMap.length; i += 1) { 365 | if (listenerGroupMap[i] === null && l.keyCombo === null || 366 | listenerGroupMap[i] !== null && listenerGroupMap[i].isEqual(l.keyCombo)) { 367 | mapIndex = i; 368 | } 369 | } 370 | if (mapIndex === -1) { 371 | mapIndex = listenerGroupMap.length; 372 | listenerGroupMap.push(l.keyCombo); 373 | } 374 | if (!listenerGroups[mapIndex]) { 375 | listenerGroups[mapIndex] = []; 376 | } 377 | listenerGroups[mapIndex].push(l); 378 | }); 379 | 380 | return listenerGroups; 381 | } 382 | 383 | _applyBindings(event) { 384 | let preventRepeat = false; 385 | 386 | event || (event = {}); 387 | event.preventRepeat = () => { preventRepeat = true; }; 388 | event.pressedKeys = this._locale.pressedKeys.slice(0); 389 | 390 | const activeTargetKeys = this._locale.activeTargetKeys; 391 | const pressedKeys = this._locale.pressedKeys.slice(0); 392 | const listenerGroups = this._getGroupedListeners(); 393 | 394 | for (let i = 0; i < listenerGroups.length; i += 1) { 395 | const listeners = listenerGroups[i]; 396 | const keyCombo = listeners[0].keyCombo; 397 | 398 | if ( 399 | keyCombo === null || 400 | keyCombo.check(pressedKeys) && 401 | activeTargetKeys.some(k => keyCombo.keyNames.includes(k)) 402 | ) { 403 | for (let j = 0; j < listeners.length; j += 1) { 404 | let listener = listeners[j]; 405 | 406 | if (!listener.executingHandler && listener.pressHandler && !listener.preventRepeat) { 407 | listener.executingHandler = true; 408 | listener.pressHandler.call(this, event); 409 | listener.executingHandler = false; 410 | 411 | if (preventRepeat || listener.preventRepeatByDefault) { 412 | listener.preventRepeat = true; 413 | preventRepeat = false; 414 | } 415 | } 416 | 417 | if (this._appliedListeners.indexOf(listener) === -1) { 418 | this._appliedListeners.push(listener); 419 | } 420 | } 421 | 422 | if (keyCombo) { 423 | for (let j = 0; j < keyCombo.keyNames.length; j += 1) { 424 | const index = pressedKeys.indexOf(keyCombo.keyNames[j]); 425 | if (index !== -1) { 426 | pressedKeys.splice(index, 1); 427 | j -= 1; 428 | } 429 | } 430 | } 431 | } 432 | } 433 | } 434 | 435 | _clearBindings(event) { 436 | event || (event = {}); 437 | event.pressedKeys = this._locale.pressedKeys.slice(0); 438 | 439 | for (let i = 0; i < this._appliedListeners.length; i += 1) { 440 | const listener = this._appliedListeners[i]; 441 | const keyCombo = listener.keyCombo; 442 | if (keyCombo === null || !keyCombo.check(this._locale.pressedKeys)) { 443 | listener.preventRepeat = false; 444 | if (keyCombo !== null || event.pressedKeys.length === 0) { 445 | this._appliedListeners.splice(i, 1); 446 | i -= 1; 447 | } 448 | if (!listener.executingHandler && listener.releaseHandler) { 449 | listener.executingHandler = true; 450 | listener.releaseHandler.call(this, event); 451 | listener.executingHandler = false; 452 | } 453 | } 454 | } 455 | } 456 | 457 | _handleCommandBug(event, platform) { 458 | // On Mac when the command key is kept pressed, keyup is not triggered for any other key. 459 | // In this case force a keyup for non-modifier keys directly after the keypress. 460 | const modifierKeys = ["shift", "ctrl", "alt", "capslock", "tab", "command"]; 461 | if (platform.match("Mac") && this._locale.pressedKeys.includes("command") && 462 | !modifierKeys.includes(this._locale.getKeyNames(event.keyCode)[0])) { 463 | this._targetKeyUpBinding(event); 464 | } 465 | } 466 | } 467 | -------------------------------------------------------------------------------- /lib/locale.js: -------------------------------------------------------------------------------- 1 | import { KeyCombo } from './key-combo'; 2 | 3 | 4 | export class Locale { 5 | constructor(name) { 6 | this.localeName = name; 7 | this.activeTargetKeys = []; 8 | this.pressedKeys = []; 9 | this._appliedMacros = []; 10 | this._keyMap = {}; 11 | this._killKeyCodes = []; 12 | this._macros = []; 13 | } 14 | 15 | bindKeyCode(keyCode, keyNames) { 16 | if (typeof keyNames === 'string') { 17 | keyNames = [keyNames]; 18 | } 19 | 20 | this._keyMap[keyCode] = keyNames; 21 | }; 22 | 23 | bindMacro(keyComboStr, keyNames) { 24 | if (typeof keyNames === 'string') { 25 | keyNames = [ keyNames ]; 26 | } 27 | 28 | let handler = null; 29 | if (typeof keyNames === 'function') { 30 | handler = keyNames; 31 | keyNames = null; 32 | } 33 | 34 | const macro = { 35 | keyCombo : new KeyCombo(keyComboStr), 36 | keyNames : keyNames, 37 | handler : handler 38 | }; 39 | 40 | this._macros.push(macro); 41 | }; 42 | 43 | getKeyCodes(keyName) { 44 | const keyCodes = []; 45 | for (const keyCode in this._keyMap) { 46 | const index = this._keyMap[keyCode].indexOf(keyName); 47 | if (index > -1) { keyCodes.push(keyCode|0); } 48 | } 49 | return keyCodes; 50 | }; 51 | 52 | getKeyNames(keyCode) { 53 | return this._keyMap[keyCode] || []; 54 | }; 55 | 56 | setKillKey(keyCode) { 57 | if (typeof keyCode === 'string') { 58 | const keyCodes = this.getKeyCodes(keyCode); 59 | for (let i = 0; i < keyCodes.length; i += 1) { 60 | this.setKillKey(keyCodes[i]); 61 | } 62 | return; 63 | } 64 | 65 | this._killKeyCodes.push(keyCode); 66 | }; 67 | 68 | pressKey(keyCode) { 69 | if (typeof keyCode === 'string') { 70 | const keyCodes = this.getKeyCodes(keyCode); 71 | for (let i = 0; i < keyCodes.length; i += 1) { 72 | this.pressKey(keyCodes[i]); 73 | } 74 | return; 75 | } 76 | 77 | this.activeTargetKeys.length = 0; 78 | const keyNames = this.getKeyNames(keyCode); 79 | for (let i = 0; i < keyNames.length; i += 1) { 80 | this.activeTargetKeys.push(keyNames[i]); 81 | if (this.pressedKeys.indexOf(keyNames[i]) === -1) { 82 | this.pressedKeys.push(keyNames[i]); 83 | } 84 | } 85 | 86 | this._applyMacros(); 87 | }; 88 | 89 | releaseKey(keyCode) { 90 | if (typeof keyCode === 'string') { 91 | const keyCodes = this.getKeyCodes(keyCode); 92 | for (let i = 0; i < keyCodes.length; i += 1) { 93 | this.releaseKey(keyCodes[i]); 94 | } 95 | 96 | } else { 97 | const keyNames = this.getKeyNames(keyCode); 98 | const killKeyCodeIndex = this._killKeyCodes.indexOf(keyCode); 99 | 100 | if (killKeyCodeIndex !== -1) { 101 | this.pressedKeys.length = 0; 102 | } else { 103 | for (let i = 0; i < keyNames.length; i += 1) { 104 | const index = this.pressedKeys.indexOf(keyNames[i]); 105 | if (index > -1) { 106 | this.pressedKeys.splice(index, 1); 107 | } 108 | } 109 | } 110 | 111 | this.activeTargetKeys.length = 0; 112 | this._clearMacros(); 113 | } 114 | }; 115 | 116 | _applyMacros() { 117 | const macros = this._macros.slice(0); 118 | for (let i = 0; i < macros.length; i += 1) { 119 | const macro = macros[i]; 120 | if (macro.keyCombo.check(this.pressedKeys)) { 121 | if (macro.handler) { 122 | macro.keyNames = macro.handler(this.pressedKeys); 123 | } 124 | for (let j = 0; j < macro.keyNames.length; j += 1) { 125 | if (this.pressedKeys.indexOf(macro.keyNames[j]) === -1) { 126 | this.pressedKeys.push(macro.keyNames[j]); 127 | } 128 | } 129 | this._appliedMacros.push(macro); 130 | } 131 | } 132 | }; 133 | 134 | _clearMacros() { 135 | for (let i = 0; i < this._appliedMacros.length; i += 1) { 136 | const macro = this._appliedMacros[i]; 137 | if (!macro.keyCombo.check(this.pressedKeys)) { 138 | for (let j = 0; j < macro.keyNames.length; j += 1) { 139 | const index = this.pressedKeys.indexOf(macro.keyNames[j]); 140 | if (index > -1) { 141 | this.pressedKeys.splice(index, 1); 142 | } 143 | } 144 | if (macro.handler) { 145 | macro.keyNames = null; 146 | } 147 | this._appliedMacros.splice(i, 1); 148 | i -= 1; 149 | } 150 | } 151 | } 152 | } 153 | -------------------------------------------------------------------------------- /locales/us.js: -------------------------------------------------------------------------------- 1 | 2 | export function us(locale, platform, userAgent) { 3 | 4 | // general 5 | locale.bindKeyCode(3, ['cancel']); 6 | locale.bindKeyCode(8, ['backspace']); 7 | locale.bindKeyCode(9, ['tab']); 8 | locale.bindKeyCode(12, ['clear']); 9 | locale.bindKeyCode(13, ['enter']); 10 | locale.bindKeyCode(16, ['shift']); 11 | locale.bindKeyCode(17, ['ctrl']); 12 | locale.bindKeyCode(18, ['alt', 'menu']); 13 | locale.bindKeyCode(19, ['pause', 'break']); 14 | locale.bindKeyCode(20, ['capslock']); 15 | locale.bindKeyCode(27, ['escape', 'esc']); 16 | locale.bindKeyCode(32, ['space', 'spacebar']); 17 | locale.bindKeyCode(33, ['pageup']); 18 | locale.bindKeyCode(34, ['pagedown']); 19 | locale.bindKeyCode(35, ['end']); 20 | locale.bindKeyCode(36, ['home']); 21 | locale.bindKeyCode(37, ['left']); 22 | locale.bindKeyCode(38, ['up']); 23 | locale.bindKeyCode(39, ['right']); 24 | locale.bindKeyCode(40, ['down']); 25 | locale.bindKeyCode(41, ['select']); 26 | locale.bindKeyCode(42, ['printscreen']); 27 | locale.bindKeyCode(43, ['execute']); 28 | locale.bindKeyCode(44, ['snapshot']); 29 | locale.bindKeyCode(45, ['insert', 'ins']); 30 | locale.bindKeyCode(46, ['delete', 'del']); 31 | locale.bindKeyCode(47, ['help']); 32 | locale.bindKeyCode(145, ['scrolllock', 'scroll']); 33 | locale.bindKeyCode(188, ['comma', ',']); 34 | locale.bindKeyCode(190, ['period', '.']); 35 | locale.bindKeyCode(191, ['slash', 'forwardslash', '/']); 36 | locale.bindKeyCode(192, ['graveaccent', '`']); 37 | locale.bindKeyCode(219, ['openbracket', '[']); 38 | locale.bindKeyCode(220, ['backslash', '\\']); 39 | locale.bindKeyCode(221, ['closebracket', ']']); 40 | locale.bindKeyCode(222, ['apostrophe', '\'']); 41 | 42 | // 0-9 43 | locale.bindKeyCode(48, ['zero', '0']); 44 | locale.bindKeyCode(49, ['one', '1']); 45 | locale.bindKeyCode(50, ['two', '2']); 46 | locale.bindKeyCode(51, ['three', '3']); 47 | locale.bindKeyCode(52, ['four', '4']); 48 | locale.bindKeyCode(53, ['five', '5']); 49 | locale.bindKeyCode(54, ['six', '6']); 50 | locale.bindKeyCode(55, ['seven', '7']); 51 | locale.bindKeyCode(56, ['eight', '8']); 52 | locale.bindKeyCode(57, ['nine', '9']); 53 | 54 | // numpad 55 | locale.bindKeyCode(96, ['numzero', 'num0']); 56 | locale.bindKeyCode(97, ['numone', 'num1']); 57 | locale.bindKeyCode(98, ['numtwo', 'num2']); 58 | locale.bindKeyCode(99, ['numthree', 'num3']); 59 | locale.bindKeyCode(100, ['numfour', 'num4']); 60 | locale.bindKeyCode(101, ['numfive', 'num5']); 61 | locale.bindKeyCode(102, ['numsix', 'num6']); 62 | locale.bindKeyCode(103, ['numseven', 'num7']); 63 | locale.bindKeyCode(104, ['numeight', 'num8']); 64 | locale.bindKeyCode(105, ['numnine', 'num9']); 65 | locale.bindKeyCode(106, ['nummultiply', 'num*']); 66 | locale.bindKeyCode(107, ['numadd', 'num+']); 67 | locale.bindKeyCode(108, ['numenter']); 68 | locale.bindKeyCode(109, ['numsubtract', 'num-']); 69 | locale.bindKeyCode(110, ['numdecimal', 'num.']); 70 | locale.bindKeyCode(111, ['numdivide', 'num/']); 71 | locale.bindKeyCode(144, ['numlock', 'num']); 72 | 73 | // function keys 74 | locale.bindKeyCode(112, ['f1']); 75 | locale.bindKeyCode(113, ['f2']); 76 | locale.bindKeyCode(114, ['f3']); 77 | locale.bindKeyCode(115, ['f4']); 78 | locale.bindKeyCode(116, ['f5']); 79 | locale.bindKeyCode(117, ['f6']); 80 | locale.bindKeyCode(118, ['f7']); 81 | locale.bindKeyCode(119, ['f8']); 82 | locale.bindKeyCode(120, ['f9']); 83 | locale.bindKeyCode(121, ['f10']); 84 | locale.bindKeyCode(122, ['f11']); 85 | locale.bindKeyCode(123, ['f12']); 86 | locale.bindKeyCode(124, ['f13']); 87 | locale.bindKeyCode(125, ['f14']); 88 | locale.bindKeyCode(126, ['f15']); 89 | locale.bindKeyCode(127, ['f16']); 90 | locale.bindKeyCode(128, ['f17']); 91 | locale.bindKeyCode(129, ['f18']); 92 | locale.bindKeyCode(130, ['f19']); 93 | locale.bindKeyCode(131, ['f20']); 94 | locale.bindKeyCode(132, ['f21']); 95 | locale.bindKeyCode(133, ['f22']); 96 | locale.bindKeyCode(134, ['f23']); 97 | locale.bindKeyCode(135, ['f24']); 98 | 99 | // secondary key symbols 100 | locale.bindMacro('shift + `', ['tilde', '~']); 101 | locale.bindMacro('shift + 1', ['exclamation', 'exclamationpoint', '!']); 102 | locale.bindMacro('shift + 2', ['at', '@']); 103 | locale.bindMacro('shift + 3', ['number', '#']); 104 | locale.bindMacro('shift + 4', ['dollar', 'dollars', 'dollarsign', '$']); 105 | locale.bindMacro('shift + 5', ['percent', '%']); 106 | locale.bindMacro('shift + 6', ['caret', '^']); 107 | locale.bindMacro('shift + 7', ['ampersand', 'and', '&']); 108 | locale.bindMacro('shift + 8', ['asterisk', '*']); 109 | locale.bindMacro('shift + 9', ['openparen', '(']); 110 | locale.bindMacro('shift + 0', ['closeparen', ')']); 111 | locale.bindMacro('shift + -', ['underscore', '_']); 112 | locale.bindMacro('shift + =', ['plus', '+']); 113 | locale.bindMacro('shift + [', ['opencurlybrace', 'opencurlybracket', '{']); 114 | locale.bindMacro('shift + ]', ['closecurlybrace', 'closecurlybracket', '}']); 115 | locale.bindMacro('shift + \\', ['verticalbar', '|']); 116 | locale.bindMacro('shift + ;', ['colon', ':']); 117 | locale.bindMacro('shift + \'', ['quotationmark', '\'']); 118 | locale.bindMacro('shift + !,', ['openanglebracket', '<']); 119 | locale.bindMacro('shift + .', ['closeanglebracket', '>']); 120 | locale.bindMacro('shift + /', ['questionmark', '?']); 121 | 122 | if (platform.match('Mac')) { 123 | locale.bindMacro('command', ['mod', 'modifier']); 124 | } else { 125 | locale.bindMacro('ctrl', ['mod', 'modifier']); 126 | } 127 | 128 | //a-z and A-Z 129 | for (let keyCode = 65; keyCode <= 90; keyCode += 1) { 130 | var keyName = String.fromCharCode(keyCode + 32); 131 | var capitalKeyName = String.fromCharCode(keyCode); 132 | locale.bindKeyCode(keyCode, keyName); 133 | locale.bindMacro('shift + ' + keyName, capitalKeyName); 134 | locale.bindMacro('capslock + ' + keyName, capitalKeyName); 135 | } 136 | 137 | // browser caveats 138 | const semicolonKeyCode = userAgent.match('Firefox') ? 59 : 186; 139 | const dashKeyCode = userAgent.match('Firefox') ? 173 : 189; 140 | const equalKeyCode = userAgent.match('Firefox') ? 61 : 187; 141 | let leftCommandKeyCode; 142 | let rightCommandKeyCode; 143 | if (platform.match('Mac') && (userAgent.match('Safari') || userAgent.match('Chrome'))) { 144 | leftCommandKeyCode = 91; 145 | rightCommandKeyCode = 93; 146 | } else if(platform.match('Mac') && userAgent.match('Opera')) { 147 | leftCommandKeyCode = 17; 148 | rightCommandKeyCode = 17; 149 | } else if(platform.match('Mac') && userAgent.match('Firefox')) { 150 | leftCommandKeyCode = 224; 151 | rightCommandKeyCode = 224; 152 | } 153 | locale.bindKeyCode(semicolonKeyCode, ['semicolon', ';']); 154 | locale.bindKeyCode(dashKeyCode, ['dash', '-']); 155 | locale.bindKeyCode(equalKeyCode, ['equal', 'equalsign', '=']); 156 | locale.bindKeyCode(leftCommandKeyCode, ['command', 'windows', 'win', 'super', 'leftcommand', 'leftwindows', 'leftwin', 'leftsuper']); 157 | locale.bindKeyCode(rightCommandKeyCode, ['command', 'windows', 'win', 'super', 'rightcommand', 'rightwindows', 'rightwin', 'rightsuper']); 158 | 159 | // kill keys 160 | locale.setKillKey('command'); 161 | }; 162 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "keyboardjs", 3 | "description": "A library for binding to keys and key combos without the pain of key codes and key combo conflicts.", 4 | "version": "2.7.0", 5 | "main": "dist/keyboard.js", 6 | "scripts": { 7 | "test": "mocha -r esm test/**/*.spec.js", 8 | "build": "rollup --config" 9 | }, 10 | "keywords": [ 11 | "Key Binding, Keyboard, Key combos, Keyboard Shortcuts" 12 | ], 13 | "author": "Robert Hurst ", 14 | "bugs": { 15 | "url": "https://github.com/RobertWHurst/KeyboardJS/issues" 16 | }, 17 | "repository": { 18 | "type": "git", 19 | "url": "git@github.com:RobertWHurst/KeyboardJS.git" 20 | }, 21 | "license": "MIT", 22 | "devDependencies": { 23 | "@babel/core": "^7.10.2", 24 | "@babel/preset-env": "^7.10.2", 25 | "@rollup/plugin-babel": "^5.0.2", 26 | "esm": "^3.2.25", 27 | "mocha": "^7.2.0", 28 | "rollup": "^2.13.1", 29 | "rollup-plugin-terser": "^6.1.0", 30 | "sinon": "^9.0.2" 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /rollup.config.js: -------------------------------------------------------------------------------- 1 | import babel from "@rollup/plugin-babel"; 2 | import { terser } from "rollup-plugin-terser"; 3 | 4 | export default { 5 | input: "./index.js", 6 | output: [ 7 | { 8 | file: './dist/keyboard.js', 9 | name: 'keyboardJS', 10 | format: 'umd', 11 | sourcemap: 'inline' 12 | }, 13 | { 14 | file: './dist/keyboard.min.js', 15 | name: 'keyboardJS', 16 | format: 'umd', 17 | plugins: [terser()] 18 | } 19 | ], 20 | plugins: [babel({ 21 | presets: ['@babel/preset-env'], 22 | babelHelpers: 'bundled' 23 | })] 24 | } 25 | -------------------------------------------------------------------------------- /test/fixtures/document.js: -------------------------------------------------------------------------------- 1 | import sinon from 'sinon'; 2 | 3 | 4 | export const document = { 5 | addEventListener: sinon.stub(), 6 | removeEventListener: sinon.stub(), 7 | }; 8 | -------------------------------------------------------------------------------- /test/fixtures/window.js: -------------------------------------------------------------------------------- 1 | import sinon from 'sinon'; 2 | 3 | 4 | export const window = { 5 | addEventListener : sinon.stub(), 6 | removeEventListener : sinon.stub(), 7 | navigator: { 8 | platform : 'test-platform', 9 | userAgent : 'test-user-agent' 10 | } 11 | }; 12 | -------------------------------------------------------------------------------- /test/key-combo.spec.js: -------------------------------------------------------------------------------- 1 | import assert from 'assert'; 2 | import { KeyCombo } from '../lib/key-combo'; 3 | 4 | 5 | describe('KeyCombo', () => { 6 | 7 | 8 | describe('.parseComboStr', () => { 9 | 10 | it('can parse combo strings', () => { 11 | const comboArr = KeyCombo.parseComboStr('a + b'); 12 | 13 | assert.equal(comboArr[0][0], 'a'); 14 | assert.equal(comboArr[0][1], 'b'); 15 | }); 16 | 17 | it('can parse combo strings containing combo deliminators', () => { 18 | const comboArr = KeyCombo.parseComboStr('a + b > c + d'); 19 | 20 | assert.equal(comboArr[0][0], 'a'); 21 | assert.equal(comboArr[0][1], 'b'); 22 | assert.equal(comboArr[1][0], 'c'); 23 | assert.equal(comboArr[1][1], 'd'); 24 | }); 25 | }); 26 | 27 | 28 | describe('#check', () => { 29 | 30 | it('can check the combo against an array of key names', () => { 31 | const keyCombo1 = new KeyCombo('a + b'); 32 | const keyCombo2 = new KeyCombo('a + \\+'); 33 | 34 | assert.ok(keyCombo1.check(['a', 'b'])); 35 | assert.ok(keyCombo1.check(['b', 'a'])); 36 | assert.ok(keyCombo1.check(['a', 'b', 'c'])); 37 | assert.ok(keyCombo1.check(['z', 'a', 'b'])); 38 | assert.ok(keyCombo1.check(['z', 'a', 'b', 'c'])); 39 | 40 | assert.ok(keyCombo2.check(['a', '+'])); 41 | }); 42 | 43 | it('can check the combo containing combo deliminators against an array of key names', () => { 44 | const keyCombo = new KeyCombo('a + b > c + d'); 45 | 46 | assert.ok(keyCombo.check(['a', 'b', 'c', 'd'])); 47 | assert.ok(keyCombo.check(['b', 'a', 'd', 'c'])); 48 | assert.ok(keyCombo.check(['a', 'b', 'e', 'c', 'd', 'f'])); 49 | assert.ok(keyCombo.check(['z', 'a', 'b', 'y', 'c', 'd'])); 50 | assert.ok(keyCombo.check(['z', 'a', 'b', 'y', 'x', 'c', 'd', 'w'])); 51 | 52 | assert.equal(keyCombo.check(['c', 'd', 'a', 'b']), false); 53 | assert.equal(keyCombo.check(['d', 'c', 'b', 'a']), false); 54 | }); 55 | }); 56 | 57 | 58 | describe('#isEqual', () => { 59 | 60 | it('can correctly equate two the combo to a given one', () => { 61 | const keyCombo1 = new KeyCombo('a + b'); 62 | const keyCombo2 = new KeyCombo('a + b'); 63 | const keyCombo3 = new KeyCombo('b + a'); 64 | const keyCombo4 = new KeyCombo('a + b + c'); 65 | const keyCombo5 = new KeyCombo('a > b'); 66 | 67 | assert.ok(keyCombo1.isEqual(keyCombo2)); 68 | assert.ok(keyCombo1.isEqual(keyCombo3)); 69 | assert.equal(keyCombo1.isEqual(keyCombo4), false); 70 | assert.equal(keyCombo1.isEqual(keyCombo5), false); 71 | }); 72 | }); 73 | }); 74 | -------------------------------------------------------------------------------- /test/keyboard.spec.js: -------------------------------------------------------------------------------- 1 | import sinon from 'sinon'; 2 | import assert from 'assert'; 3 | import { Keyboard } from '../lib/keyboard'; 4 | import { KeyCombo } from '../lib/key-combo'; 5 | import { Locale } from '../lib/locale'; 6 | import { document as doc } from './fixtures/document'; 7 | import { window as win } from './fixtures/window'; 8 | 9 | 10 | describe('Keyboard', () => { 11 | 12 | let keyboard; 13 | beforeEach(() => { 14 | keyboard = new Keyboard(win, doc); 15 | }); 16 | 17 | it('creates the global context automatically', () => { 18 | global.addEventListener = () => {} 19 | global.document = { addEventListener: () => {} } 20 | 21 | keyboard = new Keyboard(); 22 | assert.equal(keyboard._currentContext, 'global') 23 | assert.equal(keyboard._targetWindow, global) 24 | assert.equal(keyboard._targetElement, global.document) 25 | 26 | delete global.addEventListener 27 | delete global.document 28 | }) 29 | 30 | it('if the global object is not from a browser it will allow manually watching without throwing an error', () => { 31 | keyboard = new Keyboard(); 32 | assert.equal(keyboard._currentContext, 'global') 33 | assert.equal(keyboard._targetWindow, null) 34 | assert.equal(keyboard._targetElement, null) 35 | 36 | const window = { addEventListener: () => {} } 37 | const document = { addEventListener: () => {} } 38 | keyboard.watch(window, document) 39 | 40 | assert.equal(keyboard._targetWindow, window) 41 | assert.equal(keyboard._targetElement, document) 42 | }) 43 | 44 | 45 | describe('#setLocale', () => { 46 | 47 | it('creates and sets a locale', () => { 48 | keyboard.setLocale('testName', (locale, platform, userAgent) => { 49 | assert.equal(platform, 'test-platform'); 50 | assert.equal(userAgent, 'test-user-agent'); 51 | 52 | locale.test = 1; 53 | }); 54 | 55 | assert.equal(keyboard._locale.test, 1); 56 | assert.equal(keyboard._locales.testName.test, 1); 57 | }); 58 | 59 | it('sets a locale', () => { 60 | keyboard._locales.testName = { test: 2 }; 61 | 62 | keyboard.setLocale('testName'); 63 | 64 | assert.equal(keyboard._locale.test, 2); 65 | }); 66 | 67 | it('accepts locale instance and sets it', () => { 68 | keyboard.setLocale({ 69 | localeName: 'testName', 70 | test: 3 71 | }); 72 | 73 | assert.equal(keyboard._locale.test, 3); 74 | }); 75 | }); 76 | 77 | 78 | describe('#getLocale', () => { 79 | 80 | it('returns the current locale', () => { 81 | keyboard._locales.testName = { test: 4, localeName: 'testName' }; 82 | keyboard._locale = keyboard._locales.testName; 83 | 84 | const locale = keyboard.getLocale(); 85 | 86 | assert.equal(locale.test, 4); 87 | }); 88 | 89 | it('returns the a locale by name', () => { 90 | keyboard._locales.testName = { test: 5 }; 91 | keyboard._locale = keyboard._locales.testName; 92 | 93 | const locale = keyboard.getLocale('testName'); 94 | 95 | assert.equal(locale.test, 5); 96 | }); 97 | }); 98 | 99 | 100 | describe('#bind', () => { 101 | 102 | it('binds a combo to press handler and release handlers', () => { 103 | const pressHandler = () => {}; 104 | const releaseHandler = () => {}; 105 | 106 | keyboard.bind('a', pressHandler, releaseHandler); 107 | 108 | assert.equal(keyboard._listeners[0].keyCombo.sourceStr, 'a'); 109 | assert.equal(keyboard._listeners[0].pressHandler, pressHandler); 110 | assert.equal(keyboard._listeners[0].releaseHandler, releaseHandler); 111 | }); 112 | 113 | it('binds a combo to a press handler', () => { 114 | const pressHandler = () => {}; 115 | 116 | keyboard.bind('a', pressHandler); 117 | 118 | assert.equal(keyboard._listeners[0].keyCombo.sourceStr, 'a'); 119 | assert.equal(keyboard._listeners[0].pressHandler, pressHandler); 120 | assert.equal(keyboard._listeners[0].releaseHandler, null); 121 | }); 122 | 123 | it('binds a combo to a release handler', () => { 124 | const releaseHandler = () => {}; 125 | 126 | keyboard.bind('a', null, releaseHandler); 127 | 128 | assert.equal(keyboard._listeners[0].keyCombo.sourceStr, 'a'); 129 | assert.equal(keyboard._listeners[0].pressHandler, null); 130 | assert.equal(keyboard._listeners[0].releaseHandler, releaseHandler); 131 | }); 132 | 133 | it('binds several combos to press and release handlers', () => { 134 | const pressHandler = () => {}; 135 | const releaseHandler = () => {}; 136 | 137 | keyboard.bind(['a', 'b'], pressHandler, releaseHandler); 138 | 139 | assert.equal(keyboard._listeners[0].keyCombo.sourceStr, 'a'); 140 | assert.equal(keyboard._listeners[1].keyCombo.sourceStr, 'b'); 141 | assert.equal(keyboard._listeners[0].pressHandler, pressHandler); 142 | assert.equal(keyboard._listeners[1].pressHandler, pressHandler); 143 | assert.equal(keyboard._listeners[0].releaseHandler, releaseHandler); 144 | assert.equal(keyboard._listeners[1].releaseHandler, releaseHandler); 145 | }); 146 | 147 | it('binds press and release handlers to any keypress', () => { 148 | const pressHandler = () => {}; 149 | const releaseHandler = () => {}; 150 | 151 | keyboard.bind(pressHandler, releaseHandler); 152 | 153 | assert.equal(keyboard._listeners[0].keyCombo, null); 154 | assert.equal(keyboard._listeners[0].pressHandler, pressHandler); 155 | assert.equal(keyboard._listeners[0].releaseHandler, releaseHandler); 156 | }); 157 | 158 | it('accepts preventRepeatByDefault as a final argument', () => { 159 | const pressHandler = () => {}; 160 | const releaseHandler = () => {}; 161 | 162 | keyboard.bind('a', pressHandler, releaseHandler, true); 163 | keyboard.bind(pressHandler, releaseHandler, true); 164 | 165 | assert.equal(keyboard._listeners[0].keyCombo.sourceStr, 'a'); 166 | assert.equal(keyboard._listeners[0].pressHandler, pressHandler); 167 | assert.equal(keyboard._listeners[0].releaseHandler, releaseHandler); 168 | assert.equal(keyboard._listeners[0].preventRepeatByDefault, true); 169 | assert.equal(keyboard._listeners[1].keyCombo, null); 170 | assert.equal(keyboard._listeners[1].pressHandler, pressHandler); 171 | assert.equal(keyboard._listeners[1].releaseHandler, releaseHandler); 172 | assert.equal(keyboard._listeners[1].preventRepeatByDefault, true); 173 | }); 174 | }); 175 | 176 | 177 | describe('#addListener', () => { 178 | 179 | it('is an alias for bind', () => { 180 | sinon.stub(keyboard, 'bind'); 181 | const fn = () => {}; 182 | keyboard.addListener('a', fn); 183 | sinon.assert.calledOnce(keyboard.bind); 184 | sinon.assert.calledWith(keyboard.bind, 'a', fn); 185 | keyboard.bind.restore(); 186 | }); 187 | }); 188 | 189 | 190 | describe('#on', () => { 191 | 192 | it('is an alias for bind', () => { 193 | sinon.stub(keyboard, 'bind'); 194 | const fn = () => {}; 195 | keyboard.on('a', fn); 196 | sinon.assert.calledOnce(keyboard.bind); 197 | sinon.assert.calledWith(keyboard.bind, 'a', fn); 198 | keyboard.bind.restore(); 199 | }); 200 | }); 201 | 202 | 203 | describe('#unbind', () => { 204 | 205 | const pressHandler = () => {}; 206 | const releaseHandler = () => {}; 207 | beforeEach(() => { 208 | keyboard._listeners.push({ 209 | keyCombo: new KeyCombo('a'), 210 | pressHandler: pressHandler, 211 | releaseHandler: releaseHandler, 212 | preventRepeat: false 213 | }); 214 | keyboard._listeners.push({ 215 | keyCombo: new KeyCombo('a'), 216 | pressHandler: null, 217 | releaseHandler: releaseHandler, 218 | preventRepeat: false 219 | }); 220 | keyboard._listeners.push({ 221 | keyCombo: new KeyCombo('a'), 222 | pressHandler: pressHandler, 223 | releaseHandler: null, 224 | preventRepeat: false 225 | }); 226 | }); 227 | 228 | afterEach(() => { 229 | keyboard._listeners.length = 0; 230 | }); 231 | 232 | it('unbinds a combo from press handler and release handlers', () => { 233 | keyboard.unbind('a', pressHandler, releaseHandler); 234 | 235 | assert.equal(keyboard._listeners.length, 2); 236 | assert.equal(keyboard._listeners[0].pressHandler, null); 237 | assert.equal(keyboard._listeners[0].releaseHandler, releaseHandler); 238 | assert.equal(keyboard._listeners[1].pressHandler, pressHandler); 239 | assert.equal(keyboard._listeners[1].releaseHandler, null); 240 | }); 241 | 242 | it('unbinds a combo from a press handler', () => { 243 | keyboard.unbind('a', pressHandler); 244 | 245 | assert.equal(keyboard._listeners.length, 2); 246 | assert.equal(keyboard._listeners[0].pressHandler, pressHandler); 247 | assert.equal(keyboard._listeners[0].releaseHandler, releaseHandler); 248 | assert.equal(keyboard._listeners[1].pressHandler, null); 249 | assert.equal(keyboard._listeners[1].releaseHandler, releaseHandler); 250 | }); 251 | 252 | it('unbinds a combo from a release handler', () => { 253 | keyboard.unbind('a', null, releaseHandler); 254 | 255 | assert.equal(keyboard._listeners.length, 2); 256 | assert.equal(keyboard._listeners[0].pressHandler, pressHandler); 257 | assert.equal(keyboard._listeners[0].releaseHandler, releaseHandler); 258 | assert.equal(keyboard._listeners[1].pressHandler, pressHandler); 259 | assert.equal(keyboard._listeners[1].releaseHandler, null); 260 | }); 261 | 262 | it('unbinds a several combos from press and release handlers', () => { 263 | keyboard._listeners.push({ 264 | keyCombo: new KeyCombo('b'), 265 | pressHandler: pressHandler, 266 | releaseHandler: releaseHandler, 267 | preventRepeat: false 268 | }); 269 | 270 | keyboard.unbind(['a', 'b'], pressHandler, releaseHandler); 271 | 272 | assert.equal(keyboard._listeners.length, 2); 273 | assert.equal(keyboard._listeners[0].pressHandler, null); 274 | assert.equal(keyboard._listeners[0].releaseHandler, releaseHandler); 275 | assert.equal(keyboard._listeners[1].pressHandler, pressHandler); 276 | assert.equal(keyboard._listeners[1].releaseHandler, null); 277 | }); 278 | 279 | it('unbinds press and release handlers bound to any key press', () => { 280 | keyboard._listeners.push({ 281 | keyCombo: null, 282 | pressHandler: pressHandler, 283 | releaseHandler: releaseHandler, 284 | preventRepeat: false 285 | }); 286 | 287 | 288 | keyboard.unbind(pressHandler, releaseHandler); 289 | 290 | assert.equal(keyboard._listeners.length, 3); 291 | assert.equal(keyboard._listeners[0].pressHandler, pressHandler); 292 | assert.equal(keyboard._listeners[0].releaseHandler, releaseHandler); 293 | assert.equal(keyboard._listeners[1].pressHandler, null); 294 | assert.equal(keyboard._listeners[1].releaseHandler, releaseHandler); 295 | assert.equal(keyboard._listeners[2].pressHandler, pressHandler); 296 | assert.equal(keyboard._listeners[2].releaseHandler, null); 297 | }); 298 | }); 299 | 300 | 301 | describe('#removeListener', () => { 302 | 303 | it('is an alias for unbind', () => { 304 | sinon.stub(keyboard, 'unbind'); 305 | const fn = () => {}; 306 | keyboard.removeListener('a', fn); 307 | sinon.assert.calledOnce(keyboard.unbind); 308 | sinon.assert.calledWith(keyboard.unbind, 'a', fn); 309 | keyboard.unbind.restore(); 310 | }); 311 | }); 312 | 313 | 314 | describe('#off', () => { 315 | 316 | it('is an alias for unbind', () => { 317 | sinon.stub(keyboard, 'unbind'); 318 | const fn = () => {}; 319 | keyboard.off('a', fn); 320 | sinon.assert.calledOnce(keyboard.unbind); 321 | sinon.assert.calledWith(keyboard.unbind, 'a', fn); 322 | keyboard.unbind.restore(); 323 | }); 324 | }); 325 | 326 | 327 | describe('#setContext', () => { 328 | 329 | it('releases all keys before setting the context', () => { 330 | keyboard._locale = {}; 331 | sinon.stub(keyboard, 'releaseAllKeys'); 332 | 333 | keyboard.setContext('myContext'); 334 | 335 | assert.ok(keyboard.releaseAllKeys.calledOnce); 336 | 337 | keyboard.releaseAllKeys.restore(); 338 | }); 339 | 340 | it('creates a new context with the given name if it doesn\'t exist.', () => { 341 | keyboard.setContext('myContext'); 342 | 343 | assert.ok(keyboard._contexts.myContext); 344 | assert.equal(keyboard._currentContext, 'myContext'); 345 | }); 346 | 347 | it('applies an existing context if one with the given name already exists', () => { 348 | keyboard._contexts.myContext = { 349 | listeners: [1], 350 | targetWindow: keyboard._targetWindow, 351 | targetElement: keyboard._targetElement, 352 | targetPlatform: keyboard._targetPlatform, 353 | targetUserAgent: keyboard._targetUserAgent 354 | }; 355 | 356 | keyboard.setContext('myContext'); 357 | 358 | assert.equal(keyboard._currentContext, 'myContext'); 359 | assert.equal(keyboard._contexts[keyboard._currentContext].listeners[0], 1); 360 | }); 361 | 362 | it('watches the targets set in the context', () => { 363 | const targetWindow = { 364 | addEventListener: sinon.stub(), 365 | removeEventListener: sinon.stub() 366 | }; 367 | const targetElement = { 368 | addEventListener: sinon.stub(), 369 | removeEventListener: sinon.stub() 370 | }; 371 | 372 | keyboard._contexts.myContext = { 373 | listeners: [1], 374 | targetWindow, 375 | targetElement, 376 | targetPlatform: 'test-platform', 377 | targetUserAgent: 'test-user-agent' 378 | }; 379 | 380 | keyboard.setContext('myContext'); 381 | 382 | assert.equal(keyboard._targetWindow, targetWindow); 383 | assert.equal(keyboard._targetElement, targetElement); 384 | assert.equal(keyboard._targetPlatform, 'test-platform'); 385 | assert.equal(keyboard._targetUserAgent, 'test-user-agent'); 386 | 387 | sinon.assert.calledTwice(targetWindow.addEventListener); 388 | sinon.assert.calledTwice(targetElement.addEventListener); 389 | }); 390 | }); 391 | 392 | 393 | describe('#getContext', () => { 394 | 395 | it('returns the current context', () => { 396 | keyboard._currentContext = 'myContext'; 397 | 398 | assert.equal(keyboard.getContext(), 'myContext'); 399 | }); 400 | }); 401 | 402 | 403 | describe('#watch', () => { 404 | 405 | it('calls stop', () => { 406 | sinon.stub(keyboard, 'stop'); 407 | 408 | keyboard.watch(win, doc); 409 | 410 | assert.ok(keyboard.stop.calledOnce); 411 | keyboard.stop.restore(); 412 | }); 413 | 414 | it('attaches to a given window and document', () => { 415 | const win = { addEventListener: sinon.stub() }; 416 | const doc = { addEventListener: sinon.stub() }; 417 | 418 | keyboard.watch(win, doc); 419 | 420 | assert.equal(keyboard._isModernBrowser, true); 421 | assert.equal(keyboard._targetWindow, win); 422 | assert.equal(keyboard._targetElement, doc); 423 | assert.ok(win.addEventListener.firstCall.args[0], 'focus'); 424 | assert.ok(win.addEventListener.secondCall.args[0], 'blur'); 425 | assert.ok(doc.addEventListener.firstCall.args[0], 'keydown'); 426 | assert.ok(doc.addEventListener.secondCall.args[0], 'keyup'); 427 | }); 428 | 429 | it('attaches to a given window and document (Legacy IE)', () => { 430 | const win = { attachEvent: sinon.stub() }; 431 | const doc = { attachEvent: sinon.stub() }; 432 | 433 | keyboard.watch(win, doc); 434 | 435 | assert.equal(keyboard._isModernBrowser, false); 436 | assert.equal(keyboard._targetWindow, win); 437 | assert.equal(keyboard._targetElement, doc); 438 | assert.ok(win.attachEvent.firstCall.args[0], 'onfocus'); 439 | assert.ok(win.attachEvent.secondCall.args[0], 'onblur'); 440 | assert.ok(doc.attachEvent.firstCall.args[0], 'onkeydown'); 441 | assert.ok(doc.attachEvent.secondCall.args[0], 'onkeyup'); 442 | }); 443 | 444 | it('attaches to the global namespace if a window and document is not given', () => { 445 | global.addEventListener = sinon.stub(); 446 | global.document = { addEventListener: sinon.stub() }; 447 | 448 | keyboard.watch(); 449 | 450 | assert.equal(keyboard._isModernBrowser, true); 451 | assert.equal(keyboard._targetWindow, global); 452 | assert.equal(keyboard._targetElement, global.document); 453 | assert.ok(global.addEventListener.firstCall.args[0], 'focus'); 454 | assert.ok(global.addEventListener.secondCall.args[0], 'blur'); 455 | assert.ok(global.document.addEventListener.firstCall.args[0], 'keydown'); 456 | assert.ok(global.document.addEventListener.secondCall.args[0], 'keyup'); 457 | 458 | delete global.addEventListener; 459 | delete global.document; 460 | }); 461 | 462 | it('throws is error if the target window does not have the necessary methods', () => { 463 | const win = {}; 464 | const doc = {}; 465 | 466 | assert.throws(() => { 467 | keyboard.watch(win, doc); 468 | }, /^(?=.*targetWindow)(?=.*addEventListener)(?=.*attachEvent).*$/); 469 | }); 470 | 471 | it('throws is error a target window was not given and if the global does contain the necessary functions', () => { 472 | assert.throws(() => { 473 | keyboard.setContext('custom') 474 | keyboard.watch(); 475 | }, /^(?=.*window)(?=.*addEventListener)(?=.*attachEvent).*$/); 476 | }); 477 | 478 | it('does not throw if watching the global object using the global namespace', () => { 479 | keyboard.watch(); 480 | }); 481 | }); 482 | 483 | 484 | describe('#stop', () => { 485 | 486 | it('dettaches from the currently attached window and document', () => { 487 | const doc = keyboard._targetElement = { removeEventListener: sinon.stub() }; 488 | const win = keyboard._targetWindow = { removeEventListener: sinon.stub() }; 489 | 490 | keyboard.stop(); 491 | 492 | assert.equal(keyboard._targetWindow, null); 493 | assert.equal(keyboard._targetElement, null); 494 | assert.ok(win.removeEventListener.firstCall.args[0], 'focus'); 495 | assert.ok(win.removeEventListener.secondCall.args[0], 'blur'); 496 | assert.ok(doc.removeEventListener.firstCall.args[0], 'keydown'); 497 | assert.ok(doc.removeEventListener.secondCall.args[0], 'keyup'); 498 | }); 499 | 500 | it('dettaches from the currently attached window and document (Legacy IE)', () => { 501 | const doc = { detachEvent: sinon.stub() }; 502 | const win = { detachEvent: sinon.stub() }; 503 | 504 | keyboard._isModernBrowser = false; 505 | keyboard._targetElement = doc; 506 | keyboard._targetWindow = win; 507 | 508 | keyboard.stop(); 509 | 510 | assert.equal(keyboard._targetWindow, null); 511 | assert.equal(keyboard._targetElement, null); 512 | assert.ok(win.detachEvent.firstCall.args[0], 'onfocus'); 513 | assert.ok(win.detachEvent.secondCall.args[0], 'onblur'); 514 | assert.ok(doc.detachEvent.firstCall.args[0], 'onkeydown'); 515 | assert.ok(doc.detachEvent.secondCall.args[0], 'onkeyup'); 516 | }); 517 | }); 518 | 519 | 520 | describe('#pressKey', () => { 521 | 522 | let locale; 523 | beforeEach(() => { 524 | locale = new Locale('test'); 525 | locale.bindKeyCode(0, 'a'); 526 | locale.bindKeyCode(1, 'b'); 527 | keyboard._locale = locale; 528 | }); 529 | 530 | it('calls pressKey on the locale', () => { 531 | sinon.stub(locale, 'pressKey'); 532 | 533 | keyboard.pressKey('a'); 534 | 535 | assert.equal(locale.pressKey.lastCall.args[0], 'a'); 536 | 537 | locale.pressKey.restore(); 538 | }); 539 | 540 | it('executes bindings with a combo matching the pressed keys within the locale', () => { 541 | const pressHandler = sinon.stub(); 542 | keyboard._listeners.push({ 543 | keyCombo: new KeyCombo('a'), 544 | pressHandler: pressHandler, 545 | releaseHandler: null, 546 | preventRepeat: false 547 | }); 548 | 549 | keyboard.pressKey('a'); 550 | 551 | assert.ok(pressHandler.calledOnce); 552 | }); 553 | 554 | it('executes bindings without a combo', () => { 555 | const pressHandler = sinon.stub(); 556 | keyboard._listeners.push({ 557 | keyCombo: null, 558 | pressHandler: pressHandler, 559 | releaseHandler: null, 560 | preventRepeat: false 561 | }); 562 | 563 | keyboard.pressKey('a'); 564 | keyboard.pressKey('b'); 565 | 566 | assert.ok(pressHandler.calledTwice); 567 | }); 568 | 569 | it('prevents combo overlap by marking off keys once they have been used by a combo', () => { 570 | const aPressHandler = sinon.stub(); 571 | const aBPressHandler = sinon.stub(); 572 | keyboard._listeners.push({ 573 | keyCombo: new KeyCombo('a'), 574 | pressHandler: aPressHandler, 575 | releaseHandler: null, 576 | preventRepeat: false 577 | }); 578 | keyboard._listeners.push({ 579 | keyCombo: new KeyCombo('a + b'), 580 | pressHandler: aBPressHandler, 581 | releaseHandler: null, 582 | preventRepeat: false 583 | }); 584 | 585 | keyboard.pressKey('a'); // combo a fires 586 | keyboard.pressKey('b'); // combo a + b fires, but not combo a because the 587 | // a key has been consumed by combo a + b 588 | 589 | assert.ok(aPressHandler.calledOnce); 590 | assert.ok(aBPressHandler.calledOnce); 591 | }); 592 | 593 | it('allows any number of identical bindings to fire without inhibiting each other', () => { 594 | const a1PressHandler = sinon.stub(); 595 | const a2PressHandler = sinon.stub(); 596 | keyboard._listeners.push({ 597 | keyCombo: new KeyCombo('a'), 598 | pressHandler: a1PressHandler, 599 | releaseHandler: null, 600 | preventRepeat: false 601 | }); 602 | keyboard._listeners.push({ 603 | keyCombo: new KeyCombo('a'), 604 | pressHandler: a2PressHandler, 605 | releaseHandler: null, 606 | preventRepeat: false 607 | }); 608 | 609 | keyboard.pressKey('a'); // combo a1 and a2 fires 610 | 611 | assert.ok(a1PressHandler.calledOnce); 612 | assert.ok(a2PressHandler.calledOnce); 613 | }); 614 | 615 | it('does nothing when paused', () => { 616 | sinon.stub(locale, 'pressKey'); 617 | keyboard._paused = true; 618 | 619 | keyboard.pressKey('a'); 620 | 621 | assert.equal(locale.pressKey.called, false); 622 | assert.equal(locale.pressedKeys.length, 0); 623 | 624 | locale.pressKey.restore(); 625 | }); 626 | 627 | it('will trigger bindings each time press key is executed', () => { 628 | const pressHandler = sinon.stub(); 629 | keyboard._listeners.push({ 630 | keyCombo: new KeyCombo('a'), 631 | pressHandler: pressHandler, 632 | releaseHandler: null, 633 | preventRepeat: false 634 | }); 635 | 636 | keyboard.pressKey('a'); 637 | keyboard.pressKey('a'); 638 | 639 | sinon.assert.calledTwice(pressHandler); 640 | }); 641 | 642 | it('will only trigger bindings that use preventRepeat once', () => { 643 | const pressHandler = sinon.spy((e) => { e.preventRepeat() }); 644 | keyboard._listeners.push({ 645 | keyCombo: new KeyCombo('a'), 646 | pressHandler: pressHandler, 647 | releaseHandler: null, 648 | preventRepeat: false 649 | }); 650 | 651 | keyboard.pressKey('a'); 652 | keyboard.pressKey('a'); 653 | 654 | sinon.assert.calledOnce(pressHandler); 655 | }); 656 | 657 | it('will trigger bindings that use preventRepeat again once the binding\'s combo is released', () => { 658 | const pressHandler = sinon.spy((e) => { e.preventRepeat() }); 659 | keyboard._listeners.push({ 660 | keyCombo: new KeyCombo('a'), 661 | pressHandler: pressHandler, 662 | releaseHandler: null, 663 | preventRepeat: false 664 | }); 665 | 666 | keyboard.pressKey('a'); 667 | keyboard.pressKey('a'); 668 | 669 | keyboard.releaseKey('a'); 670 | 671 | keyboard.pressKey('a'); 672 | keyboard.pressKey('a'); 673 | 674 | sinon.assert.calledTwice(pressHandler); 675 | }); 676 | 677 | it('will not trigger bindings that caused it to be executed in the same tick', () => { 678 | const pressHandler = sinon.spy(() => { keyboard.pressKey('a') }); 679 | keyboard._listeners.push({ 680 | keyCombo: new KeyCombo('a'), 681 | pressHandler: pressHandler, 682 | releaseHandler: null, 683 | preventRepeat: false 684 | }); 685 | 686 | keyboard.pressKey('a'); 687 | keyboard.releaseKey('a'); 688 | 689 | sinon.assert.calledOnce(pressHandler); 690 | }); 691 | 692 | it('will not trigger bindings when an unbound key is pressed', () => { 693 | const pressHandler = sinon.stub(); 694 | keyboard._listeners.push({ 695 | keyCombo: new KeyCombo('a'), 696 | pressHandler: pressHandler, 697 | releaseHandler: null, 698 | preventRepeat: false 699 | }); 700 | 701 | keyboard.pressKey('a'); 702 | keyboard.pressKey('b'); 703 | 704 | sinon.assert.calledOnce(pressHandler); 705 | }); 706 | }); 707 | 708 | 709 | describe('#releaseKey', () => { 710 | 711 | let locale; 712 | beforeEach(() => { 713 | locale = new Locale('test'); 714 | locale.bindKeyCode(0, 'a'); 715 | locale.bindKeyCode(1, 'b'); 716 | keyboard._locale = locale; 717 | }); 718 | 719 | it('calls releaseKey on the locale', () => { 720 | sinon.stub(locale, 'releaseKey'); 721 | 722 | keyboard.releaseKey('a'); 723 | 724 | assert.equal(locale.releaseKey.lastCall.args[0], 'a'); 725 | 726 | locale.releaseKey.restore(); 727 | }); 728 | 729 | it('will not execute a binding\'s releaseHandler unless it was triggered first by a press', () => { 730 | const releaseHandler = sinon.stub(); 731 | keyboard.pressKey('a'); 732 | keyboard._listeners.push({ 733 | keyCombo: new KeyCombo('a'), 734 | pressHandler: null, 735 | releaseHandler: releaseHandler, 736 | preventRepeat: false 737 | }); 738 | 739 | keyboard.releaseKey('a'); 740 | 741 | assert.equal(releaseHandler.calledOnce, false); 742 | }); 743 | 744 | it('executes the releaseHandler of active bindings that no longer match the pressed keys', () => { 745 | const releaseHandler = sinon.stub(); 746 | keyboard._listeners.push({ 747 | keyCombo: new KeyCombo('a'), 748 | pressHandler: null, 749 | releaseHandler: releaseHandler, 750 | preventRepeat: false 751 | }); 752 | keyboard.pressKey('a'); 753 | 754 | keyboard.releaseKey('a'); 755 | 756 | assert.ok(releaseHandler.calledOnce); 757 | }); 758 | 759 | it('executes the releaseHandler without a combo', () => { 760 | const releaseHandler = sinon.stub(); 761 | keyboard._listeners.push({ 762 | keyCombo: null, 763 | pressHandler: null, 764 | releaseHandler: releaseHandler, 765 | preventRepeat: false 766 | }); 767 | keyboard.pressKey('a'); 768 | keyboard.pressKey('b'); 769 | 770 | keyboard.releaseKey('a'); 771 | keyboard.releaseKey('b'); 772 | 773 | assert.ok(releaseHandler.calledTwice); 774 | }); 775 | }); 776 | 777 | 778 | describe('#releaseAllKeys', () => { 779 | 780 | let locale; 781 | beforeEach(() => { 782 | locale = new Locale('test'); 783 | locale.bindKeyCode(0, 'a'); 784 | keyboard._locale = locale; 785 | }); 786 | 787 | it('clears pressedKeys on the locale', () => { 788 | keyboard.releaseAllKeys(); 789 | 790 | assert.equal(locale.pressedKeys.length, 0); 791 | }); 792 | 793 | it('will not execute a binding\'s releaseHandler unless it was triggered first by a press', () => { 794 | const releaseHandler = sinon.stub(); 795 | keyboard.pressKey('a'); 796 | keyboard._listeners.push({ 797 | keyCombo: new KeyCombo('a'), 798 | pressHandler: null, 799 | releaseHandler: releaseHandler, 800 | preventRepeat: false 801 | }); 802 | 803 | keyboard.releaseAllKeys(); 804 | 805 | assert.equal(releaseHandler.calledOnce, false); 806 | }); 807 | 808 | it('executes the releaseHandler of active bindings that no longer match the pressed keys', () => { 809 | const releaseHandler = sinon.stub(); 810 | keyboard._listeners.push({ 811 | keyCombo: new KeyCombo('a'), 812 | pressHandler: null, 813 | releaseHandler: releaseHandler, 814 | preventRepeat: false 815 | }); 816 | keyboard.pressKey('a'); 817 | 818 | keyboard.releaseAllKeys(); 819 | 820 | assert.ok(releaseHandler.calledOnce); 821 | }); 822 | }); 823 | 824 | 825 | describe('#pause', () => { 826 | 827 | it('pauses the instance', () => { 828 | keyboard.pause(); 829 | 830 | assert.ok(keyboard._paused); 831 | }); 832 | }); 833 | 834 | 835 | describe('#resume', () => { 836 | 837 | it('resumes the instance', () => { 838 | keyboard.resume(); 839 | 840 | assert.equal(keyboard._paused, false); 841 | }); 842 | }); 843 | 844 | 845 | describe('#reset', () => { 846 | 847 | it('calls releaseAllKeys', () => { 848 | sinon.stub(keyboard, 'releaseAllKeys'); 849 | 850 | keyboard.reset(); 851 | 852 | assert.ok(keyboard.releaseAllKeys.calledOnce); 853 | 854 | keyboard.releaseAllKeys.reset(); 855 | }); 856 | 857 | it('clears all listeners', () => { 858 | sinon.stub(keyboard, 'releaseAllKeys'); 859 | keyboard._listeners = [1]; 860 | 861 | keyboard.reset(); 862 | 863 | assert.equal(keyboard._listeners.length, 0); 864 | 865 | keyboard.releaseAllKeys.reset(); 866 | }); 867 | }); 868 | }); 869 | -------------------------------------------------------------------------------- /test/locale.spec.js: -------------------------------------------------------------------------------- 1 | import assert from 'assert'; 2 | import { Locale } from '../lib/locale'; 3 | import { KeyCombo } from '../lib/key-combo'; 4 | 5 | 6 | describe('Locale', () => { 7 | 8 | let locale; 9 | beforeEach(() => { 10 | locale = new Locale('test'); 11 | }); 12 | 13 | 14 | describe('#bindKeyCode', () => { 15 | 16 | it('binds a key code to a key name', () => { 17 | locale.bindKeyCode(0, 'a'); 18 | 19 | assert.equal(locale._keyMap[0][0], 'a'); 20 | }); 21 | 22 | it('binds a key code to a set of key names', () => { 23 | locale.bindKeyCode(0, ['a', 'b', 'c']); 24 | 25 | assert.equal(locale._keyMap[0][0], 'a'); 26 | assert.equal(locale._keyMap[0][1], 'b'); 27 | assert.equal(locale._keyMap[0][2], 'c'); 28 | }); 29 | }); 30 | 31 | 32 | describe('#bindMacro', () => { 33 | 34 | it('binds a key combo to a key name', () => { 35 | locale.bindMacro('a', 'b'); 36 | 37 | assert.equal(locale._macros[0].keyCombo.sourceStr, 'a'); 38 | assert.equal(locale._macros[0].keyNames[0], 'b'); 39 | }); 40 | 41 | it('binds a key combo to a set of key names', () => { 42 | locale.bindMacro('a', ['b', 'c', 'd']); 43 | 44 | assert.equal(locale._macros[0].keyCombo.sourceStr, 'a'); 45 | assert.equal(locale._macros[0].keyNames[0], 'b'); 46 | assert.equal(locale._macros[0].keyNames[1], 'c'); 47 | assert.equal(locale._macros[0].keyNames[2], 'd'); 48 | }); 49 | 50 | it('binds a key combo to a macro handler', () => { 51 | const macroHandler = () => {}; 52 | locale.bindMacro('a', macroHandler); 53 | 54 | assert.equal(locale._macros[0].keyCombo.sourceStr, 'a'); 55 | assert.equal(locale._macros[0].handler, macroHandler); 56 | }); 57 | }); 58 | 59 | 60 | describe('#getKeyCodes', () => { 61 | 62 | it('gets all key codes associated with a key name', () => { 63 | locale._keyMap[0] = ['a']; 64 | locale._keyMap[1] = ['b']; 65 | locale._keyMap[2] = ['a']; 66 | 67 | const keyCodes = locale.getKeyCodes('a'); 68 | 69 | assert.equal(keyCodes[0], 0); 70 | assert.equal(keyCodes[1], 2); 71 | }); 72 | }); 73 | 74 | 75 | describe('#getKeyNames', () => { 76 | 77 | it('gets all key names associated with a key code', () => { 78 | locale._keyMap[0] = ['a', 'b']; 79 | 80 | const keyNames = locale.getKeyNames(0); 81 | 82 | assert.equal(keyNames[0], 'a'); 83 | assert.equal(keyNames[1], 'b'); 84 | }); 85 | }); 86 | 87 | 88 | describe('#setKillKey', () => { 89 | 90 | it('marks a key code as a kill key', () => { 91 | locale.setKillKey(0); 92 | 93 | assert.equal(locale._killKeyCodes[0], 0); 94 | }); 95 | 96 | it('marks all key codes matching a key name as a kill key', () => { 97 | locale._keyMap[0] = ['a']; 98 | locale._keyMap[1] = ['a']; 99 | 100 | locale.setKillKey('a'); 101 | 102 | assert.equal(locale._killKeyCodes[0], 0); 103 | assert.equal(locale._killKeyCodes[1], 1); 104 | }); 105 | }); 106 | 107 | 108 | describe('#pressKey', () => { 109 | 110 | beforeEach(() => { 111 | locale._keyMap = { 112 | 0: ['a', 'b'], 113 | 1: ['a', 'c'], 114 | }; 115 | }); 116 | 117 | it('adds all key names associated with a given key code to pressedKeys', () => { 118 | locale.pressKey(0); 119 | 120 | assert.equal(locale.pressedKeys[0], 'a'); 121 | assert.equal(locale.pressedKeys[1], 'b'); 122 | }); 123 | 124 | it('adds all other key names associated with the same key code of a given key name to pressedKeys', () => { 125 | locale.pressKey('a'); 126 | 127 | assert.equal(locale.pressedKeys[0], 'a'); 128 | assert.equal(locale.pressedKeys[1], 'b'); 129 | assert.equal(locale.pressedKeys[2], 'c'); 130 | }); 131 | 132 | it('applies macros with combos that match the pressed keys', () => { 133 | locale._keyMap = { 134 | 0: ['a'], 135 | 1: ['b'] 136 | }; 137 | locale._macros = [ 138 | { 139 | keyCombo : new KeyCombo('a + b'), 140 | keyNames : ['c', 'd'], 141 | handler : null 142 | }, { 143 | keyCombo : new KeyCombo('a + b'), 144 | handler : function(pressedKeys) { 145 | 146 | assert.equal(pressedKeys, locale.pressedKeys); 147 | 148 | return ['e', 'f']; 149 | }, 150 | keyNames : null 151 | } 152 | ]; 153 | 154 | locale.pressKey('a'); 155 | locale.pressKey('b'); 156 | 157 | assert.equal(locale.pressedKeys[0], 'a'); 158 | assert.equal(locale.pressedKeys[1], 'b'); 159 | assert.equal(locale.pressedKeys[2], 'c'); 160 | assert.equal(locale.pressedKeys[3], 'd'); 161 | assert.equal(locale.pressedKeys[4], 'e'); 162 | assert.equal(locale.pressedKeys[5], 'f'); 163 | assert.equal(locale._appliedMacros[0], locale._macros[0]); 164 | assert.equal(locale._appliedMacros[1], locale._macros[1]); 165 | assert.equal(locale._appliedMacros[1].keyNames[0], 'e'); 166 | assert.equal(locale._appliedMacros[1].keyNames[1], 'f'); 167 | }); 168 | }); 169 | 170 | 171 | describe('#releaseKey', () => { 172 | 173 | beforeEach(() => { 174 | locale._keyMap = { 175 | 0: ['a', 'b'], 176 | 1: ['a', 'c'], 177 | }; 178 | locale.pressedKeys = ['a', 'b', 'c']; 179 | }); 180 | 181 | it('removes all key names associated with a given key code from pressedKeys', () => { 182 | locale.releaseKey(0); 183 | 184 | assert.equal(locale.pressedKeys[0], 'c'); 185 | }); 186 | 187 | it('removes all other key names associated with the same key code of a given key name from pressedKeys', () => { 188 | locale.releaseKey('a'); 189 | 190 | assert.equal(locale.pressedKeys.length, 0); 191 | }); 192 | 193 | it('clears applied macros with combos that no longer match the pressed keys', () => { 194 | locale._keyMap = { 195 | 0: ['a'], 196 | 1: ['b'], 197 | }; 198 | locale._macros = [ 199 | { 200 | keyCombo : new KeyCombo('a + b'), 201 | keyNames : ['c', 'd'], 202 | handler : null 203 | }, { 204 | keyCombo : new KeyCombo('a + b'), 205 | keyNames : ['e', 'f'], 206 | handler : function(pressedKeys) { 207 | 208 | assert.equal(pressedKeys, locale.pressedKeys); 209 | 210 | return ['e', 'f']; 211 | } 212 | } 213 | ]; 214 | locale.pressedKeys = ['a', 'b', 'c', 'd', 'e', 'f']; 215 | locale._appliedMacros = locale._macros.slice(0); 216 | 217 | locale.releaseKey('a'); 218 | 219 | assert.equal(locale.pressedKeys[0], 'b'); 220 | assert.equal(locale.pressedKeys.length, 1); 221 | assert.equal(locale._appliedMacros.length, 0); 222 | }); 223 | }); 224 | }); 225 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/code-frame@^7.10.4": 6 | version "7.10.4" 7 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" 8 | integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== 9 | dependencies: 10 | "@babel/highlight" "^7.10.4" 11 | 12 | "@babel/code-frame@^7.8.3": 13 | version "7.10.1" 14 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.1.tgz#d5481c5095daa1c57e16e54c6f9198443afb49ff" 15 | integrity sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw== 16 | dependencies: 17 | "@babel/highlight" "^7.10.1" 18 | 19 | "@babel/compat-data@^7.10.4", "@babel/compat-data@^7.11.0": 20 | version "7.11.0" 21 | resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.11.0.tgz#e9f73efe09af1355b723a7f39b11bad637d7c99c" 22 | integrity sha512-TPSvJfv73ng0pfnEOh17bYMPQbI95+nGWc71Ss4vZdRBHTDqmM9Z8ZV4rYz8Ks7sfzc95n30k6ODIq5UGnXcYQ== 23 | dependencies: 24 | browserslist "^4.12.0" 25 | invariant "^2.2.4" 26 | semver "^5.5.0" 27 | 28 | "@babel/core@^7.10.2": 29 | version "7.11.4" 30 | resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.11.4.tgz#4301dfdfafa01eeb97f1896c5501a3f0655d4229" 31 | integrity sha512-5deljj5HlqRXN+5oJTY7Zs37iH3z3b++KjiKtIsJy1NrjOOVSEaJHEetLBhyu0aQOSNNZ/0IuEAan9GzRuDXHg== 32 | dependencies: 33 | "@babel/code-frame" "^7.10.4" 34 | "@babel/generator" "^7.11.4" 35 | "@babel/helper-module-transforms" "^7.11.0" 36 | "@babel/helpers" "^7.10.4" 37 | "@babel/parser" "^7.11.4" 38 | "@babel/template" "^7.10.4" 39 | "@babel/traverse" "^7.11.0" 40 | "@babel/types" "^7.11.0" 41 | convert-source-map "^1.7.0" 42 | debug "^4.1.0" 43 | gensync "^1.0.0-beta.1" 44 | json5 "^2.1.2" 45 | lodash "^4.17.19" 46 | resolve "^1.3.2" 47 | semver "^5.4.1" 48 | source-map "^0.5.0" 49 | 50 | "@babel/generator@^7.11.0", "@babel/generator@^7.11.4": 51 | version "7.11.4" 52 | resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.11.4.tgz#1ec7eec00defba5d6f83e50e3ee72ae2fee482be" 53 | integrity sha512-Rn26vueFx0eOoz7iifCN2UHT6rGtnkSGWSoDRIy8jZN3B91PzeSULbswfLoOWuTuAcNwpG/mxy+uCTDnZ9Mp1g== 54 | dependencies: 55 | "@babel/types" "^7.11.0" 56 | jsesc "^2.5.1" 57 | source-map "^0.5.0" 58 | 59 | "@babel/helper-annotate-as-pure@^7.10.4": 60 | version "7.10.4" 61 | resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz#5bf0d495a3f757ac3bda48b5bf3b3ba309c72ba3" 62 | integrity sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA== 63 | dependencies: 64 | "@babel/types" "^7.10.4" 65 | 66 | "@babel/helper-builder-binary-assignment-operator-visitor@^7.10.4": 67 | version "7.10.4" 68 | resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz#bb0b75f31bf98cbf9ff143c1ae578b87274ae1a3" 69 | integrity sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg== 70 | dependencies: 71 | "@babel/helper-explode-assignable-expression" "^7.10.4" 72 | "@babel/types" "^7.10.4" 73 | 74 | "@babel/helper-compilation-targets@^7.10.4": 75 | version "7.10.4" 76 | resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz#804ae8e3f04376607cc791b9d47d540276332bd2" 77 | integrity sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ== 78 | dependencies: 79 | "@babel/compat-data" "^7.10.4" 80 | browserslist "^4.12.0" 81 | invariant "^2.2.4" 82 | levenary "^1.1.1" 83 | semver "^5.5.0" 84 | 85 | "@babel/helper-create-class-features-plugin@^7.10.4": 86 | version "7.10.5" 87 | resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz#9f61446ba80e8240b0a5c85c6fdac8459d6f259d" 88 | integrity sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A== 89 | dependencies: 90 | "@babel/helper-function-name" "^7.10.4" 91 | "@babel/helper-member-expression-to-functions" "^7.10.5" 92 | "@babel/helper-optimise-call-expression" "^7.10.4" 93 | "@babel/helper-plugin-utils" "^7.10.4" 94 | "@babel/helper-replace-supers" "^7.10.4" 95 | "@babel/helper-split-export-declaration" "^7.10.4" 96 | 97 | "@babel/helper-create-regexp-features-plugin@^7.10.4": 98 | version "7.10.4" 99 | resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz#fdd60d88524659a0b6959c0579925e425714f3b8" 100 | integrity sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g== 101 | dependencies: 102 | "@babel/helper-annotate-as-pure" "^7.10.4" 103 | "@babel/helper-regex" "^7.10.4" 104 | regexpu-core "^4.7.0" 105 | 106 | "@babel/helper-define-map@^7.10.4": 107 | version "7.10.5" 108 | resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz#b53c10db78a640800152692b13393147acb9bb30" 109 | integrity sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ== 110 | dependencies: 111 | "@babel/helper-function-name" "^7.10.4" 112 | "@babel/types" "^7.10.5" 113 | lodash "^4.17.19" 114 | 115 | "@babel/helper-explode-assignable-expression@^7.10.4": 116 | version "7.11.4" 117 | resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.11.4.tgz#2d8e3470252cc17aba917ede7803d4a7a276a41b" 118 | integrity sha512-ux9hm3zR4WV1Y3xXxXkdG/0gxF9nvI0YVmKVhvK9AfMoaQkemL3sJpXw+Xbz65azo8qJiEz2XVDUpK3KYhH3ZQ== 119 | dependencies: 120 | "@babel/types" "^7.10.4" 121 | 122 | "@babel/helper-function-name@^7.10.4": 123 | version "7.10.4" 124 | resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz#d2d3b20c59ad8c47112fa7d2a94bc09d5ef82f1a" 125 | integrity sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ== 126 | dependencies: 127 | "@babel/helper-get-function-arity" "^7.10.4" 128 | "@babel/template" "^7.10.4" 129 | "@babel/types" "^7.10.4" 130 | 131 | "@babel/helper-get-function-arity@^7.10.4": 132 | version "7.10.4" 133 | resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2" 134 | integrity sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A== 135 | dependencies: 136 | "@babel/types" "^7.10.4" 137 | 138 | "@babel/helper-hoist-variables@^7.10.4": 139 | version "7.10.4" 140 | resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz#d49b001d1d5a68ca5e6604dda01a6297f7c9381e" 141 | integrity sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA== 142 | dependencies: 143 | "@babel/types" "^7.10.4" 144 | 145 | "@babel/helper-member-expression-to-functions@^7.10.4", "@babel/helper-member-expression-to-functions@^7.10.5": 146 | version "7.11.0" 147 | resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz#ae69c83d84ee82f4b42f96e2a09410935a8f26df" 148 | integrity sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q== 149 | dependencies: 150 | "@babel/types" "^7.11.0" 151 | 152 | "@babel/helper-module-imports@^7.10.4": 153 | version "7.10.4" 154 | resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz#4c5c54be04bd31670a7382797d75b9fa2e5b5620" 155 | integrity sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw== 156 | dependencies: 157 | "@babel/types" "^7.10.4" 158 | 159 | "@babel/helper-module-transforms@^7.10.4", "@babel/helper-module-transforms@^7.10.5", "@babel/helper-module-transforms@^7.11.0": 160 | version "7.11.0" 161 | resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz#b16f250229e47211abdd84b34b64737c2ab2d359" 162 | integrity sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg== 163 | dependencies: 164 | "@babel/helper-module-imports" "^7.10.4" 165 | "@babel/helper-replace-supers" "^7.10.4" 166 | "@babel/helper-simple-access" "^7.10.4" 167 | "@babel/helper-split-export-declaration" "^7.11.0" 168 | "@babel/template" "^7.10.4" 169 | "@babel/types" "^7.11.0" 170 | lodash "^4.17.19" 171 | 172 | "@babel/helper-optimise-call-expression@^7.10.4": 173 | version "7.10.4" 174 | resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz#50dc96413d594f995a77905905b05893cd779673" 175 | integrity sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg== 176 | dependencies: 177 | "@babel/types" "^7.10.4" 178 | 179 | "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": 180 | version "7.10.4" 181 | resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" 182 | integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== 183 | 184 | "@babel/helper-regex@^7.10.4": 185 | version "7.10.5" 186 | resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.10.5.tgz#32dfbb79899073c415557053a19bd055aae50ae0" 187 | integrity sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg== 188 | dependencies: 189 | lodash "^4.17.19" 190 | 191 | "@babel/helper-remap-async-to-generator@^7.10.4": 192 | version "7.11.4" 193 | resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.11.4.tgz#4474ea9f7438f18575e30b0cac784045b402a12d" 194 | integrity sha512-tR5vJ/vBa9wFy3m5LLv2faapJLnDFxNWff2SAYkSE4rLUdbp7CdObYFgI7wK4T/Mj4UzpjPwzR8Pzmr5m7MHGA== 195 | dependencies: 196 | "@babel/helper-annotate-as-pure" "^7.10.4" 197 | "@babel/helper-wrap-function" "^7.10.4" 198 | "@babel/template" "^7.10.4" 199 | "@babel/types" "^7.10.4" 200 | 201 | "@babel/helper-replace-supers@^7.10.4": 202 | version "7.10.4" 203 | resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz#d585cd9388ea06e6031e4cd44b6713cbead9e6cf" 204 | integrity sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A== 205 | dependencies: 206 | "@babel/helper-member-expression-to-functions" "^7.10.4" 207 | "@babel/helper-optimise-call-expression" "^7.10.4" 208 | "@babel/traverse" "^7.10.4" 209 | "@babel/types" "^7.10.4" 210 | 211 | "@babel/helper-simple-access@^7.10.4": 212 | version "7.10.4" 213 | resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz#0f5ccda2945277a2a7a2d3a821e15395edcf3461" 214 | integrity sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw== 215 | dependencies: 216 | "@babel/template" "^7.10.4" 217 | "@babel/types" "^7.10.4" 218 | 219 | "@babel/helper-skip-transparent-expression-wrappers@^7.11.0": 220 | version "7.11.0" 221 | resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz#eec162f112c2f58d3af0af125e3bb57665146729" 222 | integrity sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q== 223 | dependencies: 224 | "@babel/types" "^7.11.0" 225 | 226 | "@babel/helper-split-export-declaration@^7.10.4", "@babel/helper-split-export-declaration@^7.11.0": 227 | version "7.11.0" 228 | resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz#f8a491244acf6a676158ac42072911ba83ad099f" 229 | integrity sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg== 230 | dependencies: 231 | "@babel/types" "^7.11.0" 232 | 233 | "@babel/helper-validator-identifier@^7.10.4": 234 | version "7.10.4" 235 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" 236 | integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== 237 | 238 | "@babel/helper-wrap-function@^7.10.4": 239 | version "7.10.4" 240 | resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz#8a6f701eab0ff39f765b5a1cfef409990e624b87" 241 | integrity sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug== 242 | dependencies: 243 | "@babel/helper-function-name" "^7.10.4" 244 | "@babel/template" "^7.10.4" 245 | "@babel/traverse" "^7.10.4" 246 | "@babel/types" "^7.10.4" 247 | 248 | "@babel/helpers@^7.10.4": 249 | version "7.10.4" 250 | resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.10.4.tgz#2abeb0d721aff7c0a97376b9e1f6f65d7a475044" 251 | integrity sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA== 252 | dependencies: 253 | "@babel/template" "^7.10.4" 254 | "@babel/traverse" "^7.10.4" 255 | "@babel/types" "^7.10.4" 256 | 257 | "@babel/highlight@^7.10.1", "@babel/highlight@^7.10.4": 258 | version "7.10.4" 259 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" 260 | integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== 261 | dependencies: 262 | "@babel/helper-validator-identifier" "^7.10.4" 263 | chalk "^2.0.0" 264 | js-tokens "^4.0.0" 265 | 266 | "@babel/parser@^7.10.4", "@babel/parser@^7.11.0", "@babel/parser@^7.11.4": 267 | version "7.11.4" 268 | resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.4.tgz#6fa1a118b8b0d80d0267b719213dc947e88cc0ca" 269 | integrity sha512-MggwidiH+E9j5Sh8pbrX5sJvMcsqS5o+7iB42M9/k0CD63MjYbdP4nhSh7uB5wnv2/RVzTZFTxzF/kIa5mrCqA== 270 | 271 | "@babel/plugin-proposal-async-generator-functions@^7.10.4": 272 | version "7.10.5" 273 | resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz#3491cabf2f7c179ab820606cec27fed15e0e8558" 274 | integrity sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg== 275 | dependencies: 276 | "@babel/helper-plugin-utils" "^7.10.4" 277 | "@babel/helper-remap-async-to-generator" "^7.10.4" 278 | "@babel/plugin-syntax-async-generators" "^7.8.0" 279 | 280 | "@babel/plugin-proposal-class-properties@^7.10.4": 281 | version "7.10.4" 282 | resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz#a33bf632da390a59c7a8c570045d1115cd778807" 283 | integrity sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg== 284 | dependencies: 285 | "@babel/helper-create-class-features-plugin" "^7.10.4" 286 | "@babel/helper-plugin-utils" "^7.10.4" 287 | 288 | "@babel/plugin-proposal-dynamic-import@^7.10.4": 289 | version "7.10.4" 290 | resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz#ba57a26cb98b37741e9d5bca1b8b0ddf8291f17e" 291 | integrity sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ== 292 | dependencies: 293 | "@babel/helper-plugin-utils" "^7.10.4" 294 | "@babel/plugin-syntax-dynamic-import" "^7.8.0" 295 | 296 | "@babel/plugin-proposal-export-namespace-from@^7.10.4": 297 | version "7.10.4" 298 | resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.4.tgz#570d883b91031637b3e2958eea3c438e62c05f54" 299 | integrity sha512-aNdf0LY6/3WXkhh0Fdb6Zk9j1NMD8ovj3F6r0+3j837Pn1S1PdNtcwJ5EG9WkVPNHPxyJDaxMaAOVq4eki0qbg== 300 | dependencies: 301 | "@babel/helper-plugin-utils" "^7.10.4" 302 | "@babel/plugin-syntax-export-namespace-from" "^7.8.3" 303 | 304 | "@babel/plugin-proposal-json-strings@^7.10.4": 305 | version "7.10.4" 306 | resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz#593e59c63528160233bd321b1aebe0820c2341db" 307 | integrity sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw== 308 | dependencies: 309 | "@babel/helper-plugin-utils" "^7.10.4" 310 | "@babel/plugin-syntax-json-strings" "^7.8.0" 311 | 312 | "@babel/plugin-proposal-logical-assignment-operators@^7.11.0": 313 | version "7.11.0" 314 | resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.11.0.tgz#9f80e482c03083c87125dee10026b58527ea20c8" 315 | integrity sha512-/f8p4z+Auz0Uaf+i8Ekf1iM7wUNLcViFUGiPxKeXvxTSl63B875YPiVdUDdem7hREcI0E0kSpEhS8tF5RphK7Q== 316 | dependencies: 317 | "@babel/helper-plugin-utils" "^7.10.4" 318 | "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" 319 | 320 | "@babel/plugin-proposal-nullish-coalescing-operator@^7.10.4": 321 | version "7.10.4" 322 | resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz#02a7e961fc32e6d5b2db0649e01bf80ddee7e04a" 323 | integrity sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw== 324 | dependencies: 325 | "@babel/helper-plugin-utils" "^7.10.4" 326 | "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" 327 | 328 | "@babel/plugin-proposal-numeric-separator@^7.10.4": 329 | version "7.10.4" 330 | resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz#ce1590ff0a65ad12970a609d78855e9a4c1aef06" 331 | integrity sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA== 332 | dependencies: 333 | "@babel/helper-plugin-utils" "^7.10.4" 334 | "@babel/plugin-syntax-numeric-separator" "^7.10.4" 335 | 336 | "@babel/plugin-proposal-object-rest-spread@^7.11.0": 337 | version "7.11.0" 338 | resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz#bd81f95a1f746760ea43b6c2d3d62b11790ad0af" 339 | integrity sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA== 340 | dependencies: 341 | "@babel/helper-plugin-utils" "^7.10.4" 342 | "@babel/plugin-syntax-object-rest-spread" "^7.8.0" 343 | "@babel/plugin-transform-parameters" "^7.10.4" 344 | 345 | "@babel/plugin-proposal-optional-catch-binding@^7.10.4": 346 | version "7.10.4" 347 | resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz#31c938309d24a78a49d68fdabffaa863758554dd" 348 | integrity sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g== 349 | dependencies: 350 | "@babel/helper-plugin-utils" "^7.10.4" 351 | "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" 352 | 353 | "@babel/plugin-proposal-optional-chaining@^7.11.0": 354 | version "7.11.0" 355 | resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz#de5866d0646f6afdaab8a566382fe3a221755076" 356 | integrity sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA== 357 | dependencies: 358 | "@babel/helper-plugin-utils" "^7.10.4" 359 | "@babel/helper-skip-transparent-expression-wrappers" "^7.11.0" 360 | "@babel/plugin-syntax-optional-chaining" "^7.8.0" 361 | 362 | "@babel/plugin-proposal-private-methods@^7.10.4": 363 | version "7.10.4" 364 | resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz#b160d972b8fdba5c7d111a145fc8c421fc2a6909" 365 | integrity sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw== 366 | dependencies: 367 | "@babel/helper-create-class-features-plugin" "^7.10.4" 368 | "@babel/helper-plugin-utils" "^7.10.4" 369 | 370 | "@babel/plugin-proposal-unicode-property-regex@^7.10.4", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": 371 | version "7.10.4" 372 | resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz#4483cda53041ce3413b7fe2f00022665ddfaa75d" 373 | integrity sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA== 374 | dependencies: 375 | "@babel/helper-create-regexp-features-plugin" "^7.10.4" 376 | "@babel/helper-plugin-utils" "^7.10.4" 377 | 378 | "@babel/plugin-syntax-async-generators@^7.8.0": 379 | version "7.8.4" 380 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" 381 | integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== 382 | dependencies: 383 | "@babel/helper-plugin-utils" "^7.8.0" 384 | 385 | "@babel/plugin-syntax-class-properties@^7.10.4": 386 | version "7.10.4" 387 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz#6644e6a0baa55a61f9e3231f6c9eeb6ee46c124c" 388 | integrity sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA== 389 | dependencies: 390 | "@babel/helper-plugin-utils" "^7.10.4" 391 | 392 | "@babel/plugin-syntax-dynamic-import@^7.8.0": 393 | version "7.8.3" 394 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" 395 | integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== 396 | dependencies: 397 | "@babel/helper-plugin-utils" "^7.8.0" 398 | 399 | "@babel/plugin-syntax-export-namespace-from@^7.8.3": 400 | version "7.8.3" 401 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" 402 | integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== 403 | dependencies: 404 | "@babel/helper-plugin-utils" "^7.8.3" 405 | 406 | "@babel/plugin-syntax-json-strings@^7.8.0": 407 | version "7.8.3" 408 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" 409 | integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== 410 | dependencies: 411 | "@babel/helper-plugin-utils" "^7.8.0" 412 | 413 | "@babel/plugin-syntax-logical-assignment-operators@^7.10.4": 414 | version "7.10.4" 415 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" 416 | integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== 417 | dependencies: 418 | "@babel/helper-plugin-utils" "^7.10.4" 419 | 420 | "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0": 421 | version "7.8.3" 422 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" 423 | integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== 424 | dependencies: 425 | "@babel/helper-plugin-utils" "^7.8.0" 426 | 427 | "@babel/plugin-syntax-numeric-separator@^7.10.4": 428 | version "7.10.4" 429 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" 430 | integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== 431 | dependencies: 432 | "@babel/helper-plugin-utils" "^7.10.4" 433 | 434 | "@babel/plugin-syntax-object-rest-spread@^7.8.0": 435 | version "7.8.3" 436 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" 437 | integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== 438 | dependencies: 439 | "@babel/helper-plugin-utils" "^7.8.0" 440 | 441 | "@babel/plugin-syntax-optional-catch-binding@^7.8.0": 442 | version "7.8.3" 443 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" 444 | integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== 445 | dependencies: 446 | "@babel/helper-plugin-utils" "^7.8.0" 447 | 448 | "@babel/plugin-syntax-optional-chaining@^7.8.0": 449 | version "7.8.3" 450 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" 451 | integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== 452 | dependencies: 453 | "@babel/helper-plugin-utils" "^7.8.0" 454 | 455 | "@babel/plugin-syntax-top-level-await@^7.10.4": 456 | version "7.10.4" 457 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz#4bbeb8917b54fcf768364e0a81f560e33a3ef57d" 458 | integrity sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ== 459 | dependencies: 460 | "@babel/helper-plugin-utils" "^7.10.4" 461 | 462 | "@babel/plugin-transform-arrow-functions@^7.10.4": 463 | version "7.10.4" 464 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz#e22960d77e697c74f41c501d44d73dbf8a6a64cd" 465 | integrity sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA== 466 | dependencies: 467 | "@babel/helper-plugin-utils" "^7.10.4" 468 | 469 | "@babel/plugin-transform-async-to-generator@^7.10.4": 470 | version "7.10.4" 471 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz#41a5017e49eb6f3cda9392a51eef29405b245a37" 472 | integrity sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ== 473 | dependencies: 474 | "@babel/helper-module-imports" "^7.10.4" 475 | "@babel/helper-plugin-utils" "^7.10.4" 476 | "@babel/helper-remap-async-to-generator" "^7.10.4" 477 | 478 | "@babel/plugin-transform-block-scoped-functions@^7.10.4": 479 | version "7.10.4" 480 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz#1afa595744f75e43a91af73b0d998ecfe4ebc2e8" 481 | integrity sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA== 482 | dependencies: 483 | "@babel/helper-plugin-utils" "^7.10.4" 484 | 485 | "@babel/plugin-transform-block-scoping@^7.10.4": 486 | version "7.11.1" 487 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.11.1.tgz#5b7efe98852bef8d652c0b28144cd93a9e4b5215" 488 | integrity sha512-00dYeDE0EVEHuuM+26+0w/SCL0BH2Qy7LwHuI4Hi4MH5gkC8/AqMN5uWFJIsoXZrAphiMm1iXzBw6L2T+eA0ew== 489 | dependencies: 490 | "@babel/helper-plugin-utils" "^7.10.4" 491 | 492 | "@babel/plugin-transform-classes@^7.10.4": 493 | version "7.10.4" 494 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz#405136af2b3e218bc4a1926228bc917ab1a0adc7" 495 | integrity sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA== 496 | dependencies: 497 | "@babel/helper-annotate-as-pure" "^7.10.4" 498 | "@babel/helper-define-map" "^7.10.4" 499 | "@babel/helper-function-name" "^7.10.4" 500 | "@babel/helper-optimise-call-expression" "^7.10.4" 501 | "@babel/helper-plugin-utils" "^7.10.4" 502 | "@babel/helper-replace-supers" "^7.10.4" 503 | "@babel/helper-split-export-declaration" "^7.10.4" 504 | globals "^11.1.0" 505 | 506 | "@babel/plugin-transform-computed-properties@^7.10.4": 507 | version "7.10.4" 508 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz#9ded83a816e82ded28d52d4b4ecbdd810cdfc0eb" 509 | integrity sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw== 510 | dependencies: 511 | "@babel/helper-plugin-utils" "^7.10.4" 512 | 513 | "@babel/plugin-transform-destructuring@^7.10.4": 514 | version "7.10.4" 515 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz#70ddd2b3d1bea83d01509e9bb25ddb3a74fc85e5" 516 | integrity sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA== 517 | dependencies: 518 | "@babel/helper-plugin-utils" "^7.10.4" 519 | 520 | "@babel/plugin-transform-dotall-regex@^7.10.4", "@babel/plugin-transform-dotall-regex@^7.4.4": 521 | version "7.10.4" 522 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz#469c2062105c1eb6a040eaf4fac4b488078395ee" 523 | integrity sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA== 524 | dependencies: 525 | "@babel/helper-create-regexp-features-plugin" "^7.10.4" 526 | "@babel/helper-plugin-utils" "^7.10.4" 527 | 528 | "@babel/plugin-transform-duplicate-keys@^7.10.4": 529 | version "7.10.4" 530 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz#697e50c9fee14380fe843d1f306b295617431e47" 531 | integrity sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA== 532 | dependencies: 533 | "@babel/helper-plugin-utils" "^7.10.4" 534 | 535 | "@babel/plugin-transform-exponentiation-operator@^7.10.4": 536 | version "7.10.4" 537 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz#5ae338c57f8cf4001bdb35607ae66b92d665af2e" 538 | integrity sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw== 539 | dependencies: 540 | "@babel/helper-builder-binary-assignment-operator-visitor" "^7.10.4" 541 | "@babel/helper-plugin-utils" "^7.10.4" 542 | 543 | "@babel/plugin-transform-for-of@^7.10.4": 544 | version "7.10.4" 545 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz#c08892e8819d3a5db29031b115af511dbbfebae9" 546 | integrity sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ== 547 | dependencies: 548 | "@babel/helper-plugin-utils" "^7.10.4" 549 | 550 | "@babel/plugin-transform-function-name@^7.10.4": 551 | version "7.10.4" 552 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz#6a467880e0fc9638514ba369111811ddbe2644b7" 553 | integrity sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg== 554 | dependencies: 555 | "@babel/helper-function-name" "^7.10.4" 556 | "@babel/helper-plugin-utils" "^7.10.4" 557 | 558 | "@babel/plugin-transform-literals@^7.10.4": 559 | version "7.10.4" 560 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz#9f42ba0841100a135f22712d0e391c462f571f3c" 561 | integrity sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ== 562 | dependencies: 563 | "@babel/helper-plugin-utils" "^7.10.4" 564 | 565 | "@babel/plugin-transform-member-expression-literals@^7.10.4": 566 | version "7.10.4" 567 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz#b1ec44fcf195afcb8db2c62cd8e551c881baf8b7" 568 | integrity sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw== 569 | dependencies: 570 | "@babel/helper-plugin-utils" "^7.10.4" 571 | 572 | "@babel/plugin-transform-modules-amd@^7.10.4": 573 | version "7.10.5" 574 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz#1b9cddaf05d9e88b3aad339cb3e445c4f020a9b1" 575 | integrity sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw== 576 | dependencies: 577 | "@babel/helper-module-transforms" "^7.10.5" 578 | "@babel/helper-plugin-utils" "^7.10.4" 579 | babel-plugin-dynamic-import-node "^2.3.3" 580 | 581 | "@babel/plugin-transform-modules-commonjs@^7.10.4": 582 | version "7.10.4" 583 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz#66667c3eeda1ebf7896d41f1f16b17105a2fbca0" 584 | integrity sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w== 585 | dependencies: 586 | "@babel/helper-module-transforms" "^7.10.4" 587 | "@babel/helper-plugin-utils" "^7.10.4" 588 | "@babel/helper-simple-access" "^7.10.4" 589 | babel-plugin-dynamic-import-node "^2.3.3" 590 | 591 | "@babel/plugin-transform-modules-systemjs@^7.10.4": 592 | version "7.10.5" 593 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz#6270099c854066681bae9e05f87e1b9cadbe8c85" 594 | integrity sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw== 595 | dependencies: 596 | "@babel/helper-hoist-variables" "^7.10.4" 597 | "@babel/helper-module-transforms" "^7.10.5" 598 | "@babel/helper-plugin-utils" "^7.10.4" 599 | babel-plugin-dynamic-import-node "^2.3.3" 600 | 601 | "@babel/plugin-transform-modules-umd@^7.10.4": 602 | version "7.10.4" 603 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz#9a8481fe81b824654b3a0b65da3df89f3d21839e" 604 | integrity sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA== 605 | dependencies: 606 | "@babel/helper-module-transforms" "^7.10.4" 607 | "@babel/helper-plugin-utils" "^7.10.4" 608 | 609 | "@babel/plugin-transform-named-capturing-groups-regex@^7.10.4": 610 | version "7.10.4" 611 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz#78b4d978810b6f3bcf03f9e318f2fc0ed41aecb6" 612 | integrity sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA== 613 | dependencies: 614 | "@babel/helper-create-regexp-features-plugin" "^7.10.4" 615 | 616 | "@babel/plugin-transform-new-target@^7.10.4": 617 | version "7.10.4" 618 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz#9097d753cb7b024cb7381a3b2e52e9513a9c6888" 619 | integrity sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw== 620 | dependencies: 621 | "@babel/helper-plugin-utils" "^7.10.4" 622 | 623 | "@babel/plugin-transform-object-super@^7.10.4": 624 | version "7.10.4" 625 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz#d7146c4d139433e7a6526f888c667e314a093894" 626 | integrity sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ== 627 | dependencies: 628 | "@babel/helper-plugin-utils" "^7.10.4" 629 | "@babel/helper-replace-supers" "^7.10.4" 630 | 631 | "@babel/plugin-transform-parameters@^7.10.4": 632 | version "7.10.5" 633 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz#59d339d58d0b1950435f4043e74e2510005e2c4a" 634 | integrity sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw== 635 | dependencies: 636 | "@babel/helper-get-function-arity" "^7.10.4" 637 | "@babel/helper-plugin-utils" "^7.10.4" 638 | 639 | "@babel/plugin-transform-property-literals@^7.10.4": 640 | version "7.10.4" 641 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz#f6fe54b6590352298785b83edd815d214c42e3c0" 642 | integrity sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g== 643 | dependencies: 644 | "@babel/helper-plugin-utils" "^7.10.4" 645 | 646 | "@babel/plugin-transform-regenerator@^7.10.4": 647 | version "7.10.4" 648 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz#2015e59d839074e76838de2159db421966fd8b63" 649 | integrity sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw== 650 | dependencies: 651 | regenerator-transform "^0.14.2" 652 | 653 | "@babel/plugin-transform-reserved-words@^7.10.4": 654 | version "7.10.4" 655 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz#8f2682bcdcef9ed327e1b0861585d7013f8a54dd" 656 | integrity sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ== 657 | dependencies: 658 | "@babel/helper-plugin-utils" "^7.10.4" 659 | 660 | "@babel/plugin-transform-shorthand-properties@^7.10.4": 661 | version "7.10.4" 662 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz#9fd25ec5cdd555bb7f473e5e6ee1c971eede4dd6" 663 | integrity sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q== 664 | dependencies: 665 | "@babel/helper-plugin-utils" "^7.10.4" 666 | 667 | "@babel/plugin-transform-spread@^7.11.0": 668 | version "7.11.0" 669 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz#fa84d300f5e4f57752fe41a6d1b3c554f13f17cc" 670 | integrity sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw== 671 | dependencies: 672 | "@babel/helper-plugin-utils" "^7.10.4" 673 | "@babel/helper-skip-transparent-expression-wrappers" "^7.11.0" 674 | 675 | "@babel/plugin-transform-sticky-regex@^7.10.4": 676 | version "7.10.4" 677 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz#8f3889ee8657581130a29d9cc91d7c73b7c4a28d" 678 | integrity sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ== 679 | dependencies: 680 | "@babel/helper-plugin-utils" "^7.10.4" 681 | "@babel/helper-regex" "^7.10.4" 682 | 683 | "@babel/plugin-transform-template-literals@^7.10.4": 684 | version "7.10.5" 685 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz#78bc5d626a6642db3312d9d0f001f5e7639fde8c" 686 | integrity sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw== 687 | dependencies: 688 | "@babel/helper-annotate-as-pure" "^7.10.4" 689 | "@babel/helper-plugin-utils" "^7.10.4" 690 | 691 | "@babel/plugin-transform-typeof-symbol@^7.10.4": 692 | version "7.10.4" 693 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz#9509f1a7eec31c4edbffe137c16cc33ff0bc5bfc" 694 | integrity sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA== 695 | dependencies: 696 | "@babel/helper-plugin-utils" "^7.10.4" 697 | 698 | "@babel/plugin-transform-unicode-escapes@^7.10.4": 699 | version "7.10.4" 700 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz#feae523391c7651ddac115dae0a9d06857892007" 701 | integrity sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg== 702 | dependencies: 703 | "@babel/helper-plugin-utils" "^7.10.4" 704 | 705 | "@babel/plugin-transform-unicode-regex@^7.10.4": 706 | version "7.10.4" 707 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz#e56d71f9282fac6db09c82742055576d5e6d80a8" 708 | integrity sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A== 709 | dependencies: 710 | "@babel/helper-create-regexp-features-plugin" "^7.10.4" 711 | "@babel/helper-plugin-utils" "^7.10.4" 712 | 713 | "@babel/preset-env@^7.10.2": 714 | version "7.11.0" 715 | resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.11.0.tgz#860ee38f2ce17ad60480c2021ba9689393efb796" 716 | integrity sha512-2u1/k7rG/gTh02dylX2kL3S0IJNF+J6bfDSp4DI2Ma8QN6Y9x9pmAax59fsCk6QUQG0yqH47yJWA+u1I1LccAg== 717 | dependencies: 718 | "@babel/compat-data" "^7.11.0" 719 | "@babel/helper-compilation-targets" "^7.10.4" 720 | "@babel/helper-module-imports" "^7.10.4" 721 | "@babel/helper-plugin-utils" "^7.10.4" 722 | "@babel/plugin-proposal-async-generator-functions" "^7.10.4" 723 | "@babel/plugin-proposal-class-properties" "^7.10.4" 724 | "@babel/plugin-proposal-dynamic-import" "^7.10.4" 725 | "@babel/plugin-proposal-export-namespace-from" "^7.10.4" 726 | "@babel/plugin-proposal-json-strings" "^7.10.4" 727 | "@babel/plugin-proposal-logical-assignment-operators" "^7.11.0" 728 | "@babel/plugin-proposal-nullish-coalescing-operator" "^7.10.4" 729 | "@babel/plugin-proposal-numeric-separator" "^7.10.4" 730 | "@babel/plugin-proposal-object-rest-spread" "^7.11.0" 731 | "@babel/plugin-proposal-optional-catch-binding" "^7.10.4" 732 | "@babel/plugin-proposal-optional-chaining" "^7.11.0" 733 | "@babel/plugin-proposal-private-methods" "^7.10.4" 734 | "@babel/plugin-proposal-unicode-property-regex" "^7.10.4" 735 | "@babel/plugin-syntax-async-generators" "^7.8.0" 736 | "@babel/plugin-syntax-class-properties" "^7.10.4" 737 | "@babel/plugin-syntax-dynamic-import" "^7.8.0" 738 | "@babel/plugin-syntax-export-namespace-from" "^7.8.3" 739 | "@babel/plugin-syntax-json-strings" "^7.8.0" 740 | "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" 741 | "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" 742 | "@babel/plugin-syntax-numeric-separator" "^7.10.4" 743 | "@babel/plugin-syntax-object-rest-spread" "^7.8.0" 744 | "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" 745 | "@babel/plugin-syntax-optional-chaining" "^7.8.0" 746 | "@babel/plugin-syntax-top-level-await" "^7.10.4" 747 | "@babel/plugin-transform-arrow-functions" "^7.10.4" 748 | "@babel/plugin-transform-async-to-generator" "^7.10.4" 749 | "@babel/plugin-transform-block-scoped-functions" "^7.10.4" 750 | "@babel/plugin-transform-block-scoping" "^7.10.4" 751 | "@babel/plugin-transform-classes" "^7.10.4" 752 | "@babel/plugin-transform-computed-properties" "^7.10.4" 753 | "@babel/plugin-transform-destructuring" "^7.10.4" 754 | "@babel/plugin-transform-dotall-regex" "^7.10.4" 755 | "@babel/plugin-transform-duplicate-keys" "^7.10.4" 756 | "@babel/plugin-transform-exponentiation-operator" "^7.10.4" 757 | "@babel/plugin-transform-for-of" "^7.10.4" 758 | "@babel/plugin-transform-function-name" "^7.10.4" 759 | "@babel/plugin-transform-literals" "^7.10.4" 760 | "@babel/plugin-transform-member-expression-literals" "^7.10.4" 761 | "@babel/plugin-transform-modules-amd" "^7.10.4" 762 | "@babel/plugin-transform-modules-commonjs" "^7.10.4" 763 | "@babel/plugin-transform-modules-systemjs" "^7.10.4" 764 | "@babel/plugin-transform-modules-umd" "^7.10.4" 765 | "@babel/plugin-transform-named-capturing-groups-regex" "^7.10.4" 766 | "@babel/plugin-transform-new-target" "^7.10.4" 767 | "@babel/plugin-transform-object-super" "^7.10.4" 768 | "@babel/plugin-transform-parameters" "^7.10.4" 769 | "@babel/plugin-transform-property-literals" "^7.10.4" 770 | "@babel/plugin-transform-regenerator" "^7.10.4" 771 | "@babel/plugin-transform-reserved-words" "^7.10.4" 772 | "@babel/plugin-transform-shorthand-properties" "^7.10.4" 773 | "@babel/plugin-transform-spread" "^7.11.0" 774 | "@babel/plugin-transform-sticky-regex" "^7.10.4" 775 | "@babel/plugin-transform-template-literals" "^7.10.4" 776 | "@babel/plugin-transform-typeof-symbol" "^7.10.4" 777 | "@babel/plugin-transform-unicode-escapes" "^7.10.4" 778 | "@babel/plugin-transform-unicode-regex" "^7.10.4" 779 | "@babel/preset-modules" "^0.1.3" 780 | "@babel/types" "^7.11.0" 781 | browserslist "^4.12.0" 782 | core-js-compat "^3.6.2" 783 | invariant "^2.2.2" 784 | levenary "^1.1.1" 785 | semver "^5.5.0" 786 | 787 | "@babel/preset-modules@^0.1.3": 788 | version "0.1.4" 789 | resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.4.tgz#362f2b68c662842970fdb5e254ffc8fc1c2e415e" 790 | integrity sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg== 791 | dependencies: 792 | "@babel/helper-plugin-utils" "^7.0.0" 793 | "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" 794 | "@babel/plugin-transform-dotall-regex" "^7.4.4" 795 | "@babel/types" "^7.4.4" 796 | esutils "^2.0.2" 797 | 798 | "@babel/runtime@^7.8.4": 799 | version "7.11.2" 800 | resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.11.2.tgz#f549c13c754cc40b87644b9fa9f09a6a95fe0736" 801 | integrity sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw== 802 | dependencies: 803 | regenerator-runtime "^0.13.4" 804 | 805 | "@babel/template@^7.10.4": 806 | version "7.10.4" 807 | resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278" 808 | integrity sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA== 809 | dependencies: 810 | "@babel/code-frame" "^7.10.4" 811 | "@babel/parser" "^7.10.4" 812 | "@babel/types" "^7.10.4" 813 | 814 | "@babel/traverse@^7.10.4", "@babel/traverse@^7.11.0": 815 | version "7.11.0" 816 | resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.11.0.tgz#9b996ce1b98f53f7c3e4175115605d56ed07dd24" 817 | integrity sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg== 818 | dependencies: 819 | "@babel/code-frame" "^7.10.4" 820 | "@babel/generator" "^7.11.0" 821 | "@babel/helper-function-name" "^7.10.4" 822 | "@babel/helper-split-export-declaration" "^7.11.0" 823 | "@babel/parser" "^7.11.0" 824 | "@babel/types" "^7.11.0" 825 | debug "^4.1.0" 826 | globals "^11.1.0" 827 | lodash "^4.17.19" 828 | 829 | "@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.11.0", "@babel/types@^7.4.4": 830 | version "7.11.0" 831 | resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.11.0.tgz#2ae6bf1ba9ae8c3c43824e5861269871b206e90d" 832 | integrity sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA== 833 | dependencies: 834 | "@babel/helper-validator-identifier" "^7.10.4" 835 | lodash "^4.17.19" 836 | to-fast-properties "^2.0.0" 837 | 838 | "@rollup/plugin-babel@^5.0.2": 839 | version "5.2.0" 840 | resolved "https://registry.yarnpkg.com/@rollup/plugin-babel/-/plugin-babel-5.2.0.tgz#b87556d61ed108b4eaf9d18b5323965adf8d9bee" 841 | integrity sha512-CPABsajaKjINgBQ3it+yMnfVO3ibsrMBxRzbUOUw2cL1hsZJ7aogU8mgglQm3S2hHJgjnAmxPz0Rq7DVdmHsTw== 842 | dependencies: 843 | "@babel/helper-module-imports" "^7.10.4" 844 | "@rollup/pluginutils" "^3.1.0" 845 | 846 | "@rollup/pluginutils@^3.1.0": 847 | version "3.1.0" 848 | resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b" 849 | integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg== 850 | dependencies: 851 | "@types/estree" "0.0.39" 852 | estree-walker "^1.0.1" 853 | picomatch "^2.2.2" 854 | 855 | "@sinonjs/commons@^1", "@sinonjs/commons@^1.6.0", "@sinonjs/commons@^1.7.0", "@sinonjs/commons@^1.7.2": 856 | version "1.8.1" 857 | resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.1.tgz#e7df00f98a203324f6dc7cc606cad9d4a8ab2217" 858 | integrity sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw== 859 | dependencies: 860 | type-detect "4.0.8" 861 | 862 | "@sinonjs/fake-timers@^6.0.0", "@sinonjs/fake-timers@^6.0.1": 863 | version "6.0.1" 864 | resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz#293674fccb3262ac782c7aadfdeca86b10c75c40" 865 | integrity sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA== 866 | dependencies: 867 | "@sinonjs/commons" "^1.7.0" 868 | 869 | "@sinonjs/formatio@^5.0.1": 870 | version "5.0.1" 871 | resolved "https://registry.yarnpkg.com/@sinonjs/formatio/-/formatio-5.0.1.tgz#f13e713cb3313b1ab965901b01b0828ea6b77089" 872 | integrity sha512-KaiQ5pBf1MpS09MuA0kp6KBQt2JUOQycqVG1NZXvzeaXe5LGFqAKueIS0bw4w0P9r7KuBSVdUk5QjXsUdu2CxQ== 873 | dependencies: 874 | "@sinonjs/commons" "^1" 875 | "@sinonjs/samsam" "^5.0.2" 876 | 877 | "@sinonjs/samsam@^5.0.2", "@sinonjs/samsam@^5.1.0": 878 | version "5.1.0" 879 | resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-5.1.0.tgz#3afe719232b541bb6cf3411a4c399a188de21ec0" 880 | integrity sha512-42nyaQOVunX5Pm6GRJobmzbS7iLI+fhERITnETXzzwDZh+TtDr/Au3yAvXVjFmZ4wEUaE4Y3NFZfKv0bV0cbtg== 881 | dependencies: 882 | "@sinonjs/commons" "^1.6.0" 883 | lodash.get "^4.4.2" 884 | type-detect "^4.0.8" 885 | 886 | "@sinonjs/text-encoding@^0.7.1": 887 | version "0.7.1" 888 | resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" 889 | integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== 890 | 891 | "@types/estree@0.0.39": 892 | version "0.0.39" 893 | resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" 894 | integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== 895 | 896 | ansi-colors@3.2.3: 897 | version "3.2.3" 898 | resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" 899 | integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== 900 | 901 | ansi-regex@^3.0.0: 902 | version "3.0.0" 903 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 904 | integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= 905 | 906 | ansi-regex@^4.1.0: 907 | version "4.1.0" 908 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" 909 | integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== 910 | 911 | ansi-styles@^3.2.0, ansi-styles@^3.2.1: 912 | version "3.2.1" 913 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 914 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 915 | dependencies: 916 | color-convert "^1.9.0" 917 | 918 | anymatch@~3.1.1: 919 | version "3.1.1" 920 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" 921 | integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== 922 | dependencies: 923 | normalize-path "^3.0.0" 924 | picomatch "^2.0.4" 925 | 926 | argparse@^1.0.7: 927 | version "1.0.10" 928 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 929 | integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== 930 | dependencies: 931 | sprintf-js "~1.0.2" 932 | 933 | babel-plugin-dynamic-import-node@^2.3.3: 934 | version "2.3.3" 935 | resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" 936 | integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== 937 | dependencies: 938 | object.assign "^4.1.0" 939 | 940 | balanced-match@^1.0.0: 941 | version "1.0.0" 942 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 943 | 944 | binary-extensions@^2.0.0: 945 | version "2.0.0" 946 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" 947 | integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow== 948 | 949 | brace-expansion@^1.1.7: 950 | version "1.1.11" 951 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 952 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 953 | dependencies: 954 | balanced-match "^1.0.0" 955 | concat-map "0.0.1" 956 | 957 | braces@~3.0.2: 958 | version "3.0.2" 959 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 960 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 961 | dependencies: 962 | fill-range "^7.0.1" 963 | 964 | browser-stdout@1.3.1: 965 | version "1.3.1" 966 | resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" 967 | integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== 968 | 969 | browserslist@^4.12.0, browserslist@^4.8.5: 970 | version "4.14.0" 971 | resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.0.tgz#2908951abfe4ec98737b72f34c3bcedc8d43b000" 972 | integrity sha512-pUsXKAF2lVwhmtpeA3LJrZ76jXuusrNyhduuQs7CDFf9foT4Y38aQOserd2lMe5DSSrjf3fx34oHwryuvxAUgQ== 973 | dependencies: 974 | caniuse-lite "^1.0.30001111" 975 | electron-to-chromium "^1.3.523" 976 | escalade "^3.0.2" 977 | node-releases "^1.1.60" 978 | 979 | buffer-from@^1.0.0: 980 | version "1.1.1" 981 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" 982 | integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== 983 | 984 | camelcase@^5.0.0: 985 | version "5.3.1" 986 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" 987 | integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== 988 | 989 | caniuse-lite@^1.0.30001111: 990 | version "1.0.30001120" 991 | resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001120.tgz#cd21d35e537214e19f7b9f4f161f7b0f2710d46c" 992 | integrity sha512-JBP68okZs1X8D7MQTY602jxMYBmXEKOFkzTBaNSkubooMPFOAv2TXWaKle7qgHpjLDhUzA/TMT0qsNleVyXGUQ== 993 | 994 | chalk@^2.0.0, chalk@^2.4.2: 995 | version "2.4.2" 996 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 997 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 998 | dependencies: 999 | ansi-styles "^3.2.1" 1000 | escape-string-regexp "^1.0.5" 1001 | supports-color "^5.3.0" 1002 | 1003 | chokidar@3.3.0: 1004 | version "3.3.0" 1005 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.0.tgz#12c0714668c55800f659e262d4962a97faf554a6" 1006 | integrity sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A== 1007 | dependencies: 1008 | anymatch "~3.1.1" 1009 | braces "~3.0.2" 1010 | glob-parent "~5.1.0" 1011 | is-binary-path "~2.1.0" 1012 | is-glob "~4.0.1" 1013 | normalize-path "~3.0.0" 1014 | readdirp "~3.2.0" 1015 | optionalDependencies: 1016 | fsevents "~2.1.1" 1017 | 1018 | cliui@^5.0.0: 1019 | version "5.0.0" 1020 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" 1021 | integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== 1022 | dependencies: 1023 | string-width "^3.1.0" 1024 | strip-ansi "^5.2.0" 1025 | wrap-ansi "^5.1.0" 1026 | 1027 | color-convert@^1.9.0: 1028 | version "1.9.3" 1029 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 1030 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 1031 | dependencies: 1032 | color-name "1.1.3" 1033 | 1034 | color-name@1.1.3: 1035 | version "1.1.3" 1036 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 1037 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 1038 | 1039 | commander@^2.20.0: 1040 | version "2.20.3" 1041 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" 1042 | integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== 1043 | 1044 | concat-map@0.0.1: 1045 | version "0.0.1" 1046 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 1047 | 1048 | convert-source-map@^1.7.0: 1049 | version "1.7.0" 1050 | resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" 1051 | integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== 1052 | dependencies: 1053 | safe-buffer "~5.1.1" 1054 | 1055 | core-js-compat@^3.6.2: 1056 | version "3.6.5" 1057 | resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.5.tgz#2a51d9a4e25dfd6e690251aa81f99e3c05481f1c" 1058 | integrity sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng== 1059 | dependencies: 1060 | browserslist "^4.8.5" 1061 | semver "7.0.0" 1062 | 1063 | debug@3.2.6: 1064 | version "3.2.6" 1065 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" 1066 | integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== 1067 | dependencies: 1068 | ms "^2.1.1" 1069 | 1070 | debug@^4.1.0: 1071 | version "4.1.1" 1072 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" 1073 | integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== 1074 | dependencies: 1075 | ms "^2.1.1" 1076 | 1077 | decamelize@^1.2.0: 1078 | version "1.2.0" 1079 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 1080 | integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= 1081 | 1082 | define-properties@^1.1.2, define-properties@^1.1.3: 1083 | version "1.1.3" 1084 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" 1085 | integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== 1086 | dependencies: 1087 | object-keys "^1.0.12" 1088 | 1089 | diff@3.5.0: 1090 | version "3.5.0" 1091 | resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" 1092 | integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== 1093 | 1094 | diff@^4.0.2: 1095 | version "4.0.2" 1096 | resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" 1097 | integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== 1098 | 1099 | electron-to-chromium@^1.3.523: 1100 | version "1.3.555" 1101 | resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.555.tgz#a096716ff77cf8da9a608eb628fd6927869503d2" 1102 | integrity sha512-/55x3nF2feXFZ5tdGUOr00TxnUjUgdxhrn+eCJ1FAcoAt+cKQTjQkUC5XF4frMWE1R5sjHk+JueuBalimfe5Pg== 1103 | 1104 | emoji-regex@^7.0.1: 1105 | version "7.0.3" 1106 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" 1107 | integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== 1108 | 1109 | es-abstract@^1.17.0-next.1, es-abstract@^1.17.5: 1110 | version "1.17.5" 1111 | resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.5.tgz#d8c9d1d66c8981fb9200e2251d799eee92774ae9" 1112 | integrity sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg== 1113 | dependencies: 1114 | es-to-primitive "^1.2.1" 1115 | function-bind "^1.1.1" 1116 | has "^1.0.3" 1117 | has-symbols "^1.0.1" 1118 | is-callable "^1.1.5" 1119 | is-regex "^1.0.5" 1120 | object-inspect "^1.7.0" 1121 | object-keys "^1.1.1" 1122 | object.assign "^4.1.0" 1123 | string.prototype.trimleft "^2.1.1" 1124 | string.prototype.trimright "^2.1.1" 1125 | 1126 | es-to-primitive@^1.2.1: 1127 | version "1.2.1" 1128 | resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" 1129 | integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== 1130 | dependencies: 1131 | is-callable "^1.1.4" 1132 | is-date-object "^1.0.1" 1133 | is-symbol "^1.0.2" 1134 | 1135 | escalade@^3.0.2: 1136 | version "3.0.2" 1137 | resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.0.2.tgz#6a580d70edb87880f22b4c91d0d56078df6962c4" 1138 | integrity sha512-gPYAU37hYCUhW5euPeR+Y74F7BL+IBsV93j5cvGriSaD1aG6MGsqsV1yamRdrWrb2j3aiZvb0X+UBOWpx3JWtQ== 1139 | 1140 | escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5: 1141 | version "1.0.5" 1142 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 1143 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 1144 | 1145 | esm@^3.2.25: 1146 | version "3.2.25" 1147 | resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10" 1148 | integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== 1149 | 1150 | esprima@^4.0.0: 1151 | version "4.0.1" 1152 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 1153 | integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== 1154 | 1155 | estree-walker@^1.0.1: 1156 | version "1.0.1" 1157 | resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700" 1158 | integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== 1159 | 1160 | esutils@^2.0.2: 1161 | version "2.0.3" 1162 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" 1163 | integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 1164 | 1165 | fill-range@^7.0.1: 1166 | version "7.0.1" 1167 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 1168 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 1169 | dependencies: 1170 | to-regex-range "^5.0.1" 1171 | 1172 | find-up@3.0.0, find-up@^3.0.0: 1173 | version "3.0.0" 1174 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" 1175 | integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== 1176 | dependencies: 1177 | locate-path "^3.0.0" 1178 | 1179 | flat@^4.1.0: 1180 | version "4.1.0" 1181 | resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.0.tgz#090bec8b05e39cba309747f1d588f04dbaf98db2" 1182 | integrity sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw== 1183 | dependencies: 1184 | is-buffer "~2.0.3" 1185 | 1186 | fs.realpath@^1.0.0: 1187 | version "1.0.0" 1188 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 1189 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 1190 | 1191 | fsevents@~2.1.1, fsevents@~2.1.2: 1192 | version "2.1.3" 1193 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" 1194 | integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== 1195 | 1196 | function-bind@^1.1.1: 1197 | version "1.1.1" 1198 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 1199 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 1200 | 1201 | gensync@^1.0.0-beta.1: 1202 | version "1.0.0-beta.1" 1203 | resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" 1204 | integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== 1205 | 1206 | get-caller-file@^2.0.1: 1207 | version "2.0.5" 1208 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" 1209 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== 1210 | 1211 | glob-parent@~5.1.0: 1212 | version "5.1.1" 1213 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" 1214 | integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== 1215 | dependencies: 1216 | is-glob "^4.0.1" 1217 | 1218 | glob@7.1.3: 1219 | version "7.1.3" 1220 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" 1221 | integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== 1222 | dependencies: 1223 | fs.realpath "^1.0.0" 1224 | inflight "^1.0.4" 1225 | inherits "2" 1226 | minimatch "^3.0.4" 1227 | once "^1.3.0" 1228 | path-is-absolute "^1.0.0" 1229 | 1230 | globals@^11.1.0: 1231 | version "11.12.0" 1232 | resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" 1233 | integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== 1234 | 1235 | growl@1.10.5: 1236 | version "1.10.5" 1237 | resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" 1238 | integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== 1239 | 1240 | has-flag@^3.0.0: 1241 | version "3.0.0" 1242 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 1243 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 1244 | 1245 | has-flag@^4.0.0: 1246 | version "4.0.0" 1247 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 1248 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 1249 | 1250 | has-symbols@^1.0.0, has-symbols@^1.0.1: 1251 | version "1.0.1" 1252 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" 1253 | integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== 1254 | 1255 | has@^1.0.3: 1256 | version "1.0.3" 1257 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 1258 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 1259 | dependencies: 1260 | function-bind "^1.1.1" 1261 | 1262 | he@1.2.0: 1263 | version "1.2.0" 1264 | resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" 1265 | integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== 1266 | 1267 | inflight@^1.0.4: 1268 | version "1.0.6" 1269 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 1270 | dependencies: 1271 | once "^1.3.0" 1272 | wrappy "1" 1273 | 1274 | inherits@2: 1275 | version "2.0.3" 1276 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 1277 | 1278 | invariant@^2.2.2, invariant@^2.2.4: 1279 | version "2.2.4" 1280 | resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" 1281 | integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== 1282 | dependencies: 1283 | loose-envify "^1.0.0" 1284 | 1285 | is-binary-path@~2.1.0: 1286 | version "2.1.0" 1287 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 1288 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 1289 | dependencies: 1290 | binary-extensions "^2.0.0" 1291 | 1292 | is-buffer@~2.0.3: 1293 | version "2.0.4" 1294 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623" 1295 | integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A== 1296 | 1297 | is-callable@^1.1.4, is-callable@^1.1.5: 1298 | version "1.2.0" 1299 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.0.tgz#83336560b54a38e35e3a2df7afd0454d691468bb" 1300 | integrity sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw== 1301 | 1302 | is-date-object@^1.0.1: 1303 | version "1.0.2" 1304 | resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" 1305 | integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== 1306 | 1307 | is-extglob@^2.1.1: 1308 | version "2.1.1" 1309 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 1310 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 1311 | 1312 | is-fullwidth-code-point@^2.0.0: 1313 | version "2.0.0" 1314 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 1315 | integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= 1316 | 1317 | is-glob@^4.0.1, is-glob@~4.0.1: 1318 | version "4.0.1" 1319 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" 1320 | integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== 1321 | dependencies: 1322 | is-extglob "^2.1.1" 1323 | 1324 | is-number@^7.0.0: 1325 | version "7.0.0" 1326 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 1327 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 1328 | 1329 | is-regex@^1.0.5: 1330 | version "1.1.0" 1331 | resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.0.tgz#ece38e389e490df0dc21caea2bd596f987f767ff" 1332 | integrity sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw== 1333 | dependencies: 1334 | has-symbols "^1.0.1" 1335 | 1336 | is-symbol@^1.0.2: 1337 | version "1.0.3" 1338 | resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" 1339 | integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== 1340 | dependencies: 1341 | has-symbols "^1.0.1" 1342 | 1343 | isarray@0.0.1: 1344 | version "0.0.1" 1345 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" 1346 | integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= 1347 | 1348 | isexe@^2.0.0: 1349 | version "2.0.0" 1350 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1351 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 1352 | 1353 | jest-worker@^26.0.0: 1354 | version "26.0.0" 1355 | resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.0.0.tgz#4920c7714f0a96c6412464718d0c58a3df3fb066" 1356 | integrity sha512-pPaYa2+JnwmiZjK9x7p9BoZht+47ecFCDFA/CJxspHzeDvQcfVBLWzCiWyo+EGrSiQMWZtCFo9iSvMZnAAo8vw== 1357 | dependencies: 1358 | merge-stream "^2.0.0" 1359 | supports-color "^7.0.0" 1360 | 1361 | "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: 1362 | version "4.0.0" 1363 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 1364 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 1365 | 1366 | js-yaml@3.13.1: 1367 | version "3.13.1" 1368 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" 1369 | integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== 1370 | dependencies: 1371 | argparse "^1.0.7" 1372 | esprima "^4.0.0" 1373 | 1374 | jsesc@^2.5.1: 1375 | version "2.5.2" 1376 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" 1377 | integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== 1378 | 1379 | jsesc@~0.5.0: 1380 | version "0.5.0" 1381 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" 1382 | integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= 1383 | 1384 | json5@^2.1.2: 1385 | version "2.1.3" 1386 | resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" 1387 | integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== 1388 | dependencies: 1389 | minimist "^1.2.5" 1390 | 1391 | just-extend@^4.0.2: 1392 | version "4.1.0" 1393 | resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.1.0.tgz#7278a4027d889601640ee0ce0e5a00b992467da4" 1394 | integrity sha512-ApcjaOdVTJ7y4r08xI5wIqpvwS48Q0PBG4DJROcEkH1f8MdAiNFyFxz3xoL0LWAVwjrwPYZdVHHxhRHcx/uGLA== 1395 | 1396 | leven@^3.1.0: 1397 | version "3.1.0" 1398 | resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" 1399 | integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== 1400 | 1401 | levenary@^1.1.1: 1402 | version "1.1.1" 1403 | resolved "https://registry.yarnpkg.com/levenary/-/levenary-1.1.1.tgz#842a9ee98d2075aa7faeedbe32679e9205f46f77" 1404 | integrity sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ== 1405 | dependencies: 1406 | leven "^3.1.0" 1407 | 1408 | locate-path@^3.0.0: 1409 | version "3.0.0" 1410 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" 1411 | integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== 1412 | dependencies: 1413 | p-locate "^3.0.0" 1414 | path-exists "^3.0.0" 1415 | 1416 | lodash.get@^4.4.2: 1417 | version "4.4.2" 1418 | resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" 1419 | integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= 1420 | 1421 | lodash@^4.17.15, lodash@^4.17.19: 1422 | version "4.17.20" 1423 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" 1424 | integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== 1425 | 1426 | log-symbols@3.0.0: 1427 | version "3.0.0" 1428 | resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4" 1429 | integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ== 1430 | dependencies: 1431 | chalk "^2.4.2" 1432 | 1433 | loose-envify@^1.0.0: 1434 | version "1.4.0" 1435 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" 1436 | integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== 1437 | dependencies: 1438 | js-tokens "^3.0.0 || ^4.0.0" 1439 | 1440 | merge-stream@^2.0.0: 1441 | version "2.0.0" 1442 | resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" 1443 | integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== 1444 | 1445 | minimatch@3.0.4, minimatch@^3.0.4: 1446 | version "3.0.4" 1447 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 1448 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 1449 | dependencies: 1450 | brace-expansion "^1.1.7" 1451 | 1452 | minimist@^1.2.5: 1453 | version "1.2.5" 1454 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" 1455 | integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== 1456 | 1457 | mkdirp@0.5.5: 1458 | version "0.5.5" 1459 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" 1460 | integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== 1461 | dependencies: 1462 | minimist "^1.2.5" 1463 | 1464 | mocha@^7.2.0: 1465 | version "7.2.0" 1466 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.2.0.tgz#01cc227b00d875ab1eed03a75106689cfed5a604" 1467 | integrity sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ== 1468 | dependencies: 1469 | ansi-colors "3.2.3" 1470 | browser-stdout "1.3.1" 1471 | chokidar "3.3.0" 1472 | debug "3.2.6" 1473 | diff "3.5.0" 1474 | escape-string-regexp "1.0.5" 1475 | find-up "3.0.0" 1476 | glob "7.1.3" 1477 | growl "1.10.5" 1478 | he "1.2.0" 1479 | js-yaml "3.13.1" 1480 | log-symbols "3.0.0" 1481 | minimatch "3.0.4" 1482 | mkdirp "0.5.5" 1483 | ms "2.1.1" 1484 | node-environment-flags "1.0.6" 1485 | object.assign "4.1.0" 1486 | strip-json-comments "2.0.1" 1487 | supports-color "6.0.0" 1488 | which "1.3.1" 1489 | wide-align "1.1.3" 1490 | yargs "13.3.2" 1491 | yargs-parser "13.1.2" 1492 | yargs-unparser "1.6.0" 1493 | 1494 | ms@2.1.1: 1495 | version "2.1.1" 1496 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" 1497 | integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== 1498 | 1499 | ms@^2.1.1: 1500 | version "2.1.2" 1501 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1502 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1503 | 1504 | nise@^4.0.4: 1505 | version "4.0.4" 1506 | resolved "https://registry.yarnpkg.com/nise/-/nise-4.0.4.tgz#d73dea3e5731e6561992b8f570be9e363c4512dd" 1507 | integrity sha512-bTTRUNlemx6deJa+ZyoCUTRvH3liK5+N6VQZ4NIw90AgDXY6iPnsqplNFf6STcj+ePk0H/xqxnP75Lr0J0Fq3A== 1508 | dependencies: 1509 | "@sinonjs/commons" "^1.7.0" 1510 | "@sinonjs/fake-timers" "^6.0.0" 1511 | "@sinonjs/text-encoding" "^0.7.1" 1512 | just-extend "^4.0.2" 1513 | path-to-regexp "^1.7.0" 1514 | 1515 | node-environment-flags@1.0.6: 1516 | version "1.0.6" 1517 | resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.6.tgz#a30ac13621f6f7d674260a54dede048c3982c088" 1518 | integrity sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw== 1519 | dependencies: 1520 | object.getownpropertydescriptors "^2.0.3" 1521 | semver "^5.7.0" 1522 | 1523 | node-releases@^1.1.60: 1524 | version "1.1.60" 1525 | resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.60.tgz#6948bdfce8286f0b5d0e5a88e8384e954dfe7084" 1526 | integrity sha512-gsO4vjEdQaTusZAEebUWp2a5d7dF5DYoIpDG7WySnk7BuZDW+GPpHXoXXuYawRBr/9t5q54tirPz79kFIWg4dA== 1527 | 1528 | normalize-path@^3.0.0, normalize-path@~3.0.0: 1529 | version "3.0.0" 1530 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 1531 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 1532 | 1533 | object-inspect@^1.7.0: 1534 | version "1.7.0" 1535 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" 1536 | integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== 1537 | 1538 | object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: 1539 | version "1.1.1" 1540 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" 1541 | integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== 1542 | 1543 | object.assign@4.1.0, object.assign@^4.1.0: 1544 | version "4.1.0" 1545 | resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" 1546 | integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== 1547 | dependencies: 1548 | define-properties "^1.1.2" 1549 | function-bind "^1.1.1" 1550 | has-symbols "^1.0.0" 1551 | object-keys "^1.0.11" 1552 | 1553 | object.getownpropertydescriptors@^2.0.3: 1554 | version "2.1.0" 1555 | resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" 1556 | integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg== 1557 | dependencies: 1558 | define-properties "^1.1.3" 1559 | es-abstract "^1.17.0-next.1" 1560 | 1561 | once@^1.3.0: 1562 | version "1.4.0" 1563 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1564 | dependencies: 1565 | wrappy "1" 1566 | 1567 | p-limit@^2.0.0: 1568 | version "2.3.0" 1569 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" 1570 | integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== 1571 | dependencies: 1572 | p-try "^2.0.0" 1573 | 1574 | p-locate@^3.0.0: 1575 | version "3.0.0" 1576 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" 1577 | integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== 1578 | dependencies: 1579 | p-limit "^2.0.0" 1580 | 1581 | p-try@^2.0.0: 1582 | version "2.2.0" 1583 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" 1584 | integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== 1585 | 1586 | path-exists@^3.0.0: 1587 | version "3.0.0" 1588 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" 1589 | integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= 1590 | 1591 | path-is-absolute@^1.0.0: 1592 | version "1.0.1" 1593 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1594 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 1595 | 1596 | path-parse@^1.0.6: 1597 | version "1.0.6" 1598 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" 1599 | integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== 1600 | 1601 | path-to-regexp@^1.7.0: 1602 | version "1.8.0" 1603 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" 1604 | integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== 1605 | dependencies: 1606 | isarray "0.0.1" 1607 | 1608 | picomatch@^2.0.4, picomatch@^2.2.2: 1609 | version "2.2.2" 1610 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" 1611 | integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== 1612 | 1613 | randombytes@^2.1.0: 1614 | version "2.1.0" 1615 | resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" 1616 | integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== 1617 | dependencies: 1618 | safe-buffer "^5.1.0" 1619 | 1620 | readdirp@~3.2.0: 1621 | version "3.2.0" 1622 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.2.0.tgz#c30c33352b12c96dfb4b895421a49fd5a9593839" 1623 | integrity sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ== 1624 | dependencies: 1625 | picomatch "^2.0.4" 1626 | 1627 | regenerate-unicode-properties@^8.2.0: 1628 | version "8.2.0" 1629 | resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" 1630 | integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA== 1631 | dependencies: 1632 | regenerate "^1.4.0" 1633 | 1634 | regenerate@^1.4.0: 1635 | version "1.4.1" 1636 | resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.1.tgz#cad92ad8e6b591773485fbe05a485caf4f457e6f" 1637 | integrity sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A== 1638 | 1639 | regenerator-runtime@^0.13.4: 1640 | version "0.13.7" 1641 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" 1642 | integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== 1643 | 1644 | regenerator-transform@^0.14.2: 1645 | version "0.14.5" 1646 | resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" 1647 | integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw== 1648 | dependencies: 1649 | "@babel/runtime" "^7.8.4" 1650 | 1651 | regexpu-core@^4.7.0: 1652 | version "4.7.0" 1653 | resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.0.tgz#fcbf458c50431b0bb7b45d6967b8192d91f3d938" 1654 | integrity sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ== 1655 | dependencies: 1656 | regenerate "^1.4.0" 1657 | regenerate-unicode-properties "^8.2.0" 1658 | regjsgen "^0.5.1" 1659 | regjsparser "^0.6.4" 1660 | unicode-match-property-ecmascript "^1.0.4" 1661 | unicode-match-property-value-ecmascript "^1.2.0" 1662 | 1663 | regjsgen@^0.5.1: 1664 | version "0.5.2" 1665 | resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" 1666 | integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== 1667 | 1668 | regjsparser@^0.6.4: 1669 | version "0.6.4" 1670 | resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.4.tgz#a769f8684308401a66e9b529d2436ff4d0666272" 1671 | integrity sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw== 1672 | dependencies: 1673 | jsesc "~0.5.0" 1674 | 1675 | require-directory@^2.1.1: 1676 | version "2.1.1" 1677 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 1678 | integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= 1679 | 1680 | require-main-filename@^2.0.0: 1681 | version "2.0.0" 1682 | resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" 1683 | integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== 1684 | 1685 | resolve@^1.3.2: 1686 | version "1.17.0" 1687 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" 1688 | integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== 1689 | dependencies: 1690 | path-parse "^1.0.6" 1691 | 1692 | rollup-plugin-terser@^6.1.0: 1693 | version "6.1.0" 1694 | resolved "https://registry.yarnpkg.com/rollup-plugin-terser/-/rollup-plugin-terser-6.1.0.tgz#071866585aea104bfbb9dd1019ac523e63c81e45" 1695 | integrity sha512-4fB3M9nuoWxrwm39habpd4hvrbrde2W2GG4zEGPQg1YITNkM3Tqur5jSuXlWNzbv/2aMLJ+dZJaySc3GCD8oDw== 1696 | dependencies: 1697 | "@babel/code-frame" "^7.8.3" 1698 | jest-worker "^26.0.0" 1699 | serialize-javascript "^3.0.0" 1700 | terser "^4.7.0" 1701 | 1702 | rollup@^2.13.1: 1703 | version "2.26.8" 1704 | resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.26.8.tgz#7b02353835a73c4797f42177a5fa3fc074012713" 1705 | integrity sha512-li9WaJYc5z9WzV1jhZbPQCrsOpGNsI+Li1qyrn5n745ZNSnlkRlBtj1Hs+Z0Dc2N1+P7HT34UKAEASqN9Th8cg== 1706 | optionalDependencies: 1707 | fsevents "~2.1.2" 1708 | 1709 | safe-buffer@^5.1.0: 1710 | version "5.2.1" 1711 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 1712 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 1713 | 1714 | safe-buffer@~5.1.1: 1715 | version "5.1.2" 1716 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 1717 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 1718 | 1719 | semver@7.0.0: 1720 | version "7.0.0" 1721 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" 1722 | integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== 1723 | 1724 | semver@^5.4.1, semver@^5.5.0, semver@^5.7.0: 1725 | version "5.7.1" 1726 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 1727 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 1728 | 1729 | serialize-javascript@^3.0.0: 1730 | version "3.1.0" 1731 | resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-3.1.0.tgz#8bf3a9170712664ef2561b44b691eafe399214ea" 1732 | integrity sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg== 1733 | dependencies: 1734 | randombytes "^2.1.0" 1735 | 1736 | set-blocking@^2.0.0: 1737 | version "2.0.0" 1738 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 1739 | integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= 1740 | 1741 | sinon@^9.0.2: 1742 | version "9.0.3" 1743 | resolved "https://registry.yarnpkg.com/sinon/-/sinon-9.0.3.tgz#bffc3ec28c936332cd2a41833547b9eed201ecff" 1744 | integrity sha512-IKo9MIM111+smz9JGwLmw5U1075n1YXeAq8YeSFlndCLhAL5KGn6bLgu7b/4AYHTV/LcEMcRm2wU2YiL55/6Pg== 1745 | dependencies: 1746 | "@sinonjs/commons" "^1.7.2" 1747 | "@sinonjs/fake-timers" "^6.0.1" 1748 | "@sinonjs/formatio" "^5.0.1" 1749 | "@sinonjs/samsam" "^5.1.0" 1750 | diff "^4.0.2" 1751 | nise "^4.0.4" 1752 | supports-color "^7.1.0" 1753 | 1754 | source-map-support@~0.5.12: 1755 | version "0.5.19" 1756 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" 1757 | integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== 1758 | dependencies: 1759 | buffer-from "^1.0.0" 1760 | source-map "^0.6.0" 1761 | 1762 | source-map@^0.5.0: 1763 | version "0.5.7" 1764 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" 1765 | integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= 1766 | 1767 | source-map@^0.6.0, source-map@~0.6.1: 1768 | version "0.6.1" 1769 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 1770 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 1771 | 1772 | sprintf-js@~1.0.2: 1773 | version "1.0.3" 1774 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 1775 | integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= 1776 | 1777 | "string-width@^1.0.2 || 2": 1778 | version "2.1.1" 1779 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 1780 | integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== 1781 | dependencies: 1782 | is-fullwidth-code-point "^2.0.0" 1783 | strip-ansi "^4.0.0" 1784 | 1785 | string-width@^3.0.0, string-width@^3.1.0: 1786 | version "3.1.0" 1787 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" 1788 | integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== 1789 | dependencies: 1790 | emoji-regex "^7.0.1" 1791 | is-fullwidth-code-point "^2.0.0" 1792 | strip-ansi "^5.1.0" 1793 | 1794 | string.prototype.trimend@^1.0.0: 1795 | version "1.0.1" 1796 | resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" 1797 | integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== 1798 | dependencies: 1799 | define-properties "^1.1.3" 1800 | es-abstract "^1.17.5" 1801 | 1802 | string.prototype.trimleft@^2.1.1: 1803 | version "2.1.2" 1804 | resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz#4408aa2e5d6ddd0c9a80739b087fbc067c03b3cc" 1805 | integrity sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw== 1806 | dependencies: 1807 | define-properties "^1.1.3" 1808 | es-abstract "^1.17.5" 1809 | string.prototype.trimstart "^1.0.0" 1810 | 1811 | string.prototype.trimright@^2.1.1: 1812 | version "2.1.2" 1813 | resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz#c76f1cef30f21bbad8afeb8db1511496cfb0f2a3" 1814 | integrity sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg== 1815 | dependencies: 1816 | define-properties "^1.1.3" 1817 | es-abstract "^1.17.5" 1818 | string.prototype.trimend "^1.0.0" 1819 | 1820 | string.prototype.trimstart@^1.0.0: 1821 | version "1.0.1" 1822 | resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" 1823 | integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== 1824 | dependencies: 1825 | define-properties "^1.1.3" 1826 | es-abstract "^1.17.5" 1827 | 1828 | strip-ansi@^4.0.0: 1829 | version "4.0.0" 1830 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 1831 | integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= 1832 | dependencies: 1833 | ansi-regex "^3.0.0" 1834 | 1835 | strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: 1836 | version "5.2.0" 1837 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" 1838 | integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== 1839 | dependencies: 1840 | ansi-regex "^4.1.0" 1841 | 1842 | strip-json-comments@2.0.1: 1843 | version "2.0.1" 1844 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 1845 | integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= 1846 | 1847 | supports-color@6.0.0: 1848 | version "6.0.0" 1849 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a" 1850 | integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg== 1851 | dependencies: 1852 | has-flag "^3.0.0" 1853 | 1854 | supports-color@^5.3.0: 1855 | version "5.5.0" 1856 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 1857 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 1858 | dependencies: 1859 | has-flag "^3.0.0" 1860 | 1861 | supports-color@^7.0.0: 1862 | version "7.1.0" 1863 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" 1864 | integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== 1865 | dependencies: 1866 | has-flag "^4.0.0" 1867 | 1868 | supports-color@^7.1.0: 1869 | version "7.2.0" 1870 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 1871 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 1872 | dependencies: 1873 | has-flag "^4.0.0" 1874 | 1875 | terser@^4.7.0: 1876 | version "4.7.0" 1877 | resolved "https://registry.yarnpkg.com/terser/-/terser-4.7.0.tgz#15852cf1a08e3256a80428e865a2fa893ffba006" 1878 | integrity sha512-Lfb0RiZcjRDXCC3OSHJpEkxJ9Qeqs6mp2v4jf2MHfy8vGERmVDuvjXdd/EnP5Deme5F2yBRBymKmKHCBg2echw== 1879 | dependencies: 1880 | commander "^2.20.0" 1881 | source-map "~0.6.1" 1882 | source-map-support "~0.5.12" 1883 | 1884 | to-fast-properties@^2.0.0: 1885 | version "2.0.0" 1886 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" 1887 | integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= 1888 | 1889 | to-regex-range@^5.0.1: 1890 | version "5.0.1" 1891 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 1892 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 1893 | dependencies: 1894 | is-number "^7.0.0" 1895 | 1896 | type-detect@4.0.8, type-detect@^4.0.8: 1897 | version "4.0.8" 1898 | resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" 1899 | integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== 1900 | 1901 | unicode-canonical-property-names-ecmascript@^1.0.4: 1902 | version "1.0.4" 1903 | resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" 1904 | integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== 1905 | 1906 | unicode-match-property-ecmascript@^1.0.4: 1907 | version "1.0.4" 1908 | resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" 1909 | integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== 1910 | dependencies: 1911 | unicode-canonical-property-names-ecmascript "^1.0.4" 1912 | unicode-property-aliases-ecmascript "^1.0.4" 1913 | 1914 | unicode-match-property-value-ecmascript@^1.2.0: 1915 | version "1.2.0" 1916 | resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531" 1917 | integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ== 1918 | 1919 | unicode-property-aliases-ecmascript@^1.0.4: 1920 | version "1.1.0" 1921 | resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4" 1922 | integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg== 1923 | 1924 | which-module@^2.0.0: 1925 | version "2.0.0" 1926 | resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" 1927 | integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= 1928 | 1929 | which@1.3.1: 1930 | version "1.3.1" 1931 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 1932 | integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== 1933 | dependencies: 1934 | isexe "^2.0.0" 1935 | 1936 | wide-align@1.1.3: 1937 | version "1.1.3" 1938 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" 1939 | integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== 1940 | dependencies: 1941 | string-width "^1.0.2 || 2" 1942 | 1943 | wrap-ansi@^5.1.0: 1944 | version "5.1.0" 1945 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" 1946 | integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== 1947 | dependencies: 1948 | ansi-styles "^3.2.0" 1949 | string-width "^3.0.0" 1950 | strip-ansi "^5.0.0" 1951 | 1952 | wrappy@1: 1953 | version "1.0.2" 1954 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1955 | 1956 | y18n@^4.0.0: 1957 | version "4.0.0" 1958 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" 1959 | integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== 1960 | 1961 | yargs-parser@13.1.2, yargs-parser@^13.1.2: 1962 | version "13.1.2" 1963 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" 1964 | integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== 1965 | dependencies: 1966 | camelcase "^5.0.0" 1967 | decamelize "^1.2.0" 1968 | 1969 | yargs-unparser@1.6.0: 1970 | version "1.6.0" 1971 | resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f" 1972 | integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw== 1973 | dependencies: 1974 | flat "^4.1.0" 1975 | lodash "^4.17.15" 1976 | yargs "^13.3.0" 1977 | 1978 | yargs@13.3.2, yargs@^13.3.0: 1979 | version "13.3.2" 1980 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" 1981 | integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== 1982 | dependencies: 1983 | cliui "^5.0.0" 1984 | find-up "^3.0.0" 1985 | get-caller-file "^2.0.1" 1986 | require-directory "^2.1.1" 1987 | require-main-filename "^2.0.0" 1988 | set-blocking "^2.0.0" 1989 | string-width "^3.0.0" 1990 | which-module "^2.0.0" 1991 | y18n "^4.0.0" 1992 | yargs-parser "^13.1.2" 1993 | --------------------------------------------------------------------------------