├── .gitignore ├── .npmignore ├── LICENSE.md ├── README.md ├── decode.js ├── encode.js ├── index.js ├── lib └── common.js ├── package-lock.json ├── package.json └── test ├── cli.js ├── convert.js ├── fixtures ├── Indoor_switch_small_on_01.qoa ├── Indoor_switch_small_on_01.qoa.wav ├── Indoor_switch_small_on_01.wav ├── sting_banjo_humorous_02.qoa ├── sting_banjo_humorous_02.qoa.wav └── sting_banjo_humorous_02.wav ├── sine.js ├── test.js ├── webaudio.html └── webaudio.js /.gitignore: -------------------------------------------------------------------------------- 1 | bower_components 2 | node_modules 3 | *.log 4 | .DS_Store 5 | test/fixtures/sine.wav 6 | test/fixtures/sine-qoa.wav 7 | test/fixtures/sine.qoa -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | bower_components 2 | node_modules 3 | *.log 4 | .DS_Store 5 | .npmignore 6 | LICENSE.md 7 | test/ -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | Copyright (c) 2020 Matt DesLauriers 3 | 4 | Permission is hereby granted, free of charge, to any person obtaining a copy 5 | of this software and associated documentation files (the "Software"), to deal 6 | in the Software without restriction, including without limitation the rights 7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | copies of the Software, and to permit persons to whom the Software is 9 | furnished to do so, subject to the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be included in all 12 | copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 15 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 16 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 17 | IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 18 | DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 19 | OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 20 | OR OTHER DEALINGS IN THE SOFTWARE. 21 | 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # qoa-format 2 | 3 | A JavaScript port of [The "Quite OK Audio" (QOA) format](https://github.com/phoboslab/qoa), a lossy audio compression that achieves relatively decent compression with fast decoding and not much complexity. Also see [this](https://phoboslab.org/log/2023/02/qoa-time-domain-audio-compression) blog post by @phoboslab. 4 | 5 | Features: 6 | 7 | - Lossy, time domain audio compression format with a constrained bitrate of 277 kbits/s for stereo 44100 Hz 8 | - This pure JavaScript encoder / decoder implementation bundles to about 6kb minified (or 3kb for just the decoder) 9 | - Works in Node.js and the browser without any specific audio APIs 10 | - Rough decoding performance tests on MBP M1 Max in Chrome show similar performance to WebAudio `decodeAudioData` 11 | - The audio format and encoder/decoder is open source and MIT licensed 12 | 13 | _This software is still experimental, unstable, and likely to change or break. Use at your own risk._ 14 | 15 | ## ⚠️ Warning 16 | 17 | If you are hacking and experimenting with this, take care when using headphones as garbage data may produced loud noises that can damage hearing. 18 | 19 | As the spec is still in flux, this may not correctly decode files generated by different versions of [the C encoder](https://github.com/phoboslab/qoa/) or third-party implementations. This has been tested against [this particular QOA commit tree](https://github.com/phoboslab/qoa/tree/e8386f41d435a864ce2890e9f56d964215b40301) when building from source on macOS. 20 | 21 | ## Example 22 | 23 | ```js 24 | import { encode, decode } from 'qoa-format'; 25 | 26 | // or just the decode/encode function - 27 | // import decode from 'qoa-format/decode.js'; 28 | 29 | // Encoding raw audio samples 30 | const audioData = { 31 | sampleRate: 44100 32 | channelData: [ 33 | new Float32Array([ /* audio samples */ ]) 34 | ] 35 | } 36 | 37 | // lossy encode raw audio samples to Uint8Array QOA file 38 | const qoaFile = encode(audioData) 39 | 40 | // Decode QOA file back to audio data 41 | const decodedAudio = decode(qoaFile); 42 | 43 | // Show info about the decoded file 44 | console.log(decodedAudio.sampleRate); // 44100 45 | console.log(decodedAudio.channels); // 1 46 | console.log(decodedAudio.samples); // (number of samples in audio signal) 47 | console.log(decodedAudio.channelData); // [ Float32Array(samples) ] 48 | ``` 49 | 50 | See [test/sine.js](./test/sine.js) for encoding/decoding a 441 Hz sine wave, and [test/webaudio.js](./test/webaudio.js) for a decoder and web audio QOA player. 51 | 52 | ## Install 53 | 54 | Use [npm](https://npmjs.com/) to install. 55 | 56 | ```sh 57 | npm install qoa-format --save 58 | ``` 59 | 60 | ## API Usage 61 | 62 | #### `data = encode({ channelData, sampleRate })` 63 | 64 | Encodes the audio signal in `channelData` with `sampleRate` as a QOA file, returning `data` as a `Uint8Array`. The length of `channelData` determines the number of channels (mono, stereo, multi-channel), and each element is expected to be a `Float32Array` with the same length (i.e. `samples` or number of sample frames). The signal is expected to range from `-1..1`. 65 | 66 | #### `audio = decode(Uint8Array | Buffer)` 67 | 68 | Decodes the `Uint8Array` or `Buffer` object into an `audio` specifier which has the following format: 69 | 70 | ``` 71 | { 72 | sampleRate, // in Hz 73 | channels, // number of channels 74 | samples, // number of frame samples per channel 75 | channelData: [ 76 | // an array of audio samples for each channel 77 | Float32Array(samples), 78 | ... 79 | ] 80 | } 81 | ``` 82 | 83 | ## Run from Source 84 | 85 | Once cloned, you can `npm install` and then run the test: 86 | 87 | ```sh 88 | npm run test 89 | ``` 90 | 91 | Or the HTML/WebAudio test, run the below command and then open [http://localhost:8000/test/webaudio.html](http://localhost:8000/test/webaudio.html). **Note:** Take caution when wearing headphones if you are hacking with this. 🎧 92 | 93 | ```sh 94 | npm run test:browser 95 | ``` 96 | 97 | Or run the CLI to convert files: 98 | 99 | ```sh 100 | # encode WAV to QOA 101 | node test/cli.js input.wav output.qoa 102 | 103 | # decode QOA to WAV 104 | node test/cli.js output.qoa converted.wav 105 | ``` 106 | 107 | ## TODOs 108 | 109 | - A more optimized BitStream reader/writer could be added to this module to remove a dependency, produce a smaller build size, and potentially improve performance. 110 | - The QOA format is easily seekable, this should be exposed in the API to allow fast seeking and audio streaming on the web 111 | 112 | ## Credits 113 | 114 | - QOA format by @phoboslab 115 | - JavaScript port by @mattdesl 116 | - Thanks to @thi.ng for the BitStream decoder 117 | 118 | ## License 119 | 120 | MIT, see [LICENSE.md](http://github.com/mattdesl/qoa-format/blob/master/LICENSE.md) for details. 121 | -------------------------------------------------------------------------------- /decode.js: -------------------------------------------------------------------------------- 1 | import { BitInputStream } from "@thi.ng/bitstream"; 2 | import { 3 | qoa_lms_predict, 4 | qoa_lms_update, 5 | qoa_clamp, 6 | qoa_dequant_tab, 7 | LMS, 8 | QOA_MIN_FILESIZE, 9 | QOA_SLICE_LEN, 10 | QOA_MAGIC, 11 | QOA_LMS_LEN, 12 | } from "./lib/common.js"; 13 | 14 | function decodeHeader(stream) { 15 | const magic = stream.read(32); 16 | if (magic !== QOA_MAGIC) { 17 | throw new Error(`Not a QOA file; expected magic number 'qoaf'`); 18 | } 19 | 20 | // peek first frame to get audio file data 21 | const header = { 22 | samples: stream.read(32), 23 | channels: stream.read(8), 24 | sampleRate: stream.read(24), 25 | }; 26 | 27 | // go back to end of header 28 | stream.seek(64); 29 | 30 | // return data 31 | return header; 32 | } 33 | 34 | function qoa_decode_frame(stream, audio, lmses, channelData, sampleOffset) { 35 | const channels = stream.read(8); 36 | const sampleRate = stream.read(24); 37 | const samples = stream.read(16); // frame samples 38 | const frameSize = stream.read(16); 39 | 40 | const dataSize = Math.floor(frameSize - 8 - QOA_LMS_LEN * 4 * channels); 41 | const numSlices = Math.floor(dataSize / 8); 42 | const maxTotalSamples = numSlices * QOA_SLICE_LEN; 43 | 44 | if ( 45 | channels != audio.channels || 46 | sampleRate != audio.sampleRate || 47 | samples * channels > maxTotalSamples 48 | ) { 49 | throw new Error(`invalid frame header data`); 50 | } 51 | 52 | // decode LMS history and weights 53 | for (let c = 0; c < channels; c++) { 54 | const lms = lmses[c]; 55 | for (let i = 0; i < QOA_LMS_LEN; i++) { 56 | let h = stream.read(16); 57 | lms.history[i] = h; 58 | } 59 | for (let i = 0; i < QOA_LMS_LEN; i++) { 60 | let w = stream.read(16); 61 | lms.weights[i] = w; 62 | } 63 | } 64 | 65 | for ( 66 | let sample_index = 0; 67 | sample_index < samples; 68 | sample_index += QOA_SLICE_LEN 69 | ) { 70 | for (let c = 0; c < channels; c++) { 71 | const scalefactor = stream.read(4); 72 | const table = qoa_dequant_tab[scalefactor]; 73 | const slice_start = sample_index; 74 | const slice_end = Math.min(sample_index + QOA_SLICE_LEN, samples); 75 | const slice_count = slice_end - slice_start; 76 | const lms = lmses[c]; 77 | const sampleData = channelData[c]; 78 | let idx = sampleOffset + slice_start; 79 | const weights = lms.weights; 80 | const history = lms.history; 81 | let bitsRemaining = 60; 82 | // note: this loop is a hot code path and could be optimized 83 | for (let i = 0; i < slice_count; i++) { 84 | const predicted = qoa_lms_predict(weights, history); 85 | const quantized = stream.read(3); 86 | const dequantized = table[quantized]; 87 | const reconstructed = qoa_clamp(predicted + dequantized, -32768, 32767); 88 | const sample = 89 | reconstructed < 0 ? reconstructed / 32768 : reconstructed / 32767; 90 | sampleData[idx++] = sample; 91 | qoa_lms_update(weights, history, reconstructed, dequantized); 92 | bitsRemaining -= 3; 93 | } 94 | // skip stream if needed 95 | if (bitsRemaining > 0) { 96 | stream.read(bitsRemaining); 97 | } 98 | } 99 | } 100 | 101 | return samples; 102 | } 103 | 104 | export default function decode(data) { 105 | if (data.byteLength < QOA_MIN_FILESIZE) { 106 | throw new Error(`QOA file size must be >= ${QOA_MIN_FILESIZE}`); 107 | } 108 | 109 | const stream = new BitInputStream(data); 110 | const audio = decodeHeader(stream); 111 | 112 | const channelData = []; 113 | const lmses = []; 114 | for (let c = 0; c < audio.channels; c++) { 115 | const d = new Float32Array(audio.samples); 116 | channelData.push(d); 117 | lmses.push(LMS()); 118 | } 119 | 120 | let sampleIndex = 0; 121 | let frameLen = 0; 122 | do { 123 | frameLen = qoa_decode_frame(stream, audio, lmses, channelData, sampleIndex); 124 | sampleIndex += frameLen; 125 | } while (frameLen && sampleIndex < audio.samples); 126 | 127 | return { 128 | ...audio, 129 | channelData, 130 | }; 131 | } 132 | -------------------------------------------------------------------------------- /encode.js: -------------------------------------------------------------------------------- 1 | import { BitOutputStream } from "@thi.ng/bitstream"; 2 | import { 3 | qoa_lms_predict, 4 | qoa_lms_update, 5 | qoa_clamp, 6 | qoa_dequant_tab, 7 | qoa_scalefactor_tab, 8 | LMS, 9 | QOA_SLICE_LEN, 10 | QOA_FRAME_LEN, 11 | QOA_MAGIC, 12 | QOA_LMS_LEN, 13 | QOA_FRAME_SIZE, 14 | } from "./lib/common.js"; 15 | 16 | /* The reciprocal_tab maps each of the 16 scalefactors to their rounded 17 | reciprocals 1/scalefactor. This allows us to calculate the scaled residuals in 18 | the encoder with just one multiplication instead of an expensive division. We 19 | do this in .16 fixed point with integers, instead of floats. 20 | 21 | The reciprocal_tab is computed as: 22 | reciprocal_tab[s] <- ((1<<16) + scalefactor_tab[s] - 1) / scalefactor_tab[s] */ 23 | 24 | const qoa_reciprocal_tab = qoa_scalefactor_tab.map((s) => 25 | Math.floor(((1 << 16) + s - 1) / s) 26 | ); 27 | 28 | /* The quant_tab provides an index into the dequant_tab for residuals in the 29 | range of -8 .. 8. It maps this range to just 3bits and becommes less accurate at 30 | the higher end. Note that the residual zero is identical to the lowest positive 31 | value. This is mostly fine, since the qoa_div() function always rounds away 32 | from zero. */ 33 | 34 | const qoa_quant_tab = [ 35 | // -8..-1 36 | 7, 7, 7, 5, 5, 3, 3, 1, 37 | // 0 38 | 0, 39 | // 1.. 8 40 | 0, 2, 2, 4, 4, 6, 6, 6, 41 | ]; 42 | 43 | /* qoa_div() implements a rounding division, but avoids rounding to zero for 44 | small numbers. E.g. 0.1 will be rounded to 1. Note that 0 itself still 45 | returns as 0, which is handled in the qoa_quant_tab[]. 46 | qoa_div() takes an index into the .16 fixed point qoa_reciprocal_tab as an 47 | argument, so it can do the division with a cheaper integer multiplication. */ 48 | 49 | function qoa_div(v, scalefactor) { 50 | const reciprocal = qoa_reciprocal_tab[scalefactor]; 51 | let n = (v * reciprocal + (1 << 15)) >> 16; 52 | n = n + ((v > 0) - (v < 0)) - ((n > 0) - (n < 0)); /* round away from 0 */ 53 | return n; 54 | } 55 | 56 | function qoa_encode_frame(stream, audio, lmses, sample_offset, frame_len) { 57 | const channels = audio.channels; 58 | const sampleRate = audio.sampleRate; 59 | const channelData = audio.channelData; 60 | const samples = audio.samples; 61 | 62 | const slices = Math.floor((frame_len + QOA_SLICE_LEN - 1) / QOA_SLICE_LEN); 63 | const frame_size = QOA_FRAME_SIZE(channels, slices); 64 | 65 | // Frame header 66 | stream.write(channels, 8); 67 | stream.write(sampleRate, 24); 68 | stream.write(frame_len, 16); // frame samples 69 | stream.write(frame_size, 16); 70 | 71 | // write current LMS weights and history state 72 | for (let c = 0; c < channels; c++) { 73 | const lms = lmses[c]; 74 | 75 | /* If the weights have grown too large, reset them to 0. This may happen 76 | with certain high-frequency sounds. This is a last resort and will 77 | introduce quite a bit of noise, but should at least prevent pops/clicks */ 78 | const weights_sum = 79 | lms.weights[0] * lms.weights[0] + 80 | lms.weights[1] * lms.weights[1] + 81 | lms.weights[2] * lms.weights[2] + 82 | lms.weights[3] * lms.weights[3]; 83 | if (weights_sum > 0x2fffffff) { 84 | lms.weights[0] = 0; 85 | lms.weights[1] = 0; 86 | lms.weights[2] = 0; 87 | lms.weights[3] = 0; 88 | } 89 | 90 | for (let i = 0; i < QOA_LMS_LEN; i++) { 91 | stream.write(lms.history[i], 16); 92 | } 93 | for (let i = 0; i < QOA_LMS_LEN; i++) { 94 | stream.write(lms.weights[i], 16); 95 | } 96 | } 97 | 98 | /* We encode all samples with the channels interleaved on a slice level. 99 | E.g. for stereo: (ch-0, slice 0), (ch 1, slice 0), (ch 0, slice 1), ...*/ 100 | for ( 101 | let sample_index = 0; 102 | sample_index < frame_len; 103 | sample_index += QOA_SLICE_LEN 104 | ) { 105 | for (let c = 0; c < channels; c++) { 106 | const slice_len = qoa_clamp(QOA_SLICE_LEN, 0, frame_len - sample_index); 107 | const slice_start = sample_index; 108 | 109 | /* Brute for search for the best scalefactor. Just go through all 110 | 16 scalefactors, encode all samples for the current slice and 111 | meassure the total squared error. */ 112 | let best_error = Number.MAX_SAFE_INTEGER; 113 | let best_slice; 114 | let best_slice_scalefactor; 115 | let best_lms; 116 | const sampleData = channelData[c]; 117 | 118 | for (let scalefactor = 0; scalefactor < 16; scalefactor++) { 119 | /* We have to reset the LMS state to the last known good one 120 | before trying each scalefactor, as each pass updates the LMS 121 | state when encoding. */ 122 | let lms = LMS(lmses[c].history, lmses[c].weights); 123 | 124 | const table = qoa_dequant_tab[scalefactor]; 125 | 126 | // an array of slice data 127 | let slice = []; 128 | let current_error = 0; 129 | let idx = slice_start + sample_offset; 130 | 131 | for (let i = 0; i < slice_len; i++) { 132 | let sample = sampleData[idx++]; 133 | 134 | // turn into 16 bit signed integer 135 | sample = Math.floor( 136 | Math.fround(sample < 0 ? sample * 32768 : sample * 32767) 137 | ); 138 | sample = qoa_clamp(sample, -32768, 32767); 139 | 140 | let predicted = qoa_lms_predict(lms.weights, lms.history); 141 | let residual = sample - predicted; 142 | let scaled = qoa_div(residual, scalefactor); 143 | let clamped = qoa_clamp(scaled, -8, 8); 144 | let quantized = qoa_quant_tab[clamped + 8]; 145 | let dequantized = table[quantized]; 146 | let reconstructed = qoa_clamp(predicted + dequantized, -32768, 32767); 147 | let error = sample - reconstructed; 148 | current_error += error * error; 149 | if (current_error > best_error) { 150 | break; 151 | } 152 | 153 | qoa_lms_update(lms.weights, lms.history, reconstructed, dequantized); 154 | slice.push(quantized); 155 | } 156 | 157 | if (current_error < best_error) { 158 | best_error = current_error; 159 | best_slice = slice; 160 | best_slice_scalefactor = scalefactor; 161 | best_lms = lms; 162 | } 163 | } 164 | 165 | lmses[c] = best_lms; 166 | // first, write the 4bit scalefactor 167 | stream.write(best_slice_scalefactor, 4); 168 | // now write each 3bit datum in the slice 169 | for (let i = 0; i < QOA_SLICE_LEN; i++) { 170 | // the last frame of a file might be smaller than QOA_SLICE_LEN 171 | const v = i < best_slice.length ? best_slice[i] : 0; 172 | stream.write(v, 3); 173 | } 174 | } 175 | } 176 | } 177 | 178 | export default function encode({ channelData, sampleRate = 44100 } = {}) { 179 | const channels = channelData.length; 180 | const samples = channels >= 1 ? channelData[0].length : 0; 181 | const audio = { 182 | samples, 183 | channels, 184 | channelData, 185 | sampleRate, 186 | }; 187 | 188 | const num_frames = (samples + QOA_FRAME_LEN - 1) / QOA_FRAME_LEN; 189 | const num_slices = (samples + QOA_SLICE_LEN - 1) / QOA_SLICE_LEN; 190 | const encoded_size = 191 | 8 /* 8 byte file header */ + 192 | num_frames * 8 /* 8 byte frame headers */ + 193 | num_frames * 194 | QOA_LMS_LEN * 195 | 4 * 196 | audio.channels /* 4 * 4 bytes lms state per channel */ + 197 | num_slices * 8 * audio.channels; /* 8 byte slices */ 198 | 199 | const lmses = []; 200 | for (let c = 0; c < audio.channels; c++) { 201 | const lms = LMS(); 202 | lms.weights[0] = 0; 203 | lms.weights[1] = 0; 204 | lms.weights[2] = -(1 << 13); 205 | lms.weights[3] = 1 << 14; 206 | lmses.push(lms); 207 | } 208 | 209 | // write header 210 | const stream = new BitOutputStream(encoded_size); 211 | stream.write(QOA_MAGIC, 32); 212 | stream.write(samples, 32); 213 | 214 | let frame_len = QOA_FRAME_LEN; 215 | for ( 216 | let sample_index = 0; 217 | sample_index < samples; 218 | sample_index += frame_len 219 | ) { 220 | frame_len = qoa_clamp(QOA_FRAME_LEN, 0, samples - sample_index); 221 | qoa_encode_frame(stream, audio, lmses, sample_index, frame_len); 222 | } 223 | 224 | return stream.bytes(); 225 | } 226 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | import decode from "./decode.js"; 2 | import encode from "./encode.js"; 3 | 4 | export { encode, decode }; 5 | -------------------------------------------------------------------------------- /lib/common.js: -------------------------------------------------------------------------------- 1 | export const QOA_MIN_FILESIZE = 16; 2 | export const QOA_MAX_CHANNELS = 8; 3 | 4 | export const QOA_SLICE_LEN = 20; 5 | export const QOA_SLICES_PER_FRAME = 256; 6 | export const QOA_FRAME_LEN = QOA_SLICES_PER_FRAME * QOA_SLICE_LEN; 7 | export const QOA_LMS_LEN = 4; 8 | export const QOA_MAGIC = 0x716f6166; /* 'qoaf' */ 9 | export const QOA_FRAME_SIZE = (channels, slices) => 10 | Math.floor(8 + QOA_LMS_LEN * 4 * channels + 8 * slices * channels); 11 | 12 | export function qoa_clamp(v, min, max) { 13 | return v < min ? min : v > max ? max : v; 14 | } 15 | 16 | export function LMS(h, w) { 17 | const history = new Int16Array(h || 4); 18 | const weights = new Int16Array(w || 4); 19 | return { history, weights }; 20 | } 21 | 22 | export function qoa_lms_predict(weights, history) { 23 | return ( 24 | (weights[0] * history[0] + 25 | weights[1] * history[1] + 26 | weights[2] * history[2] + 27 | weights[3] * history[3]) >> 28 | 13 29 | ); 30 | } 31 | 32 | export function qoa_lms_update(weights, history, sample, residual) { 33 | let delta = residual >> 4; 34 | weights[0] += history[0] < 0 ? -delta : delta; 35 | weights[1] += history[1] < 0 ? -delta : delta; 36 | weights[2] += history[2] < 0 ? -delta : delta; 37 | weights[3] += history[3] < 0 ? -delta : delta; 38 | history[0] = history[1]; 39 | history[1] = history[2]; 40 | history[2] = history[3]; 41 | history[3] = sample; 42 | } 43 | 44 | export const qoa_round = (num) => Math.sign(num) * Math.round(Math.abs(num)); 45 | 46 | /* We have 16 different scalefactors. Like the quantized residuals these become 47 | less accurate at the higher end. In theory, the highest scalefactor that we 48 | would need to encode the highest 16bit residual is (2**16)/8 = 8192. However we 49 | rely on the LMS filter to predict samples accurately enough that a maximum 50 | residual of one quarter of the 16 bit range is high sufficent. I.e. with the 51 | scalefactor 2048 times the quant range of 8 we can encode residuals up to 2**14. 52 | 53 | The scalefactor values are computed as: 54 | scalefactor_tab[s] <- round(pow(s + 1, 2.75)) */ 55 | 56 | export const qoa_scalefactor_tab = Array(16) 57 | .fill() 58 | .map((_, s) => qoa_round(Math.pow(s + 1, 2.75))); 59 | 60 | /* The dequant_tab maps each of the scalefactors and quantized residuals to 61 | their unscaled & dequantized version. 62 | 63 | Since qoa_div rounds away from the zero, the smallest entries are mapped to 3/4 64 | instead of 1. The dequant_tab assumes the following dequantized values for each 65 | of the quant_tab indices and is computed as: 66 | float dqt[8] = {0.75, -0.75, 2.5, -2.5, 4.5, -4.5, 7, -7}; 67 | dequant_tab[s][q] <- round(scalefactor_tab[s] * dqt[q]) */ 68 | 69 | const dqt = [0.75, -0.75, 2.5, -2.5, 4.5, -4.5, 7, -7]; 70 | export const qoa_dequant_tab = qoa_scalefactor_tab.map((sf) => { 71 | return dqt.map((dq) => qoa_round(dq * sf)); 72 | }); 73 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "qoa-format", 3 | "version": "1.0.1", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "qoa-format", 9 | "version": "1.0.1", 10 | "license": "MIT", 11 | "dependencies": { 12 | "@thi.ng/bitstream": "^2.2.12" 13 | }, 14 | "devDependencies": { 15 | "audiobuffer-to-wav": "^1.0.0", 16 | "esbuild": "^0.17.6", 17 | "minimist": "^1.2.7", 18 | "tape": "^5.6.3", 19 | "wav-decoder": "^1.3.0" 20 | } 21 | }, 22 | "node_modules/@esbuild/android-arm": { 23 | "version": "0.17.6", 24 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.6.tgz", 25 | "integrity": "sha512-bSC9YVUjADDy1gae8RrioINU6e1lCkg3VGVwm0QQ2E1CWcC4gnMce9+B6RpxuSsrsXsk1yojn7sp1fnG8erE2g==", 26 | "cpu": [ 27 | "arm" 28 | ], 29 | "dev": true, 30 | "optional": true, 31 | "os": [ 32 | "android" 33 | ], 34 | "engines": { 35 | "node": ">=12" 36 | } 37 | }, 38 | "node_modules/@esbuild/android-arm64": { 39 | "version": "0.17.6", 40 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.6.tgz", 41 | "integrity": "sha512-YnYSCceN/dUzUr5kdtUzB+wZprCafuD89Hs0Aqv9QSdwhYQybhXTaSTcrl6X/aWThn1a/j0eEpUBGOE7269REg==", 42 | "cpu": [ 43 | "arm64" 44 | ], 45 | "dev": true, 46 | "optional": true, 47 | "os": [ 48 | "android" 49 | ], 50 | "engines": { 51 | "node": ">=12" 52 | } 53 | }, 54 | "node_modules/@esbuild/android-x64": { 55 | "version": "0.17.6", 56 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.6.tgz", 57 | "integrity": "sha512-MVcYcgSO7pfu/x34uX9u2QIZHmXAB7dEiLQC5bBl5Ryqtpj9lT2sg3gNDEsrPEmimSJW2FXIaxqSQ501YLDsZQ==", 58 | "cpu": [ 59 | "x64" 60 | ], 61 | "dev": true, 62 | "optional": true, 63 | "os": [ 64 | "android" 65 | ], 66 | "engines": { 67 | "node": ">=12" 68 | } 69 | }, 70 | "node_modules/@esbuild/darwin-arm64": { 71 | "version": "0.17.6", 72 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.6.tgz", 73 | "integrity": "sha512-bsDRvlbKMQMt6Wl08nHtFz++yoZHsyTOxnjfB2Q95gato+Yi4WnRl13oC2/PJJA9yLCoRv9gqT/EYX0/zDsyMA==", 74 | "cpu": [ 75 | "arm64" 76 | ], 77 | "dev": true, 78 | "optional": true, 79 | "os": [ 80 | "darwin" 81 | ], 82 | "engines": { 83 | "node": ">=12" 84 | } 85 | }, 86 | "node_modules/@esbuild/darwin-x64": { 87 | "version": "0.17.6", 88 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.6.tgz", 89 | "integrity": "sha512-xh2A5oPrYRfMFz74QXIQTQo8uA+hYzGWJFoeTE8EvoZGHb+idyV4ATaukaUvnnxJiauhs/fPx3vYhU4wiGfosg==", 90 | "cpu": [ 91 | "x64" 92 | ], 93 | "dev": true, 94 | "optional": true, 95 | "os": [ 96 | "darwin" 97 | ], 98 | "engines": { 99 | "node": ">=12" 100 | } 101 | }, 102 | "node_modules/@esbuild/freebsd-arm64": { 103 | "version": "0.17.6", 104 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.6.tgz", 105 | "integrity": "sha512-EnUwjRc1inT4ccZh4pB3v1cIhohE2S4YXlt1OvI7sw/+pD+dIE4smwekZlEPIwY6PhU6oDWwITrQQm5S2/iZgg==", 106 | "cpu": [ 107 | "arm64" 108 | ], 109 | "dev": true, 110 | "optional": true, 111 | "os": [ 112 | "freebsd" 113 | ], 114 | "engines": { 115 | "node": ">=12" 116 | } 117 | }, 118 | "node_modules/@esbuild/freebsd-x64": { 119 | "version": "0.17.6", 120 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.6.tgz", 121 | "integrity": "sha512-Uh3HLWGzH6FwpviUcLMKPCbZUAFzv67Wj5MTwK6jn89b576SR2IbEp+tqUHTr8DIl0iDmBAf51MVaP7pw6PY5Q==", 122 | "cpu": [ 123 | "x64" 124 | ], 125 | "dev": true, 126 | "optional": true, 127 | "os": [ 128 | "freebsd" 129 | ], 130 | "engines": { 131 | "node": ">=12" 132 | } 133 | }, 134 | "node_modules/@esbuild/linux-arm": { 135 | "version": "0.17.6", 136 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.6.tgz", 137 | "integrity": "sha512-7YdGiurNt7lqO0Bf/U9/arrPWPqdPqcV6JCZda4LZgEn+PTQ5SMEI4MGR52Bfn3+d6bNEGcWFzlIxiQdS48YUw==", 138 | "cpu": [ 139 | "arm" 140 | ], 141 | "dev": true, 142 | "optional": true, 143 | "os": [ 144 | "linux" 145 | ], 146 | "engines": { 147 | "node": ">=12" 148 | } 149 | }, 150 | "node_modules/@esbuild/linux-arm64": { 151 | "version": "0.17.6", 152 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.6.tgz", 153 | "integrity": "sha512-bUR58IFOMJX523aDVozswnlp5yry7+0cRLCXDsxnUeQYJik1DukMY+apBsLOZJblpH+K7ox7YrKrHmJoWqVR9w==", 154 | "cpu": [ 155 | "arm64" 156 | ], 157 | "dev": true, 158 | "optional": true, 159 | "os": [ 160 | "linux" 161 | ], 162 | "engines": { 163 | "node": ">=12" 164 | } 165 | }, 166 | "node_modules/@esbuild/linux-ia32": { 167 | "version": "0.17.6", 168 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.6.tgz", 169 | "integrity": "sha512-ujp8uoQCM9FRcbDfkqECoARsLnLfCUhKARTP56TFPog8ie9JG83D5GVKjQ6yVrEVdMie1djH86fm98eY3quQkQ==", 170 | "cpu": [ 171 | "ia32" 172 | ], 173 | "dev": true, 174 | "optional": true, 175 | "os": [ 176 | "linux" 177 | ], 178 | "engines": { 179 | "node": ">=12" 180 | } 181 | }, 182 | "node_modules/@esbuild/linux-loong64": { 183 | "version": "0.17.6", 184 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.6.tgz", 185 | "integrity": "sha512-y2NX1+X/Nt+izj9bLoiaYB9YXT/LoaQFYvCkVD77G/4F+/yuVXYCWz4SE9yr5CBMbOxOfBcy/xFL4LlOeNlzYQ==", 186 | "cpu": [ 187 | "loong64" 188 | ], 189 | "dev": true, 190 | "optional": true, 191 | "os": [ 192 | "linux" 193 | ], 194 | "engines": { 195 | "node": ">=12" 196 | } 197 | }, 198 | "node_modules/@esbuild/linux-mips64el": { 199 | "version": "0.17.6", 200 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.6.tgz", 201 | "integrity": "sha512-09AXKB1HDOzXD+j3FdXCiL/MWmZP0Ex9eR8DLMBVcHorrWJxWmY8Nms2Nm41iRM64WVx7bA/JVHMv081iP2kUA==", 202 | "cpu": [ 203 | "mips64el" 204 | ], 205 | "dev": true, 206 | "optional": true, 207 | "os": [ 208 | "linux" 209 | ], 210 | "engines": { 211 | "node": ">=12" 212 | } 213 | }, 214 | "node_modules/@esbuild/linux-ppc64": { 215 | "version": "0.17.6", 216 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.6.tgz", 217 | "integrity": "sha512-AmLhMzkM8JuqTIOhxnX4ubh0XWJIznEynRnZAVdA2mMKE6FAfwT2TWKTwdqMG+qEaeyDPtfNoZRpJbD4ZBv0Tg==", 218 | "cpu": [ 219 | "ppc64" 220 | ], 221 | "dev": true, 222 | "optional": true, 223 | "os": [ 224 | "linux" 225 | ], 226 | "engines": { 227 | "node": ">=12" 228 | } 229 | }, 230 | "node_modules/@esbuild/linux-riscv64": { 231 | "version": "0.17.6", 232 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.6.tgz", 233 | "integrity": "sha512-Y4Ri62PfavhLQhFbqucysHOmRamlTVK10zPWlqjNbj2XMea+BOs4w6ASKwQwAiqf9ZqcY9Ab7NOU4wIgpxwoSQ==", 234 | "cpu": [ 235 | "riscv64" 236 | ], 237 | "dev": true, 238 | "optional": true, 239 | "os": [ 240 | "linux" 241 | ], 242 | "engines": { 243 | "node": ">=12" 244 | } 245 | }, 246 | "node_modules/@esbuild/linux-s390x": { 247 | "version": "0.17.6", 248 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.6.tgz", 249 | "integrity": "sha512-SPUiz4fDbnNEm3JSdUW8pBJ/vkop3M1YwZAVwvdwlFLoJwKEZ9L98l3tzeyMzq27CyepDQ3Qgoba44StgbiN5Q==", 250 | "cpu": [ 251 | "s390x" 252 | ], 253 | "dev": true, 254 | "optional": true, 255 | "os": [ 256 | "linux" 257 | ], 258 | "engines": { 259 | "node": ">=12" 260 | } 261 | }, 262 | "node_modules/@esbuild/linux-x64": { 263 | "version": "0.17.6", 264 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.6.tgz", 265 | "integrity": "sha512-a3yHLmOodHrzuNgdpB7peFGPx1iJ2x6m+uDvhP2CKdr2CwOaqEFMeSqYAHU7hG+RjCq8r2NFujcd/YsEsFgTGw==", 266 | "cpu": [ 267 | "x64" 268 | ], 269 | "dev": true, 270 | "optional": true, 271 | "os": [ 272 | "linux" 273 | ], 274 | "engines": { 275 | "node": ">=12" 276 | } 277 | }, 278 | "node_modules/@esbuild/netbsd-x64": { 279 | "version": "0.17.6", 280 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.6.tgz", 281 | "integrity": "sha512-EanJqcU/4uZIBreTrnbnre2DXgXSa+Gjap7ifRfllpmyAU7YMvaXmljdArptTHmjrkkKm9BK6GH5D5Yo+p6y5A==", 282 | "cpu": [ 283 | "x64" 284 | ], 285 | "dev": true, 286 | "optional": true, 287 | "os": [ 288 | "netbsd" 289 | ], 290 | "engines": { 291 | "node": ">=12" 292 | } 293 | }, 294 | "node_modules/@esbuild/openbsd-x64": { 295 | "version": "0.17.6", 296 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.6.tgz", 297 | "integrity": "sha512-xaxeSunhQRsTNGFanoOkkLtnmMn5QbA0qBhNet/XLVsc+OVkpIWPHcr3zTW2gxVU5YOHFbIHR9ODuaUdNza2Vw==", 298 | "cpu": [ 299 | "x64" 300 | ], 301 | "dev": true, 302 | "optional": true, 303 | "os": [ 304 | "openbsd" 305 | ], 306 | "engines": { 307 | "node": ">=12" 308 | } 309 | }, 310 | "node_modules/@esbuild/sunos-x64": { 311 | "version": "0.17.6", 312 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.6.tgz", 313 | "integrity": "sha512-gnMnMPg5pfMkZvhHee21KbKdc6W3GR8/JuE0Da1kjwpK6oiFU3nqfHuVPgUX2rsOx9N2SadSQTIYV1CIjYG+xw==", 314 | "cpu": [ 315 | "x64" 316 | ], 317 | "dev": true, 318 | "optional": true, 319 | "os": [ 320 | "sunos" 321 | ], 322 | "engines": { 323 | "node": ">=12" 324 | } 325 | }, 326 | "node_modules/@esbuild/win32-arm64": { 327 | "version": "0.17.6", 328 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.6.tgz", 329 | "integrity": "sha512-G95n7vP1UnGJPsVdKXllAJPtqjMvFYbN20e8RK8LVLhlTiSOH1sd7+Gt7rm70xiG+I5tM58nYgwWrLs6I1jHqg==", 330 | "cpu": [ 331 | "arm64" 332 | ], 333 | "dev": true, 334 | "optional": true, 335 | "os": [ 336 | "win32" 337 | ], 338 | "engines": { 339 | "node": ">=12" 340 | } 341 | }, 342 | "node_modules/@esbuild/win32-ia32": { 343 | "version": "0.17.6", 344 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.6.tgz", 345 | "integrity": "sha512-96yEFzLhq5bv9jJo5JhTs1gI+1cKQ83cUpyxHuGqXVwQtY5Eq54ZEsKs8veKtiKwlrNimtckHEkj4mRh4pPjsg==", 346 | "cpu": [ 347 | "ia32" 348 | ], 349 | "dev": true, 350 | "optional": true, 351 | "os": [ 352 | "win32" 353 | ], 354 | "engines": { 355 | "node": ">=12" 356 | } 357 | }, 358 | "node_modules/@esbuild/win32-x64": { 359 | "version": "0.17.6", 360 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.6.tgz", 361 | "integrity": "sha512-n6d8MOyUrNp6G4VSpRcgjs5xj4A91svJSaiwLIDWVWEsZtpN5FA9NlBbZHDmAJc2e8e6SF4tkBD3HAvPF+7igA==", 362 | "cpu": [ 363 | "x64" 364 | ], 365 | "dev": true, 366 | "optional": true, 367 | "os": [ 368 | "win32" 369 | ], 370 | "engines": { 371 | "node": ">=12" 372 | } 373 | }, 374 | "node_modules/@thi.ng/bitstream": { 375 | "version": "2.2.12", 376 | "resolved": "https://registry.npmjs.org/@thi.ng/bitstream/-/bitstream-2.2.12.tgz", 377 | "integrity": "sha512-2NtYwfjL9Gpv5laWXx4k/T2ibNrnxekW6xE/77ATkII4dVdqLVdUOKFvBAr+EbHmeT+SJTuWaOSd/GpDQPVgMA==", 378 | "funding": [ 379 | { 380 | "type": "github", 381 | "url": "https://github.com/sponsors/postspectacular" 382 | }, 383 | { 384 | "type": "patreon", 385 | "url": "https://patreon.com/thing_umbrella" 386 | } 387 | ], 388 | "dependencies": { 389 | "@thi.ng/errors": "^2.2.8" 390 | }, 391 | "engines": { 392 | "node": ">=12.7" 393 | } 394 | }, 395 | "node_modules/@thi.ng/errors": { 396 | "version": "2.2.8", 397 | "resolved": "https://registry.npmjs.org/@thi.ng/errors/-/errors-2.2.8.tgz", 398 | "integrity": "sha512-cJea03+HCnDNlcuz3+5noURGXMT9gPBYgIcXWR76mW0IJ92jfyQ04Yt6J12rO73Td4wNLi+EiRrQdfcjFsyhqw==", 399 | "funding": [ 400 | { 401 | "type": "github", 402 | "url": "https://github.com/sponsors/postspectacular" 403 | }, 404 | { 405 | "type": "patreon", 406 | "url": "https://patreon.com/thing_umbrella" 407 | } 408 | ], 409 | "engines": { 410 | "node": ">=12.7" 411 | } 412 | }, 413 | "node_modules/array.prototype.every": { 414 | "version": "1.1.4", 415 | "resolved": "https://registry.npmjs.org/array.prototype.every/-/array.prototype.every-1.1.4.tgz", 416 | "integrity": "sha512-Aui35iRZk1HHLRAyF7QP0KAnOnduaQ6fo6k1NVWfRc0xTs2AZ70ytlXvOmkC6Di4JmUs2Wv3DYzGtCQFSk5uGg==", 417 | "dev": true, 418 | "dependencies": { 419 | "call-bind": "^1.0.2", 420 | "define-properties": "^1.1.4", 421 | "es-abstract": "^1.20.4", 422 | "is-string": "^1.0.7" 423 | }, 424 | "engines": { 425 | "node": ">= 0.4" 426 | }, 427 | "funding": { 428 | "url": "https://github.com/sponsors/ljharb" 429 | } 430 | }, 431 | "node_modules/audiobuffer-to-wav": { 432 | "version": "1.0.0", 433 | "resolved": "https://registry.npmjs.org/audiobuffer-to-wav/-/audiobuffer-to-wav-1.0.0.tgz", 434 | "integrity": "sha512-CAoir4NRrAzAgYo20tEMiKZR84coE8bq/L+H2kwAaULVY4+0xySsEVtNT5raqpzmH6y0pqzY6EmoViLd9W8F/w==", 435 | "dev": true 436 | }, 437 | "node_modules/available-typed-arrays": { 438 | "version": "1.0.5", 439 | "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", 440 | "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", 441 | "dev": true, 442 | "engines": { 443 | "node": ">= 0.4" 444 | }, 445 | "funding": { 446 | "url": "https://github.com/sponsors/ljharb" 447 | } 448 | }, 449 | "node_modules/balanced-match": { 450 | "version": "1.0.2", 451 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 452 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 453 | "dev": true 454 | }, 455 | "node_modules/brace-expansion": { 456 | "version": "1.1.11", 457 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 458 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 459 | "dev": true, 460 | "dependencies": { 461 | "balanced-match": "^1.0.0", 462 | "concat-map": "0.0.1" 463 | } 464 | }, 465 | "node_modules/call-bind": { 466 | "version": "1.0.2", 467 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 468 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 469 | "dev": true, 470 | "dependencies": { 471 | "function-bind": "^1.1.1", 472 | "get-intrinsic": "^1.0.2" 473 | }, 474 | "funding": { 475 | "url": "https://github.com/sponsors/ljharb" 476 | } 477 | }, 478 | "node_modules/concat-map": { 479 | "version": "0.0.1", 480 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 481 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 482 | "dev": true 483 | }, 484 | "node_modules/deep-equal": { 485 | "version": "2.2.0", 486 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.0.tgz", 487 | "integrity": "sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==", 488 | "dev": true, 489 | "dependencies": { 490 | "call-bind": "^1.0.2", 491 | "es-get-iterator": "^1.1.2", 492 | "get-intrinsic": "^1.1.3", 493 | "is-arguments": "^1.1.1", 494 | "is-array-buffer": "^3.0.1", 495 | "is-date-object": "^1.0.5", 496 | "is-regex": "^1.1.4", 497 | "is-shared-array-buffer": "^1.0.2", 498 | "isarray": "^2.0.5", 499 | "object-is": "^1.1.5", 500 | "object-keys": "^1.1.1", 501 | "object.assign": "^4.1.4", 502 | "regexp.prototype.flags": "^1.4.3", 503 | "side-channel": "^1.0.4", 504 | "which-boxed-primitive": "^1.0.2", 505 | "which-collection": "^1.0.1", 506 | "which-typed-array": "^1.1.9" 507 | }, 508 | "funding": { 509 | "url": "https://github.com/sponsors/ljharb" 510 | } 511 | }, 512 | "node_modules/define-properties": { 513 | "version": "1.1.4", 514 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", 515 | "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", 516 | "dev": true, 517 | "dependencies": { 518 | "has-property-descriptors": "^1.0.0", 519 | "object-keys": "^1.1.1" 520 | }, 521 | "engines": { 522 | "node": ">= 0.4" 523 | }, 524 | "funding": { 525 | "url": "https://github.com/sponsors/ljharb" 526 | } 527 | }, 528 | "node_modules/defined": { 529 | "version": "1.0.1", 530 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", 531 | "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", 532 | "dev": true, 533 | "funding": { 534 | "url": "https://github.com/sponsors/ljharb" 535 | } 536 | }, 537 | "node_modules/dotignore": { 538 | "version": "0.1.2", 539 | "resolved": "https://registry.npmjs.org/dotignore/-/dotignore-0.1.2.tgz", 540 | "integrity": "sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==", 541 | "dev": true, 542 | "dependencies": { 543 | "minimatch": "^3.0.4" 544 | }, 545 | "bin": { 546 | "ignored": "bin/ignored" 547 | } 548 | }, 549 | "node_modules/es-abstract": { 550 | "version": "1.21.1", 551 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz", 552 | "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==", 553 | "dev": true, 554 | "dependencies": { 555 | "available-typed-arrays": "^1.0.5", 556 | "call-bind": "^1.0.2", 557 | "es-set-tostringtag": "^2.0.1", 558 | "es-to-primitive": "^1.2.1", 559 | "function-bind": "^1.1.1", 560 | "function.prototype.name": "^1.1.5", 561 | "get-intrinsic": "^1.1.3", 562 | "get-symbol-description": "^1.0.0", 563 | "globalthis": "^1.0.3", 564 | "gopd": "^1.0.1", 565 | "has": "^1.0.3", 566 | "has-property-descriptors": "^1.0.0", 567 | "has-proto": "^1.0.1", 568 | "has-symbols": "^1.0.3", 569 | "internal-slot": "^1.0.4", 570 | "is-array-buffer": "^3.0.1", 571 | "is-callable": "^1.2.7", 572 | "is-negative-zero": "^2.0.2", 573 | "is-regex": "^1.1.4", 574 | "is-shared-array-buffer": "^1.0.2", 575 | "is-string": "^1.0.7", 576 | "is-typed-array": "^1.1.10", 577 | "is-weakref": "^1.0.2", 578 | "object-inspect": "^1.12.2", 579 | "object-keys": "^1.1.1", 580 | "object.assign": "^4.1.4", 581 | "regexp.prototype.flags": "^1.4.3", 582 | "safe-regex-test": "^1.0.0", 583 | "string.prototype.trimend": "^1.0.6", 584 | "string.prototype.trimstart": "^1.0.6", 585 | "typed-array-length": "^1.0.4", 586 | "unbox-primitive": "^1.0.2", 587 | "which-typed-array": "^1.1.9" 588 | }, 589 | "engines": { 590 | "node": ">= 0.4" 591 | }, 592 | "funding": { 593 | "url": "https://github.com/sponsors/ljharb" 594 | } 595 | }, 596 | "node_modules/es-get-iterator": { 597 | "version": "1.1.3", 598 | "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", 599 | "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", 600 | "dev": true, 601 | "dependencies": { 602 | "call-bind": "^1.0.2", 603 | "get-intrinsic": "^1.1.3", 604 | "has-symbols": "^1.0.3", 605 | "is-arguments": "^1.1.1", 606 | "is-map": "^2.0.2", 607 | "is-set": "^2.0.2", 608 | "is-string": "^1.0.7", 609 | "isarray": "^2.0.5", 610 | "stop-iteration-iterator": "^1.0.0" 611 | }, 612 | "funding": { 613 | "url": "https://github.com/sponsors/ljharb" 614 | } 615 | }, 616 | "node_modules/es-set-tostringtag": { 617 | "version": "2.0.1", 618 | "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", 619 | "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", 620 | "dev": true, 621 | "dependencies": { 622 | "get-intrinsic": "^1.1.3", 623 | "has": "^1.0.3", 624 | "has-tostringtag": "^1.0.0" 625 | }, 626 | "engines": { 627 | "node": ">= 0.4" 628 | } 629 | }, 630 | "node_modules/es-to-primitive": { 631 | "version": "1.2.1", 632 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 633 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 634 | "dev": true, 635 | "dependencies": { 636 | "is-callable": "^1.1.4", 637 | "is-date-object": "^1.0.1", 638 | "is-symbol": "^1.0.2" 639 | }, 640 | "engines": { 641 | "node": ">= 0.4" 642 | }, 643 | "funding": { 644 | "url": "https://github.com/sponsors/ljharb" 645 | } 646 | }, 647 | "node_modules/esbuild": { 648 | "version": "0.17.6", 649 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.6.tgz", 650 | "integrity": "sha512-TKFRp9TxrJDdRWfSsSERKEovm6v30iHnrjlcGhLBOtReE28Yp1VSBRfO3GTaOFMoxsNerx4TjrhzSuma9ha83Q==", 651 | "dev": true, 652 | "hasInstallScript": true, 653 | "bin": { 654 | "esbuild": "bin/esbuild" 655 | }, 656 | "engines": { 657 | "node": ">=12" 658 | }, 659 | "optionalDependencies": { 660 | "@esbuild/android-arm": "0.17.6", 661 | "@esbuild/android-arm64": "0.17.6", 662 | "@esbuild/android-x64": "0.17.6", 663 | "@esbuild/darwin-arm64": "0.17.6", 664 | "@esbuild/darwin-x64": "0.17.6", 665 | "@esbuild/freebsd-arm64": "0.17.6", 666 | "@esbuild/freebsd-x64": "0.17.6", 667 | "@esbuild/linux-arm": "0.17.6", 668 | "@esbuild/linux-arm64": "0.17.6", 669 | "@esbuild/linux-ia32": "0.17.6", 670 | "@esbuild/linux-loong64": "0.17.6", 671 | "@esbuild/linux-mips64el": "0.17.6", 672 | "@esbuild/linux-ppc64": "0.17.6", 673 | "@esbuild/linux-riscv64": "0.17.6", 674 | "@esbuild/linux-s390x": "0.17.6", 675 | "@esbuild/linux-x64": "0.17.6", 676 | "@esbuild/netbsd-x64": "0.17.6", 677 | "@esbuild/openbsd-x64": "0.17.6", 678 | "@esbuild/sunos-x64": "0.17.6", 679 | "@esbuild/win32-arm64": "0.17.6", 680 | "@esbuild/win32-ia32": "0.17.6", 681 | "@esbuild/win32-x64": "0.17.6" 682 | } 683 | }, 684 | "node_modules/for-each": { 685 | "version": "0.3.3", 686 | "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", 687 | "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", 688 | "dev": true, 689 | "dependencies": { 690 | "is-callable": "^1.1.3" 691 | } 692 | }, 693 | "node_modules/fs.realpath": { 694 | "version": "1.0.0", 695 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 696 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 697 | "dev": true 698 | }, 699 | "node_modules/function-bind": { 700 | "version": "1.1.1", 701 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 702 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 703 | "dev": true 704 | }, 705 | "node_modules/function.prototype.name": { 706 | "version": "1.1.5", 707 | "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", 708 | "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", 709 | "dev": true, 710 | "dependencies": { 711 | "call-bind": "^1.0.2", 712 | "define-properties": "^1.1.3", 713 | "es-abstract": "^1.19.0", 714 | "functions-have-names": "^1.2.2" 715 | }, 716 | "engines": { 717 | "node": ">= 0.4" 718 | }, 719 | "funding": { 720 | "url": "https://github.com/sponsors/ljharb" 721 | } 722 | }, 723 | "node_modules/functions-have-names": { 724 | "version": "1.2.3", 725 | "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", 726 | "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", 727 | "dev": true, 728 | "funding": { 729 | "url": "https://github.com/sponsors/ljharb" 730 | } 731 | }, 732 | "node_modules/get-intrinsic": { 733 | "version": "1.2.0", 734 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", 735 | "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", 736 | "dev": true, 737 | "dependencies": { 738 | "function-bind": "^1.1.1", 739 | "has": "^1.0.3", 740 | "has-symbols": "^1.0.3" 741 | }, 742 | "funding": { 743 | "url": "https://github.com/sponsors/ljharb" 744 | } 745 | }, 746 | "node_modules/get-package-type": { 747 | "version": "0.1.0", 748 | "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", 749 | "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", 750 | "dev": true, 751 | "engines": { 752 | "node": ">=8.0.0" 753 | } 754 | }, 755 | "node_modules/get-symbol-description": { 756 | "version": "1.0.0", 757 | "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", 758 | "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", 759 | "dev": true, 760 | "dependencies": { 761 | "call-bind": "^1.0.2", 762 | "get-intrinsic": "^1.1.1" 763 | }, 764 | "engines": { 765 | "node": ">= 0.4" 766 | }, 767 | "funding": { 768 | "url": "https://github.com/sponsors/ljharb" 769 | } 770 | }, 771 | "node_modules/glob": { 772 | "version": "7.2.3", 773 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 774 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 775 | "dev": true, 776 | "dependencies": { 777 | "fs.realpath": "^1.0.0", 778 | "inflight": "^1.0.4", 779 | "inherits": "2", 780 | "minimatch": "^3.1.1", 781 | "once": "^1.3.0", 782 | "path-is-absolute": "^1.0.0" 783 | }, 784 | "engines": { 785 | "node": "*" 786 | }, 787 | "funding": { 788 | "url": "https://github.com/sponsors/isaacs" 789 | } 790 | }, 791 | "node_modules/globalthis": { 792 | "version": "1.0.3", 793 | "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", 794 | "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", 795 | "dev": true, 796 | "dependencies": { 797 | "define-properties": "^1.1.3" 798 | }, 799 | "engines": { 800 | "node": ">= 0.4" 801 | }, 802 | "funding": { 803 | "url": "https://github.com/sponsors/ljharb" 804 | } 805 | }, 806 | "node_modules/gopd": { 807 | "version": "1.0.1", 808 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", 809 | "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", 810 | "dev": true, 811 | "dependencies": { 812 | "get-intrinsic": "^1.1.3" 813 | }, 814 | "funding": { 815 | "url": "https://github.com/sponsors/ljharb" 816 | } 817 | }, 818 | "node_modules/has": { 819 | "version": "1.0.3", 820 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 821 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 822 | "dev": true, 823 | "dependencies": { 824 | "function-bind": "^1.1.1" 825 | }, 826 | "engines": { 827 | "node": ">= 0.4.0" 828 | } 829 | }, 830 | "node_modules/has-bigints": { 831 | "version": "1.0.2", 832 | "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", 833 | "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", 834 | "dev": true, 835 | "funding": { 836 | "url": "https://github.com/sponsors/ljharb" 837 | } 838 | }, 839 | "node_modules/has-dynamic-import": { 840 | "version": "2.0.1", 841 | "resolved": "https://registry.npmjs.org/has-dynamic-import/-/has-dynamic-import-2.0.1.tgz", 842 | "integrity": "sha512-X3fbtsZmwb6W7fJGR9o7x65fZoodygCrZ3TVycvghP62yYQfS0t4RS0Qcz+j5tQYUKeSWS09tHkWW6WhFV3XhQ==", 843 | "dev": true, 844 | "dependencies": { 845 | "call-bind": "^1.0.2", 846 | "get-intrinsic": "^1.1.1" 847 | }, 848 | "funding": { 849 | "url": "https://github.com/sponsors/ljharb" 850 | } 851 | }, 852 | "node_modules/has-property-descriptors": { 853 | "version": "1.0.0", 854 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", 855 | "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", 856 | "dev": true, 857 | "dependencies": { 858 | "get-intrinsic": "^1.1.1" 859 | }, 860 | "funding": { 861 | "url": "https://github.com/sponsors/ljharb" 862 | } 863 | }, 864 | "node_modules/has-proto": { 865 | "version": "1.0.1", 866 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", 867 | "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", 868 | "dev": true, 869 | "engines": { 870 | "node": ">= 0.4" 871 | }, 872 | "funding": { 873 | "url": "https://github.com/sponsors/ljharb" 874 | } 875 | }, 876 | "node_modules/has-symbols": { 877 | "version": "1.0.3", 878 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 879 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 880 | "dev": true, 881 | "engines": { 882 | "node": ">= 0.4" 883 | }, 884 | "funding": { 885 | "url": "https://github.com/sponsors/ljharb" 886 | } 887 | }, 888 | "node_modules/has-tostringtag": { 889 | "version": "1.0.0", 890 | "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", 891 | "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", 892 | "dev": true, 893 | "dependencies": { 894 | "has-symbols": "^1.0.2" 895 | }, 896 | "engines": { 897 | "node": ">= 0.4" 898 | }, 899 | "funding": { 900 | "url": "https://github.com/sponsors/ljharb" 901 | } 902 | }, 903 | "node_modules/inflight": { 904 | "version": "1.0.6", 905 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 906 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 907 | "dev": true, 908 | "dependencies": { 909 | "once": "^1.3.0", 910 | "wrappy": "1" 911 | } 912 | }, 913 | "node_modules/inherits": { 914 | "version": "2.0.4", 915 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 916 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 917 | "dev": true 918 | }, 919 | "node_modules/internal-slot": { 920 | "version": "1.0.4", 921 | "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.4.tgz", 922 | "integrity": "sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==", 923 | "dev": true, 924 | "dependencies": { 925 | "get-intrinsic": "^1.1.3", 926 | "has": "^1.0.3", 927 | "side-channel": "^1.0.4" 928 | }, 929 | "engines": { 930 | "node": ">= 0.4" 931 | } 932 | }, 933 | "node_modules/is-arguments": { 934 | "version": "1.1.1", 935 | "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", 936 | "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", 937 | "dev": true, 938 | "dependencies": { 939 | "call-bind": "^1.0.2", 940 | "has-tostringtag": "^1.0.0" 941 | }, 942 | "engines": { 943 | "node": ">= 0.4" 944 | }, 945 | "funding": { 946 | "url": "https://github.com/sponsors/ljharb" 947 | } 948 | }, 949 | "node_modules/is-array-buffer": { 950 | "version": "3.0.1", 951 | "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz", 952 | "integrity": "sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==", 953 | "dev": true, 954 | "dependencies": { 955 | "call-bind": "^1.0.2", 956 | "get-intrinsic": "^1.1.3", 957 | "is-typed-array": "^1.1.10" 958 | }, 959 | "funding": { 960 | "url": "https://github.com/sponsors/ljharb" 961 | } 962 | }, 963 | "node_modules/is-bigint": { 964 | "version": "1.0.4", 965 | "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", 966 | "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", 967 | "dev": true, 968 | "dependencies": { 969 | "has-bigints": "^1.0.1" 970 | }, 971 | "funding": { 972 | "url": "https://github.com/sponsors/ljharb" 973 | } 974 | }, 975 | "node_modules/is-boolean-object": { 976 | "version": "1.1.2", 977 | "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", 978 | "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", 979 | "dev": true, 980 | "dependencies": { 981 | "call-bind": "^1.0.2", 982 | "has-tostringtag": "^1.0.0" 983 | }, 984 | "engines": { 985 | "node": ">= 0.4" 986 | }, 987 | "funding": { 988 | "url": "https://github.com/sponsors/ljharb" 989 | } 990 | }, 991 | "node_modules/is-callable": { 992 | "version": "1.2.7", 993 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", 994 | "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", 995 | "dev": true, 996 | "engines": { 997 | "node": ">= 0.4" 998 | }, 999 | "funding": { 1000 | "url": "https://github.com/sponsors/ljharb" 1001 | } 1002 | }, 1003 | "node_modules/is-core-module": { 1004 | "version": "2.11.0", 1005 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", 1006 | "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", 1007 | "dev": true, 1008 | "dependencies": { 1009 | "has": "^1.0.3" 1010 | }, 1011 | "funding": { 1012 | "url": "https://github.com/sponsors/ljharb" 1013 | } 1014 | }, 1015 | "node_modules/is-date-object": { 1016 | "version": "1.0.5", 1017 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", 1018 | "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", 1019 | "dev": true, 1020 | "dependencies": { 1021 | "has-tostringtag": "^1.0.0" 1022 | }, 1023 | "engines": { 1024 | "node": ">= 0.4" 1025 | }, 1026 | "funding": { 1027 | "url": "https://github.com/sponsors/ljharb" 1028 | } 1029 | }, 1030 | "node_modules/is-map": { 1031 | "version": "2.0.2", 1032 | "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", 1033 | "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", 1034 | "dev": true, 1035 | "funding": { 1036 | "url": "https://github.com/sponsors/ljharb" 1037 | } 1038 | }, 1039 | "node_modules/is-negative-zero": { 1040 | "version": "2.0.2", 1041 | "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", 1042 | "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", 1043 | "dev": true, 1044 | "engines": { 1045 | "node": ">= 0.4" 1046 | }, 1047 | "funding": { 1048 | "url": "https://github.com/sponsors/ljharb" 1049 | } 1050 | }, 1051 | "node_modules/is-number-object": { 1052 | "version": "1.0.7", 1053 | "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", 1054 | "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", 1055 | "dev": true, 1056 | "dependencies": { 1057 | "has-tostringtag": "^1.0.0" 1058 | }, 1059 | "engines": { 1060 | "node": ">= 0.4" 1061 | }, 1062 | "funding": { 1063 | "url": "https://github.com/sponsors/ljharb" 1064 | } 1065 | }, 1066 | "node_modules/is-regex": { 1067 | "version": "1.1.4", 1068 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", 1069 | "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", 1070 | "dev": true, 1071 | "dependencies": { 1072 | "call-bind": "^1.0.2", 1073 | "has-tostringtag": "^1.0.0" 1074 | }, 1075 | "engines": { 1076 | "node": ">= 0.4" 1077 | }, 1078 | "funding": { 1079 | "url": "https://github.com/sponsors/ljharb" 1080 | } 1081 | }, 1082 | "node_modules/is-set": { 1083 | "version": "2.0.2", 1084 | "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", 1085 | "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", 1086 | "dev": true, 1087 | "funding": { 1088 | "url": "https://github.com/sponsors/ljharb" 1089 | } 1090 | }, 1091 | "node_modules/is-shared-array-buffer": { 1092 | "version": "1.0.2", 1093 | "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", 1094 | "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", 1095 | "dev": true, 1096 | "dependencies": { 1097 | "call-bind": "^1.0.2" 1098 | }, 1099 | "funding": { 1100 | "url": "https://github.com/sponsors/ljharb" 1101 | } 1102 | }, 1103 | "node_modules/is-string": { 1104 | "version": "1.0.7", 1105 | "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", 1106 | "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", 1107 | "dev": true, 1108 | "dependencies": { 1109 | "has-tostringtag": "^1.0.0" 1110 | }, 1111 | "engines": { 1112 | "node": ">= 0.4" 1113 | }, 1114 | "funding": { 1115 | "url": "https://github.com/sponsors/ljharb" 1116 | } 1117 | }, 1118 | "node_modules/is-symbol": { 1119 | "version": "1.0.4", 1120 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", 1121 | "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", 1122 | "dev": true, 1123 | "dependencies": { 1124 | "has-symbols": "^1.0.2" 1125 | }, 1126 | "engines": { 1127 | "node": ">= 0.4" 1128 | }, 1129 | "funding": { 1130 | "url": "https://github.com/sponsors/ljharb" 1131 | } 1132 | }, 1133 | "node_modules/is-typed-array": { 1134 | "version": "1.1.10", 1135 | "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", 1136 | "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", 1137 | "dev": true, 1138 | "dependencies": { 1139 | "available-typed-arrays": "^1.0.5", 1140 | "call-bind": "^1.0.2", 1141 | "for-each": "^0.3.3", 1142 | "gopd": "^1.0.1", 1143 | "has-tostringtag": "^1.0.0" 1144 | }, 1145 | "engines": { 1146 | "node": ">= 0.4" 1147 | }, 1148 | "funding": { 1149 | "url": "https://github.com/sponsors/ljharb" 1150 | } 1151 | }, 1152 | "node_modules/is-weakmap": { 1153 | "version": "2.0.1", 1154 | "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", 1155 | "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", 1156 | "dev": true, 1157 | "funding": { 1158 | "url": "https://github.com/sponsors/ljharb" 1159 | } 1160 | }, 1161 | "node_modules/is-weakref": { 1162 | "version": "1.0.2", 1163 | "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", 1164 | "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", 1165 | "dev": true, 1166 | "dependencies": { 1167 | "call-bind": "^1.0.2" 1168 | }, 1169 | "funding": { 1170 | "url": "https://github.com/sponsors/ljharb" 1171 | } 1172 | }, 1173 | "node_modules/is-weakset": { 1174 | "version": "2.0.2", 1175 | "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", 1176 | "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", 1177 | "dev": true, 1178 | "dependencies": { 1179 | "call-bind": "^1.0.2", 1180 | "get-intrinsic": "^1.1.1" 1181 | }, 1182 | "funding": { 1183 | "url": "https://github.com/sponsors/ljharb" 1184 | } 1185 | }, 1186 | "node_modules/isarray": { 1187 | "version": "2.0.5", 1188 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", 1189 | "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", 1190 | "dev": true 1191 | }, 1192 | "node_modules/minimatch": { 1193 | "version": "3.1.2", 1194 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1195 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1196 | "dev": true, 1197 | "dependencies": { 1198 | "brace-expansion": "^1.1.7" 1199 | }, 1200 | "engines": { 1201 | "node": "*" 1202 | } 1203 | }, 1204 | "node_modules/minimist": { 1205 | "version": "1.2.7", 1206 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", 1207 | "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", 1208 | "dev": true, 1209 | "funding": { 1210 | "url": "https://github.com/sponsors/ljharb" 1211 | } 1212 | }, 1213 | "node_modules/object-inspect": { 1214 | "version": "1.12.3", 1215 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", 1216 | "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", 1217 | "dev": true, 1218 | "funding": { 1219 | "url": "https://github.com/sponsors/ljharb" 1220 | } 1221 | }, 1222 | "node_modules/object-is": { 1223 | "version": "1.1.5", 1224 | "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", 1225 | "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", 1226 | "dev": true, 1227 | "dependencies": { 1228 | "call-bind": "^1.0.2", 1229 | "define-properties": "^1.1.3" 1230 | }, 1231 | "engines": { 1232 | "node": ">= 0.4" 1233 | }, 1234 | "funding": { 1235 | "url": "https://github.com/sponsors/ljharb" 1236 | } 1237 | }, 1238 | "node_modules/object-keys": { 1239 | "version": "1.1.1", 1240 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 1241 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 1242 | "dev": true, 1243 | "engines": { 1244 | "node": ">= 0.4" 1245 | } 1246 | }, 1247 | "node_modules/object.assign": { 1248 | "version": "4.1.4", 1249 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", 1250 | "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", 1251 | "dev": true, 1252 | "dependencies": { 1253 | "call-bind": "^1.0.2", 1254 | "define-properties": "^1.1.4", 1255 | "has-symbols": "^1.0.3", 1256 | "object-keys": "^1.1.1" 1257 | }, 1258 | "engines": { 1259 | "node": ">= 0.4" 1260 | }, 1261 | "funding": { 1262 | "url": "https://github.com/sponsors/ljharb" 1263 | } 1264 | }, 1265 | "node_modules/once": { 1266 | "version": "1.4.0", 1267 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1268 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1269 | "dev": true, 1270 | "dependencies": { 1271 | "wrappy": "1" 1272 | } 1273 | }, 1274 | "node_modules/path-is-absolute": { 1275 | "version": "1.0.1", 1276 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1277 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 1278 | "dev": true, 1279 | "engines": { 1280 | "node": ">=0.10.0" 1281 | } 1282 | }, 1283 | "node_modules/path-parse": { 1284 | "version": "1.0.7", 1285 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1286 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 1287 | "dev": true 1288 | }, 1289 | "node_modules/regexp.prototype.flags": { 1290 | "version": "1.4.3", 1291 | "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", 1292 | "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", 1293 | "dev": true, 1294 | "dependencies": { 1295 | "call-bind": "^1.0.2", 1296 | "define-properties": "^1.1.3", 1297 | "functions-have-names": "^1.2.2" 1298 | }, 1299 | "engines": { 1300 | "node": ">= 0.4" 1301 | }, 1302 | "funding": { 1303 | "url": "https://github.com/sponsors/ljharb" 1304 | } 1305 | }, 1306 | "node_modules/resolve": { 1307 | "version": "2.0.0-next.4", 1308 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", 1309 | "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", 1310 | "dev": true, 1311 | "dependencies": { 1312 | "is-core-module": "^2.9.0", 1313 | "path-parse": "^1.0.7", 1314 | "supports-preserve-symlinks-flag": "^1.0.0" 1315 | }, 1316 | "bin": { 1317 | "resolve": "bin/resolve" 1318 | }, 1319 | "funding": { 1320 | "url": "https://github.com/sponsors/ljharb" 1321 | } 1322 | }, 1323 | "node_modules/resumer": { 1324 | "version": "0.0.0", 1325 | "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", 1326 | "integrity": "sha512-Fn9X8rX8yYF4m81rZCK/5VmrmsSbqS/i3rDLl6ZZHAXgC2nTAx3dhwG8q8odP/RmdLa2YrybDJaAMg+X1ajY3w==", 1327 | "dev": true, 1328 | "dependencies": { 1329 | "through": "~2.3.4" 1330 | } 1331 | }, 1332 | "node_modules/safe-regex-test": { 1333 | "version": "1.0.0", 1334 | "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", 1335 | "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", 1336 | "dev": true, 1337 | "dependencies": { 1338 | "call-bind": "^1.0.2", 1339 | "get-intrinsic": "^1.1.3", 1340 | "is-regex": "^1.1.4" 1341 | }, 1342 | "funding": { 1343 | "url": "https://github.com/sponsors/ljharb" 1344 | } 1345 | }, 1346 | "node_modules/side-channel": { 1347 | "version": "1.0.4", 1348 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 1349 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 1350 | "dev": true, 1351 | "dependencies": { 1352 | "call-bind": "^1.0.0", 1353 | "get-intrinsic": "^1.0.2", 1354 | "object-inspect": "^1.9.0" 1355 | }, 1356 | "funding": { 1357 | "url": "https://github.com/sponsors/ljharb" 1358 | } 1359 | }, 1360 | "node_modules/stop-iteration-iterator": { 1361 | "version": "1.0.0", 1362 | "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", 1363 | "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", 1364 | "dev": true, 1365 | "dependencies": { 1366 | "internal-slot": "^1.0.4" 1367 | }, 1368 | "engines": { 1369 | "node": ">= 0.4" 1370 | } 1371 | }, 1372 | "node_modules/string.prototype.trim": { 1373 | "version": "1.2.7", 1374 | "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", 1375 | "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", 1376 | "dev": true, 1377 | "dependencies": { 1378 | "call-bind": "^1.0.2", 1379 | "define-properties": "^1.1.4", 1380 | "es-abstract": "^1.20.4" 1381 | }, 1382 | "engines": { 1383 | "node": ">= 0.4" 1384 | }, 1385 | "funding": { 1386 | "url": "https://github.com/sponsors/ljharb" 1387 | } 1388 | }, 1389 | "node_modules/string.prototype.trimend": { 1390 | "version": "1.0.6", 1391 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", 1392 | "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", 1393 | "dev": true, 1394 | "dependencies": { 1395 | "call-bind": "^1.0.2", 1396 | "define-properties": "^1.1.4", 1397 | "es-abstract": "^1.20.4" 1398 | }, 1399 | "funding": { 1400 | "url": "https://github.com/sponsors/ljharb" 1401 | } 1402 | }, 1403 | "node_modules/string.prototype.trimstart": { 1404 | "version": "1.0.6", 1405 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", 1406 | "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", 1407 | "dev": true, 1408 | "dependencies": { 1409 | "call-bind": "^1.0.2", 1410 | "define-properties": "^1.1.4", 1411 | "es-abstract": "^1.20.4" 1412 | }, 1413 | "funding": { 1414 | "url": "https://github.com/sponsors/ljharb" 1415 | } 1416 | }, 1417 | "node_modules/supports-preserve-symlinks-flag": { 1418 | "version": "1.0.0", 1419 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 1420 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 1421 | "dev": true, 1422 | "engines": { 1423 | "node": ">= 0.4" 1424 | }, 1425 | "funding": { 1426 | "url": "https://github.com/sponsors/ljharb" 1427 | } 1428 | }, 1429 | "node_modules/tape": { 1430 | "version": "5.6.3", 1431 | "resolved": "https://registry.npmjs.org/tape/-/tape-5.6.3.tgz", 1432 | "integrity": "sha512-cUDDGSbyoSIpdUAqbqLI/r7i/S4BHuCB9M5j7E/LrLs/x/i4zeAJ798aqo+FGo+kr9seBZwr8AkZW6rjceyAMQ==", 1433 | "dev": true, 1434 | "dependencies": { 1435 | "array.prototype.every": "^1.1.4", 1436 | "call-bind": "^1.0.2", 1437 | "deep-equal": "^2.2.0", 1438 | "defined": "^1.0.1", 1439 | "dotignore": "^0.1.2", 1440 | "for-each": "^0.3.3", 1441 | "get-package-type": "^0.1.0", 1442 | "glob": "^7.2.3", 1443 | "has": "^1.0.3", 1444 | "has-dynamic-import": "^2.0.1", 1445 | "inherits": "^2.0.4", 1446 | "is-regex": "^1.1.4", 1447 | "minimist": "^1.2.7", 1448 | "object-inspect": "^1.12.3", 1449 | "object-is": "^1.1.5", 1450 | "object-keys": "^1.1.1", 1451 | "object.assign": "^4.1.4", 1452 | "resolve": "^2.0.0-next.4", 1453 | "resumer": "^0.0.0", 1454 | "string.prototype.trim": "^1.2.7", 1455 | "through": "^2.3.8" 1456 | }, 1457 | "bin": { 1458 | "tape": "bin/tape" 1459 | }, 1460 | "funding": { 1461 | "url": "https://github.com/sponsors/ljharb" 1462 | } 1463 | }, 1464 | "node_modules/through": { 1465 | "version": "2.3.8", 1466 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1467 | "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", 1468 | "dev": true 1469 | }, 1470 | "node_modules/typed-array-length": { 1471 | "version": "1.0.4", 1472 | "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", 1473 | "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", 1474 | "dev": true, 1475 | "dependencies": { 1476 | "call-bind": "^1.0.2", 1477 | "for-each": "^0.3.3", 1478 | "is-typed-array": "^1.1.9" 1479 | }, 1480 | "funding": { 1481 | "url": "https://github.com/sponsors/ljharb" 1482 | } 1483 | }, 1484 | "node_modules/unbox-primitive": { 1485 | "version": "1.0.2", 1486 | "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", 1487 | "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", 1488 | "dev": true, 1489 | "dependencies": { 1490 | "call-bind": "^1.0.2", 1491 | "has-bigints": "^1.0.2", 1492 | "has-symbols": "^1.0.3", 1493 | "which-boxed-primitive": "^1.0.2" 1494 | }, 1495 | "funding": { 1496 | "url": "https://github.com/sponsors/ljharb" 1497 | } 1498 | }, 1499 | "node_modules/wav-decoder": { 1500 | "version": "1.3.0", 1501 | "resolved": "https://registry.npmjs.org/wav-decoder/-/wav-decoder-1.3.0.tgz", 1502 | "integrity": "sha512-4U6O/JNb1dPO90CO2YMTQ5N2plJcntm39vNMvRq9VZ4Vy5FzS7Lnx95N2QcYUyKYcZfCbhI//W3dSHA8YnOQyQ==", 1503 | "dev": true 1504 | }, 1505 | "node_modules/which-boxed-primitive": { 1506 | "version": "1.0.2", 1507 | "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", 1508 | "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", 1509 | "dev": true, 1510 | "dependencies": { 1511 | "is-bigint": "^1.0.1", 1512 | "is-boolean-object": "^1.1.0", 1513 | "is-number-object": "^1.0.4", 1514 | "is-string": "^1.0.5", 1515 | "is-symbol": "^1.0.3" 1516 | }, 1517 | "funding": { 1518 | "url": "https://github.com/sponsors/ljharb" 1519 | } 1520 | }, 1521 | "node_modules/which-collection": { 1522 | "version": "1.0.1", 1523 | "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", 1524 | "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", 1525 | "dev": true, 1526 | "dependencies": { 1527 | "is-map": "^2.0.1", 1528 | "is-set": "^2.0.1", 1529 | "is-weakmap": "^2.0.1", 1530 | "is-weakset": "^2.0.1" 1531 | }, 1532 | "funding": { 1533 | "url": "https://github.com/sponsors/ljharb" 1534 | } 1535 | }, 1536 | "node_modules/which-typed-array": { 1537 | "version": "1.1.9", 1538 | "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", 1539 | "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", 1540 | "dev": true, 1541 | "dependencies": { 1542 | "available-typed-arrays": "^1.0.5", 1543 | "call-bind": "^1.0.2", 1544 | "for-each": "^0.3.3", 1545 | "gopd": "^1.0.1", 1546 | "has-tostringtag": "^1.0.0", 1547 | "is-typed-array": "^1.1.10" 1548 | }, 1549 | "engines": { 1550 | "node": ">= 0.4" 1551 | }, 1552 | "funding": { 1553 | "url": "https://github.com/sponsors/ljharb" 1554 | } 1555 | }, 1556 | "node_modules/wrappy": { 1557 | "version": "1.0.2", 1558 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1559 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 1560 | "dev": true 1561 | } 1562 | }, 1563 | "dependencies": { 1564 | "@esbuild/android-arm": { 1565 | "version": "0.17.6", 1566 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.6.tgz", 1567 | "integrity": "sha512-bSC9YVUjADDy1gae8RrioINU6e1lCkg3VGVwm0QQ2E1CWcC4gnMce9+B6RpxuSsrsXsk1yojn7sp1fnG8erE2g==", 1568 | "dev": true, 1569 | "optional": true 1570 | }, 1571 | "@esbuild/android-arm64": { 1572 | "version": "0.17.6", 1573 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.6.tgz", 1574 | "integrity": "sha512-YnYSCceN/dUzUr5kdtUzB+wZprCafuD89Hs0Aqv9QSdwhYQybhXTaSTcrl6X/aWThn1a/j0eEpUBGOE7269REg==", 1575 | "dev": true, 1576 | "optional": true 1577 | }, 1578 | "@esbuild/android-x64": { 1579 | "version": "0.17.6", 1580 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.6.tgz", 1581 | "integrity": "sha512-MVcYcgSO7pfu/x34uX9u2QIZHmXAB7dEiLQC5bBl5Ryqtpj9lT2sg3gNDEsrPEmimSJW2FXIaxqSQ501YLDsZQ==", 1582 | "dev": true, 1583 | "optional": true 1584 | }, 1585 | "@esbuild/darwin-arm64": { 1586 | "version": "0.17.6", 1587 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.6.tgz", 1588 | "integrity": "sha512-bsDRvlbKMQMt6Wl08nHtFz++yoZHsyTOxnjfB2Q95gato+Yi4WnRl13oC2/PJJA9yLCoRv9gqT/EYX0/zDsyMA==", 1589 | "dev": true, 1590 | "optional": true 1591 | }, 1592 | "@esbuild/darwin-x64": { 1593 | "version": "0.17.6", 1594 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.6.tgz", 1595 | "integrity": "sha512-xh2A5oPrYRfMFz74QXIQTQo8uA+hYzGWJFoeTE8EvoZGHb+idyV4ATaukaUvnnxJiauhs/fPx3vYhU4wiGfosg==", 1596 | "dev": true, 1597 | "optional": true 1598 | }, 1599 | "@esbuild/freebsd-arm64": { 1600 | "version": "0.17.6", 1601 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.6.tgz", 1602 | "integrity": "sha512-EnUwjRc1inT4ccZh4pB3v1cIhohE2S4YXlt1OvI7sw/+pD+dIE4smwekZlEPIwY6PhU6oDWwITrQQm5S2/iZgg==", 1603 | "dev": true, 1604 | "optional": true 1605 | }, 1606 | "@esbuild/freebsd-x64": { 1607 | "version": "0.17.6", 1608 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.6.tgz", 1609 | "integrity": "sha512-Uh3HLWGzH6FwpviUcLMKPCbZUAFzv67Wj5MTwK6jn89b576SR2IbEp+tqUHTr8DIl0iDmBAf51MVaP7pw6PY5Q==", 1610 | "dev": true, 1611 | "optional": true 1612 | }, 1613 | "@esbuild/linux-arm": { 1614 | "version": "0.17.6", 1615 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.6.tgz", 1616 | "integrity": "sha512-7YdGiurNt7lqO0Bf/U9/arrPWPqdPqcV6JCZda4LZgEn+PTQ5SMEI4MGR52Bfn3+d6bNEGcWFzlIxiQdS48YUw==", 1617 | "dev": true, 1618 | "optional": true 1619 | }, 1620 | "@esbuild/linux-arm64": { 1621 | "version": "0.17.6", 1622 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.6.tgz", 1623 | "integrity": "sha512-bUR58IFOMJX523aDVozswnlp5yry7+0cRLCXDsxnUeQYJik1DukMY+apBsLOZJblpH+K7ox7YrKrHmJoWqVR9w==", 1624 | "dev": true, 1625 | "optional": true 1626 | }, 1627 | "@esbuild/linux-ia32": { 1628 | "version": "0.17.6", 1629 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.6.tgz", 1630 | "integrity": "sha512-ujp8uoQCM9FRcbDfkqECoARsLnLfCUhKARTP56TFPog8ie9JG83D5GVKjQ6yVrEVdMie1djH86fm98eY3quQkQ==", 1631 | "dev": true, 1632 | "optional": true 1633 | }, 1634 | "@esbuild/linux-loong64": { 1635 | "version": "0.17.6", 1636 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.6.tgz", 1637 | "integrity": "sha512-y2NX1+X/Nt+izj9bLoiaYB9YXT/LoaQFYvCkVD77G/4F+/yuVXYCWz4SE9yr5CBMbOxOfBcy/xFL4LlOeNlzYQ==", 1638 | "dev": true, 1639 | "optional": true 1640 | }, 1641 | "@esbuild/linux-mips64el": { 1642 | "version": "0.17.6", 1643 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.6.tgz", 1644 | "integrity": "sha512-09AXKB1HDOzXD+j3FdXCiL/MWmZP0Ex9eR8DLMBVcHorrWJxWmY8Nms2Nm41iRM64WVx7bA/JVHMv081iP2kUA==", 1645 | "dev": true, 1646 | "optional": true 1647 | }, 1648 | "@esbuild/linux-ppc64": { 1649 | "version": "0.17.6", 1650 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.6.tgz", 1651 | "integrity": "sha512-AmLhMzkM8JuqTIOhxnX4ubh0XWJIznEynRnZAVdA2mMKE6FAfwT2TWKTwdqMG+qEaeyDPtfNoZRpJbD4ZBv0Tg==", 1652 | "dev": true, 1653 | "optional": true 1654 | }, 1655 | "@esbuild/linux-riscv64": { 1656 | "version": "0.17.6", 1657 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.6.tgz", 1658 | "integrity": "sha512-Y4Ri62PfavhLQhFbqucysHOmRamlTVK10zPWlqjNbj2XMea+BOs4w6ASKwQwAiqf9ZqcY9Ab7NOU4wIgpxwoSQ==", 1659 | "dev": true, 1660 | "optional": true 1661 | }, 1662 | "@esbuild/linux-s390x": { 1663 | "version": "0.17.6", 1664 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.6.tgz", 1665 | "integrity": "sha512-SPUiz4fDbnNEm3JSdUW8pBJ/vkop3M1YwZAVwvdwlFLoJwKEZ9L98l3tzeyMzq27CyepDQ3Qgoba44StgbiN5Q==", 1666 | "dev": true, 1667 | "optional": true 1668 | }, 1669 | "@esbuild/linux-x64": { 1670 | "version": "0.17.6", 1671 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.6.tgz", 1672 | "integrity": "sha512-a3yHLmOodHrzuNgdpB7peFGPx1iJ2x6m+uDvhP2CKdr2CwOaqEFMeSqYAHU7hG+RjCq8r2NFujcd/YsEsFgTGw==", 1673 | "dev": true, 1674 | "optional": true 1675 | }, 1676 | "@esbuild/netbsd-x64": { 1677 | "version": "0.17.6", 1678 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.6.tgz", 1679 | "integrity": "sha512-EanJqcU/4uZIBreTrnbnre2DXgXSa+Gjap7ifRfllpmyAU7YMvaXmljdArptTHmjrkkKm9BK6GH5D5Yo+p6y5A==", 1680 | "dev": true, 1681 | "optional": true 1682 | }, 1683 | "@esbuild/openbsd-x64": { 1684 | "version": "0.17.6", 1685 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.6.tgz", 1686 | "integrity": "sha512-xaxeSunhQRsTNGFanoOkkLtnmMn5QbA0qBhNet/XLVsc+OVkpIWPHcr3zTW2gxVU5YOHFbIHR9ODuaUdNza2Vw==", 1687 | "dev": true, 1688 | "optional": true 1689 | }, 1690 | "@esbuild/sunos-x64": { 1691 | "version": "0.17.6", 1692 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.6.tgz", 1693 | "integrity": "sha512-gnMnMPg5pfMkZvhHee21KbKdc6W3GR8/JuE0Da1kjwpK6oiFU3nqfHuVPgUX2rsOx9N2SadSQTIYV1CIjYG+xw==", 1694 | "dev": true, 1695 | "optional": true 1696 | }, 1697 | "@esbuild/win32-arm64": { 1698 | "version": "0.17.6", 1699 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.6.tgz", 1700 | "integrity": "sha512-G95n7vP1UnGJPsVdKXllAJPtqjMvFYbN20e8RK8LVLhlTiSOH1sd7+Gt7rm70xiG+I5tM58nYgwWrLs6I1jHqg==", 1701 | "dev": true, 1702 | "optional": true 1703 | }, 1704 | "@esbuild/win32-ia32": { 1705 | "version": "0.17.6", 1706 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.6.tgz", 1707 | "integrity": "sha512-96yEFzLhq5bv9jJo5JhTs1gI+1cKQ83cUpyxHuGqXVwQtY5Eq54ZEsKs8veKtiKwlrNimtckHEkj4mRh4pPjsg==", 1708 | "dev": true, 1709 | "optional": true 1710 | }, 1711 | "@esbuild/win32-x64": { 1712 | "version": "0.17.6", 1713 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.6.tgz", 1714 | "integrity": "sha512-n6d8MOyUrNp6G4VSpRcgjs5xj4A91svJSaiwLIDWVWEsZtpN5FA9NlBbZHDmAJc2e8e6SF4tkBD3HAvPF+7igA==", 1715 | "dev": true, 1716 | "optional": true 1717 | }, 1718 | "@thi.ng/bitstream": { 1719 | "version": "2.2.12", 1720 | "resolved": "https://registry.npmjs.org/@thi.ng/bitstream/-/bitstream-2.2.12.tgz", 1721 | "integrity": "sha512-2NtYwfjL9Gpv5laWXx4k/T2ibNrnxekW6xE/77ATkII4dVdqLVdUOKFvBAr+EbHmeT+SJTuWaOSd/GpDQPVgMA==", 1722 | "requires": { 1723 | "@thi.ng/errors": "^2.2.8" 1724 | } 1725 | }, 1726 | "@thi.ng/errors": { 1727 | "version": "2.2.8", 1728 | "resolved": "https://registry.npmjs.org/@thi.ng/errors/-/errors-2.2.8.tgz", 1729 | "integrity": "sha512-cJea03+HCnDNlcuz3+5noURGXMT9gPBYgIcXWR76mW0IJ92jfyQ04Yt6J12rO73Td4wNLi+EiRrQdfcjFsyhqw==" 1730 | }, 1731 | "array.prototype.every": { 1732 | "version": "1.1.4", 1733 | "resolved": "https://registry.npmjs.org/array.prototype.every/-/array.prototype.every-1.1.4.tgz", 1734 | "integrity": "sha512-Aui35iRZk1HHLRAyF7QP0KAnOnduaQ6fo6k1NVWfRc0xTs2AZ70ytlXvOmkC6Di4JmUs2Wv3DYzGtCQFSk5uGg==", 1735 | "dev": true, 1736 | "requires": { 1737 | "call-bind": "^1.0.2", 1738 | "define-properties": "^1.1.4", 1739 | "es-abstract": "^1.20.4", 1740 | "is-string": "^1.0.7" 1741 | } 1742 | }, 1743 | "audiobuffer-to-wav": { 1744 | "version": "1.0.0", 1745 | "resolved": "https://registry.npmjs.org/audiobuffer-to-wav/-/audiobuffer-to-wav-1.0.0.tgz", 1746 | "integrity": "sha512-CAoir4NRrAzAgYo20tEMiKZR84coE8bq/L+H2kwAaULVY4+0xySsEVtNT5raqpzmH6y0pqzY6EmoViLd9W8F/w==", 1747 | "dev": true 1748 | }, 1749 | "available-typed-arrays": { 1750 | "version": "1.0.5", 1751 | "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", 1752 | "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", 1753 | "dev": true 1754 | }, 1755 | "balanced-match": { 1756 | "version": "1.0.2", 1757 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 1758 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 1759 | "dev": true 1760 | }, 1761 | "brace-expansion": { 1762 | "version": "1.1.11", 1763 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 1764 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 1765 | "dev": true, 1766 | "requires": { 1767 | "balanced-match": "^1.0.0", 1768 | "concat-map": "0.0.1" 1769 | } 1770 | }, 1771 | "call-bind": { 1772 | "version": "1.0.2", 1773 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 1774 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 1775 | "dev": true, 1776 | "requires": { 1777 | "function-bind": "^1.1.1", 1778 | "get-intrinsic": "^1.0.2" 1779 | } 1780 | }, 1781 | "concat-map": { 1782 | "version": "0.0.1", 1783 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 1784 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 1785 | "dev": true 1786 | }, 1787 | "deep-equal": { 1788 | "version": "2.2.0", 1789 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.0.tgz", 1790 | "integrity": "sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==", 1791 | "dev": true, 1792 | "requires": { 1793 | "call-bind": "^1.0.2", 1794 | "es-get-iterator": "^1.1.2", 1795 | "get-intrinsic": "^1.1.3", 1796 | "is-arguments": "^1.1.1", 1797 | "is-array-buffer": "^3.0.1", 1798 | "is-date-object": "^1.0.5", 1799 | "is-regex": "^1.1.4", 1800 | "is-shared-array-buffer": "^1.0.2", 1801 | "isarray": "^2.0.5", 1802 | "object-is": "^1.1.5", 1803 | "object-keys": "^1.1.1", 1804 | "object.assign": "^4.1.4", 1805 | "regexp.prototype.flags": "^1.4.3", 1806 | "side-channel": "^1.0.4", 1807 | "which-boxed-primitive": "^1.0.2", 1808 | "which-collection": "^1.0.1", 1809 | "which-typed-array": "^1.1.9" 1810 | } 1811 | }, 1812 | "define-properties": { 1813 | "version": "1.1.4", 1814 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", 1815 | "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", 1816 | "dev": true, 1817 | "requires": { 1818 | "has-property-descriptors": "^1.0.0", 1819 | "object-keys": "^1.1.1" 1820 | } 1821 | }, 1822 | "defined": { 1823 | "version": "1.0.1", 1824 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", 1825 | "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", 1826 | "dev": true 1827 | }, 1828 | "dotignore": { 1829 | "version": "0.1.2", 1830 | "resolved": "https://registry.npmjs.org/dotignore/-/dotignore-0.1.2.tgz", 1831 | "integrity": "sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==", 1832 | "dev": true, 1833 | "requires": { 1834 | "minimatch": "^3.0.4" 1835 | } 1836 | }, 1837 | "es-abstract": { 1838 | "version": "1.21.1", 1839 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz", 1840 | "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==", 1841 | "dev": true, 1842 | "requires": { 1843 | "available-typed-arrays": "^1.0.5", 1844 | "call-bind": "^1.0.2", 1845 | "es-set-tostringtag": "^2.0.1", 1846 | "es-to-primitive": "^1.2.1", 1847 | "function-bind": "^1.1.1", 1848 | "function.prototype.name": "^1.1.5", 1849 | "get-intrinsic": "^1.1.3", 1850 | "get-symbol-description": "^1.0.0", 1851 | "globalthis": "^1.0.3", 1852 | "gopd": "^1.0.1", 1853 | "has": "^1.0.3", 1854 | "has-property-descriptors": "^1.0.0", 1855 | "has-proto": "^1.0.1", 1856 | "has-symbols": "^1.0.3", 1857 | "internal-slot": "^1.0.4", 1858 | "is-array-buffer": "^3.0.1", 1859 | "is-callable": "^1.2.7", 1860 | "is-negative-zero": "^2.0.2", 1861 | "is-regex": "^1.1.4", 1862 | "is-shared-array-buffer": "^1.0.2", 1863 | "is-string": "^1.0.7", 1864 | "is-typed-array": "^1.1.10", 1865 | "is-weakref": "^1.0.2", 1866 | "object-inspect": "^1.12.2", 1867 | "object-keys": "^1.1.1", 1868 | "object.assign": "^4.1.4", 1869 | "regexp.prototype.flags": "^1.4.3", 1870 | "safe-regex-test": "^1.0.0", 1871 | "string.prototype.trimend": "^1.0.6", 1872 | "string.prototype.trimstart": "^1.0.6", 1873 | "typed-array-length": "^1.0.4", 1874 | "unbox-primitive": "^1.0.2", 1875 | "which-typed-array": "^1.1.9" 1876 | } 1877 | }, 1878 | "es-get-iterator": { 1879 | "version": "1.1.3", 1880 | "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", 1881 | "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", 1882 | "dev": true, 1883 | "requires": { 1884 | "call-bind": "^1.0.2", 1885 | "get-intrinsic": "^1.1.3", 1886 | "has-symbols": "^1.0.3", 1887 | "is-arguments": "^1.1.1", 1888 | "is-map": "^2.0.2", 1889 | "is-set": "^2.0.2", 1890 | "is-string": "^1.0.7", 1891 | "isarray": "^2.0.5", 1892 | "stop-iteration-iterator": "^1.0.0" 1893 | } 1894 | }, 1895 | "es-set-tostringtag": { 1896 | "version": "2.0.1", 1897 | "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", 1898 | "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", 1899 | "dev": true, 1900 | "requires": { 1901 | "get-intrinsic": "^1.1.3", 1902 | "has": "^1.0.3", 1903 | "has-tostringtag": "^1.0.0" 1904 | } 1905 | }, 1906 | "es-to-primitive": { 1907 | "version": "1.2.1", 1908 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 1909 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 1910 | "dev": true, 1911 | "requires": { 1912 | "is-callable": "^1.1.4", 1913 | "is-date-object": "^1.0.1", 1914 | "is-symbol": "^1.0.2" 1915 | } 1916 | }, 1917 | "esbuild": { 1918 | "version": "0.17.6", 1919 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.6.tgz", 1920 | "integrity": "sha512-TKFRp9TxrJDdRWfSsSERKEovm6v30iHnrjlcGhLBOtReE28Yp1VSBRfO3GTaOFMoxsNerx4TjrhzSuma9ha83Q==", 1921 | "dev": true, 1922 | "requires": { 1923 | "@esbuild/android-arm": "0.17.6", 1924 | "@esbuild/android-arm64": "0.17.6", 1925 | "@esbuild/android-x64": "0.17.6", 1926 | "@esbuild/darwin-arm64": "0.17.6", 1927 | "@esbuild/darwin-x64": "0.17.6", 1928 | "@esbuild/freebsd-arm64": "0.17.6", 1929 | "@esbuild/freebsd-x64": "0.17.6", 1930 | "@esbuild/linux-arm": "0.17.6", 1931 | "@esbuild/linux-arm64": "0.17.6", 1932 | "@esbuild/linux-ia32": "0.17.6", 1933 | "@esbuild/linux-loong64": "0.17.6", 1934 | "@esbuild/linux-mips64el": "0.17.6", 1935 | "@esbuild/linux-ppc64": "0.17.6", 1936 | "@esbuild/linux-riscv64": "0.17.6", 1937 | "@esbuild/linux-s390x": "0.17.6", 1938 | "@esbuild/linux-x64": "0.17.6", 1939 | "@esbuild/netbsd-x64": "0.17.6", 1940 | "@esbuild/openbsd-x64": "0.17.6", 1941 | "@esbuild/sunos-x64": "0.17.6", 1942 | "@esbuild/win32-arm64": "0.17.6", 1943 | "@esbuild/win32-ia32": "0.17.6", 1944 | "@esbuild/win32-x64": "0.17.6" 1945 | } 1946 | }, 1947 | "for-each": { 1948 | "version": "0.3.3", 1949 | "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", 1950 | "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", 1951 | "dev": true, 1952 | "requires": { 1953 | "is-callable": "^1.1.3" 1954 | } 1955 | }, 1956 | "fs.realpath": { 1957 | "version": "1.0.0", 1958 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1959 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 1960 | "dev": true 1961 | }, 1962 | "function-bind": { 1963 | "version": "1.1.1", 1964 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1965 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 1966 | "dev": true 1967 | }, 1968 | "function.prototype.name": { 1969 | "version": "1.1.5", 1970 | "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", 1971 | "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", 1972 | "dev": true, 1973 | "requires": { 1974 | "call-bind": "^1.0.2", 1975 | "define-properties": "^1.1.3", 1976 | "es-abstract": "^1.19.0", 1977 | "functions-have-names": "^1.2.2" 1978 | } 1979 | }, 1980 | "functions-have-names": { 1981 | "version": "1.2.3", 1982 | "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", 1983 | "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", 1984 | "dev": true 1985 | }, 1986 | "get-intrinsic": { 1987 | "version": "1.2.0", 1988 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", 1989 | "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", 1990 | "dev": true, 1991 | "requires": { 1992 | "function-bind": "^1.1.1", 1993 | "has": "^1.0.3", 1994 | "has-symbols": "^1.0.3" 1995 | } 1996 | }, 1997 | "get-package-type": { 1998 | "version": "0.1.0", 1999 | "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", 2000 | "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", 2001 | "dev": true 2002 | }, 2003 | "get-symbol-description": { 2004 | "version": "1.0.0", 2005 | "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", 2006 | "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", 2007 | "dev": true, 2008 | "requires": { 2009 | "call-bind": "^1.0.2", 2010 | "get-intrinsic": "^1.1.1" 2011 | } 2012 | }, 2013 | "glob": { 2014 | "version": "7.2.3", 2015 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 2016 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 2017 | "dev": true, 2018 | "requires": { 2019 | "fs.realpath": "^1.0.0", 2020 | "inflight": "^1.0.4", 2021 | "inherits": "2", 2022 | "minimatch": "^3.1.1", 2023 | "once": "^1.3.0", 2024 | "path-is-absolute": "^1.0.0" 2025 | } 2026 | }, 2027 | "globalthis": { 2028 | "version": "1.0.3", 2029 | "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", 2030 | "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", 2031 | "dev": true, 2032 | "requires": { 2033 | "define-properties": "^1.1.3" 2034 | } 2035 | }, 2036 | "gopd": { 2037 | "version": "1.0.1", 2038 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", 2039 | "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", 2040 | "dev": true, 2041 | "requires": { 2042 | "get-intrinsic": "^1.1.3" 2043 | } 2044 | }, 2045 | "has": { 2046 | "version": "1.0.3", 2047 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 2048 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 2049 | "dev": true, 2050 | "requires": { 2051 | "function-bind": "^1.1.1" 2052 | } 2053 | }, 2054 | "has-bigints": { 2055 | "version": "1.0.2", 2056 | "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", 2057 | "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", 2058 | "dev": true 2059 | }, 2060 | "has-dynamic-import": { 2061 | "version": "2.0.1", 2062 | "resolved": "https://registry.npmjs.org/has-dynamic-import/-/has-dynamic-import-2.0.1.tgz", 2063 | "integrity": "sha512-X3fbtsZmwb6W7fJGR9o7x65fZoodygCrZ3TVycvghP62yYQfS0t4RS0Qcz+j5tQYUKeSWS09tHkWW6WhFV3XhQ==", 2064 | "dev": true, 2065 | "requires": { 2066 | "call-bind": "^1.0.2", 2067 | "get-intrinsic": "^1.1.1" 2068 | } 2069 | }, 2070 | "has-property-descriptors": { 2071 | "version": "1.0.0", 2072 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", 2073 | "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", 2074 | "dev": true, 2075 | "requires": { 2076 | "get-intrinsic": "^1.1.1" 2077 | } 2078 | }, 2079 | "has-proto": { 2080 | "version": "1.0.1", 2081 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", 2082 | "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", 2083 | "dev": true 2084 | }, 2085 | "has-symbols": { 2086 | "version": "1.0.3", 2087 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 2088 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 2089 | "dev": true 2090 | }, 2091 | "has-tostringtag": { 2092 | "version": "1.0.0", 2093 | "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", 2094 | "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", 2095 | "dev": true, 2096 | "requires": { 2097 | "has-symbols": "^1.0.2" 2098 | } 2099 | }, 2100 | "inflight": { 2101 | "version": "1.0.6", 2102 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 2103 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 2104 | "dev": true, 2105 | "requires": { 2106 | "once": "^1.3.0", 2107 | "wrappy": "1" 2108 | } 2109 | }, 2110 | "inherits": { 2111 | "version": "2.0.4", 2112 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 2113 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 2114 | "dev": true 2115 | }, 2116 | "internal-slot": { 2117 | "version": "1.0.4", 2118 | "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.4.tgz", 2119 | "integrity": "sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==", 2120 | "dev": true, 2121 | "requires": { 2122 | "get-intrinsic": "^1.1.3", 2123 | "has": "^1.0.3", 2124 | "side-channel": "^1.0.4" 2125 | } 2126 | }, 2127 | "is-arguments": { 2128 | "version": "1.1.1", 2129 | "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", 2130 | "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", 2131 | "dev": true, 2132 | "requires": { 2133 | "call-bind": "^1.0.2", 2134 | "has-tostringtag": "^1.0.0" 2135 | } 2136 | }, 2137 | "is-array-buffer": { 2138 | "version": "3.0.1", 2139 | "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz", 2140 | "integrity": "sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==", 2141 | "dev": true, 2142 | "requires": { 2143 | "call-bind": "^1.0.2", 2144 | "get-intrinsic": "^1.1.3", 2145 | "is-typed-array": "^1.1.10" 2146 | } 2147 | }, 2148 | "is-bigint": { 2149 | "version": "1.0.4", 2150 | "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", 2151 | "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", 2152 | "dev": true, 2153 | "requires": { 2154 | "has-bigints": "^1.0.1" 2155 | } 2156 | }, 2157 | "is-boolean-object": { 2158 | "version": "1.1.2", 2159 | "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", 2160 | "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", 2161 | "dev": true, 2162 | "requires": { 2163 | "call-bind": "^1.0.2", 2164 | "has-tostringtag": "^1.0.0" 2165 | } 2166 | }, 2167 | "is-callable": { 2168 | "version": "1.2.7", 2169 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", 2170 | "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", 2171 | "dev": true 2172 | }, 2173 | "is-core-module": { 2174 | "version": "2.11.0", 2175 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", 2176 | "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", 2177 | "dev": true, 2178 | "requires": { 2179 | "has": "^1.0.3" 2180 | } 2181 | }, 2182 | "is-date-object": { 2183 | "version": "1.0.5", 2184 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", 2185 | "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", 2186 | "dev": true, 2187 | "requires": { 2188 | "has-tostringtag": "^1.0.0" 2189 | } 2190 | }, 2191 | "is-map": { 2192 | "version": "2.0.2", 2193 | "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", 2194 | "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", 2195 | "dev": true 2196 | }, 2197 | "is-negative-zero": { 2198 | "version": "2.0.2", 2199 | "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", 2200 | "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", 2201 | "dev": true 2202 | }, 2203 | "is-number-object": { 2204 | "version": "1.0.7", 2205 | "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", 2206 | "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", 2207 | "dev": true, 2208 | "requires": { 2209 | "has-tostringtag": "^1.0.0" 2210 | } 2211 | }, 2212 | "is-regex": { 2213 | "version": "1.1.4", 2214 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", 2215 | "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", 2216 | "dev": true, 2217 | "requires": { 2218 | "call-bind": "^1.0.2", 2219 | "has-tostringtag": "^1.0.0" 2220 | } 2221 | }, 2222 | "is-set": { 2223 | "version": "2.0.2", 2224 | "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", 2225 | "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", 2226 | "dev": true 2227 | }, 2228 | "is-shared-array-buffer": { 2229 | "version": "1.0.2", 2230 | "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", 2231 | "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", 2232 | "dev": true, 2233 | "requires": { 2234 | "call-bind": "^1.0.2" 2235 | } 2236 | }, 2237 | "is-string": { 2238 | "version": "1.0.7", 2239 | "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", 2240 | "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", 2241 | "dev": true, 2242 | "requires": { 2243 | "has-tostringtag": "^1.0.0" 2244 | } 2245 | }, 2246 | "is-symbol": { 2247 | "version": "1.0.4", 2248 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", 2249 | "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", 2250 | "dev": true, 2251 | "requires": { 2252 | "has-symbols": "^1.0.2" 2253 | } 2254 | }, 2255 | "is-typed-array": { 2256 | "version": "1.1.10", 2257 | "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", 2258 | "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", 2259 | "dev": true, 2260 | "requires": { 2261 | "available-typed-arrays": "^1.0.5", 2262 | "call-bind": "^1.0.2", 2263 | "for-each": "^0.3.3", 2264 | "gopd": "^1.0.1", 2265 | "has-tostringtag": "^1.0.0" 2266 | } 2267 | }, 2268 | "is-weakmap": { 2269 | "version": "2.0.1", 2270 | "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", 2271 | "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", 2272 | "dev": true 2273 | }, 2274 | "is-weakref": { 2275 | "version": "1.0.2", 2276 | "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", 2277 | "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", 2278 | "dev": true, 2279 | "requires": { 2280 | "call-bind": "^1.0.2" 2281 | } 2282 | }, 2283 | "is-weakset": { 2284 | "version": "2.0.2", 2285 | "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", 2286 | "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", 2287 | "dev": true, 2288 | "requires": { 2289 | "call-bind": "^1.0.2", 2290 | "get-intrinsic": "^1.1.1" 2291 | } 2292 | }, 2293 | "isarray": { 2294 | "version": "2.0.5", 2295 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", 2296 | "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", 2297 | "dev": true 2298 | }, 2299 | "minimatch": { 2300 | "version": "3.1.2", 2301 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 2302 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 2303 | "dev": true, 2304 | "requires": { 2305 | "brace-expansion": "^1.1.7" 2306 | } 2307 | }, 2308 | "minimist": { 2309 | "version": "1.2.7", 2310 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", 2311 | "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", 2312 | "dev": true 2313 | }, 2314 | "object-inspect": { 2315 | "version": "1.12.3", 2316 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", 2317 | "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", 2318 | "dev": true 2319 | }, 2320 | "object-is": { 2321 | "version": "1.1.5", 2322 | "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", 2323 | "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", 2324 | "dev": true, 2325 | "requires": { 2326 | "call-bind": "^1.0.2", 2327 | "define-properties": "^1.1.3" 2328 | } 2329 | }, 2330 | "object-keys": { 2331 | "version": "1.1.1", 2332 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 2333 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 2334 | "dev": true 2335 | }, 2336 | "object.assign": { 2337 | "version": "4.1.4", 2338 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", 2339 | "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", 2340 | "dev": true, 2341 | "requires": { 2342 | "call-bind": "^1.0.2", 2343 | "define-properties": "^1.1.4", 2344 | "has-symbols": "^1.0.3", 2345 | "object-keys": "^1.1.1" 2346 | } 2347 | }, 2348 | "once": { 2349 | "version": "1.4.0", 2350 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 2351 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 2352 | "dev": true, 2353 | "requires": { 2354 | "wrappy": "1" 2355 | } 2356 | }, 2357 | "path-is-absolute": { 2358 | "version": "1.0.1", 2359 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 2360 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 2361 | "dev": true 2362 | }, 2363 | "path-parse": { 2364 | "version": "1.0.7", 2365 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 2366 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 2367 | "dev": true 2368 | }, 2369 | "regexp.prototype.flags": { 2370 | "version": "1.4.3", 2371 | "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", 2372 | "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", 2373 | "dev": true, 2374 | "requires": { 2375 | "call-bind": "^1.0.2", 2376 | "define-properties": "^1.1.3", 2377 | "functions-have-names": "^1.2.2" 2378 | } 2379 | }, 2380 | "resolve": { 2381 | "version": "2.0.0-next.4", 2382 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", 2383 | "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", 2384 | "dev": true, 2385 | "requires": { 2386 | "is-core-module": "^2.9.0", 2387 | "path-parse": "^1.0.7", 2388 | "supports-preserve-symlinks-flag": "^1.0.0" 2389 | } 2390 | }, 2391 | "resumer": { 2392 | "version": "0.0.0", 2393 | "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", 2394 | "integrity": "sha512-Fn9X8rX8yYF4m81rZCK/5VmrmsSbqS/i3rDLl6ZZHAXgC2nTAx3dhwG8q8odP/RmdLa2YrybDJaAMg+X1ajY3w==", 2395 | "dev": true, 2396 | "requires": { 2397 | "through": "~2.3.4" 2398 | } 2399 | }, 2400 | "safe-regex-test": { 2401 | "version": "1.0.0", 2402 | "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", 2403 | "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", 2404 | "dev": true, 2405 | "requires": { 2406 | "call-bind": "^1.0.2", 2407 | "get-intrinsic": "^1.1.3", 2408 | "is-regex": "^1.1.4" 2409 | } 2410 | }, 2411 | "side-channel": { 2412 | "version": "1.0.4", 2413 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 2414 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 2415 | "dev": true, 2416 | "requires": { 2417 | "call-bind": "^1.0.0", 2418 | "get-intrinsic": "^1.0.2", 2419 | "object-inspect": "^1.9.0" 2420 | } 2421 | }, 2422 | "stop-iteration-iterator": { 2423 | "version": "1.0.0", 2424 | "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", 2425 | "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", 2426 | "dev": true, 2427 | "requires": { 2428 | "internal-slot": "^1.0.4" 2429 | } 2430 | }, 2431 | "string.prototype.trim": { 2432 | "version": "1.2.7", 2433 | "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", 2434 | "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", 2435 | "dev": true, 2436 | "requires": { 2437 | "call-bind": "^1.0.2", 2438 | "define-properties": "^1.1.4", 2439 | "es-abstract": "^1.20.4" 2440 | } 2441 | }, 2442 | "string.prototype.trimend": { 2443 | "version": "1.0.6", 2444 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", 2445 | "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", 2446 | "dev": true, 2447 | "requires": { 2448 | "call-bind": "^1.0.2", 2449 | "define-properties": "^1.1.4", 2450 | "es-abstract": "^1.20.4" 2451 | } 2452 | }, 2453 | "string.prototype.trimstart": { 2454 | "version": "1.0.6", 2455 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", 2456 | "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", 2457 | "dev": true, 2458 | "requires": { 2459 | "call-bind": "^1.0.2", 2460 | "define-properties": "^1.1.4", 2461 | "es-abstract": "^1.20.4" 2462 | } 2463 | }, 2464 | "supports-preserve-symlinks-flag": { 2465 | "version": "1.0.0", 2466 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 2467 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 2468 | "dev": true 2469 | }, 2470 | "tape": { 2471 | "version": "5.6.3", 2472 | "resolved": "https://registry.npmjs.org/tape/-/tape-5.6.3.tgz", 2473 | "integrity": "sha512-cUDDGSbyoSIpdUAqbqLI/r7i/S4BHuCB9M5j7E/LrLs/x/i4zeAJ798aqo+FGo+kr9seBZwr8AkZW6rjceyAMQ==", 2474 | "dev": true, 2475 | "requires": { 2476 | "array.prototype.every": "^1.1.4", 2477 | "call-bind": "^1.0.2", 2478 | "deep-equal": "^2.2.0", 2479 | "defined": "^1.0.1", 2480 | "dotignore": "^0.1.2", 2481 | "for-each": "^0.3.3", 2482 | "get-package-type": "^0.1.0", 2483 | "glob": "^7.2.3", 2484 | "has": "^1.0.3", 2485 | "has-dynamic-import": "^2.0.1", 2486 | "inherits": "^2.0.4", 2487 | "is-regex": "^1.1.4", 2488 | "minimist": "^1.2.7", 2489 | "object-inspect": "^1.12.3", 2490 | "object-is": "^1.1.5", 2491 | "object-keys": "^1.1.1", 2492 | "object.assign": "^4.1.4", 2493 | "resolve": "^2.0.0-next.4", 2494 | "resumer": "^0.0.0", 2495 | "string.prototype.trim": "^1.2.7", 2496 | "through": "^2.3.8" 2497 | } 2498 | }, 2499 | "through": { 2500 | "version": "2.3.8", 2501 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 2502 | "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", 2503 | "dev": true 2504 | }, 2505 | "typed-array-length": { 2506 | "version": "1.0.4", 2507 | "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", 2508 | "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", 2509 | "dev": true, 2510 | "requires": { 2511 | "call-bind": "^1.0.2", 2512 | "for-each": "^0.3.3", 2513 | "is-typed-array": "^1.1.9" 2514 | } 2515 | }, 2516 | "unbox-primitive": { 2517 | "version": "1.0.2", 2518 | "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", 2519 | "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", 2520 | "dev": true, 2521 | "requires": { 2522 | "call-bind": "^1.0.2", 2523 | "has-bigints": "^1.0.2", 2524 | "has-symbols": "^1.0.3", 2525 | "which-boxed-primitive": "^1.0.2" 2526 | } 2527 | }, 2528 | "wav-decoder": { 2529 | "version": "1.3.0", 2530 | "resolved": "https://registry.npmjs.org/wav-decoder/-/wav-decoder-1.3.0.tgz", 2531 | "integrity": "sha512-4U6O/JNb1dPO90CO2YMTQ5N2plJcntm39vNMvRq9VZ4Vy5FzS7Lnx95N2QcYUyKYcZfCbhI//W3dSHA8YnOQyQ==", 2532 | "dev": true 2533 | }, 2534 | "which-boxed-primitive": { 2535 | "version": "1.0.2", 2536 | "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", 2537 | "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", 2538 | "dev": true, 2539 | "requires": { 2540 | "is-bigint": "^1.0.1", 2541 | "is-boolean-object": "^1.1.0", 2542 | "is-number-object": "^1.0.4", 2543 | "is-string": "^1.0.5", 2544 | "is-symbol": "^1.0.3" 2545 | } 2546 | }, 2547 | "which-collection": { 2548 | "version": "1.0.1", 2549 | "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", 2550 | "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", 2551 | "dev": true, 2552 | "requires": { 2553 | "is-map": "^2.0.1", 2554 | "is-set": "^2.0.1", 2555 | "is-weakmap": "^2.0.1", 2556 | "is-weakset": "^2.0.1" 2557 | } 2558 | }, 2559 | "which-typed-array": { 2560 | "version": "1.1.9", 2561 | "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", 2562 | "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", 2563 | "dev": true, 2564 | "requires": { 2565 | "available-typed-arrays": "^1.0.5", 2566 | "call-bind": "^1.0.2", 2567 | "for-each": "^0.3.3", 2568 | "gopd": "^1.0.1", 2569 | "has-tostringtag": "^1.0.0", 2570 | "is-typed-array": "^1.1.10" 2571 | } 2572 | }, 2573 | "wrappy": { 2574 | "version": "1.0.2", 2575 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2576 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 2577 | "dev": true 2578 | } 2579 | } 2580 | } 2581 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "qoa-format", 3 | "version": "1.0.1", 4 | "description": "", 5 | "main": "index.js", 6 | "type": "module", 7 | "license": "MIT", 8 | "author": { 9 | "name": "Matt DesLauriers", 10 | "email": "dave.des@gmail.com", 11 | "url": "https://github.com/mattdesl" 12 | }, 13 | "dependencies": { 14 | "@thi.ng/bitstream": "^2.2.12" 15 | }, 16 | "scripts": { 17 | "test": "node test/test.js", 18 | "test:browser": "esbuild test/webaudio.js --outdir=test --bundle --servedir=test" 19 | }, 20 | "keywords": [], 21 | "repository": { 22 | "type": "git", 23 | "url": "git://github.com/mattdesl/qoa-format.git" 24 | }, 25 | "homepage": "https://github.com/mattdesl/qoa-format", 26 | "bugs": { 27 | "url": "https://github.com/mattdesl/qoa-format/issues" 28 | }, 29 | "devDependencies": { 30 | "audiobuffer-to-wav": "^1.0.0", 31 | "esbuild": "^0.17.6", 32 | "minimist": "^1.2.7", 33 | "tape": "^5.6.3", 34 | "wav-decoder": "^1.3.0" 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /test/cli.js: -------------------------------------------------------------------------------- 1 | import fs from "fs/promises"; 2 | import path from "path"; 3 | import minimist from "minimist"; 4 | import { decode as decodeWAV } from "wav-decoder"; 5 | import { decode, encode } from "../index.js"; 6 | import encodeWAV from "audiobuffer-to-wav"; 7 | 8 | const argv = minimist(process.argv.slice(2)); 9 | 10 | if (argv._.length !== 2) 11 | throw new Error( 12 | "invalid arguments, usage:\n node cli.js input.{qoa,wav} output.{qoa,wav}" 13 | ); 14 | 15 | const input = argv._[0]; 16 | const output = argv._[1]; 17 | run(input, output); 18 | 19 | async function run(input, output) { 20 | const inFormat = path.extname(input).toLowerCase(); 21 | const outFormat = path.extname(output).toLowerCase(); 22 | 23 | const formats = [".qoa", ".wav"]; 24 | 25 | if (inFormat === outFormat) 26 | throw new Error(`in and out formats are the same`); 27 | if (!formats.includes(inFormat) || !formats.includes(outFormat)) 28 | throw new Error("formats must be .wav or .qoa"); 29 | 30 | const inbuf = await fs.readFile(input); 31 | let outbuf, audio; 32 | 33 | if (inFormat == ".qoa") { 34 | // decode QOA and encode WAV 35 | audio = decode(inbuf); 36 | 37 | // mimic webaudio buffer 38 | const audioBuffer = { 39 | numberOfChannels: audio.channelData.length, 40 | sampleRate: audio.sampleRate, 41 | getChannelData(index) { 42 | return audio.channelData[index]; 43 | }, 44 | }; 45 | 46 | const arrayBuf = encodeWAV(audioBuffer); 47 | outbuf = new Uint8Array(arrayBuf); 48 | } else { 49 | // decode WAV and encode QOA 50 | audio = await decodeWAV(inbuf); 51 | outbuf = encode(audio); 52 | } 53 | 54 | const { channelData, sampleRate } = audio; 55 | const samples = channelData.length ? channelData[0].length : 0; 56 | const channels = channelData.length; 57 | console.log("Channels:", channels); 58 | console.log("Sample Rate:", sampleRate, "Hz"); 59 | console.log("Samples:", samples); 60 | console.log("Duration:", (samples / sampleRate).toFixed(2), "sec"); 61 | 62 | if (outbuf) { 63 | console.log("Writing:", output); 64 | await fs.writeFile(output, outbuf); 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /test/convert.js: -------------------------------------------------------------------------------- 1 | import tape from "tape"; 2 | import fs from "fs/promises"; 3 | import * as url from "url"; 4 | import path from "path"; 5 | 6 | import * as common from "../lib/common.js"; 7 | import { encode, decode } from "../index.js"; 8 | import { decode as decodeWAV } from "wav-decoder"; 9 | import { readdirSync } from "fs"; 10 | import toWav from "audiobuffer-to-wav"; 11 | 12 | const __dirname = url.fileURLToPath(new URL(".", import.meta.url)); 13 | 14 | const inDir = path.resolve(__dirname, "fixtures"); 15 | const files = readdirSync(inDir).filter( 16 | (f) => /\.wav$/i.test(f) && !/\.qoa\.wav/i.test(f) 17 | ); 18 | 19 | for (let file of files) { 20 | console.log("Encoding", file); 21 | 22 | const input = await fs.readFile(path.resolve(inDir, file)); 23 | const { channelData, sampleRate } = await decodeWAV(input); 24 | 25 | const encoded = encode({ channelData, sampleRate }); 26 | 27 | const qoaFile = path.basename(file, path.extname(file)) + ".qoa"; 28 | const outputQOA = path.resolve(inDir, qoaFile); 29 | await fs.writeFile(outputQOA, Buffer.from(encoded)); 30 | 31 | console.log("Decoding", qoaFile); 32 | const audio = decode(encoded); 33 | 34 | const audioBuffer = { 35 | numberOfChannels: audio.channels, 36 | sampleRate: audio.sampleRate, 37 | getChannelData(index) { 38 | return audio.channelData[index]; 39 | }, 40 | }; 41 | const reEncoded = toWav(audioBuffer); 42 | console.log("Writing WAV encoding after conversion"); 43 | const outFile = path.resolve(inDir, qoaFile + ".wav"); 44 | await fs.writeFile(outFile, Buffer.from(reEncoded)); 45 | } 46 | -------------------------------------------------------------------------------- /test/fixtures/Indoor_switch_small_on_01.qoa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mattdesl/qoa-format/66273accf656a9ad103bc1c64a75d0d3a33ba5b7/test/fixtures/Indoor_switch_small_on_01.qoa -------------------------------------------------------------------------------- /test/fixtures/Indoor_switch_small_on_01.qoa.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mattdesl/qoa-format/66273accf656a9ad103bc1c64a75d0d3a33ba5b7/test/fixtures/Indoor_switch_small_on_01.qoa.wav -------------------------------------------------------------------------------- /test/fixtures/Indoor_switch_small_on_01.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mattdesl/qoa-format/66273accf656a9ad103bc1c64a75d0d3a33ba5b7/test/fixtures/Indoor_switch_small_on_01.wav -------------------------------------------------------------------------------- /test/fixtures/sting_banjo_humorous_02.qoa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mattdesl/qoa-format/66273accf656a9ad103bc1c64a75d0d3a33ba5b7/test/fixtures/sting_banjo_humorous_02.qoa -------------------------------------------------------------------------------- /test/fixtures/sting_banjo_humorous_02.qoa.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mattdesl/qoa-format/66273accf656a9ad103bc1c64a75d0d3a33ba5b7/test/fixtures/sting_banjo_humorous_02.qoa.wav -------------------------------------------------------------------------------- /test/fixtures/sting_banjo_humorous_02.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mattdesl/qoa-format/66273accf656a9ad103bc1c64a75d0d3a33ba5b7/test/fixtures/sting_banjo_humorous_02.wav -------------------------------------------------------------------------------- /test/sine.js: -------------------------------------------------------------------------------- 1 | import fs from "fs/promises"; 2 | import path from "path"; 3 | import { decode, encode } from "../index.js"; 4 | import { decode as decodeWAV } from "wav-decoder"; 5 | import encodeWAVBuffer from "audiobuffer-to-wav"; 6 | import * as url from "url"; 7 | 8 | const __dirname = url.fileURLToPath(new URL(".", import.meta.url)); 9 | 10 | const sampleRate = 44100; 11 | const amplitude = 0.2; 12 | const seconds = 0.5; 13 | const tone = 441; // A 14 | 15 | const samples = Math.ceil(seconds * sampleRate); 16 | const sampleData = new Float32Array(samples); 17 | for (let i = 0; i < samples; i++) { 18 | sampleData[i] = sineWaveAt(i, tone, sampleRate) * amplitude; 19 | } 20 | 21 | // audio descriptor 22 | const audio = { 23 | sampleRate, 24 | channelData: [sampleData], 25 | }; 26 | 27 | const wav = encodeWAV(audio); 28 | 29 | const qoa = encode(audio); 30 | const converted = decode(qoa); 31 | const convertedWav = encodeWAV(converted); 32 | 33 | await fs.writeFile(path.resolve(__dirname, "fixtures/sine.qoa"), qoa); 34 | await fs.writeFile(path.resolve(__dirname, "fixtures/sine.wav"), wav); 35 | await fs.writeFile( 36 | path.resolve(__dirname, "fixtures/sine-qoa.wav"), 37 | convertedWav 38 | ); 39 | 40 | function sineWaveAt(sampleIndex, tone, sampleRate) { 41 | var sampleFreq = sampleRate / tone; 42 | return Math.sin(sampleIndex / (sampleFreq / (Math.PI * 2))); 43 | } 44 | 45 | function encodeWAV(audio) { 46 | const audioBuffer = { 47 | numberOfChannels: audio.channelData.length, 48 | sampleRate: audio.sampleRate, 49 | getChannelData(index) { 50 | return audio.channelData[index]; 51 | }, 52 | }; 53 | return new Uint8Array(encodeWAVBuffer(audioBuffer)); 54 | } 55 | -------------------------------------------------------------------------------- /test/test.js: -------------------------------------------------------------------------------- 1 | import tape from "tape"; 2 | import fs from "fs/promises"; 3 | import * as url from "url"; 4 | import path from "path"; 5 | 6 | import * as common from "../lib/common.js"; 7 | import { encode, decode } from "../index.js"; 8 | import { decode as decodeWAV } from "wav-decoder"; 9 | 10 | const __dirname = url.fileURLToPath(new URL(".", import.meta.url)); 11 | 12 | tape("should decode", async (t) => { 13 | // TODO: How best to test? 14 | // const input = await fs.readFile( 15 | // path.resolve(__dirname, "fixtures/sting_banjo_humorous_02.qoa") 16 | // ); 17 | // const output = await fs.readFile( 18 | // path.resolve(__dirname, "fixtures/sting_banjo_humorous_02-qoa.wav") 19 | // ); 20 | // const input2WAV = await fs.readFile( 21 | // path.resolve(__dirname, "fixtures/sting_banjo_humorous_02.wav") 22 | // ); 23 | // const expected02QOA = input; 24 | // const audioWAVInput = await decodeWAV(input2WAV); 25 | // const sampleRate = 44100; 26 | // const audioInfo = { 27 | // samples: sampleRate, 28 | // sampleRate, 29 | // channels: 1, 30 | // channelData: [new Float32Array(sampleRate)], 31 | // }; 32 | // t.doesNotThrow(() => encode(audioWAVInput)); 33 | // const encoded = encode(audioWAVInput); 34 | // t.ok( 35 | // Buffer.from(new Uint8Array(encoded)).equals(expected02QOA), 36 | // "files match" 37 | // ); 38 | // t.doesNotThrow(() => decode(new Uint8Array(encoded))); 39 | // t.doesNotThrow(() => decode(input)); 40 | // const expected = await decodeWAV(output); 41 | // const expectedData = expected.channelData; 42 | // const decodedAudio = decode(input); 43 | // const { channelData } = decodedAudio; 44 | // const eq = (a, b) => { 45 | // return Buffer.from(a.buffer).equals(Buffer.from(b.buffer)); 46 | // }; 47 | // t.ok(eq(channelData[0], expectedData[0]), "should be equal"); 48 | // t.ok(eq(channelData[1], expectedData[1]), "should be equal"); 49 | }); 50 | 51 | tape("dequant tab", async (t) => { 52 | const qoa_dequant_tab = [ 53 | [1, -1, 3, -3, 5, -5, 7, -7], 54 | [5, -5, 18, -18, 32, -32, 49, -49], 55 | [16, -16, 53, -53, 95, -95, 147, -147], 56 | [34, -34, 113, -113, 203, -203, 315, -315], 57 | [63, -63, 210, -210, 378, -378, 588, -588], 58 | [104, -104, 345, -345, 621, -621, 966, -966], 59 | [158, -158, 528, -528, 950, -950, 1477, -1477], 60 | [228, -228, 760, -760, 1368, -1368, 2128, -2128], 61 | [316, -316, 1053, -1053, 1895, -1895, 2947, -2947], 62 | [422, -422, 1405, -1405, 2529, -2529, 3934, -3934], 63 | [548, -548, 1828, -1828, 3290, -3290, 5117, -5117], 64 | [696, -696, 2320, -2320, 4176, -4176, 6496, -6496], 65 | [868, -868, 2893, -2893, 5207, -5207, 8099, -8099], 66 | [1064, -1064, 3548, -3548, 6386, -6386, 9933, -9933], 67 | [1286, -1286, 4288, -4288, 7718, -7718, 12005, -12005], 68 | [1536, -1536, 5120, -5120, 9216, -9216, 14336, -14336], 69 | ]; 70 | t.deepEqual(common.qoa_dequant_tab, qoa_dequant_tab, "qoa_dequant_tab"); 71 | const qoa_scalefactor_tab = [ 72 | 1, 7, 21, 45, 84, 138, 211, 304, 421, 562, 731, 928, 1157, 1419, 1715, 2048, 73 | ]; 74 | t.deepEqual( 75 | common.qoa_scalefactor_tab, 76 | qoa_scalefactor_tab, 77 | "qoa_scalefactor_tab" 78 | ); 79 | 80 | const qoa_reciprocal_tab = [ 81 | 65536, 9363, 3121, 1457, 781, 475, 311, 216, 156, 117, 90, 71, 57, 47, 39, 82 | 32, 83 | ]; 84 | // reciprocal_tab[s] <- ((1<<16) + scalefactor_tab[s] - 1) / scalefactor_tab[s] 85 | const qoa_reciprocal_tab_computed = common.qoa_scalefactor_tab.map((s) => 86 | Math.floor(((1 << 16) + s - 1) / s) 87 | ); 88 | t.deepEqual( 89 | qoa_reciprocal_tab_computed, 90 | qoa_reciprocal_tab, 91 | "qoa_reciprocal_tab" 92 | ); 93 | }); 94 | -------------------------------------------------------------------------------- /test/webaudio.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 | 6 | 7 |