├── .eslintrc.json ├── .gitattributes ├── .gitignore ├── .travis.yml ├── README.md ├── index.js ├── package-lock.json ├── package.json └── test ├── .eslintrc.json ├── decode.js ├── decode.sync.js ├── decoding.js └── fixtures ├── amen.dat ├── amen_pcm16.wav ├── amen_pcm24.wav ├── amen_pcm32.wav ├── amen_pcm32f.wav └── amen_pcm8.wav /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "node": true 4 | }, 5 | "globals": { 6 | "Promise": true, 7 | "DataView": true, 8 | "Uint8Array": true, 9 | "Float32Array": true 10 | }, 11 | "extends": "eslint:recommended" 12 | } 13 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | test/fixtures/* -diff 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_STORE 2 | npm-debug.log 3 | node_modules/ 4 | coverage/ 5 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | sudo: false 3 | node_js: 4 | - "6.0" 5 | - "8.0" 6 | cache: 7 | directories: 8 | - node_modules 9 | script: 10 | - npm run travis 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # wav-decoder 2 | [![Build Status](https://img.shields.io/travis/mohayonao/wav-decoder.svg?style=flat-square)](https://travis-ci.org/mohayonao/wav-decoder) 3 | [![NPM Version](https://img.shields.io/npm/v/wav-decoder.svg?style=flat-square)](https://www.npmjs.org/package/wav-decoder) 4 | [![License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](https://mohayonao.mit-license.org/) 5 | 6 | > promise-based wav decoder 7 | 8 | ## Installation 9 | 10 | ``` 11 | $ npm install wav-decoder 12 | ``` 13 | 14 | ## API 15 | 16 | - `decode(src: ArrayBuffer, [opts: object]): Promise` 17 | - if provide an instance of `Buffer`, it is converted to `ArrayBuffer` like `Uint8Array.from(src).buffer` implicitly. 18 | - `opts.symmetric` decode to symmetrical values (see [#14](https://github.com/mohayonao/wav-decoder/issues/14)) 19 | - `decode.sync(src: ArrayBuffer, [opts: object]): AudioData` 20 | - synchronous version 21 | 22 | ##### Returns 23 | 24 | ```js 25 | interface AudioData { 26 | sampleRate: number; 27 | channelData: Float32Array[]; 28 | } 29 | ``` 30 | 31 | ## Usage 32 | 33 | ```js 34 | const fs = require("fs"); 35 | const WavDecoder = require("wav-decoder"); 36 | 37 | const readFile = (filepath) => { 38 | return new Promise((resolve, reject) => { 39 | fs.readFile(filepath, (err, buffer) => { 40 | if (err) { 41 | return reject(err); 42 | } 43 | return resolve(buffer); 44 | }); 45 | }); 46 | }; 47 | 48 | readFile("foobar.wav").then((buffer) => { 49 | return WavDecoder.decode(buffer); 50 | }).then(function(audioData) { 51 | console.log(audioData.sampleRate); 52 | console.log(audioData.channelData[0]); // Float32Array 53 | console.log(audioData.channelData[1]); // Float32Array 54 | }); 55 | ``` 56 | 57 | ## License 58 | MIT 59 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | var formats = { 4 | 0x0001: "lpcm", 5 | 0x0003: "lpcm" 6 | }; 7 | 8 | function decodeSync(buffer, opts) { 9 | opts = opts || {}; 10 | 11 | if (global.Buffer && buffer instanceof global.Buffer) { 12 | buffer = Uint8Array.from(buffer).buffer; 13 | } 14 | 15 | var dataView = new DataView(buffer); 16 | var reader = createReader(dataView); 17 | 18 | if (reader.string(4) !== "RIFF") { 19 | throw new TypeError("Invalid WAV file"); 20 | } 21 | 22 | reader.uint32(); // skip file length 23 | 24 | if (reader.string(4) !== "WAVE") { 25 | throw new TypeError("Invalid WAV file"); 26 | } 27 | 28 | var format = null; 29 | var audioData = null; 30 | 31 | do { 32 | var chunkType = reader.string(4); 33 | var chunkSize = reader.uint32(); 34 | 35 | switch (chunkType) { 36 | case "fmt ": 37 | format = decodeFormat(reader, chunkSize); 38 | if (format instanceof Error) { 39 | throw format; 40 | } 41 | break; 42 | case "data": 43 | audioData = decodeData(reader, chunkSize, format, opts); 44 | if (audioData instanceof Error) { 45 | throw audioData; 46 | } 47 | break; 48 | default: 49 | reader.skip(chunkSize); 50 | break; 51 | } 52 | } while (audioData === null); 53 | 54 | return audioData; 55 | } 56 | 57 | function decode(buffer, opts) { 58 | return new Promise(function(resolve) { 59 | resolve(decodeSync(buffer, opts)); 60 | }); 61 | } 62 | 63 | function decodeFormat(reader, chunkSize) { 64 | var formatId = reader.uint16(); 65 | 66 | if (!formats.hasOwnProperty(formatId)) { 67 | return new TypeError("Unsupported format in WAV file: 0x" + formatId.toString(16)); 68 | } 69 | 70 | var format = { 71 | formatId: formatId, 72 | floatingPoint: formatId === 0x0003, 73 | numberOfChannels: reader.uint16(), 74 | sampleRate: reader.uint32(), 75 | byteRate: reader.uint32(), 76 | blockSize: reader.uint16(), 77 | bitDepth: reader.uint16() 78 | }; 79 | reader.skip(chunkSize - 16); 80 | 81 | return format; 82 | } 83 | 84 | function decodeData(reader, chunkSize, format, opts) { 85 | chunkSize = Math.min(chunkSize, reader.remain()); 86 | 87 | var length = Math.floor(chunkSize / format.blockSize); 88 | var numberOfChannels = format.numberOfChannels; 89 | var sampleRate = format.sampleRate; 90 | var channelData = new Array(numberOfChannels); 91 | 92 | for (var ch = 0; ch < numberOfChannels; ch++) { 93 | channelData[ch] = new Float32Array(length); 94 | } 95 | 96 | var retVal = readPCM(reader, channelData, length, format, opts); 97 | 98 | if (retVal instanceof Error) { 99 | return retVal; 100 | } 101 | 102 | return { 103 | numberOfChannels: numberOfChannels, 104 | length: length, 105 | sampleRate: sampleRate, 106 | channelData: channelData 107 | }; 108 | } 109 | 110 | function readPCM(reader, channelData, length, format, opts) { 111 | var bitDepth = format.bitDepth; 112 | var decoderOption = format.floatingPoint ? "f" : opts.symmetric ? "s" : ""; 113 | var methodName = "pcm" + bitDepth + decoderOption; 114 | 115 | if (!reader[methodName]) { 116 | return new TypeError("Not supported bit depth: " + format.bitDepth); 117 | } 118 | 119 | var read = reader[methodName].bind(reader); 120 | var numberOfChannels = format.numberOfChannels; 121 | 122 | for (var i = 0; i < length; i++) { 123 | for (var ch = 0; ch < numberOfChannels; ch++) { 124 | channelData[ch][i] = read(); 125 | } 126 | } 127 | 128 | return null; 129 | } 130 | 131 | function createReader(dataView) { 132 | var pos = 0; 133 | 134 | return { 135 | remain: function() { 136 | return dataView.byteLength - pos; 137 | }, 138 | skip: function(n) { 139 | pos += n; 140 | }, 141 | uint8: function() { 142 | var data = dataView.getUint8(pos, true); 143 | 144 | pos += 1; 145 | 146 | return data; 147 | }, 148 | int16: function() { 149 | var data = dataView.getInt16(pos, true); 150 | 151 | pos += 2; 152 | 153 | return data; 154 | }, 155 | uint16: function() { 156 | var data = dataView.getUint16(pos, true); 157 | 158 | pos += 2; 159 | 160 | return data; 161 | }, 162 | uint32: function() { 163 | var data = dataView.getUint32(pos, true); 164 | 165 | pos += 4; 166 | 167 | return data; 168 | }, 169 | string: function(n) { 170 | var data = ""; 171 | 172 | for (var i = 0; i < n; i++) { 173 | data += String.fromCharCode(this.uint8()); 174 | } 175 | 176 | return data; 177 | }, 178 | pcm8: function() { 179 | var data = dataView.getUint8(pos) - 128; 180 | 181 | pos += 1; 182 | 183 | return data < 0 ? data / 128 : data / 127; 184 | }, 185 | pcm8s: function() { 186 | var data = dataView.getUint8(pos) - 127.5; 187 | 188 | pos += 1; 189 | 190 | return data / 127.5; 191 | }, 192 | pcm16: function() { 193 | var data = dataView.getInt16(pos, true); 194 | 195 | pos += 2; 196 | 197 | return data < 0 ? data / 32768 : data / 32767; 198 | }, 199 | pcm16s: function() { 200 | var data = dataView.getInt16(pos, true); 201 | 202 | pos += 2; 203 | 204 | return data / 32768; 205 | }, 206 | pcm24: function() { 207 | var x0 = dataView.getUint8(pos + 0); 208 | var x1 = dataView.getUint8(pos + 1); 209 | var x2 = dataView.getUint8(pos + 2); 210 | var xx = (x0 + (x1 << 8) + (x2 << 16)); 211 | var data = xx > 0x800000 ? xx - 0x1000000 : xx; 212 | 213 | pos += 3; 214 | 215 | return data < 0 ? data / 8388608 : data / 8388607; 216 | }, 217 | pcm24s: function() { 218 | var x0 = dataView.getUint8(pos + 0); 219 | var x1 = dataView.getUint8(pos + 1); 220 | var x2 = dataView.getUint8(pos + 2); 221 | var xx = (x0 + (x1 << 8) + (x2 << 16)); 222 | var data = xx > 0x800000 ? xx - 0x1000000 : xx; 223 | 224 | pos += 3; 225 | 226 | return data / 8388608; 227 | }, 228 | pcm32: function() { 229 | var data = dataView.getInt32(pos, true); 230 | 231 | pos += 4; 232 | 233 | return data < 0 ? data / 2147483648 : data / 2147483647; 234 | }, 235 | pcm32s: function() { 236 | var data = dataView.getInt32(pos, true); 237 | 238 | pos += 4; 239 | 240 | return data / 2147483648; 241 | }, 242 | pcm32f: function() { 243 | var data = dataView.getFloat32(pos, true); 244 | 245 | pos += 4; 246 | 247 | return data; 248 | }, 249 | pcm64f: function() { 250 | var data = dataView.getFloat64(pos, true); 251 | 252 | pos += 8; 253 | 254 | return data; 255 | } 256 | }; 257 | } 258 | 259 | module.exports.decode = decode; 260 | module.exports.decode.sync = decodeSync; 261 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "wav-decoder", 3 | "version": "1.3.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "acorn": { 8 | "version": "5.1.1", 9 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.1.1.tgz", 10 | "integrity": "sha512-vOk6uEMctu0vQrvuSqFdJyqj1Q0S5VTDL79qtjo+DhRr+1mmaD+tluFSCZqhvi/JUhXSzoZN2BhtstaPEeE8cw==", 11 | "dev": true 12 | }, 13 | "acorn-jsx": { 14 | "version": "3.0.1", 15 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", 16 | "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", 17 | "dev": true, 18 | "requires": { 19 | "acorn": "3.3.0" 20 | }, 21 | "dependencies": { 22 | "acorn": { 23 | "version": "3.3.0", 24 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", 25 | "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", 26 | "dev": true 27 | } 28 | } 29 | }, 30 | "ajv": { 31 | "version": "5.2.2", 32 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.2.2.tgz", 33 | "integrity": "sha1-R8aNaehvXZUxA7AHSpQw3GPaXjk=", 34 | "dev": true, 35 | "requires": { 36 | "co": "4.6.0", 37 | "fast-deep-equal": "1.0.0", 38 | "json-schema-traverse": "0.3.1", 39 | "json-stable-stringify": "1.0.1" 40 | } 41 | }, 42 | "ajv-keywords": { 43 | "version": "1.5.1", 44 | "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", 45 | "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", 46 | "dev": true 47 | }, 48 | "ansi-escapes": { 49 | "version": "2.0.0", 50 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-2.0.0.tgz", 51 | "integrity": "sha1-W65SvkJIeN2Xg+iRDj/Cki6DyBs=", 52 | "dev": true 53 | }, 54 | "ansi-regex": { 55 | "version": "2.1.1", 56 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 57 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 58 | "dev": true 59 | }, 60 | "ansi-styles": { 61 | "version": "2.2.1", 62 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 63 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", 64 | "dev": true 65 | }, 66 | "argparse": { 67 | "version": "1.0.9", 68 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", 69 | "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", 70 | "dev": true, 71 | "requires": { 72 | "sprintf-js": "1.0.3" 73 | } 74 | }, 75 | "array-union": { 76 | "version": "1.0.2", 77 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", 78 | "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", 79 | "dev": true, 80 | "requires": { 81 | "array-uniq": "1.0.3" 82 | } 83 | }, 84 | "array-uniq": { 85 | "version": "1.0.3", 86 | "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", 87 | "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", 88 | "dev": true 89 | }, 90 | "arrify": { 91 | "version": "1.0.1", 92 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", 93 | "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", 94 | "dev": true 95 | }, 96 | "babel-code-frame": { 97 | "version": "6.22.0", 98 | "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", 99 | "integrity": "sha1-AnYgvuVnqIwyVhV05/0IAdMxGOQ=", 100 | "dev": true, 101 | "requires": { 102 | "chalk": "1.1.3", 103 | "esutils": "2.0.2", 104 | "js-tokens": "3.0.2" 105 | } 106 | }, 107 | "balanced-match": { 108 | "version": "1.0.0", 109 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 110 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 111 | "dev": true 112 | }, 113 | "brace-expansion": { 114 | "version": "1.1.8", 115 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", 116 | "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", 117 | "dev": true, 118 | "requires": { 119 | "balanced-match": "1.0.0", 120 | "concat-map": "0.0.1" 121 | } 122 | }, 123 | "browser-stdout": { 124 | "version": "1.3.0", 125 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", 126 | "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", 127 | "dev": true 128 | }, 129 | "caller-path": { 130 | "version": "0.1.0", 131 | "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", 132 | "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", 133 | "dev": true, 134 | "requires": { 135 | "callsites": "0.2.0" 136 | } 137 | }, 138 | "callsites": { 139 | "version": "0.2.0", 140 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", 141 | "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", 142 | "dev": true 143 | }, 144 | "chalk": { 145 | "version": "1.1.3", 146 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 147 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 148 | "dev": true, 149 | "requires": { 150 | "ansi-styles": "2.2.1", 151 | "escape-string-regexp": "1.0.5", 152 | "has-ansi": "2.0.0", 153 | "strip-ansi": "3.0.1", 154 | "supports-color": "2.0.0" 155 | } 156 | }, 157 | "circular-json": { 158 | "version": "0.3.3", 159 | "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", 160 | "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", 161 | "dev": true 162 | }, 163 | "cli-cursor": { 164 | "version": "2.1.0", 165 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", 166 | "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", 167 | "dev": true, 168 | "requires": { 169 | "restore-cursor": "2.0.0" 170 | } 171 | }, 172 | "cli-width": { 173 | "version": "2.1.0", 174 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.1.0.tgz", 175 | "integrity": "sha1-sjTKIJsp72b8UY2bmNWEewDt8Ao=", 176 | "dev": true 177 | }, 178 | "co": { 179 | "version": "4.6.0", 180 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 181 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", 182 | "dev": true 183 | }, 184 | "color-convert": { 185 | "version": "1.9.0", 186 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz", 187 | "integrity": "sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o=", 188 | "dev": true, 189 | "requires": { 190 | "color-name": "1.1.3" 191 | } 192 | }, 193 | "color-name": { 194 | "version": "1.1.3", 195 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 196 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 197 | "dev": true 198 | }, 199 | "commander": { 200 | "version": "2.9.0", 201 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", 202 | "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", 203 | "dev": true, 204 | "requires": { 205 | "graceful-readlink": "1.0.1" 206 | } 207 | }, 208 | "concat-map": { 209 | "version": "0.0.1", 210 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 211 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 212 | "dev": true 213 | }, 214 | "concat-stream": { 215 | "version": "1.6.0", 216 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", 217 | "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", 218 | "dev": true, 219 | "requires": { 220 | "inherits": "2.0.3", 221 | "readable-stream": "2.3.3", 222 | "typedarray": "0.0.6" 223 | } 224 | }, 225 | "core-util-is": { 226 | "version": "1.0.2", 227 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 228 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 229 | "dev": true 230 | }, 231 | "cross-spawn": { 232 | "version": "5.1.0", 233 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", 234 | "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", 235 | "dev": true, 236 | "requires": { 237 | "lru-cache": "4.1.1", 238 | "shebang-command": "1.2.0", 239 | "which": "1.3.0" 240 | } 241 | }, 242 | "debug": { 243 | "version": "2.6.8", 244 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", 245 | "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", 246 | "dev": true, 247 | "requires": { 248 | "ms": "2.0.0" 249 | } 250 | }, 251 | "deep-is": { 252 | "version": "0.1.3", 253 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 254 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 255 | "dev": true 256 | }, 257 | "del": { 258 | "version": "2.2.2", 259 | "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", 260 | "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", 261 | "dev": true, 262 | "requires": { 263 | "globby": "5.0.0", 264 | "is-path-cwd": "1.0.0", 265 | "is-path-in-cwd": "1.0.0", 266 | "object-assign": "4.1.1", 267 | "pify": "2.3.0", 268 | "pinkie-promise": "2.0.1", 269 | "rimraf": "2.6.1" 270 | } 271 | }, 272 | "diff": { 273 | "version": "3.2.0", 274 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", 275 | "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", 276 | "dev": true 277 | }, 278 | "doctrine": { 279 | "version": "2.0.0", 280 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz", 281 | "integrity": "sha1-xz2NKQnSIpHhoAejlYBNqLZl/mM=", 282 | "dev": true, 283 | "requires": { 284 | "esutils": "2.0.2", 285 | "isarray": "1.0.0" 286 | } 287 | }, 288 | "escape-string-regexp": { 289 | "version": "1.0.5", 290 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 291 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 292 | "dev": true 293 | }, 294 | "eslint": { 295 | "version": "4.4.1", 296 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.4.1.tgz", 297 | "integrity": "sha1-mc1+r8/8ov+Zpcj18qR01jZLS9M=", 298 | "dev": true, 299 | "requires": { 300 | "ajv": "5.2.2", 301 | "babel-code-frame": "6.22.0", 302 | "chalk": "1.1.3", 303 | "concat-stream": "1.6.0", 304 | "cross-spawn": "5.1.0", 305 | "debug": "2.6.8", 306 | "doctrine": "2.0.0", 307 | "eslint-scope": "3.7.1", 308 | "espree": "3.5.0", 309 | "esquery": "1.0.0", 310 | "estraverse": "4.2.0", 311 | "esutils": "2.0.2", 312 | "file-entry-cache": "2.0.0", 313 | "functional-red-black-tree": "1.0.1", 314 | "glob": "7.1.2", 315 | "globals": "9.18.0", 316 | "ignore": "3.3.3", 317 | "imurmurhash": "0.1.4", 318 | "inquirer": "3.2.1", 319 | "is-resolvable": "1.0.0", 320 | "js-yaml": "3.9.1", 321 | "json-stable-stringify": "1.0.1", 322 | "levn": "0.3.0", 323 | "lodash": "4.17.4", 324 | "minimatch": "3.0.4", 325 | "mkdirp": "0.5.1", 326 | "natural-compare": "1.4.0", 327 | "optionator": "0.8.2", 328 | "path-is-inside": "1.0.2", 329 | "pluralize": "4.0.0", 330 | "progress": "2.0.0", 331 | "require-uncached": "1.0.3", 332 | "semver": "5.4.1", 333 | "strip-json-comments": "2.0.1", 334 | "table": "4.0.1", 335 | "text-table": "0.2.0" 336 | } 337 | }, 338 | "eslint-scope": { 339 | "version": "3.7.1", 340 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", 341 | "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", 342 | "dev": true, 343 | "requires": { 344 | "esrecurse": "4.2.0", 345 | "estraverse": "4.2.0" 346 | } 347 | }, 348 | "espree": { 349 | "version": "3.5.0", 350 | "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.0.tgz", 351 | "integrity": "sha1-mDWGJb3QVYYeon4oZ+pyn69GPY0=", 352 | "dev": true, 353 | "requires": { 354 | "acorn": "5.1.1", 355 | "acorn-jsx": "3.0.1" 356 | } 357 | }, 358 | "esprima": { 359 | "version": "4.0.0", 360 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", 361 | "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", 362 | "dev": true 363 | }, 364 | "esquery": { 365 | "version": "1.0.0", 366 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", 367 | "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", 368 | "dev": true, 369 | "requires": { 370 | "estraverse": "4.2.0" 371 | } 372 | }, 373 | "esrecurse": { 374 | "version": "4.2.0", 375 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", 376 | "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", 377 | "dev": true, 378 | "requires": { 379 | "estraverse": "4.2.0", 380 | "object-assign": "4.1.1" 381 | } 382 | }, 383 | "estraverse": { 384 | "version": "4.2.0", 385 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", 386 | "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", 387 | "dev": true 388 | }, 389 | "esutils": { 390 | "version": "2.0.2", 391 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", 392 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", 393 | "dev": true 394 | }, 395 | "external-editor": { 396 | "version": "2.0.4", 397 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.0.4.tgz", 398 | "integrity": "sha1-HtkZnanL/i7y96MbL96LDRI2iXI=", 399 | "dev": true, 400 | "requires": { 401 | "iconv-lite": "0.4.18", 402 | "jschardet": "1.5.1", 403 | "tmp": "0.0.31" 404 | } 405 | }, 406 | "fast-deep-equal": { 407 | "version": "1.0.0", 408 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", 409 | "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", 410 | "dev": true 411 | }, 412 | "fast-levenshtein": { 413 | "version": "2.0.6", 414 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 415 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 416 | "dev": true 417 | }, 418 | "figures": { 419 | "version": "2.0.0", 420 | "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", 421 | "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", 422 | "dev": true, 423 | "requires": { 424 | "escape-string-regexp": "1.0.5" 425 | } 426 | }, 427 | "file-entry-cache": { 428 | "version": "2.0.0", 429 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", 430 | "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", 431 | "dev": true, 432 | "requires": { 433 | "flat-cache": "1.2.2", 434 | "object-assign": "4.1.1" 435 | } 436 | }, 437 | "flat-cache": { 438 | "version": "1.2.2", 439 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.2.2.tgz", 440 | "integrity": "sha1-+oZxTnLCHbiGAXYezy9VXRq8a5Y=", 441 | "dev": true, 442 | "requires": { 443 | "circular-json": "0.3.3", 444 | "del": "2.2.2", 445 | "graceful-fs": "4.1.11", 446 | "write": "0.2.1" 447 | } 448 | }, 449 | "fs.realpath": { 450 | "version": "1.0.0", 451 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 452 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 453 | "dev": true 454 | }, 455 | "functional-red-black-tree": { 456 | "version": "1.0.1", 457 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 458 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 459 | "dev": true 460 | }, 461 | "glob": { 462 | "version": "7.1.2", 463 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 464 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", 465 | "dev": true, 466 | "requires": { 467 | "fs.realpath": "1.0.0", 468 | "inflight": "1.0.6", 469 | "inherits": "2.0.3", 470 | "minimatch": "3.0.4", 471 | "once": "1.4.0", 472 | "path-is-absolute": "1.0.1" 473 | } 474 | }, 475 | "globals": { 476 | "version": "9.18.0", 477 | "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", 478 | "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", 479 | "dev": true 480 | }, 481 | "globby": { 482 | "version": "5.0.0", 483 | "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", 484 | "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", 485 | "dev": true, 486 | "requires": { 487 | "array-union": "1.0.2", 488 | "arrify": "1.0.1", 489 | "glob": "7.1.2", 490 | "object-assign": "4.1.1", 491 | "pify": "2.3.0", 492 | "pinkie-promise": "2.0.1" 493 | } 494 | }, 495 | "graceful-fs": { 496 | "version": "4.1.11", 497 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", 498 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", 499 | "dev": true 500 | }, 501 | "graceful-readlink": { 502 | "version": "1.0.1", 503 | "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", 504 | "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", 505 | "dev": true 506 | }, 507 | "growl": { 508 | "version": "1.9.2", 509 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", 510 | "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", 511 | "dev": true 512 | }, 513 | "has-ansi": { 514 | "version": "2.0.0", 515 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 516 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 517 | "dev": true, 518 | "requires": { 519 | "ansi-regex": "2.1.1" 520 | } 521 | }, 522 | "has-flag": { 523 | "version": "2.0.0", 524 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", 525 | "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", 526 | "dev": true 527 | }, 528 | "iconv-lite": { 529 | "version": "0.4.18", 530 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.18.tgz", 531 | "integrity": "sha512-sr1ZQph3UwHTR0XftSbK85OvBbxe/abLGzEnPENCQwmHf7sck8Oyu4ob3LgBxWWxRoM+QszeUyl7jbqapu2TqA==", 532 | "dev": true 533 | }, 534 | "ignore": { 535 | "version": "3.3.3", 536 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.3.tgz", 537 | "integrity": "sha1-QyNS5XrM2HqzEQ6C0/6g5HgSFW0=", 538 | "dev": true 539 | }, 540 | "imurmurhash": { 541 | "version": "0.1.4", 542 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 543 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 544 | "dev": true 545 | }, 546 | "inflight": { 547 | "version": "1.0.6", 548 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 549 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 550 | "dev": true, 551 | "requires": { 552 | "once": "1.4.0", 553 | "wrappy": "1.0.2" 554 | } 555 | }, 556 | "inherits": { 557 | "version": "2.0.3", 558 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 559 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 560 | "dev": true 561 | }, 562 | "inquirer": { 563 | "version": "3.2.1", 564 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.2.1.tgz", 565 | "integrity": "sha512-QgW3eiPN8gpj/K5vVpHADJJgrrF0ho/dZGylikGX7iqAdRgC9FVKYKWFLx6hZDBFcOLEoSqINYrVPeFAeG/PdA==", 566 | "dev": true, 567 | "requires": { 568 | "ansi-escapes": "2.0.0", 569 | "chalk": "2.1.0", 570 | "cli-cursor": "2.1.0", 571 | "cli-width": "2.1.0", 572 | "external-editor": "2.0.4", 573 | "figures": "2.0.0", 574 | "lodash": "4.17.4", 575 | "mute-stream": "0.0.7", 576 | "run-async": "2.3.0", 577 | "rx-lite": "4.0.8", 578 | "rx-lite-aggregates": "4.0.8", 579 | "string-width": "2.1.1", 580 | "strip-ansi": "4.0.0", 581 | "through": "2.3.8" 582 | }, 583 | "dependencies": { 584 | "ansi-regex": { 585 | "version": "3.0.0", 586 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 587 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 588 | "dev": true 589 | }, 590 | "ansi-styles": { 591 | "version": "3.2.0", 592 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", 593 | "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", 594 | "dev": true, 595 | "requires": { 596 | "color-convert": "1.9.0" 597 | } 598 | }, 599 | "chalk": { 600 | "version": "2.1.0", 601 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", 602 | "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", 603 | "dev": true, 604 | "requires": { 605 | "ansi-styles": "3.2.0", 606 | "escape-string-regexp": "1.0.5", 607 | "supports-color": "4.2.1" 608 | } 609 | }, 610 | "strip-ansi": { 611 | "version": "4.0.0", 612 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 613 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 614 | "dev": true, 615 | "requires": { 616 | "ansi-regex": "3.0.0" 617 | } 618 | }, 619 | "supports-color": { 620 | "version": "4.2.1", 621 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.2.1.tgz", 622 | "integrity": "sha512-qxzYsob3yv6U+xMzPrv170y8AwGP7i74g+pbixCfD6rgso8BscLT2qXIuz6TpOaiJZ3mFgT5O9lyT9nMU4LfaA==", 623 | "dev": true, 624 | "requires": { 625 | "has-flag": "2.0.0" 626 | } 627 | } 628 | } 629 | }, 630 | "is-fullwidth-code-point": { 631 | "version": "2.0.0", 632 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 633 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 634 | "dev": true 635 | }, 636 | "is-path-cwd": { 637 | "version": "1.0.0", 638 | "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", 639 | "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", 640 | "dev": true 641 | }, 642 | "is-path-in-cwd": { 643 | "version": "1.0.0", 644 | "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", 645 | "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", 646 | "dev": true, 647 | "requires": { 648 | "is-path-inside": "1.0.0" 649 | } 650 | }, 651 | "is-path-inside": { 652 | "version": "1.0.0", 653 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", 654 | "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", 655 | "dev": true, 656 | "requires": { 657 | "path-is-inside": "1.0.2" 658 | } 659 | }, 660 | "is-promise": { 661 | "version": "2.1.0", 662 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 663 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", 664 | "dev": true 665 | }, 666 | "is-resolvable": { 667 | "version": "1.0.0", 668 | "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz", 669 | "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=", 670 | "dev": true, 671 | "requires": { 672 | "tryit": "1.0.3" 673 | } 674 | }, 675 | "isarray": { 676 | "version": "1.0.0", 677 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 678 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 679 | "dev": true 680 | }, 681 | "isexe": { 682 | "version": "2.0.0", 683 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 684 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 685 | "dev": true 686 | }, 687 | "js-tokens": { 688 | "version": "3.0.2", 689 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", 690 | "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", 691 | "dev": true 692 | }, 693 | "js-yaml": { 694 | "version": "3.9.1", 695 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.9.1.tgz", 696 | "integrity": "sha512-CbcG379L1e+mWBnLvHWWeLs8GyV/EMw862uLI3c+GxVyDHWZcjZinwuBd3iW2pgxgIlksW/1vNJa4to+RvDOww==", 697 | "dev": true, 698 | "requires": { 699 | "argparse": "1.0.9", 700 | "esprima": "4.0.0" 701 | } 702 | }, 703 | "jschardet": { 704 | "version": "1.5.1", 705 | "resolved": "https://registry.npmjs.org/jschardet/-/jschardet-1.5.1.tgz", 706 | "integrity": "sha512-vE2hT1D0HLZCLLclfBSfkfTTedhVj0fubHpJBHKwwUWX0nSbhPAfk+SG9rTX95BYNmau8rGFfCeaT6T5OW1C2A==", 707 | "dev": true 708 | }, 709 | "json-schema-traverse": { 710 | "version": "0.3.1", 711 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", 712 | "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", 713 | "dev": true 714 | }, 715 | "json-stable-stringify": { 716 | "version": "1.0.1", 717 | "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", 718 | "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", 719 | "dev": true, 720 | "requires": { 721 | "jsonify": "0.0.0" 722 | } 723 | }, 724 | "json3": { 725 | "version": "3.3.2", 726 | "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", 727 | "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", 728 | "dev": true 729 | }, 730 | "jsonify": { 731 | "version": "0.0.0", 732 | "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", 733 | "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", 734 | "dev": true 735 | }, 736 | "levn": { 737 | "version": "0.3.0", 738 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 739 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 740 | "dev": true, 741 | "requires": { 742 | "prelude-ls": "1.1.2", 743 | "type-check": "0.3.2" 744 | } 745 | }, 746 | "lodash": { 747 | "version": "4.17.4", 748 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", 749 | "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", 750 | "dev": true 751 | }, 752 | "lodash._baseassign": { 753 | "version": "3.2.0", 754 | "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", 755 | "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", 756 | "dev": true, 757 | "requires": { 758 | "lodash._basecopy": "3.0.1", 759 | "lodash.keys": "3.1.2" 760 | } 761 | }, 762 | "lodash._basecopy": { 763 | "version": "3.0.1", 764 | "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", 765 | "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", 766 | "dev": true 767 | }, 768 | "lodash._basecreate": { 769 | "version": "3.0.3", 770 | "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", 771 | "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", 772 | "dev": true 773 | }, 774 | "lodash._getnative": { 775 | "version": "3.9.1", 776 | "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", 777 | "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", 778 | "dev": true 779 | }, 780 | "lodash._isiterateecall": { 781 | "version": "3.0.9", 782 | "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", 783 | "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", 784 | "dev": true 785 | }, 786 | "lodash.create": { 787 | "version": "3.1.1", 788 | "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", 789 | "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", 790 | "dev": true, 791 | "requires": { 792 | "lodash._baseassign": "3.2.0", 793 | "lodash._basecreate": "3.0.3", 794 | "lodash._isiterateecall": "3.0.9" 795 | } 796 | }, 797 | "lodash.isarguments": { 798 | "version": "3.1.0", 799 | "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", 800 | "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", 801 | "dev": true 802 | }, 803 | "lodash.isarray": { 804 | "version": "3.0.4", 805 | "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", 806 | "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", 807 | "dev": true 808 | }, 809 | "lodash.keys": { 810 | "version": "3.1.2", 811 | "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", 812 | "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", 813 | "dev": true, 814 | "requires": { 815 | "lodash._getnative": "3.9.1", 816 | "lodash.isarguments": "3.1.0", 817 | "lodash.isarray": "3.0.4" 818 | } 819 | }, 820 | "lru-cache": { 821 | "version": "4.1.1", 822 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", 823 | "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", 824 | "dev": true, 825 | "requires": { 826 | "pseudomap": "1.0.2", 827 | "yallist": "2.1.2" 828 | } 829 | }, 830 | "mimic-fn": { 831 | "version": "1.1.0", 832 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", 833 | "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", 834 | "dev": true 835 | }, 836 | "minimatch": { 837 | "version": "3.0.4", 838 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 839 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 840 | "dev": true, 841 | "requires": { 842 | "brace-expansion": "1.1.8" 843 | } 844 | }, 845 | "minimist": { 846 | "version": "0.0.8", 847 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 848 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 849 | "dev": true 850 | }, 851 | "mkdirp": { 852 | "version": "0.5.1", 853 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 854 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 855 | "dev": true, 856 | "requires": { 857 | "minimist": "0.0.8" 858 | } 859 | }, 860 | "mocha": { 861 | "version": "3.5.0", 862 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.0.tgz", 863 | "integrity": "sha512-pIU2PJjrPYvYRqVpjXzj76qltO9uBYI7woYAMoxbSefsa+vqAfptjoeevd6bUgwD0mPIO+hv9f7ltvsNreL2PA==", 864 | "dev": true, 865 | "requires": { 866 | "browser-stdout": "1.3.0", 867 | "commander": "2.9.0", 868 | "debug": "2.6.8", 869 | "diff": "3.2.0", 870 | "escape-string-regexp": "1.0.5", 871 | "glob": "7.1.1", 872 | "growl": "1.9.2", 873 | "json3": "3.3.2", 874 | "lodash.create": "3.1.1", 875 | "mkdirp": "0.5.1", 876 | "supports-color": "3.1.2" 877 | }, 878 | "dependencies": { 879 | "glob": { 880 | "version": "7.1.1", 881 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", 882 | "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", 883 | "dev": true, 884 | "requires": { 885 | "fs.realpath": "1.0.0", 886 | "inflight": "1.0.6", 887 | "inherits": "2.0.3", 888 | "minimatch": "3.0.4", 889 | "once": "1.4.0", 890 | "path-is-absolute": "1.0.1" 891 | } 892 | }, 893 | "has-flag": { 894 | "version": "1.0.0", 895 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", 896 | "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", 897 | "dev": true 898 | }, 899 | "supports-color": { 900 | "version": "3.1.2", 901 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", 902 | "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", 903 | "dev": true, 904 | "requires": { 905 | "has-flag": "1.0.0" 906 | } 907 | } 908 | } 909 | }, 910 | "ms": { 911 | "version": "2.0.0", 912 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 913 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 914 | "dev": true 915 | }, 916 | "mute-stream": { 917 | "version": "0.0.7", 918 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", 919 | "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", 920 | "dev": true 921 | }, 922 | "natural-compare": { 923 | "version": "1.4.0", 924 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 925 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 926 | "dev": true 927 | }, 928 | "object-assign": { 929 | "version": "4.1.1", 930 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 931 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 932 | "dev": true 933 | }, 934 | "once": { 935 | "version": "1.4.0", 936 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 937 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 938 | "dev": true, 939 | "requires": { 940 | "wrappy": "1.0.2" 941 | } 942 | }, 943 | "onetime": { 944 | "version": "2.0.1", 945 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", 946 | "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", 947 | "dev": true, 948 | "requires": { 949 | "mimic-fn": "1.1.0" 950 | } 951 | }, 952 | "optionator": { 953 | "version": "0.8.2", 954 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", 955 | "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", 956 | "dev": true, 957 | "requires": { 958 | "deep-is": "0.1.3", 959 | "fast-levenshtein": "2.0.6", 960 | "levn": "0.3.0", 961 | "prelude-ls": "1.1.2", 962 | "type-check": "0.3.2", 963 | "wordwrap": "1.0.0" 964 | } 965 | }, 966 | "os-tmpdir": { 967 | "version": "1.0.2", 968 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 969 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 970 | "dev": true 971 | }, 972 | "path-is-absolute": { 973 | "version": "1.0.1", 974 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 975 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 976 | "dev": true 977 | }, 978 | "path-is-inside": { 979 | "version": "1.0.2", 980 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", 981 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", 982 | "dev": true 983 | }, 984 | "pify": { 985 | "version": "2.3.0", 986 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 987 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", 988 | "dev": true 989 | }, 990 | "pinkie": { 991 | "version": "2.0.4", 992 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", 993 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", 994 | "dev": true 995 | }, 996 | "pinkie-promise": { 997 | "version": "2.0.1", 998 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", 999 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", 1000 | "dev": true, 1001 | "requires": { 1002 | "pinkie": "2.0.4" 1003 | } 1004 | }, 1005 | "pluralize": { 1006 | "version": "4.0.0", 1007 | "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-4.0.0.tgz", 1008 | "integrity": "sha1-WbcIwcAZCi9pLxx2GMRGsFL9F2I=", 1009 | "dev": true 1010 | }, 1011 | "prelude-ls": { 1012 | "version": "1.1.2", 1013 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 1014 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", 1015 | "dev": true 1016 | }, 1017 | "process-nextick-args": { 1018 | "version": "1.0.7", 1019 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", 1020 | "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", 1021 | "dev": true 1022 | }, 1023 | "progress": { 1024 | "version": "2.0.0", 1025 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", 1026 | "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", 1027 | "dev": true 1028 | }, 1029 | "pseudomap": { 1030 | "version": "1.0.2", 1031 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", 1032 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", 1033 | "dev": true 1034 | }, 1035 | "readable-stream": { 1036 | "version": "2.3.3", 1037 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", 1038 | "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", 1039 | "dev": true, 1040 | "requires": { 1041 | "core-util-is": "1.0.2", 1042 | "inherits": "2.0.3", 1043 | "isarray": "1.0.0", 1044 | "process-nextick-args": "1.0.7", 1045 | "safe-buffer": "5.1.1", 1046 | "string_decoder": "1.0.3", 1047 | "util-deprecate": "1.0.2" 1048 | } 1049 | }, 1050 | "require-uncached": { 1051 | "version": "1.0.3", 1052 | "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", 1053 | "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", 1054 | "dev": true, 1055 | "requires": { 1056 | "caller-path": "0.1.0", 1057 | "resolve-from": "1.0.1" 1058 | } 1059 | }, 1060 | "resolve-from": { 1061 | "version": "1.0.1", 1062 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", 1063 | "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", 1064 | "dev": true 1065 | }, 1066 | "restore-cursor": { 1067 | "version": "2.0.0", 1068 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", 1069 | "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", 1070 | "dev": true, 1071 | "requires": { 1072 | "onetime": "2.0.1", 1073 | "signal-exit": "3.0.2" 1074 | } 1075 | }, 1076 | "rimraf": { 1077 | "version": "2.6.1", 1078 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", 1079 | "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", 1080 | "dev": true, 1081 | "requires": { 1082 | "glob": "7.1.2" 1083 | } 1084 | }, 1085 | "run-async": { 1086 | "version": "2.3.0", 1087 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", 1088 | "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", 1089 | "dev": true, 1090 | "requires": { 1091 | "is-promise": "2.1.0" 1092 | } 1093 | }, 1094 | "rx-lite": { 1095 | "version": "4.0.8", 1096 | "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", 1097 | "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", 1098 | "dev": true 1099 | }, 1100 | "rx-lite-aggregates": { 1101 | "version": "4.0.8", 1102 | "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", 1103 | "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", 1104 | "dev": true, 1105 | "requires": { 1106 | "rx-lite": "4.0.8" 1107 | } 1108 | }, 1109 | "safe-buffer": { 1110 | "version": "5.1.1", 1111 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", 1112 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", 1113 | "dev": true 1114 | }, 1115 | "semver": { 1116 | "version": "5.4.1", 1117 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", 1118 | "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", 1119 | "dev": true 1120 | }, 1121 | "shebang-command": { 1122 | "version": "1.2.0", 1123 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 1124 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 1125 | "dev": true, 1126 | "requires": { 1127 | "shebang-regex": "1.0.0" 1128 | } 1129 | }, 1130 | "shebang-regex": { 1131 | "version": "1.0.0", 1132 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 1133 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 1134 | "dev": true 1135 | }, 1136 | "signal-exit": { 1137 | "version": "3.0.2", 1138 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 1139 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", 1140 | "dev": true 1141 | }, 1142 | "slice-ansi": { 1143 | "version": "0.0.4", 1144 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", 1145 | "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", 1146 | "dev": true 1147 | }, 1148 | "sprintf-js": { 1149 | "version": "1.0.3", 1150 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 1151 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 1152 | "dev": true 1153 | }, 1154 | "string_decoder": { 1155 | "version": "1.0.3", 1156 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", 1157 | "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", 1158 | "dev": true, 1159 | "requires": { 1160 | "safe-buffer": "5.1.1" 1161 | } 1162 | }, 1163 | "string-width": { 1164 | "version": "2.1.1", 1165 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 1166 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 1167 | "dev": true, 1168 | "requires": { 1169 | "is-fullwidth-code-point": "2.0.0", 1170 | "strip-ansi": "4.0.0" 1171 | }, 1172 | "dependencies": { 1173 | "ansi-regex": { 1174 | "version": "3.0.0", 1175 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 1176 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 1177 | "dev": true 1178 | }, 1179 | "strip-ansi": { 1180 | "version": "4.0.0", 1181 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 1182 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 1183 | "dev": true, 1184 | "requires": { 1185 | "ansi-regex": "3.0.0" 1186 | } 1187 | } 1188 | } 1189 | }, 1190 | "strip-ansi": { 1191 | "version": "3.0.1", 1192 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 1193 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 1194 | "dev": true, 1195 | "requires": { 1196 | "ansi-regex": "2.1.1" 1197 | } 1198 | }, 1199 | "strip-json-comments": { 1200 | "version": "2.0.1", 1201 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 1202 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 1203 | "dev": true 1204 | }, 1205 | "supports-color": { 1206 | "version": "2.0.0", 1207 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 1208 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 1209 | "dev": true 1210 | }, 1211 | "table": { 1212 | "version": "4.0.1", 1213 | "resolved": "https://registry.npmjs.org/table/-/table-4.0.1.tgz", 1214 | "integrity": "sha1-qBFsEz+sLGH0pCCrbN9cTWHw5DU=", 1215 | "dev": true, 1216 | "requires": { 1217 | "ajv": "4.11.8", 1218 | "ajv-keywords": "1.5.1", 1219 | "chalk": "1.1.3", 1220 | "lodash": "4.17.4", 1221 | "slice-ansi": "0.0.4", 1222 | "string-width": "2.1.1" 1223 | }, 1224 | "dependencies": { 1225 | "ajv": { 1226 | "version": "4.11.8", 1227 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", 1228 | "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", 1229 | "dev": true, 1230 | "requires": { 1231 | "co": "4.6.0", 1232 | "json-stable-stringify": "1.0.1" 1233 | } 1234 | } 1235 | } 1236 | }, 1237 | "text-table": { 1238 | "version": "0.2.0", 1239 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 1240 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 1241 | "dev": true 1242 | }, 1243 | "through": { 1244 | "version": "2.3.8", 1245 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1246 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 1247 | "dev": true 1248 | }, 1249 | "tmp": { 1250 | "version": "0.0.31", 1251 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz", 1252 | "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=", 1253 | "dev": true, 1254 | "requires": { 1255 | "os-tmpdir": "1.0.2" 1256 | } 1257 | }, 1258 | "tryit": { 1259 | "version": "1.0.3", 1260 | "resolved": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", 1261 | "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=", 1262 | "dev": true 1263 | }, 1264 | "type-check": { 1265 | "version": "0.3.2", 1266 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 1267 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 1268 | "dev": true, 1269 | "requires": { 1270 | "prelude-ls": "1.1.2" 1271 | } 1272 | }, 1273 | "typedarray": { 1274 | "version": "0.0.6", 1275 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 1276 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", 1277 | "dev": true 1278 | }, 1279 | "util-deprecate": { 1280 | "version": "1.0.2", 1281 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1282 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 1283 | "dev": true 1284 | }, 1285 | "wav-encoder": { 1286 | "version": "1.2.0", 1287 | "resolved": "https://registry.npmjs.org/wav-encoder/-/wav-encoder-1.2.0.tgz", 1288 | "integrity": "sha512-Cbr5Dmp16fiOouvqyqSwsINEK8/hIjS1jmNeKszqvbbRoyG5l41SjZWiXQTfZcN2ebxx2QJ1582aCr4P/btd8A==", 1289 | "dev": true 1290 | }, 1291 | "which": { 1292 | "version": "1.3.0", 1293 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", 1294 | "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", 1295 | "dev": true, 1296 | "requires": { 1297 | "isexe": "2.0.0" 1298 | } 1299 | }, 1300 | "wordwrap": { 1301 | "version": "1.0.0", 1302 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", 1303 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", 1304 | "dev": true 1305 | }, 1306 | "wrappy": { 1307 | "version": "1.0.2", 1308 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1309 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1310 | "dev": true 1311 | }, 1312 | "write": { 1313 | "version": "0.2.1", 1314 | "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", 1315 | "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", 1316 | "dev": true, 1317 | "requires": { 1318 | "mkdirp": "0.5.1" 1319 | } 1320 | }, 1321 | "yallist": { 1322 | "version": "2.1.2", 1323 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", 1324 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", 1325 | "dev": true 1326 | } 1327 | } 1328 | } 1329 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "wav-decoder", 3 | "description": "promise-based wav decoder", 4 | "version": "1.3.0", 5 | "author": "Nao Yonamine ", 6 | "bugs": { 7 | "url": "https://github.com/mohayonao/wav-decoder/issues" 8 | }, 9 | "dependencies": {}, 10 | "devDependencies": { 11 | "eslint": "^4.4.1", 12 | "mocha": "^3.5.0", 13 | "wav-encoder": "^1.2.0" 14 | }, 15 | "files": [ 16 | "package.json", 17 | "README.md", 18 | "index.js" 19 | ], 20 | "homepage": "https://github.com/mohayonao/wav-decoder/", 21 | "keywords": [ 22 | "decode", 23 | "universal", 24 | "wav" 25 | ], 26 | "license": "MIT", 27 | "main": "index.js", 28 | "repository": { 29 | "type": "git", 30 | "url": "https://github.com/mohayonao/wav-decoder.git" 31 | }, 32 | "scripts": { 33 | "lint": "eslint index.js", 34 | "postversion": "git push && git push --tags", 35 | "prepublish": "npm run lint && npm run test", 36 | "preversion": "npm run lint && npm run test", 37 | "test": "mocha", 38 | "travis": "npm run lint && npm run test" 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /test/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "mocha": true 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /test/decode.js: -------------------------------------------------------------------------------- 1 | const fs = require("fs"); 2 | const path = require("path"); 3 | const assert = require("assert"); 4 | const decoder = require(".."); 5 | 6 | const testSpec = [ 7 | { opts: { bitDepth: 8 }, delta: 1e-1, filename: "amen_pcm8.wav" }, 8 | { opts: { bitDepth: 16 }, delta: 1e-4, filename: "amen_pcm16.wav" }, 9 | { opts: { bitDepth: 24 }, delta: 1e-6, filename: "amen_pcm24.wav" }, 10 | { opts: { bitDepth: 32 }, delta: 1e-8, filename: "amen_pcm32.wav" }, 11 | { opts: { float: true }, delta: 0.00, filename: "amen_pcm32f.wav" } 12 | ]; 13 | 14 | function readFile(filename) { 15 | return fs.readFileSync(path.join(__dirname, "fixtures", filename)); 16 | } 17 | 18 | function readAudioData(filename) { 19 | const buffer = readFile(filename).buffer; 20 | 21 | const uint32 = new Uint32Array(buffer, 4); 22 | const float32 = new Float32Array(buffer, 16); 23 | 24 | const numberOfChannels = uint32[0]; 25 | const length = uint32[1]; 26 | const sampleRate = uint32[2]; 27 | const channelData = new Array(numberOfChannels).fill().map((_, ch) => { 28 | return float32.subarray(ch * length, (ch + 1) * length); 29 | }); 30 | 31 | return { 32 | numberOfChannels: numberOfChannels, 33 | length: length, 34 | sampleRate: sampleRate, 35 | channelData: channelData 36 | }; 37 | } 38 | 39 | function deepCloseTo(a, b, delta) { 40 | assert(a.length === b.length); 41 | 42 | for (let i = 0, imax = a.length; i < imax; i++) { 43 | assert(Math.abs(a[i] - b[i]) <= delta, `a[${i}]=${a[i]}, b[${i}]=${b[i]}`); 44 | } 45 | 46 | return true; 47 | } 48 | 49 | describe("decode(audioData, opts)", () => { 50 | const expected = readAudioData("amen.dat"); 51 | 52 | testSpec.forEach(({ opts, delta, filename }) => { 53 | it(filename, () => { 54 | const wavData = readFile(filename); 55 | 56 | return decoder.decode(wavData).then((actual) => { 57 | assert(actual.numberOfChannels === expected.numberOfChannels); 58 | assert(actual.length === expected.length); 59 | assert(actual.sampleRate === expected.sampleRate); 60 | assert(deepCloseTo(actual.channelData[0], expected.channelData[0], delta)); 61 | assert(deepCloseTo(actual.channelData[1], expected.channelData[1], delta)); 62 | }); 63 | }); 64 | }); 65 | }); 66 | -------------------------------------------------------------------------------- /test/decode.sync.js: -------------------------------------------------------------------------------- 1 | const fs = require("fs"); 2 | const path = require("path"); 3 | const assert = require("assert"); 4 | const decoder = require(".."); 5 | 6 | const testSpec = [ 7 | { opts: { bitDepth: 8 }, delta: 1e-1, filename: "amen_pcm8.wav" }, 8 | { opts: { bitDepth: 16 }, delta: 1e-4, filename: "amen_pcm16.wav" }, 9 | { opts: { bitDepth: 24 }, delta: 1e-6, filename: "amen_pcm24.wav" }, 10 | { opts: { bitDepth: 32 }, delta: 1e-8, filename: "amen_pcm32.wav" }, 11 | { opts: { float: true }, delta: 0.00, filename: "amen_pcm32f.wav" } 12 | ]; 13 | 14 | function readFile(filename) { 15 | return fs.readFileSync(path.join(__dirname, "fixtures", filename)); 16 | } 17 | 18 | function readAudioData(filename) { 19 | const buffer = readFile(filename).buffer; 20 | 21 | const uint32 = new Uint32Array(buffer, 4); 22 | const float32 = new Float32Array(buffer, 16); 23 | 24 | const numberOfChannels = uint32[0]; 25 | const length = uint32[1]; 26 | const sampleRate = uint32[2]; 27 | const channelData = new Array(numberOfChannels).fill().map((_, ch) => { 28 | return float32.subarray(ch * length, (ch + 1) * length); 29 | }); 30 | 31 | return { 32 | numberOfChannels: numberOfChannels, 33 | length: length, 34 | sampleRate: sampleRate, 35 | channelData: channelData 36 | }; 37 | } 38 | 39 | function deepCloseTo(a, b, delta) { 40 | assert(a.length === b.length); 41 | 42 | for (let i = 0, imax = a.length; i < imax; i++) { 43 | assert(Math.abs(a[i] - b[i]) <= delta, `a[${i}]=${a[i]}, b[${i}]=${b[i]}`); 44 | } 45 | 46 | return true; 47 | } 48 | 49 | describe("decode.sync(audioData, opts)", () => { 50 | const expected = readAudioData("amen.dat"); 51 | 52 | testSpec.forEach(({ opts, delta, filename }) => { 53 | it(filename, () => { 54 | const wavData = readFile(filename); 55 | const actual = decoder.decode.sync(wavData); 56 | 57 | assert(actual.numberOfChannels === expected.numberOfChannels); 58 | assert(actual.length === expected.length); 59 | assert(actual.sampleRate === expected.sampleRate); 60 | assert(deepCloseTo(actual.channelData[0], expected.channelData[0], delta)); 61 | assert(deepCloseTo(actual.channelData[1], expected.channelData[1], delta)); 62 | }); 63 | }); 64 | }); 65 | -------------------------------------------------------------------------------- /test/decoding.js: -------------------------------------------------------------------------------- 1 | const assert = require("assert"); 2 | const wavEncoder = require("wav-encoder"); 3 | const wavDecoder = require(".."); 4 | 5 | const testSpec = [ 6 | { 7 | opts: { bitDepth: 8 }, 8 | rawData: new Uint8Array([ 0, 1, 64, 128, 192, 255 ]), 9 | expected: new Float32Array([ -1, -0.9921875, -0.5, 0, 0.5039370059967041, 1 ]), 10 | }, 11 | { 12 | opts: { bitDepth: 8, symmetric: true }, 13 | rawData: new Uint8Array([ 0, 1, 64, 128, 192, 255 ]), 14 | expected: new Float32Array([ -1, -0.9921568632125854, -0.49803921580314636, 0.003921568859368563, 0.5058823823928833, 1 ]), 15 | }, 16 | { 17 | opts: { bitDepth: 16 }, 18 | rawData: new Int16Array([ -32768, -32767, -16384, 0, 16384, 32767 ]), 19 | expected: new Float32Array([ -1, -0.999969482421875, -0.5, 0, 0.5000152587890625, 1 ]), 20 | }, 21 | { 22 | opts: { bitDepth: 16, symmetric: true }, 23 | rawData: new Int16Array([ -32768, -32767, -16384, 0, 16384, 32767 ]), 24 | expected: new Float32Array([ -1, -0.999969482421875, -0.5, 0, 0.5, 0.999969482421875 ]), 25 | }, 26 | { 27 | opts: { bitDepth: 32 }, 28 | rawData: new Int32Array([ -2147483648, -2147483647, -1073741824, 0, 1073741824, 2147483647 ]), 29 | expected: new Float32Array([ -1, -1, -0.5, 0, 0.5, 1 ]), 30 | }, 31 | { 32 | opts: { bitDepth: 32, symmetric: true }, 33 | rawData: new Int32Array([ -2147483648, -2147483647, -1073741824, 0, 1073741824, 2147483647 ]), 34 | expected: new Float32Array([ -1, -1, -0.5, 0, 0.5, 1 ]), 35 | }, 36 | { 37 | opts: { bitDepth: 32, float: true }, 38 | rawData: new Float32Array([ -1, -0.5, 0, 0.5, 1 ]), 39 | expected: new Float32Array([ -1, -0.5, 0, 0.5, 1 ]), 40 | } 41 | ]; 42 | 43 | describe("decoding", () => { 44 | testSpec.forEach(({ opts, rawData, expected }) => { 45 | it(JSON.stringify(opts), () => { 46 | const audioData = { 47 | channelData: [ new Float32Array(rawData.length) ], 48 | sampleRate: 44100, 49 | } 50 | const encoded = wavEncoder.encode.sync(audioData, opts); 51 | const view = new rawData.constructor(encoded, 44); 52 | 53 | view.set(rawData); 54 | 55 | const decoded = wavDecoder.decode.sync(encoded, opts); 56 | const actual = decoded.channelData[0]; 57 | 58 | assert.deepEqual(actual, expected); 59 | }); 60 | }); 61 | }); 62 | -------------------------------------------------------------------------------- /test/fixtures/amen.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mohayonao/wav-decoder/7f1a56574db663276acd06158223a517d5dc31a4/test/fixtures/amen.dat -------------------------------------------------------------------------------- /test/fixtures/amen_pcm16.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mohayonao/wav-decoder/7f1a56574db663276acd06158223a517d5dc31a4/test/fixtures/amen_pcm16.wav -------------------------------------------------------------------------------- /test/fixtures/amen_pcm24.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mohayonao/wav-decoder/7f1a56574db663276acd06158223a517d5dc31a4/test/fixtures/amen_pcm24.wav -------------------------------------------------------------------------------- /test/fixtures/amen_pcm32.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mohayonao/wav-decoder/7f1a56574db663276acd06158223a517d5dc31a4/test/fixtures/amen_pcm32.wav -------------------------------------------------------------------------------- /test/fixtures/amen_pcm32f.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mohayonao/wav-decoder/7f1a56574db663276acd06158223a517d5dc31a4/test/fixtures/amen_pcm32f.wav -------------------------------------------------------------------------------- /test/fixtures/amen_pcm8.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mohayonao/wav-decoder/7f1a56574db663276acd06158223a517d5dc31a4/test/fixtures/amen_pcm8.wav --------------------------------------------------------------------------------