diff --git a/README.md b/README.md index 97d98eb..ee5d6dd 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ #### Bring your own sound. -Use AudioKeys to power the QWERTY keyboard in your next Web Audio project. AudioKeys provides **intelligent handling of key events**, giving you key up and key down events that you can use to trigger your sounds. +Use AudioKeys to power the typing keyboard in your next Web Audio project. AudioKeys provides **intelligent handling of key events**, giving you key up and key down events that you can use to trigger your sounds. AudioKeys provides **configurable polyphony**— if you're making a monophonic synth, choose from the common note priorities "last note", "first note", "highest note", or "lowest note". It also handles odd situations like switching tabs— AudioKeys fires a note off event when your browser window goes out of focus. @@ -126,6 +126,12 @@ For more on note priority, check out [this Sound on Sound article](https://web.a ###### `rootNote` Determines what note the lowest key on the keyboard will represent. The default is `60` (C4). Keep in mind that setting it to a note other than C (36, 48, 60, 72, 84, etc.) will result in the key mappings not lining up like a regular keyboard! +###### `layoutIndependentMapping` + +Whether to identify keyboardEvents using the keyboard layout-independent `e.code` instead of the (deprecated) QWERTY-only `e.keyCode`. +`true` recommended. +Default: `false` for backward-compatibility. + ------------------------------------ @@ -134,4 +140,4 @@ Determines what note the lowest key on the keyboard will represent. The default - [x] Implement octave shifting (for `rows=1`) - [x] Implement velocity selection (for `rows=1`) - [ ] Demo site -- [ ] Add MIDI support \ No newline at end of file +- [ ] Add MIDI support diff --git a/dist/audiokeys.js b/dist/audiokeys.js index 39dc477..7824724 100644 --- a/dist/audiokeys.js +++ b/dist/audiokeys.js @@ -14,28 +14,33 @@ module.exports = { _addKey: function(e) { + const identifier = this._getIdentifier(e); + var self = this; - // if the keyCode is one that can be mapped and isn't + // if the code is one that can be mapped and isn't // already pressed, add it to the key object. - if(self._isNote(e.keyCode) && !self._isPressed(e.keyCode)) { - var newKey = self._makeNote(e.keyCode); + if(self._isNote(identifier) && !self._isPressed(identifier)) { + var newKey = self._makeNote(identifier); // add the newKey to the list of keys self._state.keys = (self._state.keys || []).concat(newKey); // reevaluate the active notes based on our priority rules. // give it the new note to use if there is an event to trigger. self._update(); - } else if(self._isSpecialKey(e.keyCode)) { - self._specialKey(e.keyCode); + } else if(self._isSpecialKey(identifier)) { + self._specialKey(identifier); } }, _removeKey: function(e) { + const identifier = this._getIdentifier(e); + var self = this; - // if the keyCode is active, remove it from the key object. - if(self._isPressed(e.keyCode)) { + // if the code is active, remove it from the key object. + if(self._isPressed(identifier)) { var keyToRemove; - for(var i = 0; i < self._state.keys.length; i++) { - if(self._state.keys[i].keyCode === e.keyCode) { + for (var i = 0; i < self._state.keys.length; i++) { + const other = self._getIdentifier(self._state.keys[i]); + if(other === identifier) { keyToRemove = self._state.keys[i]; break; } @@ -47,15 +52,16 @@ module.exports = { } }, - _isPressed: function(keyCode) { + _isPressed: function(code) { var self = this; if(!self._state.keys || !self._state.keys.length) { return false; } - for(var i = 0; i < self._state.keys.length; i++) { - if(self._state.keys[i].keyCode === keyCode) { + for (var i = 0; i < self._state.keys.length; i++) { + const other = self._getIdentifier(self._state.keys[i]); + if(other === code) { return true; } } @@ -63,14 +69,16 @@ module.exports = { }, // turn a key object into a note object for the event listeners. - _makeNote: function(keyCode) { + _makeNote: function(code) { var self = this; - return { - keyCode: keyCode, - note: self._map(keyCode), - frequency: self._toFrequency( self._map(keyCode) ), - velocity: self._state.velocity + const note = { + note: self._map(code), + frequency: self._toFrequency(self._map(code)), + velocity: self._state.velocity, }; + const identifier = self._state.layoutIndependentMapping ? 'code' : 'keyCode'; + note[identifier] = code; + return note; }, // clear any active notes @@ -116,13 +124,9 @@ module.exports = { // if it's not in the OLD buffer, it's a note ON. // if it's not in the NEW buffer, it's a note OFF. - var oldNotes = oldBuffer.map( function(key) { - return key.keyCode; - }); + var oldNotes = oldBuffer.map(self._getIdentifier.bind(self)); - var newNotes = self._state.buffer.map( function(key) { - return key.keyCode; - }); + var newNotes = self._state.buffer.map(self._getIdentifier.bind(self)); // check for old (removed) notes var notesToRemove = []; @@ -142,17 +146,19 @@ module.exports = { notesToAdd.forEach( function(key) { for(var i = 0; i < self._state.buffer.length; i++) { - if(self._state.buffer[i].keyCode === key) { + const other = self._getIdentifier(self._state.buffer[i]); + if(other === key) { self._trigger('down', self._state.buffer[i]); break; } } }); - notesToRemove.forEach( function(key) { + notesToRemove.forEach(function(key) { // these need to fire the entire object for(var i = 0; i < oldBuffer.length; i++) { - if(oldBuffer[i].keyCode === key) { + const other = self._getIdentifier(oldBuffer[i]); + if(other === key) { // note up events should have a velocity of 0 oldBuffer[i].velocity = 0; self._trigger('up', oldBuffer[i]); @@ -249,6 +255,9 @@ function AudioKeys(options) { var self = this; self._setState(options); + // initialize key mapping according to keyIdentifier used + self._keyMap = self._getKeyMap(self._state.layoutIndependentMapping); + self._specialKeyMap = self._getSpecialKeyMap(self._state.layoutIndependentMapping); // all listeners are stored in arrays in their respective properties. // e.g. self._listeners.down = [fn1, fn2, ... ] @@ -275,7 +284,8 @@ AudioKeys.prototype._map = mapping._map; AudioKeys.prototype._offset = mapping._offset; AudioKeys.prototype._isNote = mapping._isNote; AudioKeys.prototype._toFrequency = mapping._toFrequency; -AudioKeys.prototype._keyMap = mapping._keyMap; +AudioKeys.prototype._getIdentifier = mapping._getIdentifier; +AudioKeys.prototype._getKeyMap = mapping._getKeyMap; // buffer AudioKeys.prototype._addKey = buffer._addKey; @@ -296,25 +306,26 @@ AudioKeys.prototype._lowest = priority._lowest; // special AudioKeys.prototype._isSpecialKey = special._isSpecialKey; AudioKeys.prototype._specialKey = special._specialKey; -AudioKeys.prototype._specialKeyMap = special._specialKeyMap; +AudioKeys.prototype._getSpecialKeyMap = special._getSpecialKeyMap; // Browserify will take care of making this a global // in a browser environment without a build system. module.exports = AudioKeys; + },{"./AudioKeys.buffer":1,"./AudioKeys.events":2,"./AudioKeys.mapping":4,"./AudioKeys.priority":5,"./AudioKeys.special":6,"./AudioKeys.state":7}],4:[function(require,module,exports){ module.exports = { - // _map returns the midi note for a given keyCode. - _map: function(keyCode) { - return this._keyMap[this._state.rows][keyCode] + this._offset(); + // _map returns the midi note for a given code. + _map: function(code) { + return this._keyMap[this._state.rows][code] + this._offset(); }, _offset: function() { return this._state.rootNote - this._keyMap[this._state.rows].root + (this._state.octave * 12); }, - // _isNote determines whether a keyCode is a note or not. - _isNote: function(keyCode) { - return !!this._keyMap[this._state.rows][keyCode]; + // _isNote determines whether a code is a note or not. + _isNote: function(code) { + return !!this._keyMap[this._state.rows][code]; }, // convert a midi note to a frequency. we assume here that _map has @@ -323,78 +334,153 @@ module.exports = { return ( Math.pow(2, ( note-69 ) / 12) ) * 440.0; }, - // the object keys correspond to `rows`, so `_keyMap[rows]` should - // retrieve that particular mapping. - _keyMap: { - 1: { - root: 60, - // starting with the 'a' key - 65: 60, - 87: 61, - 83: 62, - 69: 63, - 68: 64, - 70: 65, - 84: 66, - 71: 67, - 89: 68, - 72: 69, - 85: 70, - 74: 71, - 75: 72, - 79: 73, - 76: 74, - 80: 75, - 186: 76, - 222: 77 - }, - 2: { - root: 60, - // bottom row - 90: 60, - 83: 61, - 88: 62, - 68: 63, - 67: 64, - 86: 65, - 71: 66, - 66: 67, - 72: 68, - 78: 69, - 74: 70, - 77: 71, - 188: 72, - 76: 73, - 190: 74, - 186: 75, - 191: 76, - // top row - 81: 72, - 50: 73, - 87: 74, - 51: 75, - 69: 76, - 82: 77, - 53: 78, - 84: 79, - 54: 80, - 89: 81, - 55: 82, - 85: 83, - 73: 84, - 57: 85, - 79: 86, - 48: 87, - 80: 88, - 219: 89, - 187: 90, - 221: 91 - } + // retrieve appropriate key identifier from keyboard event + _getIdentifier: function(e) { + var self = this; + return e[self._state.layoutIndependentMapping ? 'code' : 'keyCode']; }, + _getKeyMap: function(useLayoutIndependentMapping) { + // the object keys correspond to `rows`, so `_keyMap[rows]` should + // retrieve that particular mapping. + if (useLayoutIndependentMapping) { + return { + 1: { + root: 60, + // starting with the 'a' key + KeyA: 60, + KeyW: 61, + KeyS: 62, + KeyE: 63, + KeyD: 64, + KeyF: 65, + KeyT: 66, + KeyG: 67, + KeyY: 68, + KeyH: 69, + KeyU: 70, + KeyJ: 71, + KeyK: 72, + KeyO: 73, + KeyL: 74, + KeyP: 75, + SemiColon: 76, + Quote: 77, + }, + 2: { + root: 60, + // bottom row + KeyZ: 60, + KeyS: 61, + KeyX: 62, + KeyD: 63, + KeyC: 64, + KeyV: 65, + KeyG: 66, + KeyB: 67, + KeyH: 68, + KeyN: 69, + KeyJ: 70, + KeyM: 71, + Comma: 72, + KeyL: 73, + Period: 74, + SemiColon: 75, + Slash: 76, + // top row + KeyQ: 72, + Digit2: 73, + KeyW: 74, + Digit3: 75, + KeyE: 76, + KeyR: 77, + Digit5: 78, + KeyT: 79, + Digit6: 80, + KeyY: 81, + Digit7: 82, + KeyU: 83, + KeyI: 84, + Digit9: 85, + KeyO: 86, + Digit0: 87, + KeyP: 88, + BracketLeft: 89, + Equal: 90, + BracketRight: 91, + } + } + } else { + return { + 1: { + root: 60, + // starting with the 'a' key + 65: 60, + 87: 61, + 83: 62, + 69: 63, + 68: 64, + 70: 65, + 84: 66, + 71: 67, + 89: 68, + 72: 69, + 85: 70, + 74: 71, + 75: 72, + 79: 73, + 76: 74, + 80: 75, + 186: 76, + 222: 77, + }, + 2: { + root: 60, + // bottom row + 90: 60, + 83: 61, + 88: 62, + 68: 63, + 67: 64, + 86: 65, + 71: 66, + 66: 67, + 72: 68, + 78: 69, + 74: 70, + 77: 71, + 188: 72, + 76: 73, + 190: 74, + 186: 75, + 191: 76, + // top row + 81: 72, + 50: 73, + 87: 74, + 51: 75, + 69: 76, + 82: 77, + 53: 78, + 84: 79, + 54: 80, + 89: 81, + 55: 82, + 85: 83, + 73: 84, + 57: 85, + 79: 86, + 48: 87, + 80: 88, + 219: 89, + 187: 90, + 221: 91, + }, + } + } + } }; - },{}],5:[function(require,module,exports){ module.exports = { _prioritize: function() { @@ -504,74 +590,136 @@ module.exports = { // This file maps special keys to the state— octave shifting and // velocity selection, both available when `rows` = 1. module.exports = { - _isSpecialKey: function(keyCode) { - return (this._state.rows === 1 && this._specialKeyMap[keyCode]); + _isSpecialKey: function(code) { + return this._state.rows === 1 && this._specialKeyMap[code]; }, - _specialKey: function(keyCode) { + _specialKey: function(code) { var self = this; - if(self._specialKeyMap[keyCode].type === 'octave' && self._state.octaveControls) { + if( + self._specialKeyMap[code].type === 'octave' && + self._state.octaveControls + ) { // shift the state of the `octave` - self._state.octave += self._specialKeyMap[keyCode].value; - } else if(self._specialKeyMap[keyCode].type === 'velocity' && self._state.velocityControls) { + self._state.octave += self._specialKeyMap[code].value; + } else if( + self._specialKeyMap[code].type === 'velocity' && + self._state.velocityControls + ) { // set the `velocity` to a new value - self._state.velocity = self._specialKeyMap[keyCode].value; + self._state.velocity = self._specialKeyMap[code].value; } }, - _specialKeyMap: { - // octaves - 90: { - type: 'octave', - value: -1 - }, - 88: { - type: 'octave', - value: 1 - }, - // velocity - 49: { - type: 'velocity', - value: 1 - }, - 50: { - type: 'velocity', - value: 14 - }, - 51: { - type: 'velocity', - value: 28 - }, - 52: { - type: 'velocity', - value: 42 - }, - 53: { - type: 'velocity', - value: 56 - }, - 54: { - type: 'velocity', - value: 70 - }, - 55: { - type: 'velocity', - value: 84 - }, - 56: { - type: 'velocity', - value: 98 - }, - 57: { - type: 'velocity', - value: 112 - }, - 48: { - type: 'velocity', - value: 127 - }, + _getSpecialKeyMap: function(useLayoutIndependentMapping) { + if (useLayoutIndependentMapping) { + return { + // octaves + KeyZ: { + type: 'octave', + value: -1, + }, + KeyX: { + type: 'octave', + value: 1, + }, + // velocity + Digit1: { + type: 'velocity', + value: 1, + }, + Digit2: { + type: 'velocity', + value: 14, + }, + Digit3: { + type: 'velocity', + value: 28, + }, + Digit4: { + type: 'velocity', + value: 42, + }, + Digit5: { + type: 'velocity', + value: 56, + }, + Digit6: { + type: 'velocity', + value: 70, + }, + Digit7: { + type: 'velocity', + value: 84, + }, + Digit8: { + type: 'velocity', + value: 98, + }, + Digit9: { + type: 'velocity', + value: 112, + }, + Digit0: { + type: 'velocity', + value: 127, + }, + } + } else { + return { + // octaves + 90: { + type: 'octave', + value: -1, + }, + 88: { + type: 'octave', + value: 1, + }, + // velocity + 49: { + type: 'velocity', + value: 1, + }, + 50: { + type: 'velocity', + value: 14, + }, + 51: { + type: 'velocity', + value: 28, + }, + 52: { + type: 'velocity', + value: 42, + }, + 53: { + type: 'velocity', + value: 56, + }, + 54: { + type: 'velocity', + value: 70, + }, + 55: { + type: 'velocity', + value: 84, + }, + 56: { + type: 'velocity', + value: 98, + }, + 57: { + type: 'velocity', + value: 112, + }, + 48: { + type: 'velocity', + value: 127, + }, + } + } }, - }; },{}],7:[function(require,module,exports){ @@ -597,7 +745,8 @@ module.exports = { velocityControls: true, velocity: 127, keys: [], - buffer: [] + buffer: [], + layoutIndependentMapping: false }); // ... and override them with options. diff --git a/dist/audiokeys.min.js b/dist/audiokeys.min.js index d7cdfc2..c2b97a0 100644 --- a/dist/audiokeys.min.js +++ b/dist/audiokeys.min.js @@ -1 +1 @@ -!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.AudioKeys=e()}}(function(){return function e(t,o,i){function s(n,a){if(!o[n]){if(!t[n]){var p="function"==typeof require&&require;if(!a&&p)return p(n,!0);if(r)return r(n,!0);var y=new Error("Cannot find module '"+n+"'");throw y.code="MODULE_NOT_FOUND",y}var _=o[n]={exports:{}};t[n][0].call(_.exports,function(e){var o=t[n][1][e];return s(o||e)},_,_.exports,e,t,o,i)}return o[n].exports}for(var r="function"==typeof require&&require,n=0;n=e._state.keys.length?e._state.keys=e._state.keys.map(function(e){return e.isActive=!0,e}):(e._state.keys=e._state.keys.map(function(e){return e.isActive=!1,e}),e["_"+e._state.priority]()),e._state.buffer=[],e._state.keys.forEach(function(t){t.isActive&&e._state.buffer.push(t)})},_last:function(){for(var e=this,t=e._state.keys.length-e._state.polyphony;t=e._state.keys.length?e._state.keys=e._state.keys.map(function(e){return e.isActive=!0,e}):(e._state.keys=e._state.keys.map(function(e){return e.isActive=!1,e}),e["_"+e._state.priority]()),e._state.buffer=[],e._state.keys.forEach(function(t){t.isActive&&e._state.buffer.push(t)})},_last:function(){for(var e=this,t=e._state.keys.length-e._state.polyphony;t=2.2.7 <3" } }, "acorn": { @@ -36,9 +36,9 @@ "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", "dev": true, "requires": { - "kind-of": "3.2.2", - "longest": "1.0.1", - "repeat-string": "1.6.1" + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" } }, "amdefine": { @@ -71,7 +71,7 @@ "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "dev": true, "requires": { - "arr-flatten": "1.1.0" + "arr-flatten": "^1.0.1" } }, "arr-flatten": { @@ -140,9 +140,9 @@ "integrity": "sha512-b/OsSjvWEo8Pi8H0zsDd2P6Uqo2TK2pH8gNLSJtNLM2Db0v2QaAZ0pBQJXVjAn4gBuugeVDr7s63ZogpUIwWDg==", "dev": true, "requires": { - "bn.js": "4.11.8", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, "assert": { @@ -160,7 +160,7 @@ "integrity": "sha1-e9QXhNMkk5h66yOba04cV6hzuRc=", "dev": true, "requires": { - "acorn": "4.0.13" + "acorn": "^4.0.3" } }, "atob": { @@ -193,7 +193,7 @@ "integrity": "sha1-wGt5evCF6gC8Unr8jvzxHeIjIFQ=", "dev": true, "requires": { - "readable-stream": "1.0.34" + "readable-stream": "~1.0.26" }, "dependencies": { "readable-stream": { @@ -202,10 +202,10 @@ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", "isarray": "0.0.1", - "string_decoder": "0.10.31" + "string_decoder": "~0.10.x" } } } @@ -222,7 +222,7 @@ "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", "dev": true, "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, @@ -232,9 +232,9 @@ "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "dev": true, "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" } }, "brorand": { @@ -249,11 +249,11 @@ "integrity": "sha1-+GzWzvT1MAyOY+B6TVEvZfv/RTE=", "dev": true, "requires": { - "JSONStream": "1.3.1", - "combine-source-map": "0.7.2", - "defined": "1.0.0", - "through2": "2.0.3", - "umd": "3.0.1" + "JSONStream": "^1.0.3", + "combine-source-map": "~0.7.1", + "defined": "^1.0.0", + "through2": "^2.0.0", + "umd": "^3.0.0" } }, "browser-resolve": { @@ -279,53 +279,53 @@ "integrity": "sha512-gKfOsNQv/toWz+60nSPfYzuwSEdzvV2WdxrVPUbPD/qui44rAkB3t3muNtmmGYHqrG56FGwX9SUEQmzNLAeS7g==", "dev": true, "requires": { - "JSONStream": "1.3.1", - "assert": "1.4.1", - "browser-pack": "6.0.2", - "browser-resolve": "1.11.2", - "browserify-zlib": "0.2.0", - "buffer": "5.0.8", - "cached-path-relative": "1.0.1", - "concat-stream": "1.5.2", - "console-browserify": "1.1.0", - "constants-browserify": "1.0.0", - "crypto-browserify": "3.12.0", - "defined": "1.0.0", - "deps-sort": "2.0.0", - "domain-browser": "1.1.7", - "duplexer2": "0.1.4", - "events": "1.1.1", - "glob": "7.1.2", - "has": "1.0.1", - "htmlescape": "1.1.1", - "https-browserify": "1.0.0", - "inherits": "2.0.3", - "insert-module-globals": "7.0.1", - "labeled-stream-splicer": "2.0.0", - "module-deps": "4.1.1", - "os-browserify": "0.3.0", - "parents": "1.0.1", - "path-browserify": "0.0.0", - "process": "0.11.10", - "punycode": "1.4.1", - "querystring-es3": "0.2.1", - "read-only-stream": "2.0.0", - "readable-stream": "2.3.3", - "resolve": "1.5.0", - "shasum": "1.0.2", - "shell-quote": "1.6.1", - "stream-browserify": "2.0.1", - "stream-http": "2.7.2", - "string_decoder": "1.0.3", - "subarg": "1.0.0", - "syntax-error": "1.3.0", - "through2": "2.0.3", - "timers-browserify": "1.4.2", - "tty-browserify": "0.0.0", - "url": "0.11.0", - "util": "0.10.3", - "vm-browserify": "0.0.4", - "xtend": "4.0.1" + "JSONStream": "^1.0.3", + "assert": "^1.4.0", + "browser-pack": "^6.0.1", + "browser-resolve": "^1.11.0", + "browserify-zlib": "~0.2.0", + "buffer": "^5.0.2", + "cached-path-relative": "^1.0.0", + "concat-stream": "~1.5.1", + "console-browserify": "^1.1.0", + "constants-browserify": "~1.0.0", + "crypto-browserify": "^3.0.0", + "defined": "^1.0.0", + "deps-sort": "^2.0.0", + "domain-browser": "~1.1.0", + "duplexer2": "~0.1.2", + "events": "~1.1.0", + "glob": "^7.1.0", + "has": "^1.0.0", + "htmlescape": "^1.1.0", + "https-browserify": "^1.0.0", + "inherits": "~2.0.1", + "insert-module-globals": "^7.0.0", + "labeled-stream-splicer": "^2.0.0", + "module-deps": "^4.0.8", + "os-browserify": "~0.3.0", + "parents": "^1.0.1", + "path-browserify": "~0.0.0", + "process": "~0.11.0", + "punycode": "^1.3.2", + "querystring-es3": "~0.2.0", + "read-only-stream": "^2.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.1.4", + "shasum": "^1.0.0", + "shell-quote": "^1.6.1", + "stream-browserify": "^2.0.0", + "stream-http": "^2.0.0", + "string_decoder": "~1.0.0", + "subarg": "^1.0.0", + "syntax-error": "^1.1.1", + "through2": "^2.0.0", + "timers-browserify": "^1.0.1", + "tty-browserify": "~0.0.0", + "url": "~0.11.0", + "util": "~0.10.1", + "vm-browserify": "~0.0.1", + "xtend": "^4.0.0" }, "dependencies": { "duplexer2": { @@ -334,7 +334,7 @@ "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", "dev": true, "requires": { - "readable-stream": "2.3.3" + "readable-stream": "^2.0.2" } }, "glob": { @@ -343,12 +343,12 @@ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.3.3", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "isarray": { @@ -363,7 +363,7 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "1.1.8" + "brace-expansion": "^1.1.7" } }, "readable-stream": { @@ -372,13 +372,13 @@ "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.0.3", + "util-deprecate": "~1.0.1" } }, "string_decoder": { @@ -387,7 +387,7 @@ "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } } } @@ -398,12 +398,12 @@ "integrity": "sha512-UGnTYAnB2a3YuYKIRy1/4FB2HdM866E0qC46JXvVTYKlBlZlnvfpSfY6OKfXZAkv70eJ2a1SqzpAo5CRhZGDFg==", "dev": true, "requires": { - "buffer-xor": "1.0.3", - "cipher-base": "1.0.4", - "create-hash": "1.1.3", - "evp_bytestokey": "1.0.3", - "inherits": "2.0.3", - "safe-buffer": "5.1.1" + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "browserify-cipher": { @@ -412,9 +412,9 @@ "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", "dev": true, "requires": { - "browserify-aes": "1.1.1", - "browserify-des": "1.0.0", - "evp_bytestokey": "1.0.3" + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" } }, "browserify-des": { @@ -423,9 +423,9 @@ "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", "dev": true, "requires": { - "cipher-base": "1.0.4", - "des.js": "1.0.0", - "inherits": "2.0.3" + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1" } }, "browserify-rsa": { @@ -434,8 +434,8 @@ "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "dev": true, "requires": { - "bn.js": "4.11.8", - "randombytes": "2.0.5" + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" } }, "browserify-sign": { @@ -444,13 +444,13 @@ "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", "dev": true, "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "elliptic": "6.4.0", - "inherits": "2.0.3", - "parse-asn1": "5.1.0" + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" } }, "browserify-zlib": { @@ -459,7 +459,7 @@ "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", "dev": true, "requires": { - "pako": "1.0.6" + "pako": "~1.0.5" } }, "buffer": { @@ -468,8 +468,8 @@ "integrity": "sha512-xXvjQhVNz50v2nPeoOsNqWCLGfiv4ji/gXZM28jnVwdLJxH4mFyqgqCKfaK9zf1KUbG6zTkjLOy7ou+jSMarGA==", "dev": true, "requires": { - "base64-js": "1.2.1", - "ieee754": "1.1.8" + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" } }, "buffer-xor": { @@ -508,8 +508,8 @@ "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", "dev": true, "requires": { - "camelcase": "2.1.1", - "map-obj": "1.0.1" + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" } }, "center-align": { @@ -518,8 +518,8 @@ "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", "dev": true, "requires": { - "align-text": "0.1.4", - "lazy-cache": "1.0.4" + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" } }, "chalk": { @@ -528,11 +528,11 @@ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" } }, "cipher-base": { @@ -541,8 +541,8 @@ "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "dev": true, "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.1" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "cliui": { @@ -551,8 +551,8 @@ "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", "dev": true, "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", + "center-align": "^0.1.1", + "right-align": "^0.1.1", "wordwrap": "0.0.2" } }, @@ -580,9 +580,9 @@ "integrity": "sha1-pikNQT8hemEjL5XkWP84QYz7ARc=", "dev": true, "requires": { - "inherits": "2.0.3", - "process-nextick-args": "1.0.7", - "through2": "2.0.3" + "inherits": "^2.0.1", + "process-nextick-args": "^1.0.6", + "through2": "^2.0.1" } }, "combine-source-map": { @@ -591,10 +591,10 @@ "integrity": "sha1-CHAxKFazB6h8xKxIbzqaYq7MwJ4=", "dev": true, "requires": { - "convert-source-map": "1.1.3", - "inline-source-map": "0.6.2", - "lodash.memoize": "3.0.4", - "source-map": "0.5.7" + "convert-source-map": "~1.1.0", + "inline-source-map": "~0.6.0", + "lodash.memoize": "~3.0.3", + "source-map": "~0.5.3" }, "dependencies": { "convert-source-map": { @@ -623,9 +623,9 @@ "integrity": "sha1-cIl4Yk2FavQaWnQd790mHadSwmY=", "dev": true, "requires": { - "inherits": "2.0.3", - "readable-stream": "2.0.6", - "typedarray": "0.0.6" + "inherits": "~2.0.1", + "readable-stream": "~2.0.0", + "typedarray": "~0.0.5" }, "dependencies": { "isarray": { @@ -640,12 +640,12 @@ "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "0.10.31", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" } } } @@ -656,7 +656,7 @@ "integrity": "sha1-9Vs74q60dgGxCi1SWcz7cP0vHdY=", "dev": true, "requires": { - "source-map": "0.5.7" + "source-map": "^0.5.1" } }, "console-browserify": { @@ -665,7 +665,7 @@ "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", "dev": true, "requires": { - "date-now": "0.1.4" + "date-now": "^0.1.4" } }, "constants-browserify": { @@ -692,8 +692,8 @@ "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", "dev": true, "requires": { - "bn.js": "4.11.8", - "elliptic": "6.4.0" + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" } }, "create-hash": { @@ -702,10 +702,10 @@ "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", "dev": true, "requires": { - "cipher-base": "1.0.4", - "inherits": "2.0.3", - "ripemd160": "2.0.1", - "sha.js": "2.4.9" + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "sha.js": "^2.4.0" } }, "create-hmac": { @@ -714,12 +714,12 @@ "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", "dev": true, "requires": { - "cipher-base": "1.0.4", - "create-hash": "1.1.3", - "inherits": "2.0.3", - "ripemd160": "2.0.1", - "safe-buffer": "5.1.1", - "sha.js": "2.4.9" + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, "crypto-browserify": { @@ -728,17 +728,17 @@ "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "dev": true, "requires": { - "browserify-cipher": "1.0.0", - "browserify-sign": "4.0.4", - "create-ecdh": "4.0.0", - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "diffie-hellman": "5.0.2", - "inherits": "2.0.3", - "pbkdf2": "3.0.14", - "public-encrypt": "4.0.0", - "randombytes": "2.0.5", - "randomfill": "1.0.3" + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" } }, "css": { @@ -747,10 +747,10 @@ "integrity": "sha1-c6TIHehdtmTU7mdPfUcIXjstVdw=", "dev": true, "requires": { - "inherits": "2.0.3", - "source-map": "0.1.43", - "source-map-resolve": "0.3.1", - "urix": "0.1.0" + "inherits": "^2.0.1", + "source-map": "^0.1.38", + "source-map-resolve": "^0.3.0", + "urix": "^0.1.0" }, "dependencies": { "source-map": { @@ -759,7 +759,7 @@ "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", "dev": true, "requires": { - "amdefine": "1.0.1" + "amdefine": ">=0.0.4" } } } @@ -770,7 +770,7 @@ "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", "dev": true, "requires": { - "array-find-index": "1.0.2" + "array-find-index": "^1.0.1" } }, "date-now": { @@ -800,8 +800,8 @@ "integrity": "sha1-+gccXYdIRoVCSAdCHKSxawsaB2M=", "dev": true, "requires": { - "debug": "2.6.9", - "lazy-debug-legacy": "0.0.1", + "debug": "2.X", + "lazy-debug-legacy": "0.0.X", "object-assign": "4.1.0" }, "dependencies": { @@ -825,7 +825,7 @@ "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", "dev": true, "requires": { - "clone": "1.0.3" + "clone": "^1.0.2" } }, "defined": { @@ -846,10 +846,10 @@ "integrity": "sha1-CRckkC6EZYJg65EHSMzNGvbiH7U=", "dev": true, "requires": { - "JSONStream": "1.3.1", - "shasum": "1.0.2", - "subarg": "1.0.0", - "through2": "2.0.3" + "JSONStream": "^1.0.3", + "shasum": "^1.0.0", + "subarg": "^1.0.0", + "through2": "^2.0.0" } }, "des.js": { @@ -858,8 +858,8 @@ "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", "dev": true, "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, "detect-file": { @@ -868,7 +868,7 @@ "integrity": "sha1-STXe39lIhkjgBrASlWbpOGcR6mM=", "dev": true, "requires": { - "fs-exists-sync": "0.1.0" + "fs-exists-sync": "^0.1.0" } }, "detect-newline": { @@ -883,8 +883,8 @@ "integrity": "sha1-blqMaybmx6JUsca210kNmOyR7dE=", "dev": true, "requires": { - "acorn": "4.0.13", - "defined": "1.0.0" + "acorn": "^4.0.3", + "defined": "^1.0.0" } }, "diff": { @@ -899,9 +899,9 @@ "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", "dev": true, "requires": { - "bn.js": "4.11.8", - "miller-rabin": "4.0.1", - "randombytes": "2.0.5" + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" } }, "domain-browser": { @@ -916,7 +916,7 @@ "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", "dev": true, "requires": { - "readable-stream": "1.1.14" + "readable-stream": "~1.1.9" } }, "elliptic": { @@ -925,13 +925,13 @@ "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", "dev": true, "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0", - "hash.js": "1.1.3", - "hmac-drbg": "1.0.1", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0", - "minimalistic-crypto-utils": "1.0.1" + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" } }, "end-of-stream": { @@ -940,7 +940,7 @@ "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=", "dev": true, "requires": { - "once": "1.3.3" + "once": "~1.3.0" } }, "error-ex": { @@ -949,7 +949,7 @@ "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", "dev": true, "requires": { - "is-arrayish": "0.2.1" + "is-arrayish": "^0.2.1" } }, "escape-string-regexp": { @@ -970,8 +970,8 @@ "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "dev": true, "requires": { - "md5.js": "1.3.4", - "safe-buffer": "5.1.1" + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" } }, "expand-brackets": { @@ -980,7 +980,7 @@ "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "dev": true, "requires": { - "is-posix-bracket": "0.1.1" + "is-posix-bracket": "^0.1.0" } }, "expand-range": { @@ -989,7 +989,7 @@ "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", "dev": true, "requires": { - "fill-range": "2.2.3" + "fill-range": "^2.1.0" } }, "expand-tilde": { @@ -998,7 +998,7 @@ "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=", "dev": true, "requires": { - "os-homedir": "1.0.2" + "os-homedir": "^1.0.1" } }, "extend": { @@ -1013,7 +1013,7 @@ "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "fancy-log": { @@ -1022,8 +1022,8 @@ "integrity": "sha1-Rb4X0Cu5kX1gzP/UmVyZnmyMmUg=", "dev": true, "requires": { - "chalk": "1.1.3", - "time-stamp": "1.1.0" + "chalk": "^1.1.1", + "time-stamp": "^1.0.0" } }, "filename-regex": { @@ -1038,11 +1038,11 @@ "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", "dev": true, "requires": { - "is-number": "2.1.0", - "isobject": "2.1.0", - "randomatic": "1.1.7", - "repeat-element": "1.1.2", - "repeat-string": "1.6.1" + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^1.1.3", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" } }, "find-index": { @@ -1057,8 +1057,8 @@ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "dev": true, "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "findup-sync": { @@ -1067,10 +1067,10 @@ "integrity": "sha1-QAQ5Kee8YK3wt/SCfExudaDeyhI=", "dev": true, "requires": { - "detect-file": "0.1.0", - "is-glob": "2.0.1", - "micromatch": "2.3.11", - "resolve-dir": "0.1.1" + "detect-file": "^0.1.0", + "is-glob": "^2.0.1", + "micromatch": "^2.3.7", + "resolve-dir": "^0.1.0" } }, "fined": { @@ -1079,11 +1079,11 @@ "integrity": "sha1-s33IRLdqL15wgeiE98CuNE8VNHY=", "dev": true, "requires": { - "expand-tilde": "2.0.2", - "is-plain-object": "2.0.4", - "object.defaults": "1.1.0", - "object.pick": "1.3.0", - "parse-filepath": "1.0.1" + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" }, "dependencies": { "expand-tilde": { @@ -1092,7 +1092,7 @@ "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", "dev": true, "requires": { - "homedir-polyfill": "1.0.1" + "homedir-polyfill": "^1.0.1" } } } @@ -1121,7 +1121,7 @@ "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", "dev": true, "requires": { - "for-in": "1.0.2" + "for-in": "^1.0.1" } }, "fs-exists-sync": { @@ -1148,7 +1148,7 @@ "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=", "dev": true, "requires": { - "globule": "0.1.0" + "globule": "~0.1.0" } }, "get-stdin": { @@ -1163,10 +1163,10 @@ "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", "dev": true, "requires": { - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "2.0.10", - "once": "1.3.3" + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^2.0.1", + "once": "^1.3.0" } }, "glob-base": { @@ -1175,8 +1175,8 @@ "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", "dev": true, "requires": { - "glob-parent": "2.0.0", - "is-glob": "2.0.1" + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" } }, "glob-parent": { @@ -1185,7 +1185,7 @@ "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", "dev": true, "requires": { - "is-glob": "2.0.1" + "is-glob": "^2.0.0" } }, "glob-stream": { @@ -1194,12 +1194,12 @@ "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=", "dev": true, "requires": { - "glob": "4.5.3", - "glob2base": "0.0.12", - "minimatch": "2.0.10", - "ordered-read-streams": "0.1.0", - "through2": "0.6.5", - "unique-stream": "1.0.0" + "glob": "^4.3.1", + "glob2base": "^0.0.12", + "minimatch": "^2.0.1", + "ordered-read-streams": "^0.1.0", + "through2": "^0.6.1", + "unique-stream": "^1.0.0" }, "dependencies": { "readable-stream": { @@ -1208,10 +1208,10 @@ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", "isarray": "0.0.1", - "string_decoder": "0.10.31" + "string_decoder": "~0.10.x" } }, "through2": { @@ -1220,8 +1220,8 @@ "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", "dev": true, "requires": { - "readable-stream": "1.0.34", - "xtend": "4.0.1" + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" } } } @@ -1232,7 +1232,7 @@ "integrity": "sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=", "dev": true, "requires": { - "gaze": "0.5.2" + "gaze": "^0.5.1" } }, "glob2base": { @@ -1241,7 +1241,7 @@ "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", "dev": true, "requires": { - "find-index": "0.1.1" + "find-index": "^0.1.1" } }, "global-modules": { @@ -1250,8 +1250,8 @@ "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=", "dev": true, "requires": { - "global-prefix": "0.1.5", - "is-windows": "0.2.0" + "global-prefix": "^0.1.4", + "is-windows": "^0.2.0" } }, "global-prefix": { @@ -1260,10 +1260,10 @@ "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=", "dev": true, "requires": { - "homedir-polyfill": "1.0.1", - "ini": "1.3.4", - "is-windows": "0.2.0", - "which": "1.3.0" + "homedir-polyfill": "^1.0.0", + "ini": "^1.3.4", + "is-windows": "^0.2.0", + "which": "^1.2.12" } }, "globule": { @@ -1272,9 +1272,9 @@ "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=", "dev": true, "requires": { - "glob": "3.1.21", - "lodash": "1.0.2", - "minimatch": "0.2.14" + "glob": "~3.1.21", + "lodash": "~1.0.1", + "minimatch": "~0.2.11" }, "dependencies": { "glob": { @@ -1283,9 +1283,9 @@ "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", "dev": true, "requires": { - "graceful-fs": "1.2.3", - "inherits": "1.0.2", - "minimatch": "0.2.14" + "graceful-fs": "~1.2.0", + "inherits": "1", + "minimatch": "~0.2.11" } }, "graceful-fs": { @@ -1306,8 +1306,8 @@ "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", "dev": true, "requires": { - "lru-cache": "2.7.3", - "sigmund": "1.0.1" + "lru-cache": "2", + "sigmund": "~1.0.0" } } } @@ -1318,7 +1318,7 @@ "integrity": "sha1-f+DxmfV6yQbPUS/urY+Q7kooT8U=", "dev": true, "requires": { - "sparkles": "1.0.0" + "sparkles": "^1.0.0" } }, "graceful-fs": { @@ -1327,7 +1327,7 @@ "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=", "dev": true, "requires": { - "natives": "1.1.0" + "natives": "^1.1.0" } }, "growl": { @@ -1342,19 +1342,19 @@ "integrity": "sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ=", "dev": true, "requires": { - "archy": "1.0.0", - "chalk": "1.1.3", - "deprecated": "0.0.1", - "gulp-util": "3.0.8", - "interpret": "1.0.4", - "liftoff": "2.3.0", - "minimist": "1.2.0", - "orchestrator": "0.3.8", - "pretty-hrtime": "1.0.3", - "semver": "4.3.6", - "tildify": "1.2.0", - "v8flags": "2.1.1", - "vinyl-fs": "0.3.14" + "archy": "^1.0.0", + "chalk": "^1.0.0", + "deprecated": "^0.0.1", + "gulp-util": "^3.0.0", + "interpret": "^1.0.0", + "liftoff": "^2.1.0", + "minimist": "^1.1.0", + "orchestrator": "^0.3.0", + "pretty-hrtime": "^1.0.0", + "semver": "^4.1.0", + "tildify": "^1.0.0", + "v8flags": "^2.0.2", + "vinyl-fs": "^0.3.0" } }, "gulp-concat": { @@ -1363,9 +1363,9 @@ "integrity": "sha1-Yz0WyV2IUEYorQJmVmPO5aR5M1M=", "dev": true, "requires": { - "concat-with-sourcemaps": "1.0.4", - "through2": "2.0.3", - "vinyl": "2.1.0" + "concat-with-sourcemaps": "^1.0.0", + "through2": "^2.0.0", + "vinyl": "^2.0.0" }, "dependencies": { "clone": { @@ -1392,12 +1392,12 @@ "integrity": "sha1-Ah+cLPlR1rk5lDyJ617lrdT9kkw=", "dev": true, "requires": { - "clone": "2.1.1", - "clone-buffer": "1.0.0", - "clone-stats": "1.0.0", - "cloneable-readable": "1.0.0", - "remove-trailing-separator": "1.1.0", - "replace-ext": "1.0.0" + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" } } } @@ -1408,10 +1408,10 @@ "integrity": "sha1-R5IFXZi3fUO9ggV5YdpHZGZ0Occ=", "dev": true, "requires": { - "gulp-util": "2.2.20", - "minimatch": "3.0.4", - "through2": "0.4.2", - "uglify-js": "2.8.29" + "gulp-util": "^2.2.14", + "minimatch": "^3.0.2", + "through2": "^0.4.0", + "uglify-js": "^2.6.2" }, "dependencies": { "ansi-regex": { @@ -1432,11 +1432,11 @@ "integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=", "dev": true, "requires": { - "ansi-styles": "1.1.0", - "escape-string-regexp": "1.0.5", - "has-ansi": "0.1.0", - "strip-ansi": "0.3.0", - "supports-color": "0.2.0" + "ansi-styles": "^1.1.0", + "escape-string-regexp": "^1.0.0", + "has-ansi": "^0.1.0", + "strip-ansi": "^0.3.0", + "supports-color": "^0.2.0" } }, "dateformat": { @@ -1445,8 +1445,8 @@ "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", "dev": true, "requires": { - "get-stdin": "4.0.1", - "meow": "3.7.0" + "get-stdin": "^4.0.1", + "meow": "^3.3.0" } }, "gulp-util": { @@ -1455,14 +1455,14 @@ "integrity": "sha1-1xRuVyiRC9jwR6awseVJvCLb1kw=", "dev": true, "requires": { - "chalk": "0.5.1", - "dateformat": "1.0.12", - "lodash._reinterpolate": "2.4.1", - "lodash.template": "2.4.1", - "minimist": "0.2.0", - "multipipe": "0.1.2", - "through2": "0.5.1", - "vinyl": "0.2.3" + "chalk": "^0.5.0", + "dateformat": "^1.0.7-1.2.3", + "lodash._reinterpolate": "^2.4.1", + "lodash.template": "^2.4.1", + "minimist": "^0.2.0", + "multipipe": "^0.1.0", + "through2": "^0.5.0", + "vinyl": "^0.2.1" }, "dependencies": { "through2": { @@ -1471,8 +1471,8 @@ "integrity": "sha1-390BLrnHAOIyP9M084rGIqs3Lac=", "dev": true, "requires": { - "readable-stream": "1.0.34", - "xtend": "3.0.0" + "readable-stream": "~1.0.17", + "xtend": "~3.0.0" } } } @@ -1483,7 +1483,7 @@ "integrity": "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=", "dev": true, "requires": { - "ansi-regex": "0.2.1" + "ansi-regex": "^0.2.0" } }, "lodash._reinterpolate": { @@ -1498,9 +1498,9 @@ "integrity": "sha1-LOEsXghNsKV92l5dHu659dF1o7Q=", "dev": true, "requires": { - "lodash._escapehtmlchar": "2.4.1", - "lodash._reunescapedhtml": "2.4.1", - "lodash.keys": "2.4.1" + "lodash._escapehtmlchar": "~2.4.1", + "lodash._reunescapedhtml": "~2.4.1", + "lodash.keys": "~2.4.1" } }, "lodash.keys": { @@ -1509,9 +1509,9 @@ "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", "dev": true, "requires": { - "lodash._isnative": "2.4.1", - "lodash._shimkeys": "2.4.1", - "lodash.isobject": "2.4.1" + "lodash._isnative": "~2.4.1", + "lodash._shimkeys": "~2.4.1", + "lodash.isobject": "~2.4.1" } }, "lodash.template": { @@ -1520,13 +1520,13 @@ "integrity": "sha1-nmEQB+32KRKal0qzxIuBez4c8g0=", "dev": true, "requires": { - "lodash._escapestringchar": "2.4.1", - "lodash._reinterpolate": "2.4.1", - "lodash.defaults": "2.4.1", - "lodash.escape": "2.4.1", - "lodash.keys": "2.4.1", - "lodash.templatesettings": "2.4.1", - "lodash.values": "2.4.1" + "lodash._escapestringchar": "~2.4.1", + "lodash._reinterpolate": "~2.4.1", + "lodash.defaults": "~2.4.1", + "lodash.escape": "~2.4.1", + "lodash.keys": "~2.4.1", + "lodash.templatesettings": "~2.4.1", + "lodash.values": "~2.4.1" } }, "lodash.templatesettings": { @@ -1535,8 +1535,8 @@ "integrity": "sha1-6nbHXRHrhtTb6JqDiTu4YZKaxpk=", "dev": true, "requires": { - "lodash._reinterpolate": "2.4.1", - "lodash.escape": "2.4.1" + "lodash._reinterpolate": "~2.4.1", + "lodash.escape": "~2.4.1" } }, "minimatch": { @@ -1545,7 +1545,7 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "1.1.8" + "brace-expansion": "^1.1.7" } }, "minimist": { @@ -1560,10 +1560,10 @@ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", "isarray": "0.0.1", - "string_decoder": "0.10.31" + "string_decoder": "~0.10.x" } }, "strip-ansi": { @@ -1572,7 +1572,7 @@ "integrity": "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=", "dev": true, "requires": { - "ansi-regex": "0.2.1" + "ansi-regex": "^0.2.1" } }, "supports-color": { @@ -1587,8 +1587,8 @@ "integrity": "sha1-2/WGYDEVHsg1K7bE22SiKSqEC5s=", "dev": true, "requires": { - "readable-stream": "1.0.34", - "xtend": "2.1.2" + "readable-stream": "~1.0.17", + "xtend": "~2.1.1" }, "dependencies": { "xtend": { @@ -1597,7 +1597,7 @@ "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", "dev": true, "requires": { - "object-keys": "0.4.0" + "object-keys": "~0.4.0" } } } @@ -1608,7 +1608,7 @@ "integrity": "sha1-vKk4IJWC7FpJrVOKAPofEl5RMlI=", "dev": true, "requires": { - "clone-stats": "0.0.1" + "clone-stats": "~0.0.1" } }, "xtend": { @@ -1625,17 +1625,17 @@ "integrity": "sha1-eG+XyUoPloSSRl1wVY4EJCxnlZg=", "dev": true, "requires": { - "@gulp-sourcemaps/map-sources": "1.0.0", - "acorn": "4.0.13", - "convert-source-map": "1.5.0", - "css": "2.2.1", - "debug-fabulous": "0.0.4", - "detect-newline": "2.1.0", - "graceful-fs": "4.1.11", - "source-map": "0.5.7", - "strip-bom": "2.0.0", - "through2": "2.0.3", - "vinyl": "1.2.0" + "@gulp-sourcemaps/map-sources": "1.X", + "acorn": "4.X", + "convert-source-map": "1.X", + "css": "2.X", + "debug-fabulous": "0.0.X", + "detect-newline": "2.X", + "graceful-fs": "4.X", + "source-map": "0.X", + "strip-bom": "2.X", + "through2": "2.X", + "vinyl": "1.X" }, "dependencies": { "graceful-fs": { @@ -1650,7 +1650,7 @@ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "dev": true, "requires": { - "is-utf8": "0.2.1" + "is-utf8": "^0.2.0" } }, "vinyl": { @@ -1659,8 +1659,8 @@ "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", "dev": true, "requires": { - "clone": "1.0.3", - "clone-stats": "0.0.1", + "clone": "^1.0.0", + "clone-stats": "^0.0.1", "replace-ext": "0.0.1" } } @@ -1672,24 +1672,24 @@ "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", "dev": true, "requires": { - "array-differ": "1.0.0", - "array-uniq": "1.0.3", - "beeper": "1.1.1", - "chalk": "1.1.3", - "dateformat": "2.2.0", - "fancy-log": "1.3.0", - "gulplog": "1.0.0", - "has-gulplog": "0.1.0", - "lodash._reescape": "3.0.0", - "lodash._reevaluate": "3.0.0", - "lodash._reinterpolate": "3.0.0", - "lodash.template": "3.6.2", - "minimist": "1.2.0", - "multipipe": "0.1.2", - "object-assign": "3.0.0", + "array-differ": "^1.0.0", + "array-uniq": "^1.0.2", + "beeper": "^1.0.0", + "chalk": "^1.0.0", + "dateformat": "^2.0.0", + "fancy-log": "^1.1.0", + "gulplog": "^1.0.0", + "has-gulplog": "^0.1.0", + "lodash._reescape": "^3.0.0", + "lodash._reevaluate": "^3.0.0", + "lodash._reinterpolate": "^3.0.0", + "lodash.template": "^3.0.0", + "minimist": "^1.1.0", + "multipipe": "^0.1.2", + "object-assign": "^3.0.0", "replace-ext": "0.0.1", - "through2": "2.0.3", - "vinyl": "0.5.3" + "through2": "^2.0.0", + "vinyl": "^0.5.0" } }, "gulplog": { @@ -1698,7 +1698,7 @@ "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", "dev": true, "requires": { - "glogg": "1.0.0" + "glogg": "^1.0.0" } }, "has": { @@ -1707,7 +1707,7 @@ "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", "dev": true, "requires": { - "function-bind": "1.1.1" + "function-bind": "^1.0.2" } }, "has-ansi": { @@ -1716,7 +1716,7 @@ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "has-gulplog": { @@ -1725,7 +1725,7 @@ "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", "dev": true, "requires": { - "sparkles": "1.0.0" + "sparkles": "^1.0.0" } }, "hash-base": { @@ -1734,7 +1734,7 @@ "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", "dev": true, "requires": { - "inherits": "2.0.3" + "inherits": "^2.0.1" } }, "hash.js": { @@ -1743,8 +1743,8 @@ "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", "dev": true, "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.0" } }, "hmac-drbg": { @@ -1753,9 +1753,9 @@ "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", "dev": true, "requires": { - "hash.js": "1.1.3", - "minimalistic-assert": "1.0.0", - "minimalistic-crypto-utils": "1.0.1" + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" } }, "homedir-polyfill": { @@ -1764,7 +1764,7 @@ "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", "dev": true, "requires": { - "parse-passwd": "1.0.0" + "parse-passwd": "^1.0.0" } }, "hosted-git-info": { @@ -1797,7 +1797,7 @@ "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", "dev": true, "requires": { - "repeating": "2.0.1" + "repeating": "^2.0.0" } }, "indexof": { @@ -1812,8 +1812,8 @@ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { - "once": "1.3.3", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -1834,7 +1834,7 @@ "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", "dev": true, "requires": { - "source-map": "0.5.7" + "source-map": "~0.5.3" } }, "insert-module-globals": { @@ -1843,14 +1843,14 @@ "integrity": "sha1-wDv04BywhtW15azorQr+eInWOMM=", "dev": true, "requires": { - "JSONStream": "1.3.1", - "combine-source-map": "0.7.2", - "concat-stream": "1.5.2", - "is-buffer": "1.1.6", - "lexical-scope": "1.2.0", - "process": "0.11.10", - "through2": "2.0.3", - "xtend": "4.0.1" + "JSONStream": "^1.0.3", + "combine-source-map": "~0.7.1", + "concat-stream": "~1.5.1", + "is-buffer": "^1.1.0", + "lexical-scope": "^1.2.0", + "process": "~0.11.0", + "through2": "^2.0.0", + "xtend": "^4.0.0" } }, "interpret": { @@ -1865,8 +1865,8 @@ "integrity": "sha1-IN5p89uULvLYe5wto28XIjWxtes=", "dev": true, "requires": { - "is-relative": "0.2.1", - "is-windows": "0.2.0" + "is-relative": "^0.2.1", + "is-windows": "^0.2.0" } }, "is-arrayish": { @@ -1887,7 +1887,7 @@ "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "dev": true, "requires": { - "builtin-modules": "1.1.1" + "builtin-modules": "^1.0.0" } }, "is-dotfile": { @@ -1902,7 +1902,7 @@ "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", "dev": true, "requires": { - "is-primitive": "2.0.0" + "is-primitive": "^2.0.0" } }, "is-extendable": { @@ -1923,7 +1923,7 @@ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-glob": { @@ -1932,7 +1932,7 @@ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "is-number": { @@ -1941,7 +1941,7 @@ "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "is-plain-object": { @@ -1950,7 +1950,7 @@ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.1" }, "dependencies": { "isobject": { @@ -1979,7 +1979,7 @@ "integrity": "sha1-0n9MfVFtF1+2ENuEu+7yPDvJeqU=", "dev": true, "requires": { - "is-unc-path": "0.1.2" + "is-unc-path": "^0.1.1" } }, "is-unc-path": { @@ -1988,7 +1988,7 @@ "integrity": "sha1-arBTpyVzwQJQ/0FqOBTDUXivObk=", "dev": true, "requires": { - "unc-path-regex": "0.1.2" + "unc-path-regex": "^0.1.0" } }, "is-utf8": { @@ -2062,7 +2062,7 @@ "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=", "dev": true, "requires": { - "jsonify": "0.0.0" + "jsonify": "~0.0.0" } }, "jsonify": { @@ -2083,7 +2083,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } }, "labeled-stream-splicer": { @@ -2092,9 +2092,9 @@ "integrity": "sha1-pS4dE4AkwAuGscDJH2d5GLiuClk=", "dev": true, "requires": { - "inherits": "2.0.3", - "isarray": "0.0.1", - "stream-splicer": "2.0.0" + "inherits": "^2.0.1", + "isarray": "~0.0.1", + "stream-splicer": "^2.0.0" } }, "lazy-cache": { @@ -2115,7 +2115,7 @@ "integrity": "sha1-/Ope3HBKSzqHls3KQZw6CvryLfQ=", "dev": true, "requires": { - "astw": "2.2.0" + "astw": "^2.0.0" } }, "liftoff": { @@ -2124,15 +2124,15 @@ "integrity": "sha1-qY8v9nGD2Lp8+soQVIvX/wVQs4U=", "dev": true, "requires": { - "extend": "3.0.1", - "findup-sync": "0.4.3", - "fined": "1.1.0", - "flagged-respawn": "0.3.2", - "lodash.isplainobject": "4.0.6", - "lodash.isstring": "4.0.1", - "lodash.mapvalues": "4.6.0", - "rechoir": "0.6.2", - "resolve": "1.5.0" + "extend": "^3.0.0", + "findup-sync": "^0.4.2", + "fined": "^1.0.1", + "flagged-respawn": "^0.3.2", + "lodash.isplainobject": "^4.0.4", + "lodash.isstring": "^4.0.1", + "lodash.mapvalues": "^4.4.0", + "rechoir": "^0.6.2", + "resolve": "^1.1.7" } }, "load-json-file": { @@ -2141,11 +2141,11 @@ "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" }, "dependencies": { "graceful-fs": { @@ -2160,7 +2160,7 @@ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "dev": true, "requires": { - "is-utf8": "0.2.1" + "is-utf8": "^0.2.0" } } } @@ -2195,7 +2195,7 @@ "integrity": "sha1-32fDu2t+jh6DGrSL+geVuSr+iZ0=", "dev": true, "requires": { - "lodash._htmlescapes": "2.4.1" + "lodash._htmlescapes": "~2.4.1" } }, "lodash._escapestringchar": { @@ -2258,8 +2258,8 @@ "integrity": "sha1-dHxPxAED6zu4oJduVx96JlnpO6c=", "dev": true, "requires": { - "lodash._htmlescapes": "2.4.1", - "lodash.keys": "2.4.1" + "lodash._htmlescapes": "~2.4.1", + "lodash.keys": "~2.4.1" }, "dependencies": { "lodash.keys": { @@ -2268,9 +2268,9 @@ "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", "dev": true, "requires": { - "lodash._isnative": "2.4.1", - "lodash._shimkeys": "2.4.1", - "lodash.isobject": "2.4.1" + "lodash._isnative": "~2.4.1", + "lodash._shimkeys": "~2.4.1", + "lodash.isobject": "~2.4.1" } } } @@ -2287,7 +2287,7 @@ "integrity": "sha1-bpzJZm/wgfC1psl4uD4kLmlJ0gM=", "dev": true, "requires": { - "lodash._objecttypes": "2.4.1" + "lodash._objecttypes": "~2.4.1" } }, "lodash.defaults": { @@ -2296,8 +2296,8 @@ "integrity": "sha1-p+iIXwXmiFEUS24SqPNngCa8TFQ=", "dev": true, "requires": { - "lodash._objecttypes": "2.4.1", - "lodash.keys": "2.4.1" + "lodash._objecttypes": "~2.4.1", + "lodash.keys": "~2.4.1" }, "dependencies": { "lodash.keys": { @@ -2306,9 +2306,9 @@ "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", "dev": true, "requires": { - "lodash._isnative": "2.4.1", - "lodash._shimkeys": "2.4.1", - "lodash.isobject": "2.4.1" + "lodash._isnative": "~2.4.1", + "lodash._shimkeys": "~2.4.1", + "lodash.isobject": "~2.4.1" } } } @@ -2319,7 +2319,7 @@ "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", "dev": true, "requires": { - "lodash._root": "3.0.1" + "lodash._root": "^3.0.0" } }, "lodash.isarguments": { @@ -2340,7 +2340,7 @@ "integrity": "sha1-Wi5H/mmVPx7mMafrof5k0tBlWPU=", "dev": true, "requires": { - "lodash._objecttypes": "2.4.1" + "lodash._objecttypes": "~2.4.1" } }, "lodash.isplainobject": { @@ -2361,9 +2361,9 @@ "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", "dev": true, "requires": { - "lodash._getnative": "3.9.1", - "lodash.isarguments": "3.1.0", - "lodash.isarray": "3.0.4" + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" } }, "lodash.mapvalues": { @@ -2390,15 +2390,15 @@ "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", "dev": true, "requires": { - "lodash._basecopy": "3.0.1", - "lodash._basetostring": "3.0.1", - "lodash._basevalues": "3.0.0", - "lodash._isiterateecall": "3.0.9", - "lodash._reinterpolate": "3.0.0", - "lodash.escape": "3.2.0", - "lodash.keys": "3.1.2", - "lodash.restparam": "3.6.1", - "lodash.templatesettings": "3.1.1" + "lodash._basecopy": "^3.0.0", + "lodash._basetostring": "^3.0.0", + "lodash._basevalues": "^3.0.0", + "lodash._isiterateecall": "^3.0.0", + "lodash._reinterpolate": "^3.0.0", + "lodash.escape": "^3.0.0", + "lodash.keys": "^3.0.0", + "lodash.restparam": "^3.0.0", + "lodash.templatesettings": "^3.0.0" } }, "lodash.templatesettings": { @@ -2407,8 +2407,8 @@ "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", "dev": true, "requires": { - "lodash._reinterpolate": "3.0.0", - "lodash.escape": "3.2.0" + "lodash._reinterpolate": "^3.0.0", + "lodash.escape": "^3.0.0" } }, "lodash.values": { @@ -2417,7 +2417,7 @@ "integrity": "sha1-q/UUQ2s8twUAFieXjLzzCxKA7qQ=", "dev": true, "requires": { - "lodash.keys": "2.4.1" + "lodash.keys": "~2.4.1" }, "dependencies": { "lodash.keys": { @@ -2426,9 +2426,9 @@ "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", "dev": true, "requires": { - "lodash._isnative": "2.4.1", - "lodash._shimkeys": "2.4.1", - "lodash.isobject": "2.4.1" + "lodash._isnative": "~2.4.1", + "lodash._shimkeys": "~2.4.1", + "lodash.isobject": "~2.4.1" } } } @@ -2445,8 +2445,8 @@ "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", "dev": true, "requires": { - "currently-unhandled": "0.4.1", - "signal-exit": "3.0.2" + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" } }, "lru-cache": { @@ -2473,8 +2473,8 @@ "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", "dev": true, "requires": { - "hash-base": "3.0.4", - "inherits": "2.0.3" + "hash-base": "^3.0.0", + "inherits": "^2.0.1" }, "dependencies": { "hash-base": { @@ -2483,8 +2483,8 @@ "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", "dev": true, "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.1" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } } } @@ -2495,16 +2495,16 @@ "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", "dev": true, "requires": { - "camelcase-keys": "2.1.0", - "decamelize": "1.2.0", - "loud-rejection": "1.6.0", - "map-obj": "1.0.1", - "minimist": "1.2.0", - "normalize-package-data": "2.4.0", - "object-assign": "4.1.1", - "read-pkg-up": "1.0.1", - "redent": "1.0.0", - "trim-newlines": "1.0.0" + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" }, "dependencies": { "object-assign": { @@ -2521,19 +2521,19 @@ "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "dev": true, "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" } }, "miller-rabin": { @@ -2542,8 +2542,8 @@ "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "dev": true, "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0" + "bn.js": "^4.0.0", + "brorand": "^1.0.1" } }, "minimalistic-assert": { @@ -2564,7 +2564,7 @@ "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", "dev": true, "requires": { - "brace-expansion": "1.1.8" + "brace-expansion": "^1.0.0" } }, "minimist": { @@ -2629,8 +2629,8 @@ "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", "dev": true, "requires": { - "inherits": "2.0.3", - "minimatch": "0.3.0" + "inherits": "2", + "minimatch": "0.3" } }, "minimatch": { @@ -2639,8 +2639,8 @@ "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", "dev": true, "requires": { - "lru-cache": "2.7.3", - "sigmund": "1.0.1" + "lru-cache": "2", + "sigmund": "~1.0.0" } }, "ms": { @@ -2663,21 +2663,21 @@ "integrity": "sha1-IyFYM/HaE/1gbMuAh7RIUty4If0=", "dev": true, "requires": { - "JSONStream": "1.3.1", - "browser-resolve": "1.11.2", - "cached-path-relative": "1.0.1", - "concat-stream": "1.5.2", - "defined": "1.0.0", - "detective": "4.5.0", - "duplexer2": "0.1.4", - "inherits": "2.0.3", - "parents": "1.0.1", - "readable-stream": "2.3.3", - "resolve": "1.5.0", - "stream-combiner2": "1.1.1", - "subarg": "1.0.0", - "through2": "2.0.3", - "xtend": "4.0.1" + "JSONStream": "^1.0.3", + "browser-resolve": "^1.7.0", + "cached-path-relative": "^1.0.0", + "concat-stream": "~1.5.0", + "defined": "^1.0.0", + "detective": "^4.0.0", + "duplexer2": "^0.1.2", + "inherits": "^2.0.1", + "parents": "^1.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.1.3", + "stream-combiner2": "^1.1.1", + "subarg": "^1.0.0", + "through2": "^2.0.0", + "xtend": "^4.0.0" }, "dependencies": { "duplexer2": { @@ -2686,7 +2686,7 @@ "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", "dev": true, "requires": { - "readable-stream": "2.3.3" + "readable-stream": "^2.0.2" } }, "isarray": { @@ -2701,13 +2701,13 @@ "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.0.3", + "util-deprecate": "~1.0.1" } }, "string_decoder": { @@ -2716,7 +2716,7 @@ "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } } } @@ -2748,10 +2748,10 @@ "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", "dev": true, "requires": { - "hosted-git-info": "2.5.0", - "is-builtin-module": "1.0.0", - "semver": "4.3.6", - "validate-npm-package-license": "3.0.1" + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, "normalize-path": { @@ -2760,7 +2760,7 @@ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "dev": true, "requires": { - "remove-trailing-separator": "1.1.0" + "remove-trailing-separator": "^1.0.1" } }, "number-is-nan": { @@ -2787,10 +2787,10 @@ "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", "dev": true, "requires": { - "array-each": "1.0.1", - "array-slice": "1.0.0", - "for-own": "1.0.0", - "isobject": "3.0.1" + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" }, "dependencies": { "for-own": { @@ -2799,7 +2799,7 @@ "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", "dev": true, "requires": { - "for-in": "1.0.2" + "for-in": "^1.0.1" } }, "isobject": { @@ -2816,8 +2816,8 @@ "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", "dev": true, "requires": { - "for-own": "0.1.5", - "is-extendable": "0.1.1" + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" } }, "object.pick": { @@ -2826,7 +2826,7 @@ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "dev": true, "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.1" }, "dependencies": { "isobject": { @@ -2843,7 +2843,7 @@ "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", "dev": true, "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "orchestrator": { @@ -2852,9 +2852,9 @@ "integrity": "sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=", "dev": true, "requires": { - "end-of-stream": "0.1.5", - "sequencify": "0.0.7", - "stream-consume": "0.1.0" + "end-of-stream": "~0.1.5", + "sequencify": "~0.0.7", + "stream-consume": "~0.1.0" } }, "ordered-read-streams": { @@ -2887,7 +2887,7 @@ "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=", "dev": true, "requires": { - "path-platform": "0.11.15" + "path-platform": "~0.11.15" } }, "parse-asn1": { @@ -2896,11 +2896,11 @@ "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", "dev": true, "requires": { - "asn1.js": "4.9.2", - "browserify-aes": "1.1.1", - "create-hash": "1.1.3", - "evp_bytestokey": "1.0.3", - "pbkdf2": "3.0.14" + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3" } }, "parse-filepath": { @@ -2909,9 +2909,9 @@ "integrity": "sha1-FZ1hVdQ5BNFsEO9piRHaHpGWm3M=", "dev": true, "requires": { - "is-absolute": "0.2.6", - "map-cache": "0.2.2", - "path-root": "0.1.1" + "is-absolute": "^0.2.3", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" } }, "parse-glob": { @@ -2920,10 +2920,10 @@ "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", "dev": true, "requires": { - "glob-base": "0.3.0", - "is-dotfile": "1.0.3", - "is-extglob": "1.0.0", - "is-glob": "2.0.1" + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" } }, "parse-json": { @@ -2932,7 +2932,7 @@ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "dev": true, "requires": { - "error-ex": "1.3.1" + "error-ex": "^1.2.0" } }, "parse-passwd": { @@ -2953,7 +2953,7 @@ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "dev": true, "requires": { - "pinkie-promise": "2.0.1" + "pinkie-promise": "^2.0.0" } }, "path-is-absolute": { @@ -2980,7 +2980,7 @@ "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", "dev": true, "requires": { - "path-root-regex": "0.1.2" + "path-root-regex": "^0.1.0" } }, "path-root-regex": { @@ -2995,9 +2995,9 @@ "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" }, "dependencies": { "graceful-fs": { @@ -3014,11 +3014,11 @@ "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==", "dev": true, "requires": { - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "ripemd160": "2.0.1", - "safe-buffer": "5.1.1", - "sha.js": "2.4.9" + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, "pify": { @@ -3039,7 +3039,7 @@ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "dev": true, "requires": { - "pinkie": "2.0.4" + "pinkie": "^2.0.0" } }, "preserve": { @@ -3072,11 +3072,11 @@ "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", "dev": true, "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.1.3", - "parse-asn1": "5.1.0", - "randombytes": "2.0.5" + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1" } }, "punycode": { @@ -3103,8 +3103,8 @@ "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", "dev": true, "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" + "is-number": "^3.0.0", + "kind-of": "^4.0.0" }, "dependencies": { "is-number": { @@ -3113,7 +3113,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -3122,7 +3122,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -3133,7 +3133,7 @@ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -3144,7 +3144,7 @@ "integrity": "sha512-8T7Zn1AhMsQ/HI1SjcCfT/t4ii3eAqco3yOcSzS4mozsOz69lHLsoMXmF9nZgnFanYscnSlUSgs8uZyKzpE6kg==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "^5.1.0" } }, "randomfill": { @@ -3153,8 +3153,8 @@ "integrity": "sha512-YL6GrhrWoic0Eq8rXVbMptH7dAxCs0J+mh5Y0euNekPPYaxEmdVGim6GdoxoRzKW2yJoU8tueifS7mYxvcFDEQ==", "dev": true, "requires": { - "randombytes": "2.0.5", - "safe-buffer": "5.1.1" + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" } }, "read-only-stream": { @@ -3163,7 +3163,7 @@ "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=", "dev": true, "requires": { - "readable-stream": "2.3.3" + "readable-stream": "^2.0.2" }, "dependencies": { "isarray": { @@ -3178,13 +3178,13 @@ "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.0.3", + "util-deprecate": "~1.0.1" } }, "string_decoder": { @@ -3193,7 +3193,7 @@ "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } } } @@ -3204,9 +3204,9 @@ "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", "dev": true, "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.0" + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" } }, "read-pkg-up": { @@ -3215,8 +3215,8 @@ "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", "dev": true, "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" } }, "readable-stream": { @@ -3225,10 +3225,10 @@ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", "isarray": "0.0.1", - "string_decoder": "0.10.31" + "string_decoder": "~0.10.x" } }, "rechoir": { @@ -3237,7 +3237,7 @@ "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", "dev": true, "requires": { - "resolve": "1.5.0" + "resolve": "^1.1.6" } }, "redent": { @@ -3246,8 +3246,8 @@ "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", "dev": true, "requires": { - "indent-string": "2.1.0", - "strip-indent": "1.0.1" + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" } }, "regex-cache": { @@ -3256,7 +3256,7 @@ "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", "dev": true, "requires": { - "is-equal-shallow": "0.1.3" + "is-equal-shallow": "^0.1.3" } }, "remove-trailing-separator": { @@ -3283,7 +3283,7 @@ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", "dev": true, "requires": { - "is-finite": "1.0.2" + "is-finite": "^1.0.0" } }, "replace-ext": { @@ -3298,7 +3298,7 @@ "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", "dev": true, "requires": { - "path-parse": "1.0.5" + "path-parse": "^1.0.5" } }, "resolve-dir": { @@ -3307,8 +3307,8 @@ "integrity": "sha1-shklmlYC+sXFxJatiUpujMQwJh4=", "dev": true, "requires": { - "expand-tilde": "1.2.2", - "global-modules": "0.2.3" + "expand-tilde": "^1.2.2", + "global-modules": "^0.2.3" } }, "resolve-url": { @@ -3323,7 +3323,7 @@ "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", "dev": true, "requires": { - "align-text": "0.1.4" + "align-text": "^0.1.1" } }, "ripemd160": { @@ -3332,8 +3332,8 @@ "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", "dev": true, "requires": { - "hash-base": "2.0.2", - "inherits": "2.0.3" + "hash-base": "^2.0.0", + "inherits": "^2.0.1" } }, "safe-buffer": { @@ -3360,8 +3360,8 @@ "integrity": "sha512-G8zektVqbiPHrylgew9Zg1VRB1L/DtXNUVAM6q4QLy8NE3qtHlFXTf8VLL4k1Yl6c7NMjtZUTdXV+X44nFaT6A==", "dev": true, "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.1" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "shasum": { @@ -3370,8 +3370,8 @@ "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=", "dev": true, "requires": { - "json-stable-stringify": "0.0.1", - "sha.js": "2.4.9" + "json-stable-stringify": "~0.0.0", + "sha.js": "~2.4.4" } }, "shell-quote": { @@ -3380,10 +3380,10 @@ "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", "dev": true, "requires": { - "array-filter": "0.0.1", - "array-map": "0.0.0", - "array-reduce": "0.0.0", - "jsonify": "0.0.0" + "array-filter": "~0.0.0", + "array-map": "~0.0.0", + "array-reduce": "~0.0.0", + "jsonify": "~0.0.0" } }, "sigmund": { @@ -3410,10 +3410,10 @@ "integrity": "sha1-YQ9hIqRFuN1RU1oqcbeD38Ekh2E=", "dev": true, "requires": { - "atob": "1.1.3", - "resolve-url": "0.2.1", - "source-map-url": "0.3.0", - "urix": "0.1.0" + "atob": "~1.1.0", + "resolve-url": "~0.2.1", + "source-map-url": "~0.3.0", + "urix": "~0.1.0" } }, "source-map-url": { @@ -3434,7 +3434,7 @@ "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", "dev": true, "requires": { - "spdx-license-ids": "1.2.2" + "spdx-license-ids": "^1.0.2" } }, "spdx-expression-parse": { @@ -3455,8 +3455,8 @@ "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", "dev": true, "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.3" + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" }, "dependencies": { "isarray": { @@ -3471,13 +3471,13 @@ "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.0.3", + "util-deprecate": "~1.0.1" } }, "string_decoder": { @@ -3486,7 +3486,7 @@ "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } } } @@ -3497,8 +3497,8 @@ "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", "dev": true, "requires": { - "duplexer2": "0.1.4", - "readable-stream": "2.3.3" + "duplexer2": "~0.1.0", + "readable-stream": "^2.0.2" }, "dependencies": { "duplexer2": { @@ -3507,7 +3507,7 @@ "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", "dev": true, "requires": { - "readable-stream": "2.3.3" + "readable-stream": "^2.0.2" } }, "isarray": { @@ -3522,13 +3522,13 @@ "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.0.3", + "util-deprecate": "~1.0.1" } }, "string_decoder": { @@ -3537,7 +3537,7 @@ "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } } } @@ -3554,11 +3554,11 @@ "integrity": "sha512-c0yTD2rbQzXtSsFSVhtpvY/vS6u066PcXOX9kBB3mSO76RiUQzL340uJkGBWnlBg4/HZzqiUXtaVA7wcRcJgEw==", "dev": true, "requires": { - "builtin-status-codes": "3.0.0", - "inherits": "2.0.3", - "readable-stream": "2.3.3", - "to-arraybuffer": "1.0.1", - "xtend": "4.0.1" + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.2.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" }, "dependencies": { "isarray": { @@ -3573,13 +3573,13 @@ "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.0.3", + "util-deprecate": "~1.0.1" } }, "string_decoder": { @@ -3588,7 +3588,7 @@ "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } } } @@ -3599,8 +3599,8 @@ "integrity": "sha1-G2O+Q4oTPktnHMGTUZdgAXWRDYM=", "dev": true, "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.3" + "inherits": "^2.0.1", + "readable-stream": "^2.0.2" }, "dependencies": { "isarray": { @@ -3615,13 +3615,13 @@ "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.0.3", + "util-deprecate": "~1.0.1" } }, "string_decoder": { @@ -3630,7 +3630,7 @@ "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } } } @@ -3647,7 +3647,7 @@ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-bom": { @@ -3656,8 +3656,8 @@ "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=", "dev": true, "requires": { - "first-chunk-stream": "1.0.0", - "is-utf8": "0.2.1" + "first-chunk-stream": "^1.0.0", + "is-utf8": "^0.2.0" } }, "strip-indent": { @@ -3666,7 +3666,7 @@ "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", "dev": true, "requires": { - "get-stdin": "4.0.1" + "get-stdin": "^4.0.1" } }, "subarg": { @@ -3675,7 +3675,7 @@ "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", "dev": true, "requires": { - "minimist": "1.2.0" + "minimist": "^1.1.0" } }, "supports-color": { @@ -3690,7 +3690,7 @@ "integrity": "sha1-HtkmbE1AvnXcVb+bsct3Biu5bKE=", "dev": true, "requires": { - "acorn": "4.0.13" + "acorn": "^4.0.3" } }, "through": { @@ -3705,8 +3705,8 @@ "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", "dev": true, "requires": { - "readable-stream": "2.3.3", - "xtend": "4.0.1" + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" }, "dependencies": { "isarray": { @@ -3721,13 +3721,13 @@ "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.0.3", + "util-deprecate": "~1.0.1" } }, "string_decoder": { @@ -3736,7 +3736,7 @@ "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } } } @@ -3747,7 +3747,7 @@ "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=", "dev": true, "requires": { - "os-homedir": "1.0.2" + "os-homedir": "^1.0.0" } }, "time-stamp": { @@ -3762,7 +3762,7 @@ "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", "dev": true, "requires": { - "process": "0.11.10" + "process": "~0.11.0" } }, "to-arraybuffer": { @@ -3801,9 +3801,9 @@ "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", "dev": true, "requires": { - "source-map": "0.5.7", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" } }, "uglify-to-browserify": { @@ -3890,7 +3890,7 @@ "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", "dev": true, "requires": { - "user-home": "1.1.1" + "user-home": "^1.1.1" } }, "validate-npm-package-license": { @@ -3899,8 +3899,8 @@ "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", "dev": true, "requires": { - "spdx-correct": "1.0.2", - "spdx-expression-parse": "1.0.4" + "spdx-correct": "~1.0.0", + "spdx-expression-parse": "~1.0.0" } }, "vinyl": { @@ -3909,8 +3909,8 @@ "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", "dev": true, "requires": { - "clone": "1.0.3", - "clone-stats": "0.0.1", + "clone": "^1.0.0", + "clone-stats": "^0.0.1", "replace-ext": "0.0.1" } }, @@ -3920,8 +3920,8 @@ "integrity": "sha1-ygZ+oIQx1QdyKx3lCD9gJhbrwjQ=", "dev": true, "requires": { - "bl": "0.9.5", - "through2": "0.6.5" + "bl": "^0.9.1", + "through2": "^0.6.1" }, "dependencies": { "readable-stream": { @@ -3930,10 +3930,10 @@ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", "isarray": "0.0.1", - "string_decoder": "0.10.31" + "string_decoder": "~0.10.x" } }, "through2": { @@ -3942,8 +3942,8 @@ "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", "dev": true, "requires": { - "readable-stream": "1.0.34", - "xtend": "4.0.1" + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" } } } @@ -3954,14 +3954,14 @@ "integrity": "sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=", "dev": true, "requires": { - "defaults": "1.0.3", - "glob-stream": "3.1.18", - "glob-watcher": "0.0.6", - "graceful-fs": "3.0.11", - "mkdirp": "0.5.1", - "strip-bom": "1.0.0", - "through2": "0.6.5", - "vinyl": "0.4.6" + "defaults": "^1.0.0", + "glob-stream": "^3.1.5", + "glob-watcher": "^0.0.6", + "graceful-fs": "^3.0.0", + "mkdirp": "^0.5.0", + "strip-bom": "^1.0.0", + "through2": "^0.6.1", + "vinyl": "^0.4.0" }, "dependencies": { "clone": { @@ -3976,10 +3976,10 @@ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", "isarray": "0.0.1", - "string_decoder": "0.10.31" + "string_decoder": "~0.10.x" } }, "through2": { @@ -3988,8 +3988,8 @@ "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", "dev": true, "requires": { - "readable-stream": "1.0.34", - "xtend": "4.0.1" + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" } }, "vinyl": { @@ -3998,8 +3998,8 @@ "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", "dev": true, "requires": { - "clone": "0.2.0", - "clone-stats": "0.0.1" + "clone": "^0.2.0", + "clone-stats": "^0.0.1" } } } @@ -4010,8 +4010,8 @@ "integrity": "sha1-RMvlEIIFJ53rDFZTwJSiiHk4sas=", "dev": true, "requires": { - "through2": "0.6.5", - "vinyl": "0.4.6" + "through2": "^0.6.1", + "vinyl": "^0.4.3" }, "dependencies": { "clone": { @@ -4026,10 +4026,10 @@ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", "isarray": "0.0.1", - "string_decoder": "0.10.31" + "string_decoder": "~0.10.x" } }, "through2": { @@ -4038,8 +4038,8 @@ "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", "dev": true, "requires": { - "readable-stream": "1.0.34", - "xtend": "4.0.1" + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" } }, "vinyl": { @@ -4048,8 +4048,8 @@ "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", "dev": true, "requires": { - "clone": "0.2.0", - "clone-stats": "0.0.1" + "clone": "^0.2.0", + "clone-stats": "^0.0.1" } } } @@ -4069,7 +4069,7 @@ "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", "dev": true, "requires": { - "isexe": "2.0.0" + "isexe": "^2.0.0" } }, "window-size": { @@ -4102,9 +4102,9 @@ "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", "dev": true, "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", "window-size": "0.1.0" }, "dependencies": { diff --git a/package.json b/package.json index 5f910c5..8bc1e31 100644 --- a/package.json +++ b/package.json @@ -1,14 +1,14 @@ { "name": "audiokeys", - "version": "0.1.1", - "description": "A utility for creating QWERTY keyboards with support for different monophonic and polyphonic behaviors.", + "version": "0.2.0", + "description": "A utility for turning typing keyboards into musical keyboards with support for different monophonic and polyphonic behaviors.", "main": "src/AudioKeys.js", "scripts": { "test": "mocha test/test.js" }, "repository": { - "type" : "git", - "url" : "https://github.com/kylestetz/AudioKeys.git" + "type": "git", + "url": "https://github.com/kylestetz/AudioKeys.git" }, "keywords": [ "web audio", diff --git a/src/AudioKeys.buffer.js b/src/AudioKeys.buffer.js index 51d91a0..d5cb104 100644 --- a/src/AudioKeys.buffer.js +++ b/src/AudioKeys.buffer.js @@ -13,28 +13,33 @@ module.exports = { _addKey: function(e) { + const identifier = this._getIdentifier(e); + var self = this; - // if the keyCode is one that can be mapped and isn't + // if the code is one that can be mapped and isn't // already pressed, add it to the key object. - if(self._isNote(e.keyCode) && !self._isPressed(e.keyCode)) { - var newKey = self._makeNote(e.keyCode); + if(self._isNote(identifier) && !self._isPressed(identifier)) { + var newKey = self._makeNote(identifier); // add the newKey to the list of keys self._state.keys = (self._state.keys || []).concat(newKey); // reevaluate the active notes based on our priority rules. // give it the new note to use if there is an event to trigger. self._update(); - } else if(self._isSpecialKey(e.keyCode)) { - self._specialKey(e.keyCode); + } else if(self._isSpecialKey(identifier)) { + self._specialKey(identifier); } }, _removeKey: function(e) { + const identifier = this._getIdentifier(e); + var self = this; - // if the keyCode is active, remove it from the key object. - if(self._isPressed(e.keyCode)) { + // if the code is active, remove it from the key object. + if(self._isPressed(identifier)) { var keyToRemove; - for(var i = 0; i < self._state.keys.length; i++) { - if(self._state.keys[i].keyCode === e.keyCode) { + for (var i = 0; i < self._state.keys.length; i++) { + const other = self._getIdentifier(self._state.keys[i]); + if(other === identifier) { keyToRemove = self._state.keys[i]; break; } @@ -46,15 +51,16 @@ module.exports = { } }, - _isPressed: function(keyCode) { + _isPressed: function(code) { var self = this; if(!self._state.keys || !self._state.keys.length) { return false; } - for(var i = 0; i < self._state.keys.length; i++) { - if(self._state.keys[i].keyCode === keyCode) { + for (var i = 0; i < self._state.keys.length; i++) { + const other = self._getIdentifier(self._state.keys[i]); + if(other === code) { return true; } } @@ -62,14 +68,16 @@ module.exports = { }, // turn a key object into a note object for the event listeners. - _makeNote: function(keyCode) { + _makeNote: function(code) { var self = this; - return { - keyCode: keyCode, - note: self._map(keyCode), - frequency: self._toFrequency( self._map(keyCode) ), - velocity: self._state.velocity + const note = { + note: self._map(code), + frequency: self._toFrequency(self._map(code)), + velocity: self._state.velocity, }; + const identifier = self._state.layoutIndependentMapping ? 'code' : 'keyCode'; + note[identifier] = code; + return note; }, // clear any active notes @@ -115,13 +123,9 @@ module.exports = { // if it's not in the OLD buffer, it's a note ON. // if it's not in the NEW buffer, it's a note OFF. - var oldNotes = oldBuffer.map( function(key) { - return key.keyCode; - }); + var oldNotes = oldBuffer.map(self._getIdentifier.bind(self)); - var newNotes = self._state.buffer.map( function(key) { - return key.keyCode; - }); + var newNotes = self._state.buffer.map(self._getIdentifier.bind(self)); // check for old (removed) notes var notesToRemove = []; @@ -141,17 +145,19 @@ module.exports = { notesToAdd.forEach( function(key) { for(var i = 0; i < self._state.buffer.length; i++) { - if(self._state.buffer[i].keyCode === key) { + const other = self._getIdentifier(self._state.buffer[i]); + if(other === key) { self._trigger('down', self._state.buffer[i]); break; } } }); - notesToRemove.forEach( function(key) { + notesToRemove.forEach(function(key) { // these need to fire the entire object for(var i = 0; i < oldBuffer.length; i++) { - if(oldBuffer[i].keyCode === key) { + const other = self._getIdentifier(oldBuffer[i]); + if(other === key) { // note up events should have a velocity of 0 oldBuffer[i].velocity = 0; self._trigger('up', oldBuffer[i]); diff --git a/src/AudioKeys.js b/src/AudioKeys.js index 0cef530..339ac36 100644 --- a/src/AudioKeys.js +++ b/src/AudioKeys.js @@ -12,6 +12,9 @@ function AudioKeys(options) { var self = this; self._setState(options); + // initialize key mapping according to keyIdentifier used + self._keyMap = self._getKeyMap(self._state.layoutIndependentMapping); + self._specialKeyMap = self._getSpecialKeyMap(self._state.layoutIndependentMapping); // all listeners are stored in arrays in their respective properties. // e.g. self._listeners.down = [fn1, fn2, ... ] @@ -38,7 +41,8 @@ AudioKeys.prototype._map = mapping._map; AudioKeys.prototype._offset = mapping._offset; AudioKeys.prototype._isNote = mapping._isNote; AudioKeys.prototype._toFrequency = mapping._toFrequency; -AudioKeys.prototype._keyMap = mapping._keyMap; +AudioKeys.prototype._getIdentifier = mapping._getIdentifier; +AudioKeys.prototype._getKeyMap = mapping._getKeyMap; // buffer AudioKeys.prototype._addKey = buffer._addKey; @@ -59,8 +63,8 @@ AudioKeys.prototype._lowest = priority._lowest; // special AudioKeys.prototype._isSpecialKey = special._isSpecialKey; AudioKeys.prototype._specialKey = special._specialKey; -AudioKeys.prototype._specialKeyMap = special._specialKeyMap; +AudioKeys.prototype._getSpecialKeyMap = special._getSpecialKeyMap; // Browserify will take care of making this a global // in a browser environment without a build system. -module.exports = AudioKeys; \ No newline at end of file +module.exports = AudioKeys; diff --git a/src/AudioKeys.mapping.js b/src/AudioKeys.mapping.js index 139f681..d802de9 100644 --- a/src/AudioKeys.mapping.js +++ b/src/AudioKeys.mapping.js @@ -1,16 +1,16 @@ module.exports = { - // _map returns the midi note for a given keyCode. - _map: function(keyCode) { - return this._keyMap[this._state.rows][keyCode] + this._offset(); + // _map returns the midi note for a given code. + _map: function(code) { + return this._keyMap[this._state.rows][code] + this._offset(); }, _offset: function() { return this._state.rootNote - this._keyMap[this._state.rows].root + (this._state.octave * 12); }, - // _isNote determines whether a keyCode is a note or not. - _isNote: function(keyCode) { - return !!this._keyMap[this._state.rows][keyCode]; + // _isNote determines whether a code is a note or not. + _isNote: function(code) { + return !!this._keyMap[this._state.rows][code]; }, // convert a midi note to a frequency. we assume here that _map has @@ -19,74 +19,149 @@ module.exports = { return ( Math.pow(2, ( note-69 ) / 12) ) * 440.0; }, - // the object keys correspond to `rows`, so `_keyMap[rows]` should - // retrieve that particular mapping. - _keyMap: { - 1: { - root: 60, - // starting with the 'a' key - 65: 60, - 87: 61, - 83: 62, - 69: 63, - 68: 64, - 70: 65, - 84: 66, - 71: 67, - 89: 68, - 72: 69, - 85: 70, - 74: 71, - 75: 72, - 79: 73, - 76: 74, - 80: 75, - 186: 76, - 222: 77 - }, - 2: { - root: 60, - // bottom row - 90: 60, - 83: 61, - 88: 62, - 68: 63, - 67: 64, - 86: 65, - 71: 66, - 66: 67, - 72: 68, - 78: 69, - 74: 70, - 77: 71, - 188: 72, - 76: 73, - 190: 74, - 186: 75, - 191: 76, - // top row - 81: 72, - 50: 73, - 87: 74, - 51: 75, - 69: 76, - 82: 77, - 53: 78, - 84: 79, - 54: 80, - 89: 81, - 55: 82, - 85: 83, - 73: 84, - 57: 85, - 79: 86, - 48: 87, - 80: 88, - 219: 89, - 187: 90, - 221: 91 - } + // retrieve appropriate key identifier from keyboard event + _getIdentifier: function(e) { + var self = this; + return e[self._state.layoutIndependentMapping ? 'code' : 'keyCode']; }, + _getKeyMap: function(useLayoutIndependentMapping) { + // the object keys correspond to `rows`, so `_keyMap[rows]` should + // retrieve that particular mapping. + if (useLayoutIndependentMapping) { + return { + 1: { + root: 60, + // starting with the 'a' key + KeyA: 60, + KeyW: 61, + KeyS: 62, + KeyE: 63, + KeyD: 64, + KeyF: 65, + KeyT: 66, + KeyG: 67, + KeyY: 68, + KeyH: 69, + KeyU: 70, + KeyJ: 71, + KeyK: 72, + KeyO: 73, + KeyL: 74, + KeyP: 75, + SemiColon: 76, + Quote: 77, + }, + 2: { + root: 60, + // bottom row + KeyZ: 60, + KeyS: 61, + KeyX: 62, + KeyD: 63, + KeyC: 64, + KeyV: 65, + KeyG: 66, + KeyB: 67, + KeyH: 68, + KeyN: 69, + KeyJ: 70, + KeyM: 71, + Comma: 72, + KeyL: 73, + Period: 74, + SemiColon: 75, + Slash: 76, + // top row + KeyQ: 72, + Digit2: 73, + KeyW: 74, + Digit3: 75, + KeyE: 76, + KeyR: 77, + Digit5: 78, + KeyT: 79, + Digit6: 80, + KeyY: 81, + Digit7: 82, + KeyU: 83, + KeyI: 84, + Digit9: 85, + KeyO: 86, + Digit0: 87, + KeyP: 88, + BracketLeft: 89, + Equal: 90, + BracketRight: 91, + } + } + } else { + return { + 1: { + root: 60, + // starting with the 'a' key + 65: 60, + 87: 61, + 83: 62, + 69: 63, + 68: 64, + 70: 65, + 84: 66, + 71: 67, + 89: 68, + 72: 69, + 85: 70, + 74: 71, + 75: 72, + 79: 73, + 76: 74, + 80: 75, + 186: 76, + 222: 77, + }, + 2: { + root: 60, + // bottom row + 90: 60, + 83: 61, + 88: 62, + 68: 63, + 67: 64, + 86: 65, + 71: 66, + 66: 67, + 72: 68, + 78: 69, + 74: 70, + 77: 71, + 188: 72, + 76: 73, + 190: 74, + 186: 75, + 191: 76, + // top row + 81: 72, + 50: 73, + 87: 74, + 51: 75, + 69: 76, + 82: 77, + 53: 78, + 84: 79, + 54: 80, + 89: 81, + 55: 82, + 85: 83, + 73: 84, + 57: 85, + 79: 86, + 48: 87, + 80: 88, + 219: 89, + 187: 90, + 221: 91, + }, + } + } + } }; - diff --git a/src/AudioKeys.special.js b/src/AudioKeys.special.js index c0b8782..ae6d649 100644 --- a/src/AudioKeys.special.js +++ b/src/AudioKeys.special.js @@ -1,72 +1,135 @@ // This file maps special keys to the state— octave shifting and // velocity selection, both available when `rows` = 1. module.exports = { - _isSpecialKey: function(keyCode) { - return (this._state.rows === 1 && this._specialKeyMap[keyCode]); + _isSpecialKey: function(code) { + return this._state.rows === 1 && this._specialKeyMap[code]; }, - _specialKey: function(keyCode) { + _specialKey: function(code) { var self = this; - if(self._specialKeyMap[keyCode].type === 'octave' && self._state.octaveControls) { + if( + self._specialKeyMap[code].type === 'octave' && + self._state.octaveControls + ) { // shift the state of the `octave` - self._state.octave += self._specialKeyMap[keyCode].value; - } else if(self._specialKeyMap[keyCode].type === 'velocity' && self._state.velocityControls) { + self._state.octave += self._specialKeyMap[code].value; + } else if( + self._specialKeyMap[code].type === 'velocity' && + self._state.velocityControls + ) { // set the `velocity` to a new value - self._state.velocity = self._specialKeyMap[keyCode].value; + self._state.velocity = self._specialKeyMap[code].value; } }, - _specialKeyMap: { - // octaves - 90: { - type: 'octave', - value: -1 - }, - 88: { - type: 'octave', - value: 1 - }, - // velocity - 49: { - type: 'velocity', - value: 1 - }, - 50: { - type: 'velocity', - value: 14 - }, - 51: { - type: 'velocity', - value: 28 - }, - 52: { - type: 'velocity', - value: 42 - }, - 53: { - type: 'velocity', - value: 56 - }, - 54: { - type: 'velocity', - value: 70 - }, - 55: { - type: 'velocity', - value: 84 - }, - 56: { - type: 'velocity', - value: 98 - }, - 57: { - type: 'velocity', - value: 112 - }, - 48: { - type: 'velocity', - value: 127 - }, + _getSpecialKeyMap: function(useLayoutIndependentMapping) { + if (useLayoutIndependentMapping) { + return { + // octaves + KeyZ: { + type: 'octave', + value: -1, + }, + KeyX: { + type: 'octave', + value: 1, + }, + // velocity + Digit1: { + type: 'velocity', + value: 1, + }, + Digit2: { + type: 'velocity', + value: 14, + }, + Digit3: { + type: 'velocity', + value: 28, + }, + Digit4: { + type: 'velocity', + value: 42, + }, + Digit5: { + type: 'velocity', + value: 56, + }, + Digit6: { + type: 'velocity', + value: 70, + }, + Digit7: { + type: 'velocity', + value: 84, + }, + Digit8: { + type: 'velocity', + value: 98, + }, + Digit9: { + type: 'velocity', + value: 112, + }, + Digit0: { + type: 'velocity', + value: 127, + }, + } + } else { + return { + // octaves + 90: { + type: 'octave', + value: -1, + }, + 88: { + type: 'octave', + value: 1, + }, + // velocity + 49: { + type: 'velocity', + value: 1, + }, + 50: { + type: 'velocity', + value: 14, + }, + 51: { + type: 'velocity', + value: 28, + }, + 52: { + type: 'velocity', + value: 42, + }, + 53: { + type: 'velocity', + value: 56, + }, + 54: { + type: 'velocity', + value: 70, + }, + 55: { + type: 'velocity', + value: 84, + }, + 56: { + type: 'velocity', + value: 98, + }, + 57: { + type: 'velocity', + value: 112, + }, + 48: { + type: 'velocity', + value: 127, + }, + } + } }, }; diff --git a/src/AudioKeys.state.js b/src/AudioKeys.state.js index d161605..a4f30bb 100644 --- a/src/AudioKeys.state.js +++ b/src/AudioKeys.state.js @@ -20,7 +20,8 @@ module.exports = { velocityControls: true, velocity: 127, keys: [], - buffer: [] + buffer: [], + layoutIndependentMapping: false }); // ... and override them with options. diff --git a/test/test.buffer.js b/test/test.buffer.js index 0d053c1..0615559 100644 --- a/test/test.buffer.js +++ b/test/test.buffer.js @@ -15,7 +15,19 @@ describe('Buffers', function() { keyCode: 65, frequency: keyboard._toFrequency(60), isActive: true, - velocity: 127 + velocity: 127, + }); + + var keyboard = new AudioKeys({ layoutIndependentMapping: true }); + + // simulated key event + keyboard._addKey({ code: 'KeyA' }); + assert.deepEqual(keyboard._state.keys[0], { + note: 60, + code: 'KeyA', + frequency: keyboard._toFrequency(60), + isActive: true, + velocity: 127, }); }); @@ -27,6 +39,13 @@ describe('Buffers', function() { assert.equal(keyboard._state.keys.length, 1); keyboard._removeKey({ keyCode: 65 }); assert.strictEqual(keyboard._state.keys.length, 0); + + var keyboard = new AudioKeys({ layoutIndependentMapping: true }); + // simulated key event + keyboard._addKey({ code: 'KeyA' }); + assert.equal(keyboard._state.keys.length, 1); + keyboard._removeKey({ code: 'KeyA' }); + assert.strictEqual(keyboard._state.keys.length, 0); }); it('should verify whether or not a key is active', function() { @@ -35,6 +54,12 @@ describe('Buffers', function() { // simulated key event keyboard._addKey({ keyCode: 65 }); assert.equal(keyboard._isPressed(65), true); + + var keyboard = new AudioKeys({ layoutIndependentMapping: true }); + + // simulated key event + keyboard._addKey({ code: 'KeyA' }); + assert.equal(keyboard._isPressed('KeyA'), true); }); it('should `clear` any active keys', function() { @@ -48,6 +73,15 @@ describe('Buffers', function() { keyboard.clear(); assert.strictEqual(keyboard._state.keys.length, 0); assert.strictEqual(keyboard._state.buffer.length, 0); + + var keyboard = new AudioKeys({ polyphony: 1, layoutIndependentMapping: true }); + + // simulated key event + keyboard._addKey({ code: 'KeyA' }); + keyboard._addKey({ keyCode: 'KeyW' }); + keyboard.clear(); + assert.strictEqual(keyboard._state.keys.length, 0); + assert.strictEqual(keyboard._state.buffer.length, 0); }); }); diff --git a/test/test.mapping.js b/test/test.mapping.js index 45ba46b..034d936 100644 --- a/test/test.mapping.js +++ b/test/test.mapping.js @@ -30,6 +30,16 @@ describe('Mapping', function() { keyboard.set('rows', 2); // "z" (90) maps to 60 assert.equal(keyboard._map(90), 60); + + var keyboard = new AudioKeys({ layoutIndependentMapping: true }); + + keyboard.set('rows', 1); + // "a" maps to 60 + assert.equal(keyboard._map('KeyA'), 60); + + keyboard.set('rows', 2); + // "z" maps to 60 + assert.equal(keyboard._map('KeyZ'), 60); }); it('should determine if a keyCode corresponds to a note using `_isNote`', function() { @@ -42,6 +52,16 @@ describe('Mapping', function() { keyboard.set('rows', 2); // "a" should not be a note now assert.equal(keyboard._isNote(65), false); + + var keyboard = new AudioKeys({ layoutIndependentMapping: true }); + + keyboard.set('rows', 1); + // "a" maps to 60 + assert.equal(keyboard._isNote('KeyA'), true); + + keyboard.set('rows', 2); + // "a" should not be a note now + assert.equal(keyboard._isNote('KeyA'), false); }); it('should return a note offset by the rootNote', function() { @@ -50,6 +70,12 @@ describe('Mapping', function() { keyboard.set('rootNote', 72); keyboard.set('rows', 1); assert.equal(keyboard._map(65), 72); + + var keyboard = new AudioKeys({ layoutIndependentMapping: true }); + + keyboard.set('rootNote', 72); + keyboard.set('rows', 1); + assert.equal(keyboard._map('KeyA'), 72); }); it('should convert midi notes to frequency in Hz', function() { diff --git a/test/test.special.js b/test/test.special.js index 076b586..91b323c 100644 --- a/test/test.special.js +++ b/test/test.special.js @@ -15,6 +15,18 @@ describe('Special Keys', function() { // 'a' (rootNote) keyboard._addKey({ keyCode: 65 }); assert.equal(keyboard._state.buffer[0].note, keyboard._state.rootNote - 12); + + var keyboard = new AudioKeys({ + rows: 1, + octaveControls: true, + layoutIndependentMapping: true + }); + + keyboard._addKey({ code: 'KeyZ' }); + assert.equal(keyboard._state.octave, -1); + // 'a' (rootNote) + keyboard._addKey({ code: 'KeyA' }); + assert.equal(keyboard._state.buffer[0].note, keyboard._state.rootNote - 12); }); it('should shift the octave up when `x` is pressed', function() { @@ -28,6 +40,18 @@ describe('Special Keys', function() { // 'a' (rootNote) keyboard._addKey({ keyCode: 65 }); assert.equal(keyboard._state.buffer[0].note, keyboard._state.rootNote + 12); + + var keyboard = new AudioKeys({ + rows: 1, + octaveControls: true, + layoutIndependentMapping: true + }); + + keyboard._addKey({ code: 'KeyX' }); + assert.equal(keyboard._state.octave, 1); + // 'a' (rootNote) + keyboard._addKey({ code: 'KeyA' }); + assert.equal(keyboard._state.buffer[0].note, keyboard._state.rootNote + 12); }); it('should not modify an existing note when the octave is shifted', function() { @@ -45,6 +69,22 @@ describe('Special Keys', function() { // shift octave up keyboard._addKey({ keyCode: 88 }); keyboard._removeKey({ keyCode: 65 }); + + var keyboard = new AudioKeys({ + rows: 1, + octaveControls: true, + layoutIndependentMapping: true + }); + + keyboard.up( function(note) { + assert.equal(note.note, keyboard._state.rootNote); + }); + + // 'a' (rootNote) + keyboard._addKey({ code: 'KeyA' }); + // shift octave up + keyboard._addKey({ code: 'KeyX' }); + keyboard._removeKey({ code: 'KeyA' }); }); it('should not allow octave control when `octaveControls` is false', function() { @@ -58,6 +98,18 @@ describe('Special Keys', function() { // 'a' (rootNote) keyboard._addKey({ keyCode: 65 }); assert.equal(keyboard._state.buffer[0].note, keyboard._state.rootNote); + + var keyboard = new AudioKeys({ + rows: 1, + octaveControls: false, + layoutIndependentMapping: true + }); + + // 'x', which would shift octave up + keyboard._addKey({ code: 'KeyX' }); + // 'a' (rootNote) + keyboard._addKey({ code: 'KeyA' }); + assert.equal(keyboard._state.buffer[0].note, keyboard._state.rootNote); }); }); @@ -77,6 +129,22 @@ describe('Special Keys', function() { keyboard._addKey({ keyCode: notes[i] }); assert.equal(keyboard._state.buffer[i].velocity, velocities[i]); }); + + var keyboard = new AudioKeys({ + rows: 1, + velocityControls: true, + polyphony: 100, + layoutIndependentMapping: true + }); + + var velocities = [1, 14, 28, 42, 56, 70, 84, 98, 112, 127]; + var notes = [ "KeyA", "KeyW", "KeyS", "KeyE", "KeyD", "KeyF", "KeyT", "KeyG", "KeyY", "KeyH" ]; + + [ "Digit1", "Digit2", "Digit3", "Digit4", "Digit5", "Digit6", "Digit7", "Digit8", "Digit9", "Digit0" ].forEach( function(code, i) { + keyboard._addKey({ code: code }); + keyboard._addKey({ code: notes[i] }); + assert.equal(keyboard._state.buffer[i].velocity, velocities[i]); + }); }); it('should not allow velocity control when `velocityControls` is false', function() { @@ -89,6 +157,17 @@ describe('Special Keys', function() { keyboard._addKey({ keyCode: 53 }); keyboard._addKey({ keyCode: 65 }); assert.equal(keyboard._state.buffer[0].velocity, 127); + + var keyboard = new AudioKeys({ + rows: 1, + velocityControls: false, + layoutIndependentMapping: true + }); + + // '5', which should set the velocity to 56 + keyboard._addKey({ code: 'Digit5' }); + keyboard._addKey({ code: 'KeyA' }); + assert.equal(keyboard._state.buffer[0].velocity, 127); }); }); });