diff --git a/.github/workflows/browser.yml b/.github/workflows/browser.yml new file mode 100644 index 00000000..faa763dd --- /dev/null +++ b/.github/workflows/browser.yml @@ -0,0 +1,19 @@ +name: test-browser + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - run: npm ci + - run: npm run test:browser + env: + CI: true diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml new file mode 100644 index 00000000..5c87fca6 --- /dev/null +++ b/.github/workflows/codeql.yml @@ -0,0 +1,41 @@ +name: "CodeQL" + +on: + push: + branches: [ "master" ] + pull_request: + branches: [ "master" ] + schedule: + - cron: "12 2 * * 1" + +jobs: + analyze: + name: Analyze + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + security-events: write + + strategy: + fail-fast: false + matrix: + language: [ javascript ] + + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Initialize CodeQL + uses: github/codeql-action/init@v2 + with: + languages: ${{ matrix.language }} + queries: +security-and-quality + + - name: Autobuild + uses: github/codeql-action/autobuild@v2 + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v2 + with: + category: "/language:${{ matrix.language }}" diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml index 2ac2a8af..58f3e3f5 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/nodejs.yml @@ -1,7 +1,4 @@ -# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node -# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions - -name: build +name: test-nodejs on: push: @@ -16,15 +13,16 @@ jobs: strategy: matrix: - node-version: [10.x, 12.x, 14.x] + node-version: [16, 18, 20] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v1 + uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} - run: npm ci + - run: npm run format - run: npm run build --if-present - run: npm test env: diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index 8fb3cf3f..00000000 --- a/.prettierrc +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parser": "typescript", - "trailingComma": "es5", - "tabWidth": 2, - "semi": true, - "singleQuote": true -} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..3ade5535 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "typescript.tsdk": "node_modules/typescript/lib", + "editor.formatOnSave": true +} \ No newline at end of file diff --git a/LICENSE.md b/LICENSE similarity index 94% rename from LICENSE.md rename to LICENSE index 0ffdbc0d..6f69ef40 100644 --- a/LICENSE.md +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2013-2019 Keichi Takahashi +Copyright (c) 2013-2021 Keichi Takahashi Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index d4ffdf7a..1b91ebe2 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,8 @@ -# Binary-parser-encoder +# Binary-parser -Note: This is a fork of [binary-parser](https://github.com/keichi/binary-parser) -library. It is currently being proposed as a Pull-Request in that project. +[![build](https://github.com/keichi/binary-parser/workflows/build/badge.svg)](https://github.com/keichi/binary-parser/actions?query=workflow%3Abuild) +[![npm](https://img.shields.io/npm/v/binary-parser)](https://www.npmjs.com/package/binary-parser) +[![license](https://img.shields.io/github/license/keichi/binary-parser)](https://github.com/keichi/binary-parser/blob/master/LICENSE) Until the *encoding* feature is merged in baseline of original project, this branch is published under the name: **binary-parser-encoder** in [npm](https://npmjs.org/). @@ -36,23 +37,26 @@ and [binary](https://github.com/substack/node-binary). ## Quick Start -1. Create an empty Parser object with `new Parser()` or `Parser.start()`. -2. Chain methods to build your desired parser and/or encoder. (See - [API](https://github.com/keichi/binary-parser#api) for detailed document of - each method) +1. Create an empty `Parser` object with `new Parser()` or `Parser.start()`. +2. Chain methods to build your desired parser and/or encoder. (See [API](#api) for detailed + documentation of each method) 3. Call `Parser.prototype.parse` with a `Buffer`/`Uint8Array` object passed as - an argument. + its only argument. 4. The parsed result will be returned as an object. + - If parsing failed, an exception will be thrown. 5. Or call `Parser.prototype.encode` with an object passed as argument. 6. Encoded result will be returned as a `Buffer` object. ```javascript // Module import -var Parser = require("binary-parser").Parser; +const Parser = require("binary-parser").Parser; + +// Alternative way to import the module +// import { Parser } from "binary-parser"; // Build an IP packet header Parser -var ipHeader = new Parser() - .endianess("big") +const ipHeader = new Parser() + .endianness("big") .bit4("version") .bit4("headerLength") .uint8("tos") @@ -73,7 +77,7 @@ var ipHeader = new Parser() }); // Prepare buffer to parse. -var buf = Buffer.from("450002c5939900002c06ef98adc24f6c850186d1", "hex"); +const buf = Buffer.from("450002c5939900002c06ef98adc24f6c850186d1", "hex"); // Parse buffer and show result console.log(ipHeader.parse(buf)); @@ -96,6 +100,16 @@ var anIpHeader = { console.log(ipHeader.encode(anIpHeader).toString("hex")); ``` +## Installation + +You can install `binary-parser` via npm: + +```bash +npm install binary-parser +``` + +The npm package provides entry points for both CommonJS and ES modules. + ## API ### new Parser([options]) @@ -122,22 +136,22 @@ returned from the `parse` method. Parse bytes as an integer and store it in a variable named `name`. `name` should consist only of alphanumeric characters and start with an alphabet. Number of bits can be chosen from 8, 16, 32 and 64. Byte-ordering can be either -`l` for little endian or `b` for big endian. With no prefix, it parses as a -signed number, with `u` prefixed as an unsigned number. The runtime type +`le` for little endian or `be` for big endian. With no prefix, it parses as a +signed number, with `u` prefix as an unsigned number. The runtime type returned by the 8, 16, 32 bit methods is `number` while the type returned by the 64 bit is `bigint`. **Note:** [u]int64{be,le} methods only work if your runtime is node v12.0.0 or -greater. Lower version will throw a runtime error. +greater. Lower versions will throw a runtime error. ```javascript -var parser = new Parser() +const parser = new Parser() // Signed 32-bit integer (little endian) .int32le("a") // Unsigned 8-bit integer .uint8("b") // Signed 16-bit integer (big endian) - .int16be("c"); + .int16be("c") // signed 64-bit integer (big endian) .int64be("d") ``` @@ -152,7 +166,7 @@ Parse bytes as a floating-point value and stores it to a variable named `name`. ```javascript -var parser = new Parser() +const parser = new Parser() // 32-bit floating value (big endian) .floatbe("a") // 64-bit floating value (little endian) @@ -213,8 +227,8 @@ keys: Parse bytes as an array. `options` is an object which can have the following keys: -- `type` - (Required) Type of the array element. Can be a string or an user - defined Parser object. If it's a string, you have to choose from [u]int{8, +- `type` - (Required) Type of the array element. Can be a string or a user + defined `Parser` object. If it's a string, you have to choose from [u]int{8, 16, 32}{le, be}. - `length` - (either `length`, `lengthInBytes`, or `readUntil` is required) Length of the array. Can be a number, string or a function. Use number for @@ -233,7 +247,7 @@ keys: by returning true based on *item* values or other *object* properies. ```javascript -var parser = new Parser() +const parser = new Parser() // Statically sized array .array("data", { type: "int32", @@ -298,18 +312,18 @@ the chosen parser is directly embedded into the current object. `options` is an object which can have the following keys: - `tag` - (Required) The value used to determine which parser to use from the - `choices` Can be a string pointing to another field or a function. + `choices`. Can be a string pointing to another field or a function. - `choices` - (Required) An object which key is an integer and value is the parser which is executed when `tag` equals the key value. - `defaultChoice` - (Optional) In case if the tag value doesn't match any of `choices`, this parser is used. ```javascript -var parser1 = ...; -var parser2 = ...; -var parser3 = ...; +const parser1 = ...; +const parser2 = ...; +const parser3 = ...; -var parser = new Parser().uint8("tagValue").choice("data", { +const parser = new Parser().uint8("tagValue").choice("data", { tag: "tagValue", choices: { 1: parser1, // if tagValue == 1, execute parser1 @@ -335,7 +349,7 @@ Useful for parsing binary formats such as ELF where the offset of a field is pointed by another field. - `type` - (Required) Can be a string `[u]int{8, 16, 32, 64}{le, be}` - or an user defined Parser object. + or a user defined `Parser` object. - `offset` - (Required) Indicates absolute offset from the beginning of the input buffer. Can be a number, string or a function. @@ -345,18 +359,18 @@ when called after another function which would advance the internal buffer offset. ```javascript -var parser = new Parser() +const parser = new Parser() // this call advances the buffer offset by // a variable (i.e. unknown to us) number of bytes - .string('name', { + .string("name", { zeroTerminated: true }) // this variable points to an absolute position // in the buffer - .uint32('seekOffset') + .uint32("seekOffset") // now, save the "current" offset in the stream // as the variable "currentOffset" - .saveOffset('currentOffset') + .saveOffset("currentOffset") // finally, use the saved offset to figure out // how many bytes we need to skip .seek(function() { @@ -370,17 +384,17 @@ Move the buffer offset for `relOffset` bytes from the current position. Use a negative `relOffset` value to rewind the offset. This method was previously named `skip(length)`. (Note: when encoding, the skipped bytes will be filled with zeros) -### endianess(endianess) -Define what endianess to use in this parser. `endianess` can be either -`"little"` or `"big"`. The default endianess of `Parser` is set to big-endian. +### endianness(endianness) +Define what endianness to use in this parser. `endianness` can be either +`"little"` or `"big"`. The default endianness of `Parser` is set to big-endian. ```javascript -var parser = new Parser() - .endianess("little") - // You can specify endianess explicitly +const parser = new Parser() + .endianness("little") + // You can specify endianness explicitly .uint16be("a") .uint32le("a") - // Or you can omit endianess (in this case, little-endian is used) + // Or you can omit endianness (in this case, little-endian is used) .uint16("b") .int32("c"); ``` @@ -401,16 +415,16 @@ var parser = new Parser() ``` ### namely(alias) -Set an alias to this parser, so there will be an opportunity to refer to it by -name in methods like `.array`, `.nest` and `.choice`, instead of requirement -to have an instance of it. +Set an alias to this parser, so that it can be referred to by name in methods +like `.array`, `.nest` and `.choice`, without the requirement to have an +instance of this parser. Especially, the parser may reference itself: ```javascript -var stop = new Parser(); +const stop = new Parser(); -var parser = new Parser() +const parser = new Parser() .namely("self") // use 'self' to refer to the parser itself .uint8("type") .choice("data", { @@ -438,7 +452,7 @@ var parser = new Parser() // / // 0 -var buffer = Buffer.from([ +const buffer = Buffer.from([ 2, /* left -> */ 3, /* one -> */ 1, /* -> */ 0, @@ -466,16 +480,16 @@ to avoid this, ensure that every possible path has its end. Also, this recursion is not tail-optimized, so could lead to memory leaks when it goes too deep. -An example of referencing other patches: +An example of referencing other parsers: ```javascript -// the line below registers the name 'self', so we will be able to use it in +// the line below registers the name "self", so we will be able to use it in // `twoCells` as a reference -var parser = Parser.start().namely("self"); +const parser = Parser.start().namely("self"); -var stop = Parser.start().namely("stop"); +const stop = Parser.start().namely("stop"); -var twoCells = Parser.start() +const twoCells = Parser.start() .namely("twoCells") .nest("left", { type: "self" }) .nest("right", { type: "stop" }); @@ -489,13 +503,66 @@ parser.uint8("type").choice("data", { } }); -var buffer = Buffer.from([2, /* left */ 1, 1, 0, /* right */ 0]); +const buffer = Buffer.from([2, /* left */ 1, 1, 0, /* right */ 0]); parser.parse(buffer); ``` +### wrapped([name,] options) +Read data, then wrap it by transforming it by a function for further parsing. +It works similarly to a buffer where it reads a block of data. But instead of +returning the buffer it will pass the buffer on to a parser for further processing. + +The result will be stored in the key `name`. If `name` is an empty string or +`null`, or if it is omitted, the parsed result is directly embedded into the +current object. + +- `wrapper` - (Required) A function taking a buffer and returning a buffer + (`(x: Buffer | Uint8Array ) => Buffer | Uint8Array`) transforming the buffer + into a buffer expected by `type`. +- `type` - (Required) A `Parser` object to parse the buffer returned by `wrapper`. +- `length ` - (either `length` or `readUntil` is required) Length of the + buffer. Can be a number, string or a function. Use a number for statically + sized buffers, a string to reference another variable and a function to do some + calculation. +- `readUntil` - (either `length` or `readUntil` is required) If `"eof"`, then + this parser will read till it reaches the end of the `Buffer`/`Uint8Array` + object. If it is a function, this parser will read the buffer until the + function returns `true`. + +```javascript +const zlib = require("zlib"); +// A parser to run on the data returned by the wrapper +const textParser = Parser.start() + .string("text", { + zeroTerminated: true, + }); + +const mainParser = Parser.start() + // Read length of the data to wrap + .uint32le("length") + // Read wrapped data + .wrapped("wrappedData", { + // Indicate how much data to read, like buffer() + length: "length", + // Define function to pre-process the data buffer + wrapper: function (buffer) { + // E.g. decompress data and return it for further parsing + return zlib.inflateRawSync(buffer); + }, + // The parser to run on the decompressed data + type: textParser, + }); + +mainParser.parse(buffer); +``` + +### sizeOf() +Returns how many bytes this parser consumes. If the size of the parser cannot +be statically determined, a `NaN` is returned. + ### compile() and compileEncode() -Compile this parser/encoder on-the-fly and cache its result. Usually, there is no need +Compile this parser on-the-fly and cache its result. Usually, there is no need to call this method directly, since it's called when `parse(buffer)` or `encode(obj)` is executed for the first time. @@ -510,7 +577,7 @@ These options can be used in all parsers. form. *formatter*(value, obj, buffer, offset) → *new value* \ where `value` is the value to be formatted, `obj` is the current object being generated, `buffer` is the buffer currently beeing parsed and `offset` is the current offset in that buffer. ```javascript - var parser = new Parser().array("ipv4", { + const parser = new Parser().array("ipv4", { type: uint8, length: "4", formatter: function(arr, obj, buffer, offset) { @@ -524,7 +591,7 @@ These options can be used in all parsers. *encoder*(value) → *new value* \ where `value` is the value to be encoded (de-formatted) and `obj` is the object currently being encoded. ```javascript - var parser = new Parser().array("ipv4", { + const parser = new Parser().array("ipv4", { type: uint8, length: "4", formatter: function(arr, obj, buffer, offset) { @@ -540,17 +607,17 @@ These options can be used in all parsers. numbers and so on). If `assert` is a `string` or `number`, the actual parsed result will be compared with it with `===` (strict equality check), and an exception is thrown if they mismatch. On the other hand, if `assert` is a - function, that function is executed with one argument (parsed result) and if - it returns false, an exception is thrown. + function, that function is executed with one argument (the parsed result) + and if it returns false, an exception is thrown. ```javascript // simple maginc number validation - var ClassFile = Parser.start() - .endianess("big") + const ClassFile = Parser.start() + .endianness("big") .uint32("magic", { assert: 0xcafebabe }); // Doing more complex assertion with a predicate function - var parser = new Parser() + const parser = new Parser() .int16le("a") .int16le("b") .int16le("c", { @@ -560,11 +627,103 @@ These options can be used in all parsers. }); ``` +### Context variables +You can use some special fields while parsing to traverse your structure. +These context variables will be removed after the parsing process. +Note that this feature is turned off by default for performance reasons, and +you need to call `.useContextVars()` at the top level `Parser` to enable it. +Otherwise, the context variables will not be present. + +- `$parent` - This field references the parent structure. This variable will be + `null` while parsing the root structure. + + ```javascript + var parser = new Parser() + .useContextVars() + .nest("header", { + type: new Parser().uint32("length"), + }) + .array("data", { + type: "int32", + length: function() { + return this.$parent.header.length; + } + }); + ``` + +- `$root` - This field references the root structure. + + ```javascript + const parser = new Parser() + .useContextVars() + .nest("header", { + type: new Parser().uint32("length"), + }) + .nest("data", { + type: new Parser() + .uint32("value") + .array("data", { + type: "int32", + length: function() { + return this.$root.header.length; + } + }), + }); + ``` + +- `$index` - This field references the actual index in array parsing. This + variable will be available only when using the `length` mode for arrays. + + ```javascript + const parser = new Parser() + .useContextVars() + .nest("header", { + type: new Parser().uint32("length"), + }) + .nest("data", { + type: new Parser() + .uint32("value") + .array("data", { + type: new Parser().nest({ + type: new Parser().uint8("_tmp"), + formatter: function(item) { + return this.$index % 2 === 0 ? item._tmp : String.fromCharCode(item._tmp); + } + }), + length: "$root.header.length" + }), + }); + ``` + ## Examples + See `example/` for real-world examples. -## Support +## Benchmarks + +A benchmark script to compare the parsing performance with binparse, structron +and destruct.js is available under `benchmark/`. + +## Contributing + Please report issues to the [issue tracker](https://github.com/keichi/binary-parser/issues) if you have -any difficulties using this module, found a bug, or request a new feature. -Pull requests are welcomed. +any difficulties using this module, found a bug, or would like to request a +new feature. Pull requests are welcome. + +To contribute code, first clone this repo, then install the dependencies: + +```bash +git clone https://github.com/keichi/binary-parser.git +cd binary-parser +npm install +``` + +If you added a feature or fixed a bug, update the test suite under `test/` and +then run it like this: + +```bash +npm run test +``` + +Make sure all the tests pass before submitting a pull request. diff --git a/benchmark/bench.js b/benchmark/bench.js new file mode 100644 index 00000000..2874669d --- /dev/null +++ b/benchmark/bench.js @@ -0,0 +1,95 @@ +const Benchmark = require("benchmark"); +const bp = require("binparse").bp; +const Parser = require("../dist/binary_parser").Parser; +const Destruct = require("destruct-js"); +const Struct = require("structron"); + +const suite = new Benchmark.Suite(); + +// binparse +const PointParser = bp.object("Point", { + x: bp.lu16, + y: bp.lu16, + z: bp.lu16, +}); + +const PointsParser = bp.object("SimpleObject", { + length: bp.variable("len", bp.lu32), + points: bp.array("Points", PointParser, "len"), +}); + +// binary-parser +const Points = new Parser().uint32le("len").array("points", { + length: "len", + type: new Parser().uint16le("x").uint16le("y").uint16le("z"), +}); + +// destruct-js +const spec = new Destruct.Spec({ mode: Destruct.Mode.LE }); +spec + .field("len", Destruct.UInt32) + .loop( + "points", + (r) => r.len, + new Destruct.Spec({ mode: Destruct.Mode.LE }) + .field("x", Destruct.UInt16) + .field("y", Destruct.UInt16) + .field("z", Destruct.UInt16), + ); + +// structron +const PointsStruct = new Struct() + .addMember(Struct.TYPES.UINT_LE, "len") + .addArray( + new Struct() + .addMember(Struct.TYPES.USHORT_LE, "x") + .addMember(Struct.TYPES.USHORT_LE, "y") + .addMember(Struct.TYPES.USHORT_LE, "z"), + "points", + 0, + "len", + ); + +// Prepare input +const n = 1000; +const buf = Buffer.alloc(4 + n * 2 * 3); + +buf.writeUInt32LE(n, 0); +for (let i = 0; i < n; i++) { + buf.writeUInt16LE(123, i * 6 + 0 + 4); + buf.writeUInt16LE(456, i * 6 + 2 + 4); + buf.writeUInt16LE(789, i * 6 + 4 + 4); +} + +// Run benchmarks +suite + .add("hand-written", function () { + const n = buf.readUInt32LE(0); + const points = []; + for (let i = 0; i < n; i++) { + points.push({ + x: buf.readUInt16LE(i * 6 + 0 + 4), + y: buf.readUInt16LE(i * 6 + 2 + 4), + z: buf.readUInt16LE(i * 6 + 4 + 4), + }); + } + }) + .add("binparse", function () { + const points = PointsParser.read(buf); + }) + .add("binary-parser", function () { + const points = Points.parse(buf); + }) + .add("destruct-js", function () { + const points = spec.read(buf); + }) + .add("structron", function () { + const points = PointsStruct.read(buf); + }) + .on("cycle", function (event) { + console.log(String(event.target)); + }) + .on("complete", function () { + console.log("Fastest is " + this.filter("fastest").map("name")); + }) + .run({ async: true }); diff --git a/benchmark/package-lock.json b/benchmark/package-lock.json new file mode 100644 index 00000000..b093e04c --- /dev/null +++ b/benchmark/package-lock.json @@ -0,0 +1,85 @@ +{ + "name": "benchmark", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "dependencies": { + "benchmark": "^2.1.4", + "binparse": "1.2.1", + "destruct-js": "^0.2.9", + "structron": "^0.4.3" + } + }, + "node_modules/benchmark": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-2.1.4.tgz", + "integrity": "sha1-CfPeMckWQl1JjMLuVloOvzwqVik=", + "dependencies": { + "lodash": "^4.17.4", + "platform": "^1.3.3" + } + }, + "node_modules/binparse": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/binparse/-/binparse-1.2.1.tgz", + "integrity": "sha512-3kwsgGE5vELlwhFHFGl/xQfm3QzVMqh+JQLEmLeHlssiEISvq6yc3NXsvsa6jirbZwsg/eZU4gXquY8pLHzV6Q==" + }, + "node_modules/destruct-js": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/destruct-js/-/destruct-js-0.2.9.tgz", + "integrity": "sha512-7c64QwKLYgK/n4buoyKW9tB1kwAXMvlg2CxrM9BibPpO9br6AssJlF9L8xhXzqqlZy+DfxxzXnTWDhkcUJXerA==" + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/platform": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", + "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==" + }, + "node_modules/structron": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/structron/-/structron-0.4.3.tgz", + "integrity": "sha512-DaDuI2mQy+QjtxQ8/IjTNPI6FLIF0jxqzwhUn9t1iKneV/0ANHkJfqWl/8pPBepNRc6rl46Q+TpQlnKvDm/9rA==" + } + }, + "dependencies": { + "benchmark": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-2.1.4.tgz", + "integrity": "sha1-CfPeMckWQl1JjMLuVloOvzwqVik=", + "requires": { + "lodash": "^4.17.4", + "platform": "^1.3.3" + } + }, + "binparse": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/binparse/-/binparse-1.2.1.tgz", + "integrity": "sha512-3kwsgGE5vELlwhFHFGl/xQfm3QzVMqh+JQLEmLeHlssiEISvq6yc3NXsvsa6jirbZwsg/eZU4gXquY8pLHzV6Q==" + }, + "destruct-js": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/destruct-js/-/destruct-js-0.2.9.tgz", + "integrity": "sha512-7c64QwKLYgK/n4buoyKW9tB1kwAXMvlg2CxrM9BibPpO9br6AssJlF9L8xhXzqqlZy+DfxxzXnTWDhkcUJXerA==" + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "platform": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", + "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==" + }, + "structron": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/structron/-/structron-0.4.3.tgz", + "integrity": "sha512-DaDuI2mQy+QjtxQ8/IjTNPI6FLIF0jxqzwhUn9t1iKneV/0ANHkJfqWl/8pPBepNRc6rl46Q+TpQlnKvDm/9rA==" + } + } +} diff --git a/benchmark/package.json b/benchmark/package.json new file mode 100644 index 00000000..8c2bc61b --- /dev/null +++ b/benchmark/package.json @@ -0,0 +1,8 @@ +{ + "dependencies": { + "benchmark": "^2.1.4", + "binparse": "1.2.1", + "destruct-js": "^0.2.9", + "structron": "^0.4.3" + } +} diff --git a/example/bmp.js b/example/bmp.ts similarity index 50% rename from example/bmp.js rename to example/bmp.ts index 92a8d9eb..d0651c5c 100644 --- a/example/bmp.js +++ b/example/bmp.ts @@ -1,4 +1,7 @@ -var Parser = require('../dist/binary_parser').Parser; +import { readFile } from "fs"; +import { join } from "path"; + +import { Parser } from "../lib/binary_parser"; // C structure BITMAPFILEHEADER // typedef struct tagBITMAPFILEHEADER { @@ -8,16 +11,16 @@ var Parser = require('../dist/binary_parser').Parser; // WORD bfReserved2; // DWORD bfOffBits; // } BITMAPFILEHEADER, *PBITMAPFILEHEADER; -var bmpFileHeader = new Parser() - .endianess('little') - .string('type', { +const bmpFileHeader = new Parser() + .endianness("little") + .string("type", { length: 2, - assert: 'BM', + assert: "BM", }) - .uint32('size') - .uint16('reserved1') - .uint16('reserved2') - .uint32('offBits'); + .uint32("size") + .uint16("reserved1") + .uint16("reserved2") + .uint32("offBits"); // C structure BITMAPINFOHEADER definition // typedef struct tagBITMAPINFOHEADER { @@ -33,28 +36,28 @@ var bmpFileHeader = new Parser() // DWORD biClrUsed; // DWORD biClrImportant; // } BITMAPINFOHEADER; -var bmpInfoHeader = new Parser() - .endianess('little') - .uint32('size') - .int32('width') - .int32('height') - .uint16('planes') - .uint16('bitCount') - .uint32('compression') - .uint32('sizeImage') - .int32('xPelsPerMeter') - .int32('yPelsPerMeter') - .uint32('clrUsed') - .uint32('clrImportant'); +const bmpInfoHeader = new Parser() + .endianness("little") + .uint32("size") + .int32("width") + .int32("height") + .uint16("planes") + .uint16("bitCount") + .uint32("compression") + .uint32("sizeImage") + .int32("xPelsPerMeter") + .int32("yPelsPerMeter") + .uint32("clrUsed") + .uint32("clrImportant"); -var bmpFile = new Parser() - .nest('fileHeader', { +const bmpFile = new Parser() + .nest("fileHeader", { type: bmpFileHeader, }) - .nest('infoHeader', { + .nest("infoHeader", { type: bmpInfoHeader, }); -require('fs').readFile('test.bmp', function (err, data) { +readFile(join(__dirname, "test.bmp"), (_, data) => { console.log(bmpFile.parse(data)); }); diff --git a/example/classfile.js b/example/classfile.js deleted file mode 100644 index 08126df9..00000000 --- a/example/classfile.js +++ /dev/null @@ -1,85 +0,0 @@ -var Parser = require('../dist/binary_parser').Parser; - -var ConstantClassInfo = Parser.start().uint16be('name_index'); - -var ConstantFieldrefInfo = Parser.start() - .uint16be('class_index') - .uint16be('name_and_type_index'); - -var ConstantMethodrefInfo = Parser.start() - .uint16be('class_index') - .uint16be('name_and_type_index'); - -var ConstantInterfaceMethodrefInfo = Parser.start() - .uint16be('class_index') - .uint16be('name_and_type_index'); - -var ConstantStringInfo = Parser.start().uint16be('string_index'); - -var ConstantIntegerInfo = Parser.start().uint32be('bytes'); - -var ConstantFloatInfo = Parser.start().uint32be('bytes'); - -var ConstantLongInfo = Parser.start() - .uint32be('high_bytes') - .uint32be('low_bytes'); - -var ConstantDoubleInfo = Parser.start() - .uint32be('high_bytes') - .uint32be('low_bytes'); - -var ConstantNameAndTypeInfo = Parser.start() - .uint16be('name_index') - .uint16be('descriptor_index'); - -var ConstantUtf8Info = Parser.start() - .uint16be('len') - .string('bytes', { length: 'len' }); - -var ConstantMethodHandleInfo = Parser.start() - .uint8('reference_kind') - .uint16be('reference_index'); - -var ConstantMethodTypeInfo = Parser.start().uint16be('descriptor_index'); - -var ConstantInvokeDynamicInfo = Parser.start() - .uint16be('bootstrap_method_attr_index') - .uint16be('name_and_type_index'); - -var CpInfo = Parser.start() - .uint8('tag') - .choice('info', { - tag: 'tag', - choices: { - 7: ConstantClassInfo, - 9: ConstantFieldrefInfo, - 10: ConstantMethodrefInfo, - 11: ConstantInterfaceMethodrefInfo, - 8: ConstantStringInfo, - 3: ConstantIntegerInfo, - 4: ConstantFloatInfo, - 5: ConstantLongInfo, - 6: ConstantDoubleInfo, - 12: ConstantNameAndTypeInfo, - 1: ConstantUtf8Info, - 16: ConstantMethodTypeInfo, - 18: ConstantInvokeDynamicInfo, - }, - }); - -var ClassFile = Parser.start() - .endianess('big') - .uint32('magic', { assert: 0xcafebabe }) - .uint16('minor_version') - .uint16('major_version') - .uint16('constant_pool_count') - .array('cp_info', { - type: CpInfo, - length: function () { - return this.constant_pool_count - 1; - }, - }); - -require('fs').readFile('Hello.class', function (err, data) { - console.log(require('util').inspect(ClassFile.parse(data), { depth: null })); -}); diff --git a/example/classfile.ts b/example/classfile.ts new file mode 100644 index 00000000..dc97d7ef --- /dev/null +++ b/example/classfile.ts @@ -0,0 +1,90 @@ +import { readFile } from "fs"; +import { join } from "path"; +import { inspect } from "util"; + +import { Parser } from "../lib/binary_parser"; + +const ConstantClassInfo = Parser.start().uint16be("name_index"); + +const ConstantFieldrefInfo = Parser.start() + .uint16be("class_index") + .uint16be("name_and_type_index"); + +const ConstantMethodrefInfo = Parser.start() + .uint16be("class_index") + .uint16be("name_and_type_index"); + +const ConstantInterfaceMethodrefInfo = Parser.start() + .uint16be("class_index") + .uint16be("name_and_type_index"); + +const ConstantStringInfo = Parser.start().uint16be("string_index"); + +const ConstantIntegerInfo = Parser.start().uint32be("bytes"); + +const ConstantFloatInfo = Parser.start().uint32be("bytes"); + +const ConstantLongInfo = Parser.start() + .uint32be("high_bytes") + .uint32be("low_bytes"); + +const ConstantDoubleInfo = Parser.start() + .uint32be("high_bytes") + .uint32be("low_bytes"); + +const ConstantNameAndTypeInfo = Parser.start() + .uint16be("name_index") + .uint16be("descriptor_index"); + +const ConstantUtf8Info = Parser.start() + .uint16be("len") + .string("bytes", { length: "len" }); + +// @ts-ignore +const ConstantMethodHandleInfo = Parser.start() + .uint8("reference_kind") + .uint16be("reference_index"); + +const ConstantMethodTypeInfo = Parser.start().uint16be("descriptor_index"); + +const ConstantInvokeDynamicInfo = Parser.start() + .uint16be("bootstrap_method_attr_index") + .uint16be("name_and_type_index"); + +const CpInfo = Parser.start() + .uint8("tag") + .choice("info", { + tag: "tag", + choices: { + 7: ConstantClassInfo, + 9: ConstantFieldrefInfo, + 10: ConstantMethodrefInfo, + 11: ConstantInterfaceMethodrefInfo, + 8: ConstantStringInfo, + 3: ConstantIntegerInfo, + 4: ConstantFloatInfo, + 5: ConstantLongInfo, + 6: ConstantDoubleInfo, + 12: ConstantNameAndTypeInfo, + 1: ConstantUtf8Info, + 16: ConstantMethodTypeInfo, + 18: ConstantInvokeDynamicInfo, + }, + }); + +const ClassFile = Parser.start() + .endianness("big") + .uint32("magic", { assert: 0xcafebabe }) + .uint16("minor_version") + .uint16("major_version") + .uint16("constant_pool_count") + .array("cp_info", { + type: CpInfo, + length: function (this: any) { + return this.constant_pool_count - 1; + }, + }); + +readFile(join(__dirname, "Hello.class"), (_, data) => { + console.log(inspect(ClassFile.parse(data), { depth: null, colors: true })); +}); diff --git a/example/elf32.js b/example/elf32.js deleted file mode 100644 index 314fe5e6..00000000 --- a/example/elf32.js +++ /dev/null @@ -1,84 +0,0 @@ -var Parser = require('../dist/binary_parser').Parser; - -var ELF32ProgramHeader = new Parser() - .endianess('little') - .uint32('type') - .uint32('offset') - .uint32('vaddr') - .uint32('paddr') - .uint32('filesz') - .uint32('memsz') - .uint32('flags') - .uint32('align'); - -var ELF32ProgramHeaderTable = new Parser().array('items', { - type: ELF32ProgramHeader, - length: function (vars) { - return vars.phnum; - }, -}); - -var ELF32SectionHeader = new Parser() - .endianess('little') - .uint32('name') - .uint32('type') - .uint32('flags') - .uint32('address') - .uint32('offset') - .uint32('size') - .uint32('link') - .uint32('info') - .uint32('addralign') - .uint32('entsize'); - -var ELF32SectionHeaderTable = new Parser().array('items', { - type: ELF32SectionHeader, - length: function (vars) { - return vars.shnum; - }, -}); - -var ELF32SectionHeaderStringTable = new Parser().seek(1).array('items', { - type: new Parser().string('name', { zeroTerminated: true }), - lengthInBytes: function (vars) { - var shstr = vars.section_headers.items[vars.shstrndx]; - return shstr.size - 1; - }, -}); - -var ELF32Header = new Parser() - .endianess('little') - .buffer('ident', { length: 16 }) - .uint16('type') - .uint16('machine') - .uint32('version') - .uint32('entry') - .uint32('phoff') - .uint32('shoff') - .uint32('flags') - .uint16('ehsize') - .uint16('phentsize') - .uint16('phnum') - .uint16('shentsize') - .uint16('shnum') - .uint16('shstrndx') - .pointer('program_headers', { - type: ELF32ProgramHeaderTable, - offset: 'phoff', - }) - .pointer('section_headers', { - type: ELF32SectionHeaderTable, - offset: 'shoff', - }) - .pointer('strings', { - type: ELF32SectionHeaderStringTable, - offset: function () { - var shstr = vars.section_headers.items[vars.shstrndx]; - return shstr.offset; - }, - }); - -require('fs').readFile('hello', function (err, data) { - var result = ELF32Header.parse(data); - console.log(require('util').inspect(result, { depth: null })); -}); diff --git a/example/elf32.ts b/example/elf32.ts new file mode 100644 index 00000000..f7b672e3 --- /dev/null +++ b/example/elf32.ts @@ -0,0 +1,88 @@ +import { readFile } from "fs"; +import { join } from "path"; +import { inspect } from "util"; + +import { Parser } from "../lib/binary_parser"; + +const ELF32ProgramHeader = new Parser() + .endianness("little") + .uint32("type") + .uint32("offset") + .uint32("vaddr") + .uint32("paddr") + .uint32("filesz") + .uint32("memsz") + .uint32("flags") + .uint32("align"); + +const ELF32ProgramHeaderTable = new Parser().array("items", { + type: ELF32ProgramHeader, + length: function (vars) { + return vars.phnum; + }, +}); + +const ELF32SectionHeader = new Parser() + .endianness("little") + .uint32("name") + .uint32("type") + .uint32("flags") + .uint32("address") + .uint32("offset") + .uint32("size") + .uint32("link") + .uint32("info") + .uint32("addralign") + .uint32("entsize"); + +const ELF32SectionHeaderTable = new Parser().array("items", { + type: ELF32SectionHeader, + length: function (vars) { + return vars.shnum; + }, +}); + +const ELF32SectionHeaderStringTable = new Parser().seek(1).array("items", { + type: new Parser().string("name", { zeroTerminated: true }), + lengthInBytes: function (vars) { + const shstr = vars.section_headers.items[vars.shstrndx]; + return shstr.size - 1; + }, +}); + +const ELF32Header = new Parser() + .endianness("little") + .buffer("ident", { length: 16 }) + .uint16("type") + .uint16("machine") + .uint32("version") + .uint32("entry") + .uint32("phoff") + .uint32("shoff") + .uint32("flags") + .uint16("ehsize") + .uint16("phentsize") + .uint16("phnum") + .uint16("shentsize") + .uint16("shnum") + .uint16("shstrndx") + .pointer("program_headers", { + type: ELF32ProgramHeaderTable, + offset: "phoff", + }) + .pointer("section_headers", { + type: ELF32SectionHeaderTable, + offset: "shoff", + }) + .pointer("strings", { + type: ELF32SectionHeaderStringTable, + offset: function (vars) { + const shstr = vars.section_headers.items[vars.shstrndx]; + return shstr.offset; + }, + }); + +readFile(join(__dirname, "hello"), (_, data) => { + const result = ELF32Header.parse(data); + console.log(inspect(result, { depth: null, colors: true })); +}); diff --git a/example/ip.js b/example/ip.js deleted file mode 100644 index b3c9cee7..00000000 --- a/example/ip.js +++ /dev/null @@ -1,26 +0,0 @@ -var Parser = require('../dist/binary_parser').Parser; - -var ipHeader = new Parser() - .endianess('big') - .bit4('version') - .bit4('headerLength') - .uint8('tos') - .uint16('packetLength') - .uint16('id') - .bit3('offset') - .bit13('fragOffset') - .uint8('ttl') - .uint8('protocol') - .uint16('checksum') - .array('src', { - type: 'uint8', - length: 4, - }) - .array('dst', { - type: 'uint8', - length: 4, - }); - -var buf = Buffer.from('450002c5939900002c06ef98adc24f6c850186d1', 'hex'); - -console.log(ipHeader.parse(buf)); diff --git a/example/ip.ts b/example/ip.ts new file mode 100644 index 00000000..ed4b63f5 --- /dev/null +++ b/example/ip.ts @@ -0,0 +1,26 @@ +import { Parser } from "../lib/binary_parser"; + +const ipHeader = new Parser() + .endianness("big") + .bit4("version") + .bit4("headerLength") + .uint8("tos") + .uint16("packetLength") + .uint16("id") + .bit3("offset") + .bit13("fragOffset") + .uint8("ttl") + .uint8("protocol") + .uint16("checksum") + .array("src", { + type: "uint8", + length: 4, + }) + .array("dst", { + type: "uint8", + length: 4, + }); + +const buf = Buffer.from("450002c5939900002c06ef98adc24f6c850186d1", "hex"); + +console.log(ipHeader.parse(buf)); diff --git a/example/jpg.js b/example/jpg.js deleted file mode 100644 index 87d3208d..00000000 --- a/example/jpg.js +++ /dev/null @@ -1,108 +0,0 @@ -var Parser = require('../dist/binary_parser').Parser; - -var SOI = Parser.start(); - -var EOI = Parser.start(); - -var APP0 = Parser.start() - .endianess('big') - .uint16('length') - .string('id', { - encoding: 'ascii', - zeroTerminated: true, - assert: 'JFIF', - }) - .uint16('version') - .uint8('unit') - .uint16('xDensity') - .uint16('yDensity') - .uint8('thumbWidth') - .uint8('thumbHeight') - .array('thumbData', { - type: 'uint8', - length: function () { - return this.Xt * this.Yt * 3; - }, - }); - -var COM = Parser.start() - .endianess('big') - .uint16('length') - .string('comment', { - encoding: 'ascii', - length: function () { - return this.length - 2; - }, - }); - -var SOS = Parser.start() - .endianess('big') - .uint16('length') - .uint8('componentCount') - .array('components', { - type: Parser.start().uint8('id').uint8('dht'), - length: 'componentCount', - }) - .uint8('spectrumStart') - .uint8('spectrumEnd') - .uint8('spectrumSelect'); - -var DQT = Parser.start() - .endianess('big') - .uint16('length') - .array('tables', { - type: Parser.start().uint8('precisionAndTableId').array('table', { - type: 'uint8', - length: 64, - }), - length: function () { - return (this.length - 2) / 65; - }, - }); - -var SOF0 = Parser.start() - .endianess('big') - .uint16('length') - .uint8('precision') - .uint16('width') - .uint16('height') - .uint8('componentCount') - .array('components', { - type: Parser.start() - .uint8('id') - .uint8('samplingFactor') - .uint8('quantizationTableId'), - length: 'componentCount', - }); - -var Ignore = Parser.start() - .endianess('big') - .uint16('length') - .seek(function () { - return this.length - 2; - }); - -var Segment = Parser.start() - .endianess('big') - .uint16('marker') - .choice('segment', { - tag: 'marker', - choices: { - 0xffd8: SOI, - 0xffd9: EOI, - 0xffe0: APP0, - 0xffda: SOS, - 0xffdb: DQT, - 0xffc0: SOF0, - }, - defaultChoice: Ignore, - }); - -var JPEG = Parser.start().array('segments', { - type: Segment, - readUntil: 'eof', -}); - -require('fs').readFile('test.jpg', function (err, data) { - console.log(require('util').inspect(JPEG.parse(data), { depth: null })); -}); diff --git a/example/jpg.ts b/example/jpg.ts new file mode 100644 index 00000000..010c4eb1 --- /dev/null +++ b/example/jpg.ts @@ -0,0 +1,113 @@ +import { readFile } from "fs"; +import { join } from "path"; +import { inspect } from "util"; + +import { Parser } from "../lib/binary_parser"; + +const SOI = Parser.start(); + +const EOI = Parser.start(); + +const APP0 = Parser.start() + .endianness("big") + .uint16("length") + .string("id", { + encoding: "ascii", + zeroTerminated: true, + assert: "JFIF", + }) + .uint16("version") + .uint8("unit") + .uint16("xDensity") + .uint16("yDensity") + .uint8("thumbWidth") + .uint8("thumbHeight") + .array("thumbData", { + type: "uint8", + length: function (this: any) { + return this.Xt * this.Yt * 3; + }, + }); + +// @ts-ignore +const COM = Parser.start() + .endianness("big") + .uint16("length") + .string("comment", { + encoding: "ascii", + length: function (this: any) { + return this.length - 2; + }, + }); + +const SOS = Parser.start() + .endianness("big") + .uint16("length") + .uint8("componentCount") + .array("components", { + type: Parser.start().uint8("id").uint8("dht"), + length: "componentCount", + }) + .uint8("spectrumStart") + .uint8("spectrumEnd") + .uint8("spectrumSelect"); + +const DQT = Parser.start() + .endianness("big") + .uint16("length") + .array("tables", { + type: Parser.start().uint8("precisionAndTableId").array("table", { + type: "uint8", + length: 64, + }), + length: function (this: any) { + return (this.length - 2) / 65; + }, + }); + +const SOF0 = Parser.start() + .endianness("big") + .uint16("length") + .uint8("precision") + .uint16("width") + .uint16("height") + .uint8("componentCount") + .array("components", { + type: Parser.start() + .uint8("id") + .uint8("samplingFactor") + .uint8("quantizationTableId"), + length: "componentCount", + }); + +const Ignore = Parser.start() + .endianness("big") + .uint16("length") + .seek(function (this: any) { + return this.length - 2; + }); + +const Segment = Parser.start() + .endianness("big") + .uint16("marker") + .choice("segment", { + tag: "marker", + choices: { + 0xffd8: SOI, + 0xffd9: EOI, + 0xffe0: APP0, + 0xffda: SOS, + 0xffdb: DQT, + 0xffc0: SOF0, + }, + defaultChoice: Ignore, + }); + +const JPEG = Parser.start().array("segments", { + type: Segment, + readUntil: "eof", +}); + +readFile(join(__dirname, "test.jpg"), (_, data) => { + console.log(inspect(JPEG.parse(data), { depth: null, colors: true })); +}); diff --git a/example/mbr.js b/example/mbr.js deleted file mode 100644 index c065afc9..00000000 --- a/example/mbr.js +++ /dev/null @@ -1,40 +0,0 @@ -var Parser = require('../dist/binary_parser').Parser; -var fs = require('fs'); - -var chs = new Parser({ - formatter: function (val) { - val.cylinder |= val.cylinderHigh << 8; - delete val.cylinderHigh; - return val; - }, -}) - .uint8('head') - .bit2('cylinderHigh') - .bit6('sector') - .uint8('cylinder'); - -var partitionTable = new Parser() - .uint8('bootFlag') - .nest('startCHS', { - type: chs, - }) - .uint8('type') - .nest('endCHS', { - type: chs, - }) - .uint32le('startLBA') - .uint32le('endLBA'); - -var mbrParser = new Parser() - .seek(446) - .array('partitionTables', { - type: partitionTable, - length: 4, - }) - .int16be('signature', { - assert: 0x55aa, - }); - -fs.readFile('raspbian.img', function (err, data) { - console.dir(mbrParser.parse(data), { depth: null, colors: true }); -}); diff --git a/example/mbr.ts b/example/mbr.ts new file mode 100644 index 00000000..b4f3d91a --- /dev/null +++ b/example/mbr.ts @@ -0,0 +1,46 @@ +import { readFile } from "fs"; +import { join } from "path"; +import { inspect } from "util"; + +import { Parser } from "../lib/binary_parser"; + +const chs = new Parser() + .uint8("head") + .bit2("cylinderHigh") + .bit6("sector") + .uint8("cylinder"); + +const partitionTable = new Parser() + .uint8("bootFlag") + .nest("startCHS", { + type: chs, + formatter: function (val) { + delete val.cylinderHigh; + return val; + }, + }) + .uint8("type") + .nest("endCHS", { + type: chs, + formatter: function (val) { + val.cylinder |= val.cylinderHigh << 8; + delete val.cylinderHigh; + return val; + }, + }) + .uint32le("startLBA") + .uint32le("endLBA"); + +const mbrParser = new Parser() + .seek(446) + .array("partitionTables", { + type: partitionTable, + length: 4, + }) + .int16be("signature", { + assert: 0x55aa, + }); + +readFile(join(__dirname, "raspbian.img"), (_, data) => { + console.log(inspect(mbrParser.parse(data), { depth: null, colors: true })); +}); diff --git a/example/tar.js b/example/tar.js deleted file mode 100644 index ff3531ca..00000000 --- a/example/tar.js +++ /dev/null @@ -1,42 +0,0 @@ -var Parser = require('../dist/binary_parser').Parser; -var fs = require('fs'); - -var oct2int = function (s) { - return parseInt(s, 8); -}; - -var tarHeader = new Parser() - .string('name', { length: 100, stripNull: true }) - .string('mode', { length: 8, stripNull: true, formatter: oct2int }) - .string('uid', { length: 8, stripNull: true, formatter: oct2int }) - .string('gid', { length: 8, stripNull: true, formatter: oct2int }) - .string('size', { length: 12, stripNull: true, formatter: oct2int }) - .string('mtime', { length: 12, stripNull: true, formatter: oct2int }) - .string('chksum', { length: 8, stripNull: true, formatter: oct2int }) - .string('typeflag', { length: 1, stripNull: true, formatter: oct2int }) - .string('linkname', { length: 100, stripNull: true }) - .string('magic', { length: 6, stripNull: true }) - .string('version', { length: 2, stripNull: true, formatter: oct2int }) - .string('uname', { length: 32, stripNull: true }) - .string('gname', { length: 32, stripNull: true }) - .string('devmajor', { length: 8, stripNull: true, formatter: oct2int }) - .string('devminor', { length: 8, stripNull: true, formatter: oct2int }) - .string('prefix', { length: 155, stripNull: true }) - .seek(12); - -var tarItem = new Parser() - .nest({ - type: tarHeader, - }) - .seek(function () { - return Math.ceil(this.size / 512) * 512; - }); - -var tarArchive = new Parser().array('files', { - type: tarItem, - readUntil: 'eof', -}); - -fs.readFile('test.tar', function (err, data) { - console.dir(tarArchive.parse(data), { depth: null, colors: true }); -}); diff --git a/example/tar.ts b/example/tar.ts new file mode 100644 index 00000000..f717803a --- /dev/null +++ b/example/tar.ts @@ -0,0 +1,44 @@ +import { join } from "path"; +import { readFile } from "fs"; + +import { Parser } from "../lib/binary_parser"; + +function oct2int(s: string): number { + return parseInt(s, 8); +} + +const tarHeader = new Parser() + .string("name", { length: 100, stripNull: true }) + .string("mode", { length: 8, stripNull: true, formatter: oct2int }) + .string("uid", { length: 8, stripNull: true, formatter: oct2int }) + .string("gid", { length: 8, stripNull: true, formatter: oct2int }) + .string("size", { length: 12, stripNull: true, formatter: oct2int }) + .string("mtime", { length: 12, stripNull: true, formatter: oct2int }) + .string("chksum", { length: 8, stripNull: true, formatter: oct2int }) + .string("typeflag", { length: 1, stripNull: true, formatter: oct2int }) + .string("linkname", { length: 100, stripNull: true }) + .string("magic", { length: 6, stripNull: true }) + .string("version", { length: 2, stripNull: true, formatter: oct2int }) + .string("uname", { length: 32, stripNull: true }) + .string("gname", { length: 32, stripNull: true }) + .string("devmajor", { length: 8, stripNull: true, formatter: oct2int }) + .string("devminor", { length: 8, stripNull: true, formatter: oct2int }) + .string("prefix", { length: 155, stripNull: true }) + .seek(12); + +const tarItem = new Parser() + .nest({ + type: tarHeader, + }) + .seek(function (this: any) { + return Math.ceil(this.size / 512) * 512; + }); + +const tarArchive = new Parser().array("files", { + type: tarItem, + readUntil: "eof", +}); + +readFile(join(__dirname, "test.tar"), (_, data) => { + console.dir(tarArchive.parse(data), { depth: null, colors: true }); +}); diff --git a/example/tcp.js b/example/tcp.js deleted file mode 100644 index 95e8ca78..00000000 --- a/example/tcp.js +++ /dev/null @@ -1,29 +0,0 @@ -var Parser = require('../dist/binary_parser').Parser; - -var tcpHeader = new Parser() - .endianess('big') - .uint16('srcPort') - .uint16('dstPort') - .uint32('seq') - .uint32('ack') - .bit4('dataOffset') - .bit6('reserved') - .nest('flags', { - type: new Parser() - .bit1('urg') - .bit1('ack') - .bit1('psh') - .bit1('rst') - .bit1('syn') - .bit1('fin'), - }) - .uint16('windowSize') - .uint16('checksum') - .uint16('urgentPointer'); - -var buf = Buffer.from( - 'e8a203e108e177e13d20756b801829d3004100000101080a2ea486ba793310bc', - 'hex' -); - -console.log(tcpHeader.parse(buf)); diff --git a/example/tcp.ts b/example/tcp.ts new file mode 100644 index 00000000..55482144 --- /dev/null +++ b/example/tcp.ts @@ -0,0 +1,29 @@ +import { Parser } from "../lib/binary_parser"; + +const tcpHeader = new Parser() + .endianness("big") + .uint16("srcPort") + .uint16("dstPort") + .uint32("seq") + .uint32("ack") + .bit4("dataOffset") + .bit6("reserved") + .nest("flags", { + type: new Parser() + .bit1("urg") + .bit1("ack") + .bit1("psh") + .bit1("rst") + .bit1("syn") + .bit1("fin"), + }) + .uint16("windowSize") + .uint16("checksum") + .uint16("urgentPointer"); + +const buf = Buffer.from( + "e8a203e108e177e13d20756b801829d3004100000101080a2ea486ba793310bc", + "hex", +); + +console.log(tcpHeader.parse(buf)); diff --git a/karma.conf.js b/karma.conf.js new file mode 100644 index 00000000..0bca1e8d --- /dev/null +++ b/karma.conf.js @@ -0,0 +1,55 @@ +// Karma configuration +// Generated on Mon Oct 04 2021 18:19:34 GMT+0900 (Japan Standard Time) + +module.exports = function (config) { + config.set({ + // base path that will be used to resolve all patterns (eg. files, exclude) + basePath: "", + + // frameworks to use + // available frameworks: https://www.npmjs.com/search?q=keywords:karma-adapter + frameworks: ["mocha", "karma-typescript"], + + // list of files / patterns to load in the browser + files: ["test/*.ts", "lib/*.ts"], + + // list of files / patterns to exclude + exclude: [], + + // preprocess matching files before serving them to the browser + // available preprocessors: https://www.npmjs.com/search?q=keywords:karma-preprocessor + preprocessors: { + "**/*.ts": "karma-typescript", // *.tsx for React Jsx + }, + + // test results reporter to use + // possible values: 'dots', 'progress' + // available reporters: https://www.npmjs.com/search?q=keywords:karma-reporter + reporters: ["progress", "karma-typescript"], + + // web server port + port: 9876, + + // enable / disable colors in the output (reporters and logs) + colors: true, + + // level of logging + // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG + logLevel: config.LOG_INFO, + + // enable / disable watching file and executing tests whenever any file changes + autoWatch: true, + + // start these browsers + // available browser launchers: https://www.npmjs.com/search?q=keywords:karma-launcher + browsers: ["Chrome"], + + // Continuous Integration mode + // if true, Karma captures browsers, runs the tests and exits + singleRun: false, + + // Concurrency level + // how many browser instances should be started simultaneously + concurrency: Infinity, + }); +}; diff --git a/lib/binary_parser.ts b/lib/binary_parser.ts index 8dff6db2..b49b70e5 100644 --- a/lib/binary_parser.ts +++ b/lib/binary_parser.ts @@ -1,32 +1,141 @@ -import { Context } from './context'; -import { SmartBuffer } from 'smart-buffer'; +import { SmartBuffer } from "smart-buffer"; -const aliasRegistry: { [key: string]: Parser } = {}; -const FUNCTION_PREFIX = '___parser_'; -const FUNCTION_ENCODE_PREFIX = '___encoder_'; +class Context { + code = ""; + scopes = [["vars"]]; + bitFields: Parser[] = []; + tmpVariableCount = 0; + references = new Map(); + importPath: string; + imports: any[] = []; + reverseImports = new Map(); + useContextVariables = false; + + constructor(importPath: string, useContextVariables: boolean) { + this.importPath = importPath; + this.useContextVariables = useContextVariables; + } + + generateVariable(name?: string): string { + const scopes = [...this.scopes[this.scopes.length - 1]]; + if (name) { + scopes.push(name); + } + + return scopes.join("."); + } + + generateOption(val: number | string | Function): string { + switch (typeof val) { + case "number": + return val.toString(); + case "string": + return this.generateVariable(val); + case "function": + return `${this.addImport(val)}.call(${this.generateVariable()}, vars)`; + } + } + + generateError(err: string) { + this.pushCode(`throw new Error(${err});`); + } + + generateTmpVariable(): string { + return "$tmp" + this.tmpVariableCount++; + } + + pushCode(code: string) { + this.code += code + "\n"; + } + + pushPath(name: string) { + if (name) { + this.scopes[this.scopes.length - 1].push(name); + } + } + + popPath(name: string) { + if (name) { + this.scopes[this.scopes.length - 1].pop(); + } + } + + pushScope(name: string) { + this.scopes.push([name]); + } + + popScope() { + this.scopes.pop(); + } + + addImport(im: any): string { + if (!this.importPath) return `(${im})`; + let id = this.reverseImports.get(im); + if (!id) { + id = this.imports.push(im) - 1; + this.reverseImports.set(im, id); + } + return `${this.importPath}[${id}]`; + } + + addReference(alias: string) { + if (!this.references.has(alias)) { + this.references.set(alias, { resolved: false, requested: false }); + } + } + + markResolved(alias: string) { + const reference = this.references.get(alias); + + if (reference) { + reference.resolved = true; + } + } + + markRequested(aliasList: string[]) { + aliasList.forEach((alias) => { + const reference = this.references.get(alias); + + if (reference) { + reference.requested = true; + } + }); + } + + getUnresolvedReferences(): string[] { + return Array.from(this.references) + .filter(([_, reference]) => !reference.resolved && !reference.requested) + .map(([alias, _]) => alias); + } +} + +const aliasRegistry = new Map(); +const FUNCTION_PREFIX = "___parser_"; +const FUNCTION_ENCODE_PREFIX = "___encoder_"; interface ParserOptions { length?: number | string | ((item: any) => number); assert?: number | string | ((item: number | string) => boolean); lengthInBytes?: number | string | ((item: any) => number); type?: string | Parser; - formatter?: (item: any) => string | number; + formatter?: (item: any) => any; encoder?: (item: any) => any; encoding?: string; - readUntil?: 'eof' | ((item: any, buffer: any) => number); - encodeUntil?: 'eof' | ((item: any, buffer: any) => number); + encodeUntil?: "eof" | ((item: any, buffer: Buffer) => number); + readUntil?: "eof" | ((item: any, buffer: Buffer) => boolean); greedy?: boolean; choices?: { [key: number]: string | Parser }; defaultChoice?: string | Parser; zeroTerminated?: boolean; clone?: boolean; stripNull?: boolean; + key?: string; trim?: boolean; padding?: string; padd?: string; - key?: string; - tag?: string; + tag?: string | ((item: any) => number); offset?: number | string | ((item: any) => number); + wrapper?: (buffer: Buffer) => Buffer; } interface EncoderOptions { @@ -36,48 +145,49 @@ interface EncoderOptions { type Types = PrimitiveTypes | ComplexTypes; type ComplexTypes = - | 'bit' - | 'string' - | 'buffer' - | 'array' - | 'choice' - | 'nest' - | 'seek' - | 'pointer' - | 'saveOffset' - | ''; - -type Endianess = 'be' | 'le'; + | "bit" + | "string" + | "buffer" + | "array" + | "choice" + | "nest" + | "seek" + | "pointer" + | "saveOffset" + | "wrapper" + | ""; + +type Endianness = "be" | "le"; type PrimitiveTypes = - | 'uint8' - | 'uint16le' - | 'uint16be' - | 'uint32le' - | 'uint32be' - | 'uint64le' - | 'uint64be' - | 'int8' - | 'int16le' - | 'int16be' - | 'int32le' - | 'int32be' - | 'int64le' - | 'int64be' - | 'floatle' - | 'floatbe' - | 'doublele' - | 'doublebe'; + | "uint8" + | "uint16le" + | "uint16be" + | "uint32le" + | "uint32be" + | "uint64le" + | "uint64be" + | "int8" + | "int16le" + | "int16be" + | "int32le" + | "int32be" + | "int64le" + | "int64be" + | "floatle" + | "floatbe" + | "doublele" + | "doublebe"; type PrimitiveTypesWithoutEndian = - | 'uint8' - | 'uint16' - | 'uint32' - | 'int8' - | 'int16' - | 'int32' - | 'int64' - | 'uint64'; + | "uint8" + | "uint16" + | "uint32" + | "int8" + | "int16" + | "int32" + | "int64" + | "uint64"; type BitSizes = | 1 @@ -135,24 +245,24 @@ const PRIMITIVE_SIZES: { [key in PrimitiveTypes]: number } = { }; const PRIMITIVE_NAMES: { [key in PrimitiveTypes]: string } = { - uint8: 'Uint8', - uint16le: 'Uint16', - uint16be: 'Uint16', - uint32le: 'Uint32', - uint32be: 'Uint32', - int8: 'Int8', - int16le: 'Int16', - int16be: 'Int16', - int32le: 'Int32', - int32be: 'Int32', - int64be: 'BigInt64', - int64le: 'BigInt64', - uint64be: 'BigUint64', - uint64le: 'BigUint64', - floatle: 'Float32', - floatbe: 'Float32', - doublele: 'Float64', - doublebe: 'Float64', + uint8: "Uint8", + uint16le: "Uint16", + uint16be: "Uint16", + uint32le: "Uint32", + uint32be: "Uint32", + int8: "Int8", + int16le: "Int16", + int16be: "Int16", + int32le: "Int32", + int32be: "Int32", + int64be: "BigInt64", + int64le: "BigInt64", + uint64be: "BigUint64", + uint64le: "BigUint64", + floatle: "Float32", + floatbe: "Float32", + doublele: "Float64", + doublebe: "Float64", }; const PRIMITIVE_LITTLE_ENDIANS: { [key in PrimitiveTypes]: boolean } = { @@ -177,53 +287,55 @@ const PRIMITIVE_LITTLE_ENDIANS: { [key in PrimitiveTypes]: boolean } = { }; const CAPITILIZED_TYPE_NAMES: { [key in Types]: string } = { - uint8: 'UInt8', - uint16le: 'UInt16LE', - uint16be: 'UInt16BE', - uint32le: 'UInt32LE', - uint32be: 'UInt32BE', - int8: 'Int8', - int16le: 'Int16LE', - int16be: 'Int16BE', - int32le: 'Int32LE', - int32be: 'Int32BE', - int64be: 'BigInt64BE', - int64le: 'BigInt64LE', - uint64be: 'BigUInt64BE', - uint64le: 'BigUInt64LE', - floatle: 'FloatLE', - floatbe: 'FloatBE', - doublele: 'DoubleLE', - doublebe: 'DoubleBE', - bit: 'Bit', - string: 'String', - buffer: 'Buffer', - array: 'Array', - choice: 'Choice', - nest: 'Nest', - seek: 'Seek', - pointer: 'Pointer', - saveOffset: 'SaveOffset', - '': '', + uint8: "UInt8", + uint16le: "UInt16LE", + uint16be: "UInt16BE", + uint32le: "UInt32LE", + uint32be: "UInt32BE", + int8: "Int8", + int16le: "Int16LE", + int16be: "Int16BE", + int32le: "Int32LE", + int32be: "Int32BE", + int64be: "BigInt64BE", + int64le: "BigInt64LE", + uint64be: "BigUInt64BE", + uint64le: "BigUInt64LE", + floatle: "FloatLE", + floatbe: "FloatBE", + doublele: "DoubleLE", + doublebe: "DoubleBE", + bit: "Bit", + string: "String", + buffer: "Buffer", + array: "Array", + choice: "Choice", + nest: "Nest", + seek: "Seek", + pointer: "Pointer", + saveOffset: "SaveOffset", + "": "", + wrapper: "Wrapper", }; export class Parser { - varName = ''; - type: Types = ''; + varName = ""; + type: Types = ""; options: ParserOptions = {}; - next: Parser | null = null; - head: Parser | null = null; - compiled: Function | null = null; + next?: Parser; + head?: Parser; + compiled?: Function; + endian: Endianness = "be"; + constructorFn?: Function; + alias?: string; + useContextVariables = false; compiledEncode: Function | null = null; - endian: Endianess = 'be'; - constructorFn: Function | null = null; - alias: string | null = null; smartBufferSize: number; encoderOpts: EncoderOptions; constructor(opts?: any) { this.smartBufferSize = - opts && typeof opts === 'object' && opts.smartBufferSize + opts && typeof opts === "object" && opts.smartBufferSize ? opts.smartBufferSize : 256; this.encoderOpts = { @@ -240,8 +352,8 @@ export class Parser { const littleEndian = PRIMITIVE_LITTLE_ENDIANS[type]; ctx.pushCode( `${ctx.generateVariable( - this.varName - )} = dataView.get${typeName}(offset, ${littleEndian});` + this.varName, + )} = dataView.get${typeName}(offset, ${littleEndian});`, ); ctx.pushCode(`offset += ${PRIMITIVE_SIZES[type]};`); } @@ -250,15 +362,15 @@ export class Parser { const typeName = CAPITILIZED_TYPE_NAMES[type]; ctx.pushCode( - `smartBuffer.write${typeName}(${ctx.generateVariable(this.varName)});` + `smartBuffer.write${typeName}(${ctx.generateVariable(this.varName)});`, ); } private primitiveN( type: PrimitiveTypes, varName: string, - options?: ParserOptions - ) { + options: ParserOptions, + ): this { return this.setNextParser(type as Types, varName, options); } @@ -266,369 +378,430 @@ export class Parser { return (type + this.endian.toLowerCase()) as PrimitiveTypes; } - uint8(varName: string, options?: ParserOptions) { - return this.primitiveN('uint8', varName, options); + uint8(varName: string, options: ParserOptions = {}): this { + return this.primitiveN("uint8", varName, options); } - uint16(varName: string, options?: ParserOptions) { - return this.primitiveN(this.useThisEndian('uint16'), varName, options); + uint16(varName: string, options: ParserOptions = {}): this { + return this.primitiveN(this.useThisEndian("uint16"), varName, options); } - uint16le(varName: string, options?: ParserOptions) { - return this.primitiveN('uint16le', varName, options); + + uint16le(varName: string, options: ParserOptions = {}): this { + return this.primitiveN("uint16le", varName, options); } - uint16be(varName: string, options?: ParserOptions) { - return this.primitiveN('uint16be', varName, options); + + uint16be(varName: string, options: ParserOptions = {}): this { + return this.primitiveN("uint16be", varName, options); } - uint32(varName: string, options?: ParserOptions) { - return this.primitiveN(this.useThisEndian('uint32'), varName, options); + uint32(varName: string, options: ParserOptions = {}): this { + return this.primitiveN(this.useThisEndian("uint32"), varName, options); } - uint32le(varName: string, options?: ParserOptions) { - return this.primitiveN('uint32le', varName, options); + + uint32le(varName: string, options: ParserOptions = {}): this { + return this.primitiveN("uint32le", varName, options); } - uint32be(varName: string, options?: ParserOptions) { - return this.primitiveN('uint32be', varName, options); + + uint32be(varName: string, options: ParserOptions = {}): this { + return this.primitiveN("uint32be", varName, options); } - int8(varName: string, options?: ParserOptions) { - return this.primitiveN('int8', varName, options); + int8(varName: string, options: ParserOptions = {}): this { + return this.primitiveN("int8", varName, options); } - int16(varName: string, options?: ParserOptions) { - return this.primitiveN(this.useThisEndian('int16'), varName, options); + int16(varName: string, options: ParserOptions = {}): this { + return this.primitiveN(this.useThisEndian("int16"), varName, options); } - int16le(varName: string, options?: ParserOptions) { - return this.primitiveN('int16le', varName, options); + + int16le(varName: string, options: ParserOptions = {}): this { + return this.primitiveN("int16le", varName, options); } - int16be(varName: string, options?: ParserOptions) { - return this.primitiveN('int16be', varName, options); + + int16be(varName: string, options: ParserOptions = {}): this { + return this.primitiveN("int16be", varName, options); } - int32(varName: string, options?: ParserOptions) { - return this.primitiveN(this.useThisEndian('int32'), varName, options); + int32(varName: string, options: ParserOptions = {}): this { + return this.primitiveN(this.useThisEndian("int32"), varName, options); } - int32le(varName: string, options?: ParserOptions) { - return this.primitiveN('int32le', varName, options); + + int32le(varName: string, options: ParserOptions = {}): this { + return this.primitiveN("int32le", varName, options); } - int32be(varName: string, options?: ParserOptions) { - return this.primitiveN('int32be', varName, options); + + int32be(varName: string, options: ParserOptions = {}): this { + return this.primitiveN("int32be", varName, options); } private bigIntVersionCheck() { if (!DataView.prototype.getBigInt64) - throw new Error('BigInt64 is unsupported in this runtime'); + throw new Error("BigInt64 is unsupported on this runtime"); } - int64(varName: string, options?: ParserOptions) { + + int64(varName: string, options: ParserOptions = {}): this { this.bigIntVersionCheck(); - return this.primitiveN(this.useThisEndian('int64'), varName, options); + return this.primitiveN(this.useThisEndian("int64"), varName, options); } - int64be(varName: string, options?: ParserOptions) { + + int64be(varName: string, options: ParserOptions = {}): this { this.bigIntVersionCheck(); - return this.primitiveN('int64be', varName, options); + return this.primitiveN("int64be", varName, options); } - int64le(varName: string, options?: ParserOptions) { + + int64le(varName: string, options: ParserOptions = {}): this { this.bigIntVersionCheck(); - return this.primitiveN('int64le', varName, options); + return this.primitiveN("int64le", varName, options); } - uint64(varName: string, options?: ParserOptions) { + uint64(varName: string, options: ParserOptions = {}): this { this.bigIntVersionCheck(); - return this.primitiveN(this.useThisEndian('uint64'), varName, options); + return this.primitiveN(this.useThisEndian("uint64"), varName, options); } - uint64be(varName: string, options?: ParserOptions) { + + uint64be(varName: string, options: ParserOptions = {}): this { this.bigIntVersionCheck(); - return this.primitiveN('uint64be', varName, options); + return this.primitiveN("uint64be", varName, options); } - uint64le(varName: string, options?: ParserOptions) { + + uint64le(varName: string, options: ParserOptions = {}): this { this.bigIntVersionCheck(); - return this.primitiveN('uint64le', varName, options); + return this.primitiveN("uint64le", varName, options); } - floatle(varName: string, options?: ParserOptions) { - return this.primitiveN('floatle', varName, options); + floatle(varName: string, options: ParserOptions = {}): this { + return this.primitiveN("floatle", varName, options); } - floatbe(varName: string, options?: ParserOptions) { - return this.primitiveN('floatbe', varName, options); + + floatbe(varName: string, options: ParserOptions = {}): this { + return this.primitiveN("floatbe", varName, options); } - doublele(varName: string, options?: ParserOptions) { - return this.primitiveN('doublele', varName, options); + doublele(varName: string, options: ParserOptions = {}): this { + return this.primitiveN("doublele", varName, options); } - doublebe(varName: string, options?: ParserOptions) { - return this.primitiveN('doublebe', varName, options); + + doublebe(varName: string, options: ParserOptions = {}): this { + return this.primitiveN("doublebe", varName, options); } - private bitN(size: BitSizes, varName: string, options?: ParserOptions) { - if (!options) { - options = {}; - } + private bitN(size: BitSizes, varName: string, options: ParserOptions): this { options.length = size; - return this.setNextParser('bit', varName, options); + return this.setNextParser("bit", varName, options); } - bit1(varName: string, options?: ParserOptions) { + + bit1(varName: string, options: ParserOptions = {}): this { return this.bitN(1, varName, options); } - bit2(varName: string, options?: ParserOptions) { + + bit2(varName: string, options: ParserOptions = {}): this { return this.bitN(2, varName, options); } - bit3(varName: string, options?: ParserOptions) { + + bit3(varName: string, options: ParserOptions = {}): this { return this.bitN(3, varName, options); } - bit4(varName: string, options?: ParserOptions) { + + bit4(varName: string, options: ParserOptions = {}): this { return this.bitN(4, varName, options); } - bit5(varName: string, options?: ParserOptions) { + + bit5(varName: string, options: ParserOptions = {}): this { return this.bitN(5, varName, options); } - bit6(varName: string, options?: ParserOptions) { + + bit6(varName: string, options: ParserOptions = {}): this { return this.bitN(6, varName, options); } - bit7(varName: string, options?: ParserOptions) { + + bit7(varName: string, options: ParserOptions = {}): this { return this.bitN(7, varName, options); } - bit8(varName: string, options?: ParserOptions) { + + bit8(varName: string, options: ParserOptions = {}): this { return this.bitN(8, varName, options); } - bit9(varName: string, options?: ParserOptions) { + + bit9(varName: string, options: ParserOptions = {}): this { return this.bitN(9, varName, options); } - bit10(varName: string, options?: ParserOptions) { + + bit10(varName: string, options: ParserOptions = {}): this { return this.bitN(10, varName, options); } - bit11(varName: string, options?: ParserOptions) { + + bit11(varName: string, options: ParserOptions = {}): this { return this.bitN(11, varName, options); } - bit12(varName: string, options?: ParserOptions) { + + bit12(varName: string, options: ParserOptions = {}): this { return this.bitN(12, varName, options); } - bit13(varName: string, options?: ParserOptions) { + + bit13(varName: string, options: ParserOptions = {}): this { return this.bitN(13, varName, options); } - bit14(varName: string, options?: ParserOptions) { + + bit14(varName: string, options: ParserOptions = {}): this { return this.bitN(14, varName, options); } - bit15(varName: string, options?: ParserOptions) { + + bit15(varName: string, options: ParserOptions = {}): this { return this.bitN(15, varName, options); } - bit16(varName: string, options?: ParserOptions) { + + bit16(varName: string, options: ParserOptions = {}): this { return this.bitN(16, varName, options); } - bit17(varName: string, options?: ParserOptions) { + + bit17(varName: string, options: ParserOptions = {}): this { return this.bitN(17, varName, options); } - bit18(varName: string, options?: ParserOptions) { + + bit18(varName: string, options: ParserOptions = {}): this { return this.bitN(18, varName, options); } - bit19(varName: string, options?: ParserOptions) { + + bit19(varName: string, options: ParserOptions = {}): this { return this.bitN(19, varName, options); } - bit20(varName: string, options?: ParserOptions) { + + bit20(varName: string, options: ParserOptions = {}): this { return this.bitN(20, varName, options); } - bit21(varName: string, options?: ParserOptions) { + + bit21(varName: string, options: ParserOptions = {}): this { return this.bitN(21, varName, options); } - bit22(varName: string, options?: ParserOptions) { + + bit22(varName: string, options: ParserOptions = {}): this { return this.bitN(22, varName, options); } - bit23(varName: string, options?: ParserOptions) { + + bit23(varName: string, options: ParserOptions = {}): this { return this.bitN(23, varName, options); } - bit24(varName: string, options?: ParserOptions) { + + bit24(varName: string, options: ParserOptions = {}): this { return this.bitN(24, varName, options); } - bit25(varName: string, options?: ParserOptions) { + + bit25(varName: string, options: ParserOptions = {}): this { return this.bitN(25, varName, options); } - bit26(varName: string, options?: ParserOptions) { + + bit26(varName: string, options: ParserOptions = {}): this { return this.bitN(26, varName, options); } - bit27(varName: string, options?: ParserOptions) { + + bit27(varName: string, options: ParserOptions = {}): this { return this.bitN(27, varName, options); } - bit28(varName: string, options?: ParserOptions) { + + bit28(varName: string, options: ParserOptions = {}): this { return this.bitN(28, varName, options); } - bit29(varName: string, options?: ParserOptions) { + + bit29(varName: string, options: ParserOptions = {}): this { return this.bitN(29, varName, options); } - bit30(varName: string, options?: ParserOptions) { + + bit30(varName: string, options: ParserOptions = {}): this { return this.bitN(30, varName, options); } - bit31(varName: string, options?: ParserOptions) { + + bit31(varName: string, options: ParserOptions = {}): this { return this.bitN(31, varName, options); } - bit32(varName: string, options?: ParserOptions) { + + bit32(varName: string, options: ParserOptions = {}): this { return this.bitN(32, varName, options); } - namely(alias: string) { - aliasRegistry[alias] = this; + namely(alias: string): this { + aliasRegistry.set(alias, this); this.alias = alias; return this; } - skip(length: number, options?: ParserOptions) { + skip(length: ParserOptions["length"], options: ParserOptions = {}): this { return this.seek(length, options); } - seek(relOffset: number | ((item: any) => number), options?: ParserOptions) { - if (options && options.assert) { - throw new Error('assert option on seek is not allowed.'); + seek(relOffset: ParserOptions["length"], options: ParserOptions = {}): this { + if (options.assert) { + throw new Error("assert option on seek is not allowed."); } - return this.setNextParser('seek', '', { length: relOffset }); + return this.setNextParser("seek", "", { length: relOffset }); } - string(varName: string, options: ParserOptions) { + string(varName: string, options: ParserOptions): this { if (!options.zeroTerminated && !options.length && !options.greedy) { throw new Error( - 'Neither length, zeroTerminated, nor greedy is defined for string.' + "One of length, zeroTerminated, or greedy must be defined for string.", ); } + if ((options.zeroTerminated || options.length) && options.greedy) { throw new Error( - 'greedy is mutually exclusive with length and zeroTerminated for string.' + "greedy is mutually exclusive with length and zeroTerminated for string.", ); } + if (options.stripNull && !(options.length || options.greedy)) { throw new Error( - 'Length or greedy must be defined if stripNull is defined.' + "length or greedy must be defined if stripNull is enabled.", ); } - options.encoding = options.encoding || 'utf8'; - return this.setNextParser('string', varName, options); + options.encoding = options.encoding || "utf8"; + + return this.setNextParser("string", varName, options); } - buffer(varName: string, options: ParserOptions) { + buffer(varName: string, options: ParserOptions): this { if (!options.length && !options.readUntil) { - throw new Error('Length nor readUntil is defined in buffer parser'); + throw new Error("length or readUntil must be defined for buffer."); } - return this.setNextParser('buffer', varName, options); + return this.setNextParser("buffer", varName, options); } - array(varName: string, options: ParserOptions) { + wrapped(varName: string | ParserOptions, options?: ParserOptions): this { + if (typeof options !== "object" && typeof varName === "object") { + options = varName; + varName = ""; + } + + if (!options || !options.wrapper || !options.type) { + throw new Error("Both wrapper and type must be defined for wrapped."); + } + + if (!options.length && !options.readUntil) { + throw new Error("length or readUntil must be defined for wrapped."); + } + + return this.setNextParser("wrapper", varName as string, options); + } + + array(varName: string, options: ParserOptions): this { if (!options.readUntil && !options.length && !options.lengthInBytes) { - throw new Error('Length option of array is not defined.'); + throw new Error( + "One of readUntil, length and lengthInBytes must be defined for array.", + ); } + if (!options.type) { - throw new Error('Type option of array is not defined.'); + throw new Error("type is required for array."); } + if ( - typeof options.type === 'string' && - !aliasRegistry[options.type] && - Object.keys(PRIMITIVE_SIZES).indexOf(options.type) < 0 + typeof options.type === "string" && + !aliasRegistry.has(options.type) && + !(options.type in PRIMITIVE_SIZES) ) { - throw new Error( - `Specified primitive type "${options.type}" is not supported.` - ); + throw new Error(`Array element type "${options.type}" is unknown.`); } - return this.setNextParser('array', varName, options); + return this.setNextParser("array", varName, options); } - choice(varName: string | ParserOptions, options?: ParserOptions) { - if (typeof options !== 'object' && typeof varName === 'object') { + choice(varName: string | ParserOptions, options?: ParserOptions): this { + if (typeof options !== "object" && typeof varName === "object") { options = varName; - varName = null; + varName = ""; + } + + if (!options) { + throw new Error("tag and choices are are required for choice."); } if (!options.tag) { - throw new Error('Tag option of array is not defined.'); + throw new Error("tag is requird for choice."); } + if (!options.choices) { - throw new Error('Choices option of array is not defined.'); + throw new Error("choices is required for choice."); } - Object.keys(options.choices).forEach((keyString: string) => { + for (const keyString in options.choices) { const key = parseInt(keyString, 10); const value = options.choices[key]; if (isNaN(key)) { - throw new Error('Key of choices must be a number.'); - } - - if (!value) { - throw new Error(`Choice Case ${keyString} of ${varName} is not valid.`); + throw new Error(`Choice key "${keyString}" is not a number.`); } if ( - typeof value === 'string' && - !aliasRegistry[value] && - Object.keys(PRIMITIVE_SIZES).indexOf(value) < 0 + typeof value === "string" && + !aliasRegistry.has(value) && + !((value as string) in PRIMITIVE_SIZES) ) { - throw new Error( - `Specified primitive type "${value}" is not supported.` - ); + throw new Error(`Choice type "${value}" is unknown.`); } - }); + } - return this.setNextParser('choice', varName as string, options); + return this.setNextParser("choice", varName as string, options); } - nest(varName: string | ParserOptions, options: ParserOptions) { - if (typeof options !== 'object' && typeof varName === 'object') { + nest(varName: string | ParserOptions, options?: ParserOptions): this { + if (typeof options !== "object" && typeof varName === "object") { options = varName; - varName = null; + varName = ""; } - if (!options.type) { - throw new Error('Type option of nest is not defined.'); + if (!options || !options.type) { + throw new Error("type is required for nest."); } - if (!(options.type instanceof Parser) && !aliasRegistry[options.type]) { - throw new Error('Type option of nest must be a Parser object.'); + + if (!(options.type instanceof Parser) && !aliasRegistry.has(options.type)) { + throw new Error("type must be a known parser name or a Parser object."); } + if (!(options.type instanceof Parser) && !varName) { throw new Error( - 'options.type must be a object if variable name is omitted.' + "type must be a Parser object if the variable name is omitted.", ); } - return this.setNextParser('nest', varName as string, options); + return this.setNextParser("nest", varName as string, options); } - pointer(varName: string, options?: ParserOptions) { + pointer(varName: string, options: ParserOptions): this { if (!options.offset) { - throw new Error('Offset option of pointer is not defined.'); + throw new Error("offset is required for pointer."); } if (!options.type) { - throw new Error('Type option of pointer is not defined.'); - } else if (typeof options.type === 'string') { - if ( - Object.keys(PRIMITIVE_SIZES).indexOf(options.type) < 0 && - !aliasRegistry[options.type] - ) { - throw new Error( - 'Specified type "' + options.type + '" is not supported.' - ); - } - } else if (options.type instanceof Parser) { - } else { - throw new Error( - 'Type option of pointer must be a string or a Parser object.' - ); + throw new Error("type is required for pointer."); } - return this.setNextParser('pointer', varName, options); + if ( + typeof options.type === "string" && + !(options.type in PRIMITIVE_SIZES) && + !aliasRegistry.has(options.type) + ) { + throw new Error(`Pointer type "${options.type}" is unknown.`); + } + + return this.setNextParser("pointer", varName, options); } - saveOffset(varName: string, options?: ParserOptions) { - return this.setNextParser('saveOffset', varName, options); + saveOffset(varName: string, options: ParserOptions = {}): this { + return this.setNextParser("saveOffset", varName, options); } - endianess(endianess: 'little' | 'big') { - switch (endianess.toLowerCase()) { - case 'little': - this.endian = 'le'; + endianness(endianness: "little" | "big"): this { + switch (endianness.toLowerCase()) { + case "little": + this.endian = "le"; break; - case 'big': - this.endian = 'be'; + case "big": + this.endian = "be"; break; default: - throw new Error(`Invalid endianess: ${endianess}`); + throw new Error('endianness must be one of "little" or "big"'); } return this; @@ -636,12 +809,23 @@ export class Parser { encoderSetOptions(opts: EncoderOptions) { Object.assign(this.encoderOpts, opts); + return this; } - create(constructorFn: Function) { + endianess(endianess: "little" | "big"): this { + return this.endianness(endianess); + } + + useContextVars(useContextVariables = true): this { + this.useContextVariables = useContextVariables; + + return this; + } + + create(constructorFn: Function): this { if (!(constructorFn instanceof Function)) { - throw new Error('Constructor must be a Function object.'); + throw new Error("Constructor must be a Function object."); } this.constructorFn = constructorFn; @@ -649,11 +833,11 @@ export class Parser { return this; } - private getContext(importPath?: string) { - const ctx = new Context(importPath); + private getContext(importPath: string): Context { + const ctx = new Context(importPath, this.useContextVariables); ctx.pushCode( - 'var dataView = new DataView(buffer.buffer, buffer.byteOffset, buffer.length);' + "var dataView = new DataView(buffer.buffer, buffer.byteOffset, buffer.length);", ); if (!this.alias) { @@ -666,16 +850,17 @@ export class Parser { return ctx; } - getCode() { - return this.getContext().code; + getCode(): string { + const importPath = "imports"; + return this.getContext(importPath).code; } - private getContextEncode(importPath?: string) { - const ctx = new Context(importPath); + private getContextEncode(importPath: string) { + const ctx = new Context(importPath, this.useContextVariables); ctx.pushCode('if (!obj || typeof obj !== "object") {'); ctx.generateError('"argument obj is not an object"'); - ctx.pushCode('}'); + ctx.pushCode("}"); if (!this.alias) { this.addRawCodeEncode(ctx); @@ -688,73 +873,91 @@ export class Parser { } getCodeEncode() { - return this.getContextEncode().code; + return this.getContextEncode("").code; // TODO: Not sure "" is a valid input here } private addRawCode(ctx: Context) { - ctx.pushCode('var offset = 0;'); + ctx.pushCode("var offset = 0;"); + ctx.pushCode( + `var vars = ${this.constructorFn ? "new constructorFn()" : "{}"};`, + ); - if (this.constructorFn) { - ctx.pushCode('var vars = new constructorFn();'); - } else { - ctx.pushCode('var vars = {};'); - } + ctx.pushCode("vars.$parent = null;"); + ctx.pushCode("vars.$root = vars;"); this.generate(ctx); - this.resolveReferences(ctx); - ctx.pushCode('return vars;'); + ctx.pushCode("delete vars.$parent;"); + ctx.pushCode("delete vars.$root;"); + + ctx.pushCode("return vars;"); } private addRawCodeEncode(ctx: Context) { - ctx.pushCode('var vars = obj;'); + ctx.pushCode("var vars = obj || {};"); + ctx.pushCode("vars.$parent = null;"); + ctx.pushCode("vars.$root = vars;"); + ctx.pushCode( - `var smartBuffer = SmartBuffer.fromOptions({size: ${this.smartBufferSize}, encoding: "utf8"});` + `var smartBuffer = SmartBuffer.fromOptions({size: ${this.smartBufferSize}, encoding: "utf8"});`, ); this.generateEncode(ctx); - this.resolveReferences(ctx, 'encode'); + ctx.pushCode("delete vars.$parent;"); + ctx.pushCode("delete vars.$root;"); - ctx.pushCode('return smartBuffer.toBuffer();'); + this.resolveReferences(ctx, "encode"); + + ctx.pushCode("return smartBuffer.toBuffer();"); } private addAliasedCode(ctx: Context) { - ctx.pushCode(`function ${FUNCTION_PREFIX + this.alias}(offset) {`); - - if (this.constructorFn) { - ctx.pushCode('var vars = new constructorFn();'); - } else { - ctx.pushCode('var vars = {};'); - } + ctx.pushCode(`function ${FUNCTION_PREFIX + this.alias}(offset, context) {`); + ctx.pushCode( + `var vars = ${this.constructorFn ? "new constructorFn()" : "{}"};`, + ); + ctx.pushCode( + "var ctx = Object.assign({$parent: null, $root: vars}, context || {});", + ); + ctx.pushCode(`vars = Object.assign(vars, ctx);`); this.generate(ctx); - ctx.markResolved(this.alias); + ctx.markResolved(this.alias!); this.resolveReferences(ctx); - ctx.pushCode('return { offset: offset, result: vars };'); - ctx.pushCode('}'); + ctx.pushCode( + "Object.keys(ctx).forEach(function (item) { delete vars[item]; });", + ); + ctx.pushCode("return { offset: offset, result: vars };"); + ctx.pushCode("}"); return ctx; } private addAliasedCodeEncode(ctx: Context) { - ctx.pushCode(`function ${FUNCTION_ENCODE_PREFIX + this.alias}(obj) {`); + ctx.pushCode( + `function ${FUNCTION_ENCODE_PREFIX + this.alias}(obj, context) {`, + ); - ctx.pushCode('var vars = obj;'); + ctx.pushCode("var vars = obj || {};"); ctx.pushCode( - `var smartBuffer = SmartBuffer.fromOptions({size: ${this.smartBufferSize}, encoding: "utf8"});` + "var ctx = Object.assign({$parent: null, $root: vars}, context || {});", + ); + ctx.pushCode(`vars = Object.assign(vars, ctx);`); + ctx.pushCode( + `var smartBuffer = SmartBuffer.fromOptions({size: ${this.smartBufferSize}, encoding: "utf8"});`, ); this.generateEncode(ctx); - ctx.markResolved(this.alias); - this.resolveReferences(ctx, 'encode'); + ctx.markResolved(this.alias!); + this.resolveReferences(ctx, "encode"); - ctx.pushCode('return smartBuffer.toBuffer();'); - ctx.pushCode('}'); + ctx.pushCode("return { result: smartBuffer.toBuffer() };"); + ctx.pushCode("}"); return ctx; } @@ -763,46 +966,41 @@ export class Parser { const references = ctx.getUnresolvedReferences(); ctx.markRequested(references); references.forEach((alias) => { - const parser = aliasRegistry[alias]; + const parser = aliasRegistry.get(alias); if (encode) { - parser.addAliasedCodeEncode(ctx); + parser?.addAliasedCodeEncode(ctx); } else { - parser.addAliasedCode(ctx); + parser?.addAliasedCode(ctx); } }); } compile() { - const importPath = 'imports'; + const importPath = "imports"; const ctx = this.getContext(importPath); this.compiled = new Function( importPath, - 'TextDecoder', - `return function (buffer, constructorFn) { ${ctx.code} };` - )( - ctx.imports, - typeof TextDecoder === 'undefined' - ? require('util').TextDecoder - : TextDecoder - ); + "TextDecoder", + `return function (buffer, constructorFn) { ${ctx.code} };`, + )(ctx.imports, TextDecoder); } compileEncode() { - const importPath = 'imports'; + const importPath = "imports"; const ctx = this.getContextEncode(importPath); this.compiledEncode = new Function( importPath, - 'TextDecoder', - 'SmartBuffer', - `return function (obj) { ${ctx.code} };` + "TextDecoder", + "SmartBuffer", + `return function (obj) { ${ctx.code} };`, )( ctx.imports, - typeof TextDecoder === 'undefined' - ? require('util').TextDecoder + typeof TextDecoder === "undefined" + ? require("util").TextDecoder : TextDecoder, - typeof SmartBuffer === 'undefined' - ? require('smart-buffer').SmartBuffer - : SmartBuffer + typeof SmartBuffer === "undefined" + ? require("smart-buffer").SmartBuffer + : SmartBuffer, ); } @@ -814,25 +1012,25 @@ export class Parser { // if this is a fixed length string } else if ( - this.type === 'string' && - typeof this.options.length === 'number' + this.type === "string" && + typeof this.options.length === "number" ) { size = this.options.length; // if this is a fixed length buffer } else if ( - this.type === 'buffer' && - typeof this.options.length === 'number' + this.type === "buffer" && + typeof this.options.length === "number" ) { size = this.options.length; // if this is a fixed length array } else if ( - this.type === 'array' && - typeof this.options.length === 'number' + this.type === "array" && + typeof this.options.length === "number" ) { let elementSize = NaN; - if (typeof this.options.type === 'string') { + if (typeof this.options.type === "string") { elementSize = PRIMITIVE_SIZES[this.options.type as PrimitiveTypes]; } else if (this.options.type instanceof Parser) { elementSize = this.options.type.sizeOf(); @@ -840,11 +1038,11 @@ export class Parser { size = this.options.length * elementSize; // if this a skip - } else if (this.type === 'seek') { + } else if (this.type === "seek") { size = this.options.length as number; // if this is a nested parser - } else if (this.type === 'nest') { + } else if (this.type === "nest") { size = (this.options.type as Parser).sizeOf(); } else if (!this.type) { size = 0; @@ -863,7 +1061,7 @@ export class Parser { this.compile(); } - return this.compiled(buffer, this.constructorFn); + return this.compiled!(buffer, this.constructorFn); } // Follow the parser chain till the root and start encoding from there @@ -872,15 +1070,23 @@ export class Parser { this.compileEncode(); } - return this.compiledEncode(obj); + const encoded = this.compiledEncode!(obj); + if (encoded.result) { + return encoded.result; + } + return encoded; } - private setNextParser(type: Types, varName: string, options: ParserOptions) { + private setNextParser( + type: Types, + varName: string, + options: ParserOptions, + ): this { const parser = new Parser(); parser.type = type; parser.varName = varName; - parser.options = options || parser.options; + parser.options = options; parser.endian = this.endian; parser.encoderOpts = this.encoderOpts; @@ -898,59 +1104,62 @@ export class Parser { private generate(ctx: Context) { if (this.type) { switch (this.type) { - case 'uint8': - case 'uint16le': - case 'uint16be': - case 'uint32le': - case 'uint32be': - case 'int8': - case 'int16le': - case 'int16be': - case 'int32le': - case 'int32be': - case 'int64be': - case 'int64le': - case 'uint64be': - case 'uint64le': - case 'floatle': - case 'floatbe': - case 'doublele': - case 'doublebe': + case "uint8": + case "uint16le": + case "uint16be": + case "uint32le": + case "uint32be": + case "int8": + case "int16le": + case "int16be": + case "int32le": + case "int32be": + case "int64be": + case "int64le": + case "uint64be": + case "uint64le": + case "floatle": + case "floatbe": + case "doublele": + case "doublebe": this.primitiveGenerateN(this.type, ctx); break; - case 'bit': + case "bit": this.generateBit(ctx); break; - case 'string': + case "string": this.generateString(ctx); break; - case 'buffer': + case "buffer": this.generateBuffer(ctx); break; - case 'seek': + case "seek": this.generateSeek(ctx); break; - case 'nest': + case "nest": this.generateNest(ctx); break; - case 'array': + case "array": this.generateArray(ctx); break; - case 'choice': + case "choice": this.generateChoice(ctx); break; - case 'pointer': + case "pointer": this.generatePointer(ctx); break; - case 'saveOffset': + case "saveOffset": this.generateSaveOffset(ctx); break; + case "wrapper": + this.generateWrapper(ctx); + break; } - this.generateAssert(ctx); + if (this.type !== "bit") this.generateAssert(ctx); } const varName = ctx.generateVariable(this.varName); - if (this.options.formatter) { + if (this.options.formatter && this.type !== "bit") { this.generateFormatter(ctx, varName, this.options.formatter); } @@ -969,51 +1178,51 @@ export class Parser { if (this.type) { switch (this.type) { - case 'uint8': - case 'uint16le': - case 'uint16be': - case 'uint32le': - case 'uint32be': - case 'int8': - case 'int16le': - case 'int16be': - case 'int32le': - case 'int32be': - case 'int64be': - case 'int64le': - case 'uint64be': - case 'uint64le': - case 'floatle': - case 'floatbe': - case 'doublele': - case 'doublebe': + case "uint8": + case "uint16le": + case "uint16be": + case "uint32le": + case "uint32be": + case "int8": + case "int16le": + case "int16be": + case "int32le": + case "int32be": + case "int64be": + case "int64le": + case "uint64be": + case "uint64le": + case "floatle": + case "floatbe": + case "doublele": + case "doublebe": this.primitiveGenerate_encodeN(this.type, ctx); break; - case 'bit': + case "bit": this.generate_encodeBit(ctx); break; - case 'string': + case "string": this.generate_encodeString(ctx); break; - case 'buffer': + case "buffer": this.generate_encodeBuffer(ctx); break; - case 'seek': + case "seek": this.generate_encodeSeek(ctx); break; - case 'nest': + case "nest": this.generate_encodeNest(ctx); break; - case 'array': + case "array": this.generate_encodeArray(ctx); break; - case 'choice': + case "choice": this.generate_encodeChoice(ctx); break; - case 'pointer': + case "pointer": this.generate_encodePointer(ctx); break; - case 'saveOffset': + case "saveOffset": this.generate_encodeSaveOffset(ctx); break; } @@ -1037,29 +1246,35 @@ export class Parser { const varName = ctx.generateVariable(this.varName); switch (typeof this.options.assert) { - case 'function': - const func = ctx.addImport(this.options.assert); - ctx.pushCode(`if (!${func}.call(vars, ${varName})) {`); + case "function": + { + const func = ctx.addImport(this.options.assert); + ctx.pushCode(`if (!${func}.call(vars, ${varName})) {`); + } break; - case 'number': + case "number": ctx.pushCode(`if (${this.options.assert} !== ${varName}) {`); break; - case 'string': - ctx.pushCode(`if ("${this.options.assert}" !== ${varName}) {`); + case "string": + ctx.pushCode( + `if (${JSON.stringify(this.options.assert)} !== ${varName}) {`, + ); break; default: throw new Error( - 'Assert option supports only strings, numbers and assert functions.' + "assert option must be a string, number or a function.", ); } ctx.generateError( - `"Assert error: ${varName} is " + ${this.options.assert}` + `"Assertion error: ${varName} is " + ${JSON.stringify( + this.options.assert.toString(), + )}`, ); - ctx.pushCode('}'); + ctx.pushCode("}"); } // Recursively call code generators and append results - private generateNext(ctx: Context) { + private generateNext(ctx: Context): Context { if (this.next) { ctx = this.next.generate(ctx); } @@ -1076,56 +1291,123 @@ export class Parser { return ctx; } + private nextNotBit() { + // Used to test if next type is a bitN or not + if (this.next) { + if (this.next.type === "nest") { + // For now consider a nest as a bit + if (this.next.options && this.next.options.type instanceof Parser) { + // Something in the nest + if (this.next.options.type.next) { + return this.next.options.type.next.type !== "bit"; + } + return false; + } else { + // Nest is empty. For now assume this means bit is not next. However what if something comes after the nest? + return true; + } + } else { + return this.next.type !== "bit"; + } + } else { + // Nothing else so next can't be bits + return true; + } + } + private generateBit(ctx: Context) { // TODO find better method to handle nested bit fields const parser = JSON.parse(JSON.stringify(this)); + parser.options = this.options; + parser.generateAssert = this.generateAssert.bind(this); + parser.generateFormatter = this.generateFormatter.bind(this); parser.varName = ctx.generateVariable(parser.varName); ctx.bitFields.push(parser); - if ( - !this.next || - (this.next && ['bit', 'nest'].indexOf(this.next.type) < 0) - ) { - let sum = 0; - ctx.bitFields.forEach( - (parser) => (sum += parser.options.length as number) - ); - + if (!this.next || this.nextNotBit()) { const val = ctx.generateTmpVariable(); - if (sum <= 8) { - ctx.pushCode(`var ${val} = dataView.getUint8(offset);`); - sum = 8; - } else if (sum <= 16) { - ctx.pushCode(`var ${val} = dataView.getUint16(offset);`); - sum = 16; - } else if (sum <= 24) { - const val1 = ctx.generateTmpVariable(); - const val2 = ctx.generateTmpVariable(); - ctx.pushCode(`var ${val1} = dataView.getUint16(offset);`); - ctx.pushCode(`var ${val2} = dataView.getUint8(offset + 2);`); - ctx.pushCode(`var ${val} = (${val1} << 8) | ${val2};`); - sum = 24; - } else if (sum <= 32) { - ctx.pushCode(`var ${val} = dataView.getUint32(offset);`); - sum = 32; - } else { - throw new Error( - 'Currently, bit field sequence longer than 4-bytes is not supported.' - ); - } - ctx.pushCode(`offset += ${sum / 8};`); + ctx.pushCode(`var ${val} = 0;`); + + const getMaxBits = (from = 0) => { + let sum = 0; + for (let i = from; i < ctx.bitFields.length; i++) { + const length = ctx.bitFields[i].options.length as number; + if (sum + length > 32) break; + sum += length; + } + return sum; + }; + + const getBytes = (sum: number) => { + if (sum <= 8) { + ctx.pushCode(`${val} = dataView.getUint8(offset);`); + sum = 8; + } else if (sum <= 16) { + ctx.pushCode(`${val} = dataView.getUint16(offset);`); + sum = 16; + } else if (sum <= 24) { + ctx.pushCode( + `${val} = (dataView.getUint16(offset) << 8) | dataView.getUint8(offset + 2);`, + ); + sum = 24; + } else { + ctx.pushCode(`${val} = dataView.getUint32(offset);`); + sum = 32; + } + ctx.pushCode(`offset += ${sum / 8};`); + return sum; + }; let bitOffset = 0; - const isBigEndian = this.endian === 'be'; + const isBigEndian = this.endian === "be"; - ctx.bitFields.forEach((parser) => { - const length = parser.options.length as number; + let sum = 0; + let rem = 0; + + ctx.bitFields.forEach((parser, i) => { + let length = parser.options.length as number; + if (length > rem) { + if (rem) { + const mask = -1 >>> (32 - rem); + ctx.pushCode( + `${parser.varName} = (${val} & 0x${mask.toString(16)}) << ${ + length - rem + };`, + ); + length -= rem; + } + bitOffset = 0; + rem = sum = getBytes(getMaxBits(i) - rem); + } const offset = isBigEndian ? sum - bitOffset - length : bitOffset; - const mask = (1 << length) - 1; + const mask = -1 >>> (32 - length); + + ctx.pushCode( + `${parser.varName} ${ + length < (parser.options.length as number) ? "|=" : "=" + } ${val} >> ${offset} & 0x${mask.toString(16)};`, + ); + + // Ensure value is unsigned + if ((parser.options.length as number) === 32) { + ctx.pushCode(`${parser.varName} >>>= 0`); + } + + if (parser.options.assert) { + parser.generateAssert(ctx); + } + + if (parser.options.formatter) { + parser.generateFormatter( + ctx, + parser.varName, + parser.options.formatter, + ); + } - ctx.pushCode(`${parser.varName} = ${val} >> ${offset} & ${mask};`); bitOffset += length; + rem -= length; }); ctx.bitFields = []; @@ -1140,7 +1422,7 @@ export class Parser { if ( !this.next || - (this.next && ['bit', 'nest'].indexOf(this.next.type) < 0) + (this.next && ["bit", "nest"].indexOf(this.next.type) < 0) ) { let sum = 0; ctx.bitFields.forEach((parser) => { @@ -1157,12 +1439,12 @@ export class Parser { sum = 32; } else { throw new Error( - 'Currently, bit field sequences longer than 4-bytes is not supported.' + "Currently, bit field sequences longer than 4-bytes is not supported.", ); } const isBitLittleEndian = - this.endian === 'le' && this.encoderOpts.bitEndianess; + this.endian === "le" && this.encoderOpts.bitEndianess; const tmpVal = ctx.generateTmpVariable(); const boundVal = ctx.generateTmpVariable(); ctx.pushCode(`var ${tmpVal} = 0;`); @@ -1172,14 +1454,14 @@ export class Parser { ctx.pushCode( `${boundVal} = (${parser.varName} & ${ (1 << (parser.options.length as number)) - 1 - });` + });`, ); ctx.pushCode( `${tmpVal} |= (${boundVal} << ${ isBitLittleEndian ? bitOffset : sum - (parser.options.length as number) - bitOffset - });` + });`, ); ctx.pushCode(`${tmpVal} = ${tmpVal} >>> 0;`); bitOffset += parser.options.length as number; @@ -1204,58 +1486,58 @@ export class Parser { } private generateSeek(ctx: Context) { - const length = ctx.generateOption(this.options.length); + const length = ctx.generateOption(this.options.length!); ctx.pushCode(`offset += ${length};`); } private generate_encodeSeek(ctx: Context) { - const length = ctx.generateOption(this.options.length); + const length = ctx.generateOption(this.options.length!); ctx.pushCode(`smartBuffer.writeBuffer(Buffer.alloc(${length}));`); } private generateString(ctx: Context) { const name = ctx.generateVariable(this.varName); const start = ctx.generateTmpVariable(); - const encoding = this.options.encoding; - const isHex = encoding.toLowerCase() === 'hex'; + const encoding = this.options.encoding!; + const isHex = encoding.toLowerCase() === "hex"; const toHex = 'b => b.toString(16).padStart(2, "0")'; if (this.options.length && this.options.zeroTerminated) { const len = this.options.length; ctx.pushCode(`var ${start} = offset;`); ctx.pushCode( - `while(dataView.getUint8(offset++) !== 0 && offset - ${start} < ${len});` + `while(dataView.getUint8(offset++) !== 0 && offset - ${start} < ${len});`, ); //const end = `offset - ${start} < ${len} ? offset - 1 : offset`; - const end = 'dataView.getUint8(offset -1) == 0 ? offset - 1 : offset'; + const end = "dataView.getUint8(offset -1) == 0 ? offset - 1 : offset"; ctx.pushCode( isHex ? `${name} = Array.from(buffer.subarray(${start}, ${end}), ${toHex}).join('');` - : `${name} = new TextDecoder('${encoding}').decode(buffer.subarray(${start}, ${end}));` + : `${name} = new TextDecoder('${encoding}').decode(buffer.subarray(${start}, ${end}));`, ); } else if (this.options.length) { const len = ctx.generateOption(this.options.length); ctx.pushCode( isHex ? `${name} = Array.from(buffer.subarray(offset, offset + ${len}), ${toHex}).join('');` - : `${name} = new TextDecoder('${encoding}').decode(buffer.subarray(offset, offset + ${len}));` + : `${name} = new TextDecoder('${encoding}').decode(buffer.subarray(offset, offset + ${len}));`, ); ctx.pushCode(`offset += ${len};`); } else if (this.options.zeroTerminated) { ctx.pushCode(`var ${start} = offset;`); - ctx.pushCode('while(dataView.getUint8(offset++) !== 0);'); + ctx.pushCode("while(dataView.getUint8(offset++) !== 0);"); ctx.pushCode( isHex - ? `${name} = Array.from(buffer.subarray(${start}, offset - 1)), ${toHex}).join('');` - : `${name} = new TextDecoder('${encoding}').decode(buffer.subarray(${start}, offset - 1));` + ? `${name} = Array.from(buffer.subarray(${start}, offset - 1), ${toHex}).join('');` + : `${name} = new TextDecoder('${encoding}').decode(buffer.subarray(${start}, offset - 1));`, ); } else if (this.options.greedy) { ctx.pushCode(`var ${start} = offset;`); - ctx.pushCode('while(buffer.length > offset++);'); + ctx.pushCode("while(buffer.length > offset++);"); ctx.pushCode( isHex - ? `${name} = Array.from(buffer.subarray(${start}, offset)), ${toHex}).join('');` - : `${name} = new TextDecoder('${encoding}').decode(buffer.subarray(${start}, offset));` + ? `${name} = Array.from(buffer.subarray(${start}, offset), ${toHex}).join('');` + : `${name} = new TextDecoder('${encoding}').decode(buffer.subarray(${start}, offset));`, ); } if (this.options.stripNull) { @@ -1275,7 +1557,7 @@ export class Parser { // Encode the string to a temporary buffer const tmpBuf = ctx.generateTmpVariable(); ctx.pushCode( - `var ${tmpBuf} = Buffer.from(${name}, "${this.options.encoding}");` + `var ${tmpBuf} = Buffer.from(${name}, "${this.options.encoding}");`, ); // Truncate the buffer to specified (Bytes) length ctx.pushCode(`${tmpBuf} = ${tmpBuf}.slice(0, ${optLength});`); @@ -1287,35 +1569,35 @@ export class Parser { ctx.pushCode(`if (${padLen} > 0) { smartBuffer.writeUInt8(0x00); }`); } else { const padCharVar = ctx.generateTmpVariable(); - let padChar = this.options.stripNull ? '\u0000' : ' '; - if (this.options.padd && typeof this.options.padd === 'string') { + let padChar = this.options.stripNull ? "\u0000" : " "; + if (this.options.padd && typeof this.options.padd === "string") { const code = this.options.padd.charCodeAt(0); if (code < 0x80) { padChar = String.fromCharCode(code); } } ctx.pushCode(`${padCharVar} = "${padChar}";`); - if (this.options.padding === 'left') { + if (this.options.padding === "left") { // Add heading padding spaces ctx.pushCode( - `if (${padLen} > 0) {smartBuffer.writeString(${padCharVar}.repeat(${padLen}));}` + `if (${padLen} > 0) {smartBuffer.writeString(${padCharVar}.repeat(${padLen}));}`, ); } // Copy the temporary string buffer to current smartBuffer ctx.pushCode(`smartBuffer.writeBuffer(${tmpBuf});`); - if (this.options.padding !== 'left') { + if (this.options.padding !== "left") { // Add trailing padding spaces ctx.pushCode( - `if (${padLen} > 0) {smartBuffer.writeString(${padCharVar}.repeat(${padLen}));}` + `if (${padLen} > 0) {smartBuffer.writeString(${padCharVar}.repeat(${padLen}));}`, ); } } } else { ctx.pushCode( - `smartBuffer.writeString(${name}, "${this.options.encoding}");` + `smartBuffer.writeString(${name}, "${this.options.encoding}");`, ); if (this.options.zeroTerminated) { - ctx.pushCode('smartBuffer.writeUInt8(0x00);'); + ctx.pushCode("smartBuffer.writeUInt8(0x00);"); } } } @@ -1323,7 +1605,7 @@ export class Parser { private generateBuffer(ctx: Context) { const varName = ctx.generateVariable(this.varName); - if (typeof this.options.readUntil === 'function') { + if (typeof this.options.readUntil === "function") { const pred = this.options.readUntil; const start = ctx.generateTmpVariable(); const cur = ctx.generateTmpVariable(); @@ -1334,15 +1616,15 @@ export class Parser { ctx.pushCode(`${cur} = dataView.getUint8(offset);`); const func = ctx.addImport(pred); ctx.pushCode( - `if (${func}.call(this, ${cur}, buffer.subarray(offset))) break;` + `if (${func}.call(${ctx.generateVariable()}, ${cur}, buffer.subarray(offset))) break;`, ); ctx.pushCode(`offset += 1;`); ctx.pushCode(`}`); ctx.pushCode(`${varName} = buffer.subarray(${start}, offset);`); - } else if (this.options.readUntil === 'eof') { + } else if (this.options.readUntil === "eof") { ctx.pushCode(`${varName} = buffer.subarray(offset);`); } else { - const len = ctx.generateOption(this.options.length); + const len = ctx.generateOption(this.options.length!); ctx.pushCode(`${varName} = buffer.subarray(offset, offset + ${len});`); ctx.pushCode(`offset += ${len};`); @@ -1355,62 +1637,86 @@ export class Parser { private generate_encodeBuffer(ctx: Context) { ctx.pushCode( - `smartBuffer.writeBuffer(${ctx.generateVariable(this.varName)});` + `smartBuffer.writeBuffer(${ctx.generateVariable(this.varName)});`, ); } private generateArray(ctx: Context) { - const length = ctx.generateOption(this.options.length); - const lengthInBytes = ctx.generateOption(this.options.lengthInBytes); + const length = ctx.generateOption(this.options.length!); + const lengthInBytes = ctx.generateOption(this.options.lengthInBytes!); const type = this.options.type; const counter = ctx.generateTmpVariable(); const lhs = ctx.generateVariable(this.varName); const item = ctx.generateTmpVariable(); const key = this.options.key; - const isHash = typeof key === 'string'; + const isHash = typeof key === "string"; if (isHash) { ctx.pushCode(`${lhs} = {};`); } else { ctx.pushCode(`${lhs} = [];`); } - if (typeof this.options.readUntil === 'function') { - ctx.pushCode('do {'); - } else if (this.options.readUntil === 'eof') { + if (typeof this.options.readUntil === "function") { + ctx.pushCode("do {"); + } else if (this.options.readUntil === "eof") { ctx.pushCode( - `for (var ${counter} = 0; offset < buffer.length; ${counter}++) {` + `for (var ${counter} = 0; offset < buffer.length; ${counter}++) {`, ); } else if (lengthInBytes !== undefined) { ctx.pushCode( - `for (var ${counter} = offset + ${lengthInBytes}; offset < ${counter}; ) {` + `for (var ${counter} = offset + ${lengthInBytes}; offset < ${counter}; ) {`, ); } else { ctx.pushCode( - `for (var ${counter} = ${length}; ${counter} > 0; ${counter}--) {` + `for (var ${counter} = ${length}; ${counter} > 0; ${counter}--) {`, ); } - if (typeof type === 'string') { - if (!aliasRegistry[type]) { + if (typeof type === "string") { + if (!aliasRegistry.get(type)) { const typeName = PRIMITIVE_NAMES[type as PrimitiveTypes]; const littleEndian = PRIMITIVE_LITTLE_ENDIANS[type as PrimitiveTypes]; ctx.pushCode( - `var ${item} = dataView.get${typeName}(offset, ${littleEndian});` + `var ${item} = dataView.get${typeName}(offset, ${littleEndian});`, ); ctx.pushCode(`offset += ${PRIMITIVE_SIZES[type as PrimitiveTypes]};`); } else { const tempVar = ctx.generateTmpVariable(); - ctx.pushCode(`var ${tempVar} = ${FUNCTION_PREFIX + type}(offset);`); + ctx.pushCode(`var ${tempVar} = ${FUNCTION_PREFIX + type}(offset, {`); + if (ctx.useContextVariables) { + const parentVar = ctx.generateVariable(); + ctx.pushCode(`$parent: ${parentVar},`); + ctx.pushCode(`$root: ${parentVar}.$root,`); + if (!this.options.readUntil && lengthInBytes === undefined) { + ctx.pushCode(`$index: ${length} - ${counter},`); + } + } + ctx.pushCode(`});`); ctx.pushCode( - `var ${item} = ${tempVar}.result; offset = ${tempVar}.offset;` + `var ${item} = ${tempVar}.result; offset = ${tempVar}.offset;`, ); if (type !== this.alias) ctx.addReference(type); } } else if (type instanceof Parser) { ctx.pushCode(`var ${item} = {};`); - + const parentVar = ctx.generateVariable(); ctx.pushScope(item); + + if (ctx.useContextVariables) { + ctx.pushCode(`${item}.$parent = ${parentVar};`); + ctx.pushCode(`${item}.$root = ${parentVar}.$root;`); + if (!this.options.readUntil && lengthInBytes === undefined) { + ctx.pushCode(`${item}.$index = ${length} - ${counter};`); + } + } + type.generate(ctx); + + if (ctx.useContextVariables) { + ctx.pushCode(`delete ${item}.$parent;`); + ctx.pushCode(`delete ${item}.$root;`); + ctx.pushCode(`delete ${item}.$index;`); + } ctx.popScope(); } @@ -1420,26 +1726,26 @@ export class Parser { ctx.pushCode(`${lhs}.push(${item});`); } - ctx.pushCode('}'); + ctx.pushCode("}"); - if (typeof this.options.readUntil === 'function') { + if (typeof this.options.readUntil === "function") { const pred = this.options.readUntil; const func = ctx.addImport(pred); ctx.pushCode( - `while (!${func}.call(this, ${item}, buffer.subarray(offset)));` + `while (!${func}.call(${ctx.generateVariable()}, ${item}, buffer.subarray(offset)));`, ); } } private generate_encodeArray(ctx: Context) { - const length = ctx.generateOption(this.options.length); - const lengthInBytes = ctx.generateOption(this.options.lengthInBytes); + const length = ctx.generateOption(this.options.length!); + const lengthInBytes = ctx.generateOption(this.options.lengthInBytes!); const type = this.options.type; const name = ctx.generateVariable(this.varName); const item = ctx.generateTmpVariable(); const itemCounter = ctx.generateTmpVariable(); const maxItems = ctx.generateTmpVariable(); - const isHash = typeof this.options.key === 'string'; + const isHash = typeof this.options.key === "string"; if (isHash) { ctx.generateError('"Encoding associative array not supported"'); @@ -1454,7 +1760,7 @@ export class Parser { // and length option) if (length !== undefined) { ctx.pushCode( - `${maxItems} = ${maxItems} > ${length} ? ${length} : ${maxItems}` + `${maxItems} = ${maxItems} > ${length} ? ${length} : ${maxItems}`, ); } @@ -1462,17 +1768,17 @@ export class Parser { const savSmartBuffer = ctx.generateTmpVariable(); ctx.pushCode( `var ${savSmartBuffer} = smartBuffer; ` + - `smartBuffer = SmartBuffer.fromOptions({size: ${this.smartBufferSize}, encoding: "utf8"});` + `smartBuffer = SmartBuffer.fromOptions({size: ${this.smartBufferSize}, encoding: "utf8"});`, ); ctx.pushCode(`if(${maxItems} > 0) {`); ctx.pushCode(`var ${itemCounter} = 0;`); if ( - typeof this.options.encodeUntil === 'function' || - typeof this.options.readUntil === 'function' + typeof this.options.encodeUntil === "function" || + typeof this.options.readUntil === "function" ) { - ctx.pushCode('do {'); + ctx.pushCode("do {"); } else { ctx.pushCode(`for ( ; ${itemCounter} < ${maxItems}; ) {`); } @@ -1480,16 +1786,18 @@ export class Parser { ctx.pushCode(`var ${item} = ${name}[${itemCounter}];`); ctx.pushCode(`${itemCounter}++;`); - if (typeof type === 'string') { - if (!aliasRegistry[type]) { + if (typeof type === "string") { + if (!aliasRegistry.get(type)) { ctx.pushCode( `smartBuffer.write${ CAPITILIZED_TYPE_NAMES[type as PrimitiveTypes] - }(${item});` + }(${item});`, ); } else { ctx.pushCode( - `smartBuffer.writeBuffer(${FUNCTION_ENCODE_PREFIX + type}(${item}));` + `smartBuffer.writeBuffer(${ + FUNCTION_ENCODE_PREFIX + type + }(${item}).result);`, ); if (type !== this.alias) { ctx.addReference(type); @@ -1501,18 +1809,18 @@ export class Parser { ctx.popScope(); } - ctx.pushCode('}'); // End of 'do {' or 'for (...) {' + ctx.pushCode("}"); // End of 'do {' or 'for (...) {' - if (typeof this.options.encodeUntil === 'function') { + if (typeof this.options.encodeUntil === "function") { ctx.pushCode( - ` while (${itemCounter} < ${maxItems} && !(${this.options.encodeUntil}).call(this, ${item}, vars));` + ` while (${itemCounter} < ${maxItems} && !(${this.options.encodeUntil}).call(this, ${item}, vars));`, ); - } else if (typeof this.options.readUntil === 'function') { + } else if (typeof this.options.readUntil === "function") { ctx.pushCode( - ` while (${itemCounter} < ${maxItems} && !(${this.options.readUntil}).call(this, ${item}, ${savSmartBuffer}.toBuffer()));` + ` while (${itemCounter} < ${maxItems} && !(${this.options.readUntil}).call(this, ${item}, ${savSmartBuffer}.toBuffer()));`, ); } - ctx.pushCode('}'); // End of 'if(...) {' + ctx.pushCode("}"); // End of 'if(...) {' const tmpBuffer = ctx.generateTmpVariable(); ctx.pushCode(`var ${tmpBuffer} = smartBuffer.toBuffer()`); @@ -1529,22 +1837,27 @@ export class Parser { private generateChoiceCase( ctx: Context, varName: string, - type: string | Parser + type: string | Parser, ) { - if (typeof type === 'string') { + if (typeof type === "string") { const varName = ctx.generateVariable(this.varName); - if (!aliasRegistry[type]) { + if (!aliasRegistry.has(type)) { const typeName = PRIMITIVE_NAMES[type as PrimitiveTypes]; const littleEndian = PRIMITIVE_LITTLE_ENDIANS[type as PrimitiveTypes]; ctx.pushCode( - `${varName} = dataView.get${typeName}(offset, ${littleEndian});` + `${varName} = dataView.get${typeName}(offset, ${littleEndian});`, ); ctx.pushCode(`offset += ${PRIMITIVE_SIZES[type as PrimitiveTypes]}`); } else { const tempVar = ctx.generateTmpVariable(); - ctx.pushCode(`var ${tempVar} = ${FUNCTION_PREFIX + type}(offset);`); + ctx.pushCode(`var ${tempVar} = ${FUNCTION_PREFIX + type}(offset, {`); + if (ctx.useContextVariables) { + ctx.pushCode(`$parent: ${varName}.$parent,`); + ctx.pushCode(`$root: ${varName}.$root,`); + } + ctx.pushCode(`});`); ctx.pushCode( - `${varName} = ${tempVar}.result; offset = ${tempVar}.offset;` + `${varName} = ${tempVar}.result; offset = ${tempVar}.offset;`, ); if (type !== this.alias) ctx.addReference(type); } @@ -1558,23 +1871,30 @@ export class Parser { private generate_encodeChoiceCase( ctx: Context, varName: string, - type: string | Parser + type: string | Parser, ) { - if (typeof type === 'string') { - if (!aliasRegistry[type]) { + if (typeof type === "string") { + if (!aliasRegistry.has(type)) { ctx.pushCode( `smartBuffer.write${ CAPITILIZED_TYPE_NAMES[type as Types] - }(${ctx.generateVariable(this.varName)});` + }(${ctx.generateVariable(this.varName)});`, ); } else { - const tempVar = ctx.generateTmpVariable(); + var tempVar = ctx.generateTmpVariable(); ctx.pushCode( `var ${tempVar} = ${ FUNCTION_ENCODE_PREFIX + type - }(${ctx.generateVariable(this.varName)});` + }(${ctx.generateVariable(this.varName)}, {`, ); - ctx.pushCode(`smartBuffer.writeBuffer(${tempVar});`); + if (ctx.useContextVariables) { + const parentVar = ctx.generateVariable(); + ctx.pushCode(`$parent: ${parentVar},`); + ctx.pushCode(`$root: ${parentVar}.$root,`); + } + ctx.pushCode(`});`); + + ctx.pushCode(`smartBuffer.writeBuffer(${tempVar}.result);`); if (type !== this.alias) ctx.addReference(type); } } else if (type instanceof Parser) { @@ -1585,48 +1905,75 @@ export class Parser { } private generateChoice(ctx: Context) { - const tag = ctx.generateOption(this.options.tag); + const tag = ctx.generateOption(this.options.tag!); + const nestVar = ctx.generateVariable(this.varName); + if (this.varName) { - ctx.pushCode(`${ctx.generateVariable(this.varName)} = {};`); + ctx.pushCode(`${nestVar} = {};`); + + if (ctx.useContextVariables) { + const parentVar = ctx.generateVariable(); + ctx.pushCode(`${nestVar}.$parent = ${parentVar};`); + ctx.pushCode(`${nestVar}.$root = ${parentVar}.$root;`); + } } ctx.pushCode(`switch(${tag}) {`); - Object.keys(this.options.choices).forEach((tag) => { - const type = this.options.choices[parseInt(tag, 10)]; + for (const tagString in this.options.choices) { + const tag = parseInt(tagString, 10); + const type = this.options.choices[tag]; ctx.pushCode(`case ${tag}:`); this.generateChoiceCase(ctx, this.varName, type); - ctx.pushCode('break;'); - }); - ctx.pushCode('default:'); + ctx.pushCode("break;"); + } + ctx.pushCode("default:"); if (this.options.defaultChoice) { this.generateChoiceCase(ctx, this.varName, this.options.defaultChoice); } else { ctx.generateError(`"Met undefined tag value " + ${tag} + " at choice"`); } - ctx.pushCode('}'); + ctx.pushCode("}"); + + if (this.varName && ctx.useContextVariables) { + ctx.pushCode(`delete ${nestVar}.$parent;`); + ctx.pushCode(`delete ${nestVar}.$root;`); + } } private generate_encodeChoice(ctx: Context) { - const tag = ctx.generateOption(this.options.tag); + const tag = ctx.generateOption(this.options.tag!); + const nestVar = ctx.generateVariable(this.varName); + + if (this.varName && ctx.useContextVariables) { + const parentVar = ctx.generateVariable(); + ctx.pushCode(`${nestVar}.$parent = ${parentVar};`); + ctx.pushCode(`${nestVar}.$root = ${parentVar}.$root;`); + } ctx.pushCode(`switch(${tag}) {`); - Object.keys(this.options.choices).forEach((tag) => { - const type = this.options.choices[parseInt(tag, 10)]; + for (const tagString in this.options.choices) { + const tag = parseInt(tagString, 10); + const type = this.options.choices[tag]; ctx.pushCode(`case ${tag}:`); this.generate_encodeChoiceCase(ctx, this.varName, type); - ctx.pushCode('break;'); - }, this); - ctx.pushCode('default:'); + ctx.pushCode("break;"); + } + ctx.pushCode("default:"); if (this.options.defaultChoice) { this.generate_encodeChoiceCase( ctx, this.varName, - this.options.defaultChoice + this.options.defaultChoice, ); } else { ctx.generateError(`"Met undefined tag value " + ${tag} + " at choice"`); } - ctx.pushCode('}'); + ctx.pushCode("}"); + + if (this.varName && ctx.useContextVariables) { + ctx.pushCode(`delete ${nestVar}.$parent;`); + ctx.pushCode(`delete ${nestVar}.$root;`); + } } private generateNest(ctx: Context) { @@ -1635,19 +1982,41 @@ export class Parser { if (this.options.type instanceof Parser) { if (this.varName) { ctx.pushCode(`${nestVar} = {};`); + + if (ctx.useContextVariables) { + const parentVar = ctx.generateVariable(); + ctx.pushCode(`${nestVar}.$parent = ${parentVar};`); + ctx.pushCode(`${nestVar}.$root = ${parentVar}.$root;`); + } } + ctx.pushPath(this.varName); this.options.type.generate(ctx); ctx.popPath(this.varName); - } else if (aliasRegistry[this.options.type]) { + + if (this.varName && ctx.useContextVariables) { + if (ctx.useContextVariables) { + ctx.pushCode(`delete ${nestVar}.$parent;`); + ctx.pushCode(`delete ${nestVar}.$root;`); + } + } + } else if (aliasRegistry.has(this.options.type!)) { const tempVar = ctx.generateTmpVariable(); ctx.pushCode( - `var ${tempVar} = ${FUNCTION_PREFIX + this.options.type}(offset);` + `var ${tempVar} = ${FUNCTION_PREFIX + this.options.type}(offset, {`, ); + if (ctx.useContextVariables) { + const parentVar = ctx.generateVariable(); + ctx.pushCode(`$parent: ${parentVar},`); + ctx.pushCode(`$root: ${parentVar}.$root,`); + } + ctx.pushCode(`});`); ctx.pushCode( - `${nestVar} = ${tempVar}.result; offset = ${tempVar}.offset;` + `${nestVar} = ${tempVar}.result; offset = ${tempVar}.offset;`, ); - if (this.options.type !== this.alias) ctx.addReference(this.options.type); + if (this.options.type !== this.alias) { + ctx.addReference(this.options.type!); + } } } @@ -1655,43 +2024,135 @@ export class Parser { const nestVar = ctx.generateVariable(this.varName); if (this.options.type instanceof Parser) { + if (this.varName && ctx.useContextVariables) { + const parentVar = ctx.generateVariable(); + ctx.pushCode(`${nestVar}.$parent = ${parentVar};`); + ctx.pushCode(`${nestVar}.$root = ${parentVar}.$root;`); + } + ctx.pushPath(this.varName); this.options.type.generateEncode(ctx); ctx.popPath(this.varName); - } else if (aliasRegistry[this.options.type]) { + + if (this.varName && ctx.useContextVariables) { + if (ctx.useContextVariables) { + ctx.pushCode(`delete ${nestVar}.$parent;`); + ctx.pushCode(`delete ${nestVar}.$root;`); + } + } + } else if (aliasRegistry.has(this.options.type!)) { var tempVar = ctx.generateTmpVariable(); ctx.pushCode( `var ${tempVar} = ${ FUNCTION_ENCODE_PREFIX + this.options.type - }(${nestVar});` + }(${nestVar}, {`, + ); + if (ctx.useContextVariables) { + const parentVar = ctx.generateVariable(); + ctx.pushCode(`$parent: ${parentVar},`); + ctx.pushCode(`$root: ${parentVar}.$root,`); + } + ctx.pushCode(`});`); + + ctx.pushCode(`smartBuffer.writeBuffer(${tempVar}.result);`); + if (this.options.type !== this.alias) { + ctx.addReference(this.options.type!); + } + } + } + + private generateWrapper(ctx: Context) { + const wrapperVar = ctx.generateVariable(this.varName); + const wrappedBuf = ctx.generateTmpVariable(); + if (typeof this.options.readUntil === "function") { + const pred = this.options.readUntil; + const start = ctx.generateTmpVariable(); + const cur = ctx.generateTmpVariable(); + + ctx.pushCode(`var ${start} = offset;`); + ctx.pushCode(`var ${cur} = 0;`); + ctx.pushCode(`while (offset < buffer.length) {`); + ctx.pushCode(`${cur} = dataView.getUint8(offset);`); + const func = ctx.addImport(pred); + ctx.pushCode( + `if (${func}.call(${ctx.generateVariable()}, ${cur}, buffer.subarray(offset))) break;`, + ); + ctx.pushCode(`offset += 1;`); + ctx.pushCode(`}`); + ctx.pushCode(`${wrappedBuf} = buffer.subarray(${start}, offset);`); + } else if (this.options.readUntil === "eof") { + ctx.pushCode(`${wrappedBuf} = buffer.subarray(offset);`); + } else { + const len = ctx.generateOption(this.options.length!); + ctx.pushCode(`${wrappedBuf} = buffer.subarray(offset, offset + ${len});`); + ctx.pushCode(`offset += ${len};`); + } + + if (this.options.clone) { + ctx.pushCode(`${wrappedBuf} = buffer.constructor.from(${wrappedBuf});`); + } + + const tempBuf = ctx.generateTmpVariable(); + const tempOff = ctx.generateTmpVariable(); + const tempView = ctx.generateTmpVariable(); + const func = ctx.addImport(this.options.wrapper); + ctx.pushCode( + `${wrappedBuf} = ${func}.call(this, ${wrappedBuf}).subarray(0);`, + ); + ctx.pushCode(`var ${tempBuf} = buffer;`); + ctx.pushCode(`var ${tempOff} = offset;`); + ctx.pushCode(`var ${tempView} = dataView;`); + ctx.pushCode(`buffer = ${wrappedBuf};`); + ctx.pushCode(`offset = 0;`); + ctx.pushCode( + `dataView = new DataView(buffer.buffer, buffer.byteOffset, buffer.length);`, + ); + if (this.options.type instanceof Parser) { + if (this.varName) { + ctx.pushCode(`${wrapperVar} = {};`); + } + ctx.pushPath(this.varName); + this.options.type.generate(ctx); + ctx.popPath(this.varName); + } else if (aliasRegistry.has(this.options.type!)) { + const tempVar = ctx.generateTmpVariable(); + ctx.pushCode( + `var ${tempVar} = ${FUNCTION_PREFIX + this.options.type}(0);`, ); - ctx.pushCode(`smartBuffer.writeBuffer(${tempVar});`); + ctx.pushCode(`${wrapperVar} = ${tempVar}.result;`); if (this.options.type !== this.alias) { - ctx.addReference(this.options.type); + ctx.addReference(this.options.type!); } } + ctx.pushCode(`buffer = ${tempBuf};`); + ctx.pushCode(`dataView = ${tempView};`); + ctx.pushCode(`offset = ${tempOff};`); } private generateFormatter( ctx: Context, varName: string, - formatter: Function + formatter: Function, ) { - if (typeof formatter === 'function') { + if (typeof formatter === "function") { const func = ctx.addImport(formatter); - ctx.pushCode(`${varName} = ${func}.call(this, ${varName});`); + ctx.pushCode( + `${varName} = ${func}.call(${ctx.generateVariable()}, ${varName});`, + ); } } private generateEncoder(ctx: Context, varName: string, encoder?: Function) { - if (typeof encoder === 'function') { - ctx.pushCode(`${varName} = (${encoder}).call(this, ${varName}, vars);`); + if (typeof encoder === "function") { + ctx.pushCode( + `${varName} = (${encoder}).call(${ctx.generateVariable()}, ${varName}, vars);`, + ); } } private generatePointer(ctx: Context) { const type = this.options.type; - const offset = ctx.generateOption(this.options.offset); + const offset = ctx.generateOption(this.options.offset!); const tempVar = ctx.generateTmpVariable(); const nestVar = ctx.generateVariable(this.varName); @@ -1703,23 +2164,43 @@ export class Parser { if (this.options.type instanceof Parser) { ctx.pushCode(`${nestVar} = {};`); + + if (ctx.useContextVariables) { + const parentVar = ctx.generateVariable(); + ctx.pushCode(`${nestVar}.$parent = ${parentVar};`); + ctx.pushCode(`${nestVar}.$root = ${parentVar}.$root;`); + } + ctx.pushPath(this.varName); this.options.type.generate(ctx); ctx.popPath(this.varName); - } else if (aliasRegistry[this.options.type]) { + + if (ctx.useContextVariables) { + ctx.pushCode(`delete ${nestVar}.$parent;`); + ctx.pushCode(`delete ${nestVar}.$root;`); + } + } else if (aliasRegistry.has(this.options.type!)) { const tempVar = ctx.generateTmpVariable(); ctx.pushCode( - `var ${tempVar} = ${FUNCTION_PREFIX + this.options.type}(offset);` + `var ${tempVar} = ${FUNCTION_PREFIX + this.options.type}(offset, {`, ); + if (ctx.useContextVariables) { + const parentVar = ctx.generateVariable(); + ctx.pushCode(`$parent: ${parentVar},`); + ctx.pushCode(`$root: ${parentVar}.$root,`); + } + ctx.pushCode(`});`); ctx.pushCode( - `${nestVar} = ${tempVar}.result; offset = ${tempVar}.offset;` + `${nestVar} = ${tempVar}.result; offset = ${tempVar}.offset;`, ); - if (this.options.type !== this.alias) ctx.addReference(this.options.type); - } else if (Object.keys(PRIMITIVE_SIZES).indexOf(this.options.type) >= 0) { + if (this.options.type !== this.alias) { + ctx.addReference(this.options.type!); + } + } else if (Object.keys(PRIMITIVE_SIZES).indexOf(this.options.type!) >= 0) { const typeName = PRIMITIVE_NAMES[type as PrimitiveTypes]; const littleEndian = PRIMITIVE_LITTLE_ENDIANS[type as PrimitiveTypes]; ctx.pushCode( - `${nestVar} = dataView.get${typeName}(offset, ${littleEndian});` + `${nestVar} = dataView.get${typeName}(offset, ${littleEndian});`, ); ctx.pushCode(`offset += ${PRIMITIVE_SIZES[type as PrimitiveTypes]};`); } diff --git a/lib/context.ts b/lib/context.ts deleted file mode 100644 index 185714ec..00000000 --- a/lib/context.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { Parser } from './binary_parser'; - -export class Context { - code = ''; - scopes = [['vars']]; - bitFields: Parser[] = []; - tmpVariableCount = 0; - references: { [key: string]: { resolved: boolean; requested: boolean } } = {}; - importPath: string; - imports: any[] = []; - reverseImports = new Map(); - - constructor(importPath?: string) { - this.importPath = importPath; - } - - generateVariable(name?: string) { - const arr = []; - - const scopes = this.scopes[this.scopes.length - 1]; - arr.push(...scopes); - if (name) { - arr.push(name); - } - - return arr.join('.'); - } - - generateOption(val: number | string | Function) { - switch (typeof val) { - case 'number': - return val.toString(); - case 'string': - return this.generateVariable(val); - case 'function': - return `${this.addImport(val)}.call(${this.generateVariable()}, vars)`; - } - } - - generateError(err: string) { - this.pushCode('throw new Error(' + err + ');'); - } - - generateTmpVariable() { - return '$tmp' + this.tmpVariableCount++; - } - - pushCode(code: string) { - this.code += code + '\n'; - } - - pushPath(name: string) { - if (name) { - this.scopes[this.scopes.length - 1].push(name); - } - } - - popPath(name: string) { - if (name) { - this.scopes[this.scopes.length - 1].pop(); - } - } - - pushScope(name: string) { - this.scopes.push([name]); - } - - popScope() { - this.scopes.pop(); - } - - addImport(im: any) { - if (!this.importPath) return `(${im})`; - let id = this.reverseImports.get(im); - if (!id) { - id = this.imports.push(im) - 1; - this.reverseImports.set(im, id); - } - return `${this.importPath}[${id}]`; - } - - addReference(alias: string) { - if (this.references[alias]) return; - this.references[alias] = { resolved: false, requested: false }; - } - - markResolved(alias: string) { - this.references[alias].resolved = true; - } - - markRequested(aliasList: string[]) { - aliasList.forEach((alias) => { - this.references[alias].requested = true; - }); - } - - getUnresolvedReferences() { - const references = this.references; - return Object.keys(this.references).filter( - (alias) => !references[alias].resolved && !references[alias].requested - ); - } -} diff --git a/package-lock.json b/package-lock.json index ffa9b8e1..daa0873d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,642 +1,5480 @@ { - "name": "binary-parser-encoder", - "version": "1.5.3", - "lockfileVersion": 1, + "name": "binary-parser", + "version": "2.2.1", + "lockfileVersion": 2, "requires": true, + "packages": { + "": { + "name": "binary-parser", + "version": "2.2.1", + "license": "MIT", + "dependencies": { + "smart-buffer": "~4.2.0" + }, + "devDependencies": { + "@types/mocha": "^10.0.1", + "@types/node": "^20.4.2", + "karma": "^6.4.2", + "karma-chrome-launcher": "^3.2.0", + "karma-mocha": "^2.0.1", + "karma-typescript": "^5.5.4", + "mocha": "^10.2.0", + "prettier": "^3.0.0", + "ts-node": "^10.9.1", + "typescript": "^5.1.6" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", + "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz", + "integrity": "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.15.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.5.tgz", + "integrity": "sha512-pYgXxiwAgQpgM1bNkZsDEq85f0ggXMA5L7c+o3tskGMh2BunCI9QUwB9Z4jpvXUOuMdyGKiGKQiRe11VS6Jzvg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.4", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-module-transforms": "^7.15.4", + "@babel/helpers": "^7.15.4", + "@babel/parser": "^7.15.5", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.4.tgz", + "integrity": "sha512-d3itta0tu+UayjEORPNz6e1T3FtvWlP5N4V5M+lhp/CxT4oAA7/NcScnpRyspUMLK6tu9MNHmQHxRykuN2R7hw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.15.4", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz", + "integrity": "sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.15.0", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.16.6", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz", + "integrity": "sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw==", + "dev": true, + "dependencies": { + "@babel/helper-get-function-arity": "^7.15.4", + "@babel/template": "^7.15.4", + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-get-function-arity": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz", + "integrity": "sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz", + "integrity": "sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz", + "integrity": "sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz", + "integrity": "sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.7.tgz", + "integrity": "sha512-ZNqjjQG/AuFfekFTY+7nY4RgBSklgTu970c7Rj3m/JOhIu5KPBUuTA9AY6zaKcUvk4g6EbDXdBnhi35FAssdSw==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.15.4", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-simple-access": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/helper-validator-identifier": "^7.15.7", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz", + "integrity": "sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz", + "integrity": "sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw==", + "dev": true, + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz", + "integrity": "sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz", + "integrity": "sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.4.tgz", + "integrity": "sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.7.tgz", + "integrity": "sha512-rycZXvQ+xS9QyIcJ9HXeDWf1uxqlbVFAUq0Rq0dbc50Zb/+wUe/ehyfzGfm9KZZF0kBejYgxltBXocP+gKdL2g==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.15.4.tgz", + "integrity": "sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.4.tgz", + "integrity": "sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-hoist-variables": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", + "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", + "dev": true + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", + "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", + "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", + "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", + "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", + "dev": true + }, + "node_modules/@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "dev": true + }, + "node_modules/@types/cors": { + "version": "2.8.13", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", + "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/mocha": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.1.tgz", + "integrity": "sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.4.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.2.tgz", + "integrity": "sha512-Dd0BYtWgnWJKwO1jkmTrzofjK2QXXcai0dmtzvIBhcA+RsG5h8R3xlyta0kGOZRNfL9GuRtb1knmPEhQrePCEw==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", + "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/assert": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz", + "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", + "dev": true, + "dependencies": { + "es6-object-assign": "^1.1.0", + "is-nan": "^1.2.1", + "object-is": "^1.0.1", + "util": "^0.12.0" + } + }, + "node_modules/async": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", + "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==", + "dev": true + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "dev": true, + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bn.js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", + "dev": true + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/body-parser/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "node_modules/browser-resolve": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz", + "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==", + "dev": true, + "dependencies": { + "resolve": "^1.17.0" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dev": true, + "dependencies": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "node_modules/browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dev": true, + "dependencies": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "node_modules/browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "dependencies": { + "pako": "~1.0.5" + } + }, + "node_modules/browserslist": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.2.tgz", + "integrity": "sha512-jSDZyqJmkKMEMi7SZAgX5UltFdR5NAO43vY0AwTpu4X3sGH7GLLQ83KiUomgrnvZRCeW0yPPnKqnxPqQOER9zQ==", + "dev": true, + "dependencies": { + "caniuse-lite": "^1.0.30001261", + "electron-to-chromium": "^1.3.854", + "escalade": "^3.1.1", + "nanocolors": "^0.2.12", + "node-releases": "^1.1.76" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "node_modules/builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001264", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001264.tgz", + "integrity": "sha512-Ftfqqfcs/ePiUmyaySsQ4PUsdcYyXG2rfoBVsk3iY1ahHaJEw65vfb7Suzqm+cEkwwPIv/XWkg27iCpRavH4zA==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/combine-source-map": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", + "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=", + "dev": true, + "dependencies": { + "convert-source-map": "~1.1.0", + "inline-source-map": "~0.6.0", + "lodash.memoize": "~3.0.3", + "source-map": "~0.5.3" + } + }, + "node_modules/combine-source-map/node_modules/convert-source-map": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", + "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", + "dev": true + }, + "node_modules/combine-source-map/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "node_modules/connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/connect/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/connect/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "node_modules/constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/convert-source-map/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "dependencies": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + }, + "engines": { + "node": "*" + } + }, + "node_modules/custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", + "dev": true + }, + "node_modules/date-format": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.3.tgz", + "integrity": "sha512-7P3FyqDcfeznLZp2b+OMitV9Sz2lUnsT87WaTat9nVwqsBkTzPG3lPLNwW3en6F4pHUiWzr6vb8CLhjdK9bcxQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + } + }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", + "dev": true + }, + "node_modules/diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/diffie-hellman/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", + "dev": true, + "dependencies": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "node_modules/domain-browser": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.22.0.tgz", + "integrity": "sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://bevry.me/fund" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.3.857", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.857.tgz", + "integrity": "sha512-a5kIr2lajm4bJ5E4D3fp8Y/BRB0Dx2VOcCRE5Gtb679mXIME/OFhWler8Gy2ksrf8gFX+EFCSIGA33FB3gqYpg==", + "dev": true + }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dev": true, + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/engine.io": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.1.tgz", + "integrity": "sha512-mGqhI+D7YxS9KJMppR6Iuo37Ed3abhU8NdfgSvJSDUafQutrN+sPTncJYTyM9+tkhSmWodKtVYGPPHyXJEwEQA==", + "dev": true, + "dependencies": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.1.0", + "ws": "~8.11.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io-parser": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.1.0.tgz", + "integrity": "sha512-enySgNiK5tyZFynt3z7iqBR+Bto9EVVVvDFuTT0ioHCGbzirZVGDGiQjZzEp8hWl6hd5FSVytJGuScX1C1C35w==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "dev": true + }, + "node_modules/es-abstract": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", + "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.1", + "is-string": "^1.0.7", + "is-weakref": "^1.0.1", + "object-inspect": "^1.11.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es6-object-assign": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", + "integrity": "sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=", + "dev": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flatted": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.14.8", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz", + "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, + "node_modules/fs-extra": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/inline-source-map": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", + "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", + "dev": true, + "dependencies": { + "source-map": "~0.5.3" + } + }, + "node_modules/inline-source-map/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.7.0.tgz", + "integrity": "sha512-ByY+tjCciCr+9nLryBYcSD50EOGWt95c7tIsKTG1J2ixKKXPvF7Ej3AVd+UfDydAJom3biBGDBALaO79ktwgEQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", + "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", + "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.8.tgz", + "integrity": "sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-abstract": "^1.18.5", + "foreach": "^2.0.5", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-weakref": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", + "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isbinaryfile": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.8.tgz", + "integrity": "sha512-53h6XFniq77YdW+spoRrebh0mnmTxRPTlcuIArO57lmMdq4uBKFKaeTjnb92oYWrSn/LVL+LT+Hap2tFQj8V+w==", + "dev": true, + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.1.tgz", + "integrity": "sha512-GvCYYTxaCPqwMjobtVcVKvSHtAGe48MNhGjpK8LtVF8K0ISX7hCKl85LgtuaSneWVyQmaGcW3iXVV3GaZSLpmQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/karma": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.2.tgz", + "integrity": "sha512-C6SU/53LB31BEgRg+omznBEMY4SjHU3ricV6zBcAe1EeILKkeScr+fZXtaI5WyDbkVowJxxAI6h73NcFPmXolQ==", + "dev": true, + "dependencies": { + "@colors/colors": "1.5.0", + "body-parser": "^1.19.0", + "braces": "^3.0.2", + "chokidar": "^3.5.1", + "connect": "^3.7.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.1", + "glob": "^7.1.7", + "graceful-fs": "^4.2.6", + "http-proxy": "^1.18.1", + "isbinaryfile": "^4.0.8", + "lodash": "^4.17.21", + "log4js": "^6.4.1", + "mime": "^2.5.2", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.5", + "qjobs": "^1.2.0", + "range-parser": "^1.2.1", + "rimraf": "^3.0.2", + "socket.io": "^4.4.1", + "source-map": "^0.6.1", + "tmp": "^0.2.1", + "ua-parser-js": "^0.7.30", + "yargs": "^16.1.1" + }, + "bin": { + "karma": "bin/karma" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/karma-chrome-launcher": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.2.0.tgz", + "integrity": "sha512-rE9RkUPI7I9mAxByQWkGJFXfFD6lE4gC5nPuZdobf/QdTEJI6EU4yIay/cfU/xV4ZxlM5JiTv7zWYgA64NpS5Q==", + "dev": true, + "dependencies": { + "which": "^1.2.1" + } + }, + "node_modules/karma-chrome-launcher/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/karma-mocha": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/karma-mocha/-/karma-mocha-2.0.1.tgz", + "integrity": "sha512-Tzd5HBjm8his2OA4bouAsATYEpZrp9vC7z5E5j4C5Of5Rrs1jY67RAwXNcVmd/Bnk1wgvQRou0zGVLey44G4tQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.3" + } + }, + "node_modules/karma-typescript": { + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/karma-typescript/-/karma-typescript-5.5.4.tgz", + "integrity": "sha512-D7nQ96xu/UekuqCmiPimnCuOFqp8+BxiND6MU6IJVN37E7DgXzr7SUeTzwuTHtKSYpgxKv4iOTUteYTxpeZL9A==", + "dev": true, + "dependencies": { + "acorn": "^8.1.0", + "acorn-walk": "^8.0.2", + "assert": "^2.0.0", + "async": "^3.0.1", + "browser-resolve": "^2.0.0", + "browserify-zlib": "^0.2.0", + "buffer": "^5.4.3", + "combine-source-map": "^0.8.0", + "console-browserify": "^1.2.0", + "constants-browserify": "^1.0.0", + "convert-source-map": "^1.7.0", + "crypto-browserify": "^3.12.0", + "diff": "^4.0.1", + "domain-browser": "^4.16.0", + "events": "^3.2.0", + "glob": "^7.1.6", + "https-browserify": "^1.0.0", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.0", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.17.19", + "log4js": "^6.3.0", + "minimatch": "^3.0.4", + "os-browserify": "^0.3.0", + "pad": "^3.2.0", + "path-browserify": "^1.0.0", + "process": "^0.11.10", + "punycode": "^2.1.1", + "querystring-es3": "^0.2.1", + "readable-stream": "^3.1.1", + "source-map": "^0.7.3", + "stream-browserify": "^3.0.0", + "stream-http": "^3.1.0", + "string_decoder": "^1.3.0", + "timers-browserify": "^2.0.11", + "tmp": "^0.2.1", + "tty-browserify": "^0.0.1", + "url": "^0.11.0", + "util": "^0.12.1", + "vm-browserify": "^1.1.2" + }, + "peerDependencies": { + "karma": "1 || 2 || 3 || 4 || 5 || 6", + "typescript": "1 || 2 || 3 || 4 || 5" + } + }, + "node_modules/karma-typescript/node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/karma-typescript/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.memoize": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", + "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log4js": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.4.1.tgz", + "integrity": "sha512-iUiYnXqAmNKiIZ1XSAitQ4TmNs8CdZYTAWINARF3LjnsLN8tY5m0vRwd6uuWj/yNY0YHxeZodnbmxKFUOM2rMg==", + "dev": true, + "dependencies": { + "date-format": "^4.0.3", + "debug": "^4.3.3", + "flatted": "^3.2.4", + "rfdc": "^1.3.0", + "streamroller": "^3.0.2" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "dev": true, + "dependencies": { + "mime-db": "1.51.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, + "node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mocha": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", + "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", + "dev": true, + "dependencies": { + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.4", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", + "ms": "2.1.3", + "nanoid": "3.3.3", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "workerpool": "6.2.1", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/mocha/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/mocha/node_modules/minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/nanocolors": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/nanocolors/-/nanocolors-0.2.12.tgz", + "integrity": "sha512-SFNdALvzW+rVlzqexid6epYdt8H9Zol7xDoQarioEFcFN0JHo4CYNztAxmtfgGTVRCmFlEOqqhBpoFGKqSAMug==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-releases": { + "version": "1.1.77", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.77.tgz", + "integrity": "sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pad": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/pad/-/pad-3.2.0.tgz", + "integrity": "sha512-2u0TrjcGbOjBTJpyewEl4hBO3OeX5wWue7eIFPzQTg6wFSvoaHcBTTUY5m+n0hd04gmTCPuY0kCpVIVuw5etwg==", + "dev": true, + "dependencies": { + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "node_modules/parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dev": true, + "dependencies": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dev": true, + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/prettier": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.0.tgz", + "integrity": "sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/public-encrypt/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "dev": true, + "engines": { + "node": ">=0.9" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "node_modules/resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "dev": true + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socket.io": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.1.tgz", + "integrity": "sha512-W+utHys2w//dhFjy7iQQu9sGd3eokCjGbl2r59tyLqNiJJBdIebn3GAKEXBr3osqHTObJi2die/25bCx2zsaaw==", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "cors": "~2.8.5", + "debug": "~4.3.2", + "engine.io": "~6.5.0", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", + "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", + "dev": true, + "dependencies": { + "ws": "~8.11.0" + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "dev": true, + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/stream-browserify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", + "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", + "dev": true, + "dependencies": { + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" + } + }, + "node_modules/stream-http": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", + "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", + "dev": true, + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "xtend": "^4.0.2" + } + }, + "node_modules/streamroller": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.0.2.tgz", + "integrity": "sha512-ur6y5S5dopOaRXBuRIZ1u6GC5bcEXHRZKgfBjfCglMhmIf+roVCECjvkEYzNQOXIN2/JPnkMPW/8B3CZoKaEPA==", + "dev": true, + "dependencies": { + "date-format": "^4.0.3", + "debug": "^4.1.1", + "fs-extra": "^10.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dev": true, + "dependencies": { + "setimmediate": "^1.0.4" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node/node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/tty-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", + "dev": true + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ua-parser-js": { + "version": "0.7.33", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.33.tgz", + "integrity": "sha512-s8ax/CeZdK9R/56Sui0WM6y9OFREJarMRHqLB2EwkovemBxNQ+Bqu8GAsUnVcXKgphb++ghr/B2BZx4mahujPw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + } + ], + "engines": { + "node": "*" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + }, + "node_modules/util": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", + "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "safe-buffer": "^5.1.2", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "node_modules/void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.7.tgz", + "integrity": "sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-abstract": "^1.18.5", + "foreach": "^2.0.5", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/workerpool": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + }, "dependencies": { "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", + "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.14.5" + } + }, + "@babel/compat-data": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz", + "integrity": "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==", + "dev": true + }, + "@babel/core": { + "version": "7.15.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.5.tgz", + "integrity": "sha512-pYgXxiwAgQpgM1bNkZsDEq85f0ggXMA5L7c+o3tskGMh2BunCI9QUwB9Z4jpvXUOuMdyGKiGKQiRe11VS6Jzvg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.4", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-module-transforms": "^7.15.4", + "@babel/helpers": "^7.15.4", + "@babel/parser": "^7.15.5", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.4.tgz", + "integrity": "sha512-d3itta0tu+UayjEORPNz6e1T3FtvWlP5N4V5M+lhp/CxT4oAA7/NcScnpRyspUMLK6tu9MNHmQHxRykuN2R7hw==", + "dev": true, + "requires": { + "@babel/types": "^7.15.4", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-compilation-targets": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz", + "integrity": "sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.15.0", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.16.6", + "semver": "^6.3.0" + } + }, + "@babel/helper-function-name": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz", + "integrity": "sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.15.4", + "@babel/template": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz", + "integrity": "sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA==", + "dev": true, + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz", + "integrity": "sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA==", + "dev": true, + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz", + "integrity": "sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA==", + "dev": true, + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-module-imports": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz", + "integrity": "sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA==", + "dev": true, + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-module-transforms": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.7.tgz", + "integrity": "sha512-ZNqjjQG/AuFfekFTY+7nY4RgBSklgTu970c7Rj3m/JOhIu5KPBUuTA9AY6zaKcUvk4g6EbDXdBnhi35FAssdSw==", "dev": true, "requires": { - "@babel/highlight": "^7.10.4" + "@babel/helper-module-imports": "^7.15.4", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-simple-access": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/helper-validator-identifier": "^7.15.7", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.6" } }, - "@babel/core": { - "version": "7.12.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz", - "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.1", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.1", - "@babel/parser": "^7.12.3", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1", - "convert-source-map": "^1.7.0", + "@babel/helper-optimise-call-expression": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz", + "integrity": "sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw==", + "dev": true, + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-replace-supers": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz", + "integrity": "sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-simple-access": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz", + "integrity": "sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg==", + "dev": true, + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz", + "integrity": "sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw==", + "dev": true, + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", + "dev": true + }, + "@babel/helpers": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.4.tgz", + "integrity": "sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ==", + "dev": true, + "requires": { + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/parser": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.7.tgz", + "integrity": "sha512-rycZXvQ+xS9QyIcJ9HXeDWf1uxqlbVFAUq0Rq0dbc50Zb/+wUe/ehyfzGfm9KZZF0kBejYgxltBXocP+gKdL2g==", + "dev": true + }, + "@babel/template": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.15.4.tgz", + "integrity": "sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/traverse": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.4.tgz", + "integrity": "sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-hoist-variables": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4", "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + }, + "@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true + }, + "@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "0.3.9" + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@socket.io/component-emitter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", + "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", + "dev": true + }, + "@tsconfig/node10": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", + "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", + "dev": true + }, + "@tsconfig/node12": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", + "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", + "dev": true + }, + "@tsconfig/node14": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", + "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", + "dev": true + }, + "@tsconfig/node16": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", + "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", + "dev": true + }, + "@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "dev": true + }, + "@types/cors": { + "version": "2.8.13", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", + "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.1.tgz", + "integrity": "sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==", + "dev": true + }, + "@types/node": { + "version": "20.4.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.2.tgz", + "integrity": "sha512-Dd0BYtWgnWJKwO1jkmTrzofjK2QXXcai0dmtzvIBhcA+RsG5h8R3xlyta0kGOZRNfL9GuRtb1knmPEhQrePCEw==", + "dev": true + }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "acorn": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", + "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", + "dev": true + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "assert": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz", + "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", + "dev": true, + "requires": { + "es6-object-assign": "^1.1.0", + "is-nan": "^1.2.1", + "object-is": "^1.0.1", + "util": "^0.12.0" + } + }, + "async": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", + "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==", + "dev": true + }, + "available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "bn.js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", + "dev": true + }, + "body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" }, "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } } } }, - "@babel/generator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz", - "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==", + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "requires": { - "@babel/types": "^7.12.1", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" + "fill-range": "^7.0.1" } }, - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browser-resolve": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz", + "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" + "resolve": "^1.17.0" } }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "requires": { - "@babel/types": "^7.10.4" + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, - "@babel/helper-member-expression-to-functions": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", - "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "dev": true, "requires": { - "@babel/types": "^7.12.1" + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" } }, - "@babel/helper-module-imports": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz", - "integrity": "sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA==", + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", "dev": true, "requires": { - "@babel/types": "^7.12.1" + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, - "@babel/helper-module-transforms": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", - "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", + "browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-replace-supers": "^7.12.1", - "@babel/helper-simple-access": "^7.12.1", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/helper-validator-identifier": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1", - "lodash": "^4.17.19" + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" } }, - "@babel/helper-optimise-call-expression": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", - "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", + "browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", "dev": true, "requires": { - "@babel/types": "^7.10.4" + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" } }, - "@babel/helper-replace-supers": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz", - "integrity": "sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw==", + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.12.1", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1" + "pako": "~1.0.5" } }, - "@babel/helper-simple-access": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", - "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", + "browserslist": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.2.tgz", + "integrity": "sha512-jSDZyqJmkKMEMi7SZAgX5UltFdR5NAO43vY0AwTpu4X3sGH7GLLQ83KiUomgrnvZRCeW0yPPnKqnxPqQOER9zQ==", "dev": true, "requires": { - "@babel/types": "^7.12.1" + "caniuse-lite": "^1.0.30001261", + "electron-to-chromium": "^1.3.854", + "escalade": "^3.1.1", + "nanocolors": "^0.2.12", + "node-releases": "^1.1.76" } }, - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "dev": true, "requires": { - "@babel/types": "^7.11.0" + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", "dev": true }, - "@babel/helpers": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.1.tgz", - "integrity": "sha512-9JoDSBGoWtmbay98efmT2+mySkwjzeFeAL9BuWNoVQpkPFQF8SIIFUfY5os9u8wVzglzoiPRSW7cuJmBDUt43g==", + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "dev": true, "requires": { - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1" + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" } }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001264", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001264.tgz", + "integrity": "sha512-Ftfqqfcs/ePiUmyaySsQ4PUsdcYyXG2rfoBVsk3iY1ahHaJEw65vfb7Suzqm+cEkwwPIv/XWkg27iCpRavH4zA==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" } } } }, - "@babel/parser": { - "version": "7.12.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz", - "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==", - "dev": true + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, - "@babel/traverse": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz", - "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==", + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.1", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.12.1", - "@babel/types": "^7.12.1", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, - "@babel/types": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", - "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" + "color-name": "~1.1.4" } }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "combine-source-map": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", + "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=", "dev": true, "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" + "convert-source-map": "~1.1.0", + "inline-source-map": "~0.6.0", + "lodash.memoize": "~3.0.3", + "source-map": "~0.5.3" }, "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } + "convert-source-map": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", + "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", + "dev": true }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { - "p-try": "^2.0.0" + "ms": "2.0.0" } }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, - "@istanbuljs/schema": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", - "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", "dev": true }, - "@types/node": { - "version": "14.14.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.6.tgz", - "integrity": "sha512-6QlRuqsQ/Ox/aJEQWBEJG7A9+u7oSYl3mem/K8IzxXG/kAGbV1YPD9Bg9Zw3vyxC/YP+zONKwy8hGkSt1jxFMw==", + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", "dev": true }, - "@ungap/promise-all-settled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", "dev": true }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", "dev": true, "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" + "safe-buffer": "~5.1.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } } }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", "dev": true }, - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "requires": { + "object-assign": "^4", + "vary": "^1" + } }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", "dev": true, "requires": { - "color-convert": "^2.0.1" + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } } }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" } }, - "append-transform": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", - "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, "requires": { - "default-require-extensions": "^3.0.0" + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "dev": true, "requires": { - "sprintf-js": "~1.0.2" + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" } }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", "dev": true }, - "binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "date-format": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.3.tgz", + "integrity": "sha512-7P3FyqDcfeznLZp2b+OMitV9Sz2lUnsT87WaTat9nVwqsBkTzPG3lPLNwW3en6F4pHUiWzr6vb8CLhjdK9bcxQ==", "dev": true }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { - "fill-range": "^7.0.1" + "ms": "2.1.2" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } } }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", "dev": true }, - "caching-transform": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", - "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", "dev": true, "requires": { - "hasha": "^5.0.0", - "make-dir": "^3.0.0", - "package-hash": "^4.0.0", - "write-file-atomic": "^3.0.0" + "clone": "^1.0.2" } }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "dev": true, "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "object-keys": "^1.0.12" } }, - "chokidar": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", - "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", "dev": true, "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true }, - "cliui": { + "di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", + "dev": true + }, + "diff": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" }, "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } } } }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", "dev": true, "requires": { - "color-name": "~1.1.4" + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "domain-browser": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.22.0.tgz", + "integrity": "sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw==", "dev": true }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", "dev": true }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "electron-to-chromium": { + "version": "1.3.857", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.857.tgz", + "integrity": "sha512-a5kIr2lajm4bJ5E4D3fp8Y/BRB0Dx2VOcCRE5Gtb679mXIME/OFhWler8Gy2ksrf8gFX+EFCSIGA33FB3gqYpg==", "dev": true }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", "dev": true, "requires": { - "safe-buffer": "~5.1.1" + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" }, "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true } } }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "engine.io": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.1.tgz", + "integrity": "sha512-mGqhI+D7YxS9KJMppR6Iuo37Ed3abhU8NdfgSvJSDUafQutrN+sPTncJYTyM9+tkhSmWodKtVYGPPHyXJEwEQA==", "dev": true, "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.1.0", + "ws": "~8.11.0" } }, - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "engine.io-parser": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.1.0.tgz", + "integrity": "sha512-enySgNiK5tyZFynt3z7iqBR+Bto9EVVVvDFuTT0ioHCGbzirZVGDGiQjZzEp8hWl6hd5FSVytJGuScX1C1C35w==", + "dev": true + }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "dev": true + }, + "es-abstract": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", + "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", "dev": true, "requires": { - "ms": "2.1.2" + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.1", + "is-string": "^1.0.7", + "is-weakref": "^1.0.1", + "object-inspect": "^1.11.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" } }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "default-require-extensions": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", - "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, "requires": { - "strip-bom": "^4.0.0" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" } }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "es6-object-assign": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", + "integrity": "sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=", "dev": true }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true }, - "es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", "dev": true }, "escape-string-regexp": { @@ -645,10 +5483,32 @@ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, "fill-range": { @@ -660,15 +5520,36 @@ "to-regex-range": "^5.0.1" } }, - "find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "dev": true, "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } } }, "find-up": { @@ -687,22 +5568,35 @@ "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "dev": true }, - "foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "flatted": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", + "dev": true + }, + "follow-redirects": { + "version": "1.14.8", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz", + "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==", + "dev": true + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, + "fs-extra": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", "dev": true, "requires": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" } }, - "fromentries": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.1.tgz", - "integrity": "sha512-w4t/zm2J+uAcrpeKyW0VmYiIs3aqe/xKQ+2qwazVNZSCklQHhaVjk6XzKw5GtImq5thgL0IVRjGRAOastb08RQ==", - "dev": true - }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -710,9 +5604,9 @@ "dev": true }, "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "optional": true }, @@ -734,16 +5628,31 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } }, "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -755,9 +5664,9 @@ } }, "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "requires": { "is-glob": "^4.0.1" @@ -770,15 +5679,9 @@ "dev": true }, "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", "dev": true }, "has": { @@ -790,20 +5693,52 @@ "function-bind": "^1.1.1" } }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "hasha": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", - "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "dev": true, "requires": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" } }, "he": { @@ -812,22 +5747,74 @@ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, "html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "dependencies": { + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true + } + } + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", "dev": true }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "dev": true }, "inflight": { @@ -846,6 +5833,53 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "inline-source-map": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", + "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", + "dev": true, + "requires": { + "source-map": "~0.5.3" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -855,15 +5889,40 @@ "binary-extensions": "^2.0.0" } }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true + }, "is-core-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.0.0.tgz", - "integrity": "sha512-jq1AH6C8MuteOoBPwkxHafmByhL9j5q4OaPGdbuD+ZtQJVzH+i6E3BJDQcBA09k57i2Hh2yQbEG8yObZ0jdlWw==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.7.0.tgz", + "integrity": "sha512-ByY+tjCciCr+9nLryBYcSD50EOGWt95c7tIsKTG1J2ixKKXPvF7Ej3AVd+UfDydAJom3biBGDBALaO79ktwgEQ==", "dev": true, "requires": { "has": "^1.0.3" } }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -871,48 +5930,132 @@ "dev": true }, "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, + "is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "requires": { "is-extglob": "^2.1.1" } }, + "is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + } + }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true + }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, + "is-number-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", + "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-plain-obj": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", "dev": true }, - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-shared-array-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", + "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", "dev": true }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typed-array": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.8.tgz", + "integrity": "sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-abstract": "^1.18.5", + "foreach": "^2.0.5", + "has-tostringtag": "^1.0.0" + } + }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "is-weakref": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", + "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0" + } + }, + "isbinaryfile": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.8.tgz", + "integrity": "sha512-53h6XFniq77YdW+spoRrebh0mnmTxRPTlcuIArO57lmMdq4uBKFKaeTjnb92oYWrSn/LVL+LT+Hap2tFQj8V+w==", "dev": true }, "isexe": { @@ -922,20 +6065,11 @@ "dev": true }, "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.1.tgz", + "integrity": "sha512-GvCYYTxaCPqwMjobtVcVKvSHtAGe48MNhGjpK8LtVF8K0ISX7hCKl85LgtuaSneWVyQmaGcW3iXVV3GaZSLpmQ==", "dev": true }, - "istanbul-lib-hook": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", - "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", - "dev": true, - "requires": { - "append-transform": "^2.0.0" - } - }, "istanbul-lib-instrument": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", @@ -944,23 +6078,8 @@ "requires": { "@babel/core": "^7.7.5", "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - } - }, - "istanbul-lib-processinfo": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", - "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", - "dev": true, - "requires": { - "archy": "^1.0.0", - "cross-spawn": "^7.0.0", - "istanbul-lib-coverage": "^3.0.0-alpha.1", - "make-dir": "^3.0.0", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "uuid": "^3.3.3" + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" } }, "istanbul-lib-report": { @@ -972,6 +6091,17 @@ "istanbul-lib-coverage": "^3.0.0", "make-dir": "^3.0.0", "supports-color": "^7.1.0" + }, + "dependencies": { + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, "istanbul-lib-source-maps": { @@ -983,14 +6113,6 @@ "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } } }, "istanbul-reports": { @@ -1010,13 +6132,12 @@ "dev": true }, "js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "^2.0.1" } }, "jsesc": { @@ -1025,13 +6146,152 @@ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, "requires": { - "minimist": "^1.2.5" + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "karma": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.2.tgz", + "integrity": "sha512-C6SU/53LB31BEgRg+omznBEMY4SjHU3ricV6zBcAe1EeILKkeScr+fZXtaI5WyDbkVowJxxAI6h73NcFPmXolQ==", + "dev": true, + "requires": { + "@colors/colors": "1.5.0", + "body-parser": "^1.19.0", + "braces": "^3.0.2", + "chokidar": "^3.5.1", + "connect": "^3.7.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.1", + "glob": "^7.1.7", + "graceful-fs": "^4.2.6", + "http-proxy": "^1.18.1", + "isbinaryfile": "^4.0.8", + "lodash": "^4.17.21", + "log4js": "^6.4.1", + "mime": "^2.5.2", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.5", + "qjobs": "^1.2.0", + "range-parser": "^1.2.1", + "rimraf": "^3.0.2", + "socket.io": "^4.4.1", + "source-map": "^0.6.1", + "tmp": "^0.2.1", + "ua-parser-js": "^0.7.30", + "yargs": "^16.1.1" + } + }, + "karma-chrome-launcher": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.2.0.tgz", + "integrity": "sha512-rE9RkUPI7I9mAxByQWkGJFXfFD6lE4gC5nPuZdobf/QdTEJI6EU4yIay/cfU/xV4ZxlM5JiTv7zWYgA64NpS5Q==", + "dev": true, + "requires": { + "which": "^1.2.1" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "karma-mocha": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/karma-mocha/-/karma-mocha-2.0.1.tgz", + "integrity": "sha512-Tzd5HBjm8his2OA4bouAsATYEpZrp9vC7z5E5j4C5Of5Rrs1jY67RAwXNcVmd/Bnk1wgvQRou0zGVLey44G4tQ==", + "dev": true, + "requires": { + "minimist": "^1.2.3" + } + }, + "karma-typescript": { + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/karma-typescript/-/karma-typescript-5.5.4.tgz", + "integrity": "sha512-D7nQ96xu/UekuqCmiPimnCuOFqp8+BxiND6MU6IJVN37E7DgXzr7SUeTzwuTHtKSYpgxKv4iOTUteYTxpeZL9A==", + "dev": true, + "requires": { + "acorn": "^8.1.0", + "acorn-walk": "^8.0.2", + "assert": "^2.0.0", + "async": "^3.0.1", + "browser-resolve": "^2.0.0", + "browserify-zlib": "^0.2.0", + "buffer": "^5.4.3", + "combine-source-map": "^0.8.0", + "console-browserify": "^1.2.0", + "constants-browserify": "^1.0.0", + "convert-source-map": "^1.7.0", + "crypto-browserify": "^3.12.0", + "diff": "^4.0.1", + "domain-browser": "^4.16.0", + "events": "^3.2.0", + "glob": "^7.1.6", + "https-browserify": "^1.0.0", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.0", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.17.19", + "log4js": "^6.3.0", + "minimatch": "^3.0.4", + "os-browserify": "^0.3.0", + "pad": "^3.2.0", + "path-browserify": "^1.0.0", + "process": "^0.11.10", + "punycode": "^2.1.1", + "querystring-es3": "^0.2.1", + "readable-stream": "^3.1.1", + "source-map": "^0.7.3", + "stream-browserify": "^3.0.0", + "stream-http": "^3.1.0", + "string_decoder": "^1.3.0", + "timers-browserify": "^2.0.11", + "tmp": "^0.2.1", + "tty-browserify": "^0.0.1", + "url": "^0.11.0", + "util": "^0.12.1", + "vm-browserify": "^1.1.2" + }, + "dependencies": { + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } } }, "locate-path": { @@ -1044,24 +6304,38 @@ } }, "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, - "lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", + "lodash.memoize": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", + "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=", "dev": true }, "log-symbols": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", - "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, "requires": { - "chalk": "^4.0.0" + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + } + }, + "log4js": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.4.1.tgz", + "integrity": "sha512-iUiYnXqAmNKiIZ1XSAitQ4TmNs8CdZYTAWINARF3LjnsLN8tY5m0vRwd6uuWj/yNY0YHxeZodnbmxKFUOM2rMg==", + "dev": true, + "requires": { + "date-format": "^4.0.3", + "debug": "^4.3.3", + "flatted": "^3.2.4", + "rfdc": "^1.3.0", + "streamroller": "^3.0.2" } }, "make-dir": { @@ -1073,74 +6347,182 @@ "semver": "^6.0.0" } }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", + "dev": true + }, + "mime-db": { + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "dev": true + }, + "mime-types": { + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "dev": true, + "requires": { + "mime-db": "1.51.0" + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, "mocha": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.2.0.tgz", - "integrity": "sha512-lEWEMq2LMfNJMKeuEwb5UELi+OgFDollXaytR5ggQcHpzG3NP/R7rvixAvF+9/lLsTWhWG+4yD2M70GsM06nxw==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", + "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", "dev": true, "requires": { - "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", - "chokidar": "3.4.3", - "debug": "4.2.0", - "diff": "4.0.2", + "chokidar": "3.5.3", + "debug": "4.3.4", + "diff": "5.0.0", "escape-string-regexp": "4.0.0", "find-up": "5.0.0", - "glob": "7.1.6", - "growl": "1.10.5", + "glob": "7.2.0", "he": "1.2.0", - "js-yaml": "3.14.0", - "log-symbols": "4.0.0", - "minimatch": "3.0.4", - "ms": "2.1.2", - "nanoid": "3.1.12", - "serialize-javascript": "5.0.1", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", + "ms": "2.1.3", + "nanoid": "3.3.3", + "serialize-javascript": "6.0.0", "strip-json-comments": "3.1.1", - "supports-color": "7.2.0", - "which": "2.0.2", - "wide-align": "1.1.3", - "workerpool": "6.0.2", - "yargs": "13.3.2", - "yargs-parser": "13.1.2", + "supports-color": "8.1.1", + "workerpool": "6.2.1", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", "yargs-unparser": "2.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } } }, "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "nanocolors": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/nanocolors/-/nanocolors-0.2.12.tgz", + "integrity": "sha512-SFNdALvzW+rVlzqexid6epYdt8H9Zol7xDoQarioEFcFN0JHo4CYNztAxmtfgGTVRCmFlEOqqhBpoFGKqSAMug==", "dev": true }, "nanoid": { - "version": "3.1.12", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.12.tgz", - "integrity": "sha512-1qstj9z5+x491jfiC4Nelk+f8XBad7LN20PmyWINJEMRSf3wcAjAWysw1qaA8z6NSKe2sjq1hRSDpBH5paCb6A==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", "dev": true }, - "node-preload": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", - "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", - "dev": true, - "requires": { - "process-on-spawn": "^1.0.0" - } + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true + }, + "node-releases": { + "version": "1.1.77", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.77.tgz", + "integrity": "sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ==", + "dev": true }, "normalize-path": { "version": "3.0.0", @@ -1148,167 +6530,53 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, - "nyc": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", - "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true + }, + "object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "dev": true + }, + "object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", "dev": true, "requires": { - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "caching-transform": "^4.0.0", - "convert-source-map": "^1.7.0", - "decamelize": "^1.2.0", - "find-cache-dir": "^3.2.0", - "find-up": "^4.1.0", - "foreground-child": "^2.0.0", - "get-package-type": "^0.1.0", - "glob": "^7.1.6", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-hook": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", - "istanbul-lib-processinfo": "^2.0.2", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "make-dir": "^3.0.0", - "node-preload": "^0.2.1", - "p-map": "^3.0.0", - "process-on-spawn": "^1.0.0", - "resolve-from": "^5.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "spawn-wrap": "^2.0.0", - "test-exclude": "^6.0.0", - "yargs": "^15.0.2" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" } }, "once": { @@ -1320,13 +6588,19 @@ "wrappy": "1" } }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, "p-limit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz", - "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "requires": { - "p-try": "^2.0.0" + "yocto-queue": "^0.1.0" } }, "p-locate": { @@ -1338,33 +6612,46 @@ "p-limit": "^3.0.2" } }, - "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "pad": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/pad/-/pad-3.2.0.tgz", + "integrity": "sha512-2u0TrjcGbOjBTJpyewEl4hBO3OeX5wWue7eIFPzQTg6wFSvoaHcBTTUY5m+n0hd04gmTCPuY0kCpVIVuw5etwg==", "dev": true, "requires": { - "aggregate-error": "^3.0.0" + "wcwidth": "^1.0.1" } }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", "dev": true }, - "package-hash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", - "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", + "parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", "dev": true, "requires": { - "graceful-fs": "^4.1.15", - "hasha": "^5.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" } }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true + }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -1377,87 +6664,98 @@ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", "dev": true }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "prettier": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.0.tgz", + "integrity": "sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", "dev": true, "requires": { - "find-up": "^4.0.0" + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" }, "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true } } }, - "prettier": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.2.tgz", - "integrity": "sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg==", + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, - "process-on-spawn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", - "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", + "qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "dev": true + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dev": true, "requires": { - "fromentries": "^1.2.0" + "side-channel": "^1.0.4" } }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -1467,22 +6765,52 @@ "safe-buffer": "^5.1.0" } }, - "readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", "dev": true, "requires": { - "picomatch": "^2.2.1" + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" } }, - "release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "requires": { - "es6-error": "^4.0.1" + "picomatch": "^2.2.1" } }, "require-directory": { @@ -1491,26 +6819,26 @@ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", "dev": true }, "resolve": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz", - "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", "dev": true, "requires": { - "is-core-module": "^2.0.0", + "is-core-module": "^2.2.0", "path-parse": "^1.0.6" } }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", "dev": true }, "rimraf": { @@ -1522,109 +6850,208 @@ "glob": "^7.1.3" } }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true }, "serialize-javascript": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", - "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", "dev": true, "requires": { "randombytes": "^2.1.0" } }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", "dev": true }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "requires": { - "shebang-regex": "^3.0.0" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "dev": true + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } }, "smart-buffer": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", - "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==" + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==" + }, + "socket.io": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.1.tgz", + "integrity": "sha512-W+utHys2w//dhFjy7iQQu9sGd3eokCjGbl2r59tyLqNiJJBdIebn3GAKEXBr3osqHTObJi2die/25bCx2zsaaw==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "cors": "~2.8.5", + "debug": "~4.3.2", + "engine.io": "~6.5.0", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" + } + }, + "socket.io-adapter": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", + "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", + "dev": true, + "requires": { + "ws": "~8.11.0" + } + }, + "socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "dev": true, + "requires": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + } }, "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, - "spawn-wrap": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", - "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "stream-browserify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", + "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", "dev": true, "requires": { - "foreground-child": "^2.0.0", - "is-windows": "^1.0.2", - "make-dir": "^3.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "which": "^2.0.1" + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" } }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true + "stream-http": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", + "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "xtend": "^4.0.2" + } + }, + "streamroller": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.0.2.tgz", + "integrity": "sha512-ur6y5S5dopOaRXBuRIZ1u6GC5bcEXHRZKgfBjfCglMhmIf+roVCECjvkEYzNQOXIN2/JPnkMPW/8B3CZoKaEPA==", + "dev": true, + "requires": { + "date-format": "^4.0.3", + "debug": "^4.1.1", + "fs-extra": "^10.0.0" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } }, "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" } }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" } }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } }, "strip-json-comments": { "version": "3.1.1", @@ -1633,23 +7060,30 @@ "dev": true }, "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "requires": { "has-flag": "^4.0.0" } }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", "dev": true, "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" + "setimmediate": "^1.0.4" + } + }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "requires": { + "rimraf": "^3.0.0" } }, "to-fast-properties": { @@ -1667,124 +7101,212 @@ "is-number": "^7.0.0" } }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true + }, + "ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "requires": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "dependencies": { + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + } + } + }, + "tty-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", "dev": true }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, "requires": { - "is-typedarray": "^1.0.0" + "media-typer": "0.3.0", + "mime-types": "~2.1.24" } }, "typescript": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.5.tgz", - "integrity": "sha512-ywmr/VrTVCmNTJ6iV2LwIrfG1P+lv6luD8sUJs+2eI9NLGigaN+nUQc13iHqisq7bra9lnmUSYqbJvegraBOPQ==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", "dev": true }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "ua-parser-js": { + "version": "0.7.33", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.33.tgz", + "integrity": "sha512-s8ax/CeZdK9R/56Sui0WM6y9OFREJarMRHqLB2EwkovemBxNQ+Bqu8GAsUnVcXKgphb++ghr/B2BZx4mahujPw==", "dev": true }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", "dev": true, "requires": { - "isexe": "^2.0.0" + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" } }, - "which-module": { + "universalify": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "util": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", + "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "safe-buffer": "^5.1.2", + "which-typed-array": "^1.1.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", + "dev": true + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "requires": { + "defaults": "^1.0.3" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, "requires": { - "string-width": "^1.0.2 || 2" + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-typed-array": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.7.tgz", + "integrity": "sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-abstract": "^1.18.5", + "foreach": "^2.0.5", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.7" } }, "workerpool": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.0.2.tgz", - "integrity": "sha512-DSNyvOpFKrNusaaUwk+ej6cBj1bmhLcBfj80elGk+ZIo5JSkq+unB1dLKEOcNfJDZgjGICfhQ0Q5TbP0PvF4+Q==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", "dev": true }, "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" } }, "wrappy": { @@ -1793,122 +7315,45 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } + "requires": {} + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true }, "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true }, "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" } }, "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true }, "yargs-unparser": { "version": "2.0.0", @@ -1920,21 +7365,19 @@ "decamelize": "^4.0.0", "flat": "^5.0.2", "is-plain-obj": "^2.1.0" - }, - "dependencies": { - "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "dev": true - }, - "decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true - } } + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true } } } diff --git a/package.json b/package.json index 96e40136..23879911 100644 --- a/package.json +++ b/package.json @@ -1,28 +1,42 @@ { - "name": "binary-parser-encoder", - "version": "1.5.3", + "name": "binary-parser", + "version": "2.2.1", "description": "Blazing-fast binary parser builder", "main": "dist/binary_parser.js", "types": "dist/binary_parser.d.ts", + "module": "dist/esm/binary_parser.mjs", "devDependencies": { - "mocha": "^8.2.0", - "nyc": "^15.1.0", - "prettier": "^2.1.2", - "@types/node": "^14.14.0", - "typescript": "^4.0.3" + "@types/mocha": "^10.0.1", + "@types/node": "^20.4.2", + "karma": "^6.4.2", + "karma-chrome-launcher": "^3.2.0", + "karma-mocha": "^2.0.1", + "karma-typescript": "^5.5.4", + "mocha": "^10.2.0", + "prettier": "^3.0.0", + "ts-node": "^10.9.1", + "typescript": "^5.1.6" + }, + "exports": { + ".": { + "import": "./dist/esm/binary_parser.mjs", + "require": "./dist/binary_parser.js" + }, + "./*": "./*" }, "scripts": { - "build": "tsc", - "fmt": "prettier --write \"{lib,example,test}/**/*.{ts,js}\"", - "check-fmt": "prettier --list-different \"{lib,example,test}/**/*.{ts,js}\"", - "test": "mocha", - "test-browser": "parcel test/browser.html --open", - "cover": "nyc --reporter html mocha", + "build": "npm run build:cjs && npm run build:esm", + "build:cjs": "tsc --module commonjs --outDir dist", + "build:esm": "tsc --module esnext --outDir dist/esm && mv dist/esm/binary_parser.js dist/esm/binary_parser.mjs", + "format": "prettier --list-different \"{lib,example,test,benchmark}/**/*.{ts,js}\"", + "format:fix": "prettier --write \"{lib,example,test,benchmark}/**/*.{ts,js}\"", + "test": "mocha --require ts-node/register test/*.{js,ts}", + "test:browser": "karma start --single-run --browsers ChromeHeadless karma.conf.js", "prepare": "npm run build" }, "files": [ - "dist/*.js", - "dist/binary_parser.d.ts" + "dist", + "lib" ], "keywords": [ "binary", @@ -37,8 +51,8 @@ ], "author": { "name": "Keichi Takahashi", - "email": "keichi.t@me.com", - "url": "https://keichi.net/" + "email": "hello@keichi.dev", + "url": "https://keichi.dev/" }, "contributors": [ { @@ -52,10 +66,10 @@ "url": "http://github.com/Ericbla/binary-parser.git" }, "bugs": "http://github.com/Ericbla/binary-parser/issues", - "dependencies": { - "smart-buffer": "^4.1.0" - }, "engines": { - "node": ">=8.9.0" + "node": ">=14" + }, + "dependencies": { + "smart-buffer": "~4.2.0" } } diff --git a/test/browser.html b/test/browser.html deleted file mode 100644 index 2b6752b8..00000000 --- a/test/browser.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - Mocha Tests - - - - -
- - - - - - - - - diff --git a/test/composite_parser.js b/test/composite_parser.js deleted file mode 100644 index 9d118882..00000000 --- a/test/composite_parser.js +++ /dev/null @@ -1,1109 +0,0 @@ -var assert = require('assert'); -var TextEncoder = - typeof TextEncoder === 'undefined' - ? require('util').TextEncoder - : TextEncoder; -var Parser = require('../dist/binary_parser').Parser; - -const suite = (Buffer) => - describe(`Composite parser (${Buffer.name})`, function () { - function hexToBuf(hex) { - return Buffer.from( - hex.match(/.{1,2}/g).map((byte) => parseInt(byte, 16)) - ); - } - describe('Array parser', function () { - it('should parse array of primitive types', function () { - var parser = Parser.start().uint8('length').array('message', { - length: 'length', - type: 'uint8', - }); - - var buffer = Buffer.from([12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]); - assert.deepEqual(parser.parse(buffer), { - length: 12, - message: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], - }); - }); - it('should parse array of primitive types with lengthInBytes', function () { - var parser = Parser.start().uint8('length').array('message', { - lengthInBytes: 'length', - type: 'uint8', - }); - - var buffer = Buffer.from([12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]); - assert.deepEqual(parser.parse(buffer), { - length: 12, - message: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], - }); - }); - it('should parse array of user defined types', function () { - var elementParser = new Parser().uint8('key').int16le('value'); - - var parser = Parser.start().uint16le('length').array('message', { - length: 'length', - type: elementParser, - }); - - var buffer = Buffer.from([ - 0x02, - 0x00, - 0xca, - 0xd2, - 0x04, - 0xbe, - 0xd3, - 0x04, - ]); - assert.deepEqual(parser.parse(buffer), { - length: 0x02, - message: [ - { key: 0xca, value: 1234 }, - { key: 0xbe, value: 1235 }, - ], - }); - }); - it('should parse array of user defined types with lengthInBytes', function () { - var elementParser = new Parser().uint8('key').int16le('value'); - - var parser = Parser.start().uint16le('length').array('message', { - lengthInBytes: 'length', - type: elementParser, - }); - - var buffer = Buffer.from([ - 0x06, - 0x00, - 0xca, - 0xd2, - 0x04, - 0xbe, - 0xd3, - 0x04, - ]); - assert.deepEqual(parser.parse(buffer), { - length: 0x06, - message: [ - { key: 0xca, value: 1234 }, - { key: 0xbe, value: 1235 }, - ], - }); - }); - it('should parse array of user defined types with lengthInBytes literal', function () { - var elementParser = new Parser().uint8('key').int16le('value'); - - var parser = Parser.start().array('message', { - lengthInBytes: 0x06, - type: elementParser, - }); - - var buffer = Buffer.from([0xca, 0xd2, 0x04, 0xbe, 0xd3, 0x04]); - assert.deepEqual(parser.parse(buffer), { - message: [ - { key: 0xca, value: 1234 }, - { key: 0xbe, value: 1235 }, - ], - }); - }); - it('should parse array of user defined types with lengthInBytes function', function () { - var elementParser = new Parser().uint8('key').int16le('value'); - - var parser = Parser.start() - .uint16le('length') - .array('message', { - lengthInBytes: function () { - return this.length; - }, - type: elementParser, - }); - - var buffer = Buffer.from([ - 0x06, - 0x00, - 0xca, - 0xd2, - 0x04, - 0xbe, - 0xd3, - 0x04, - ]); - assert.deepEqual(parser.parse(buffer), { - length: 0x06, - message: [ - { key: 0xca, value: 1234 }, - { key: 0xbe, value: 1235 }, - ], - }); - }); - it('should parse array of arrays', function () { - var rowParser = Parser.start().uint8('length').array('cols', { - length: 'length', - type: 'int32le', - }); - - var parser = Parser.start().uint8('length').array('rows', { - length: 'length', - type: rowParser, - }); - - var size = 1 + 10 * (1 + 5 * 4); - var buffer = Buffer.alloc ? Buffer.alloc(size) : new Buffer(size); - var dataView = new DataView(buffer.buffer); - var i, j; - - var iterator = 0; - buffer[iterator] = 10; - iterator += 1; - for (i = 0; i < 10; i++) { - buffer[iterator] = 5; - iterator += 1; - for (j = 0; j < 5; j++) { - dataView.setInt32(iterator, i * j, true); - iterator += 4; - } - } - - assert.deepEqual(parser.parse(buffer), { - length: 10, - rows: [ - { length: 5, cols: [0, 0, 0, 0, 0] }, - { length: 5, cols: [0, 1, 2, 3, 4] }, - { length: 5, cols: [0, 2, 4, 6, 8] }, - { length: 5, cols: [0, 3, 6, 9, 12] }, - { length: 5, cols: [0, 4, 8, 12, 16] }, - { length: 5, cols: [0, 5, 10, 15, 20] }, - { length: 5, cols: [0, 6, 12, 18, 24] }, - { length: 5, cols: [0, 7, 14, 21, 28] }, - { length: 5, cols: [0, 8, 16, 24, 32] }, - { length: 5, cols: [0, 9, 18, 27, 36] }, - ], - }); - }); - it('should parse until eof when readUntil is specified', function () { - var parser = Parser.start().array('data', { - readUntil: 'eof', - type: 'uint8', - }); - - var buffer = Buffer.from([ - 0xff, - 0xff, - 0xff, - 0xff, - 0xff, - 0xff, - 0xff, - 0xff, - 0xff, - 0xff, - ]); - assert.deepEqual(parser.parse(buffer), { - data: [0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff], - }); - }); - it('should parse until function returns true when readUntil is function', function () { - var parser = Parser.start().array('data', { - readUntil: function (item, buf) { - return item === 0; - }, - type: 'uint8', - }); - - var buffer = Buffer.from([ - 0xff, - 0xff, - 0xff, - 0x01, - 0x00, - 0xff, - 0xff, - 0xff, - 0xff, - 0xff, - ]); - assert.deepEqual(parser.parse(buffer), { - data: [0xff, 0xff, 0xff, 0x01, 0x00], - }); - }); - it('should parse until function returns true when readUntil is function (using read-ahead)', function () { - var parser = Parser.start().array('data', { - readUntil: function (item, buf) { - return buf.length > 0 && buf[0] === 0; - }, - type: 'uint8', - }); - - var buffer = Buffer.from([ - 0xff, - 0xff, - 0xff, - 0x01, - 0x00, - 0xff, - 0xff, - 0xff, - 0xff, - 0xff, - ]); - assert.deepEqual(parser.parse(buffer), { - data: [0xff, 0xff, 0xff, 0x01], - }); - }); - it('should parse associative arrays', function () { - var parser = Parser.start() - .int8('numlumps') - .array('lumps', { - type: Parser.start() - .int32le('filepos') - .int32le('size') - .string('name', { length: 8, encoding: 'utf8' }), - length: 'numlumps', - key: 'name', - }); - - var buffer = Buffer.from([ - 0x02, - 0xd2, - 0x04, - 0x00, - 0x00, - 0x2e, - 0x16, - 0x00, - 0x00, - 0x41, - 0x41, - 0x41, - 0x41, - 0x41, - 0x41, - 0x41, - 0x41, - 0x2e, - 0x16, - 0x00, - 0x00, - 0xd2, - 0x04, - 0x00, - 0x00, - 0x62, - 0x62, - 0x62, - 0x62, - 0x62, - 0x62, - 0x62, - 0x62, - ]); - assert.deepEqual(parser.parse(buffer), { - numlumps: 2, - lumps: { - AAAAAAAA: { - filepos: 1234, - size: 5678, - name: 'AAAAAAAA', - }, - bbbbbbbb: { - filepos: 5678, - size: 1234, - name: 'bbbbbbbb', - }, - }, - }); - }); - it('should use formatter to transform parsed array', function () { - var parser = Parser.start().array('data', { - type: 'uint8', - length: 4, - formatter: function (arr) { - return arr.join('.'); - }, - }); - - var buffer = Buffer.from([0x0a, 0x0a, 0x01, 0x6e]); - assert.deepEqual(parser.parse(buffer), { - data: '10.10.1.110', - }); - }); - it('should be able to go into recursion', function () { - var parser = Parser.start() - .namely('self') - .uint8('length') - .array('data', { - type: 'self', - length: 'length', - }); - - var buffer = Buffer.from([1, 1, 1, 0]); - assert.deepEqual(parser.parse(buffer), { - length: 1, - data: [ - { - length: 1, - data: [ - { - length: 1, - data: [{ length: 0, data: [] }], - }, - ], - }, - ], - }); - }); - it('should be able to go into even deeper recursion', function () { - var parser = Parser.start() - .namely('self') - .uint8('length') - .array('data', { - type: 'self', - length: 'length', - }); - - // 2 - // / \ - // 3 1 - // / | \ \ - // 1 0 2 0 - // / / \ - // 0 1 0 - // / - // 0 - - var buffer = Buffer.from([ - 2, - /* 0 */ 3, - /* 0 */ 1, - /* 0 */ 0, - /* 1 */ 0, - /* 2 */ 2, - /* 0 */ 1, - /* 0 */ 0, - /* 1 */ 0, - /* 1 */ 1, - /* 0 */ 0, - ]); - assert.deepEqual(parser.parse(buffer), { - length: 2, - data: [ - { - length: 3, - data: [ - { length: 1, data: [{ length: 0, data: [] }] }, - { length: 0, data: [] }, - { - length: 2, - data: [ - { length: 1, data: [{ length: 0, data: [] }] }, - { length: 0, data: [] }, - ], - }, - ], - }, - { - length: 1, - data: [{ length: 0, data: [] }], - }, - ], - }); - }); - - it('should allow parent parser attributes as choice key', function () { - var ChildParser = Parser.start().choice('data', { - tag: function (vars) { - return vars.version; - }, - choices: { - 1: Parser.start().uint8('v1'), - 2: Parser.start().uint16('v2'), - }, - }); - - var ParentParser = Parser.start() - .uint8('version') - .nest('child', { type: ChildParser }); - - var buffer = Buffer.from([0x1, 0x2]); - assert.deepEqual(ParentParser.parse(buffer), { - version: 1, - child: { data: { v1: 2 } }, - }); - - buffer = Buffer.from([0x2, 0x3, 0x4]); - assert.deepEqual(ParentParser.parse(buffer), { - version: 2, - child: { data: { v2: 0x0304 } }, - }); - }); - }); - - describe('Choice parser', function () { - it('should parse choices of primitive types', function () { - var parser = Parser.start() - .uint8('tag1') - .choice('data1', { - tag: 'tag1', - choices: { - 0: 'int32le', - 1: 'int16le', - }, - }) - .uint8('tag2') - .choice('data2', { - tag: 'tag2', - choices: { - 0: 'int32le', - 1: 'int16le', - }, - }); - - var buffer = Buffer.from([ - 0x0, - 0x4e, - 0x61, - 0xbc, - 0x00, - 0x01, - 0xd2, - 0x04, - ]); - assert.deepEqual(parser.parse(buffer), { - tag1: 0, - data1: 12345678, - tag2: 1, - data2: 1234, - }); - }); - it('should parse default choice', function () { - var parser = Parser.start() - .uint8('tag') - .choice('data', { - tag: 'tag', - choices: { - 0: 'int32le', - 1: 'int16le', - }, - defaultChoice: 'uint8', - }) - .int32le('test'); - - var buffer = Buffer.from([0x03, 0xff, 0x2f, 0xcb, 0x04, 0x0]); - assert.deepEqual(parser.parse(buffer), { - tag: 3, - data: 0xff, - test: 314159, - }); - }); - it('should parse choices of user defied types', function () { - var parser = Parser.start() - .uint8('tag') - .choice('data', { - tag: 'tag', - choices: { - 1: Parser.start() - .uint8('length') - .string('message', { length: 'length' }), - 3: Parser.start().int32le('number'), - }, - }); - - var buffer = Buffer.from([ - 0x1, - 0xc, - 0x68, - 0x65, - 0x6c, - 0x6c, - 0x6f, - 0x2c, - 0x20, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - ]); - assert.deepEqual(parser.parse(buffer), { - tag: 1, - data: { - length: 12, - message: 'hello, world', - }, - }); - buffer = Buffer.from([0x03, 0x4e, 0x61, 0xbc, 0x00]); - assert.deepEqual(parser.parse(buffer), { - tag: 3, - data: { - number: 12345678, - }, - }); - }); - it('should be able to go into recursion', function () { - var stop = Parser.start(); - - var parser = Parser.start() - .namely('self') - .uint8('type') - .choice('data', { - tag: 'type', - choices: { - 0: stop, - 1: 'self', - }, - }); - - var buffer = Buffer.from([1, 1, 1, 0]); - assert.deepEqual(parser.parse(buffer), { - type: 1, - data: { - type: 1, - data: { - type: 1, - data: { type: 0, data: {} }, - }, - }, - }); - }); - it('should be able to go into recursion with simple nesting', function () { - var stop = Parser.start(); - - var parser = Parser.start() - .namely('self') - .uint8('type') - .choice('data', { - tag: 'type', - choices: { - 0: stop, - 1: 'self', - 2: Parser.start() - .nest('left', { type: 'self' }) - .nest('right', { type: stop }), - }, - }); - - var buffer = Buffer.from([2, /* left */ 1, 1, 0, /* right */ 0]); - assert.deepEqual(parser.parse(buffer), { - type: 2, - data: { - left: { - type: 1, - data: { type: 1, data: { type: 0, data: {} } }, - }, - right: {}, - }, - }); - }); - it('should be able to refer to other parsers by name', function () { - var parser = Parser.start().namely('self'); - - var stop = Parser.start().namely('stop'); - - var twoCells = Parser.start() - .namely('twoCells') - .nest('left', { type: 'self' }) - .nest('right', { type: 'stop' }); - - parser.uint8('type').choice('data', { - tag: 'type', - choices: { - 0: 'stop', - 1: 'self', - 2: 'twoCells', - }, - }); - - var buffer = Buffer.from([2, /* left */ 1, 1, 0, /* right */ 0]); - assert.deepEqual(parser.parse(buffer), { - type: 2, - data: { - left: { - type: 1, - data: { type: 1, data: { type: 0, data: {} } }, - }, - right: {}, - }, - }); - }); - it('should be able to refer to other parsers both directly and by name', function () { - var parser = Parser.start().namely('self'); - - var stop = Parser.start(); - - var twoCells = Parser.start() - .nest('left', { type: 'self' }) - .nest('right', { type: stop }); - - parser.uint8('type').choice('data', { - tag: 'type', - choices: { - 0: stop, - 1: 'self', - 2: twoCells, - }, - }); - - var buffer = Buffer.from([2, /* left */ 1, 1, 0, /* right */ 0]); - assert.deepEqual(parser.parse(buffer), { - type: 2, - data: { - left: { - type: 1, - data: { type: 1, data: { type: 0, data: {} } }, - }, - right: {}, - }, - }); - }); - it('should be able to go into recursion with complex nesting', function () { - var stop = Parser.start(); - - var parser = Parser.start() - .namely('self') - .uint8('type') - .choice('data', { - tag: 'type', - choices: { - 0: stop, - 1: 'self', - 2: Parser.start() - .nest('left', { type: 'self' }) - .nest('right', { type: 'self' }), - 3: Parser.start() - .nest('one', { type: 'self' }) - .nest('two', { type: 'self' }) - .nest('three', { type: 'self' }), - }, - }); - - // 2 - // / \ - // 3 1 - // / | \ \ - // 1 0 2 0 - // / / \ - // 0 1 0 - // / - // 0 - - var buffer = Buffer.from([ - 2, - /* left -> */ 3, - /* one -> */ 1, - /* -> */ 0, - /* two -> */ 0, - /* three -> */ 2, - /* left -> */ 1, - /* -> */ 0, - /* right -> */ 0, - /* right -> */ 1, - /* -> */ 0, - ]); - assert.deepEqual(parser.parse(buffer), { - type: 2, - data: { - left: { - type: 3, - data: { - one: { type: 1, data: { type: 0, data: {} } }, - two: { type: 0, data: {} }, - three: { - type: 2, - data: { - left: { type: 1, data: { type: 0, data: {} } }, - right: { type: 0, data: {} }, - }, - }, - }, - }, - right: { - type: 1, - data: { type: 0, data: {} }, - }, - }, - }); - }); - it("should be able to 'flatten' choices when using null varName", function () { - var parser = Parser.start() - .uint8('tag') - .choice(null, { - tag: 'tag', - choices: { - 1: Parser.start() - .uint8('length') - .string('message', { length: 'length' }), - 3: Parser.start().int32le('number'), - }, - }); - - var buffer = Buffer.from([ - 0x1, - 0xc, - 0x68, - 0x65, - 0x6c, - 0x6c, - 0x6f, - 0x2c, - 0x20, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - ]); - assert.deepEqual(parser.parse(buffer), { - tag: 1, - length: 12, - message: 'hello, world', - }); - buffer = Buffer.from([0x03, 0x4e, 0x61, 0xbc, 0x00]); - assert.deepEqual(parser.parse(buffer), { - tag: 3, - number: 12345678, - }); - }); - it("should be able to 'flatten' choices when omitting varName paramater", function () { - var parser = Parser.start() - .uint8('tag') - .choice({ - tag: 'tag', - choices: { - 1: Parser.start() - .uint8('length') - .string('message', { length: 'length' }), - 3: Parser.start().int32le('number'), - }, - }); - - var buffer = Buffer.from([ - 0x1, - 0xc, - 0x68, - 0x65, - 0x6c, - 0x6c, - 0x6f, - 0x2c, - 0x20, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - ]); - assert.deepEqual(parser.parse(buffer), { - tag: 1, - length: 12, - message: 'hello, world', - }); - buffer = Buffer.from([0x03, 0x4e, 0x61, 0xbc, 0x00]); - assert.deepEqual(parser.parse(buffer), { - tag: 3, - number: 12345678, - }); - }); - it('should be able to use function as the choice selector', function () { - var parser = Parser.start() - .string('selector', { length: 4 }) - .choice(null, { - tag: function () { - return parseInt(this.selector, 2); // string base 2 to integer decimal - }, - choices: { - 2: Parser.start() - .uint8('length') - .string('message', { length: 'length' }), - 7: Parser.start().int32le('number'), - }, - }); - - var buffer = Buffer.from([ - 48, - 48, - 49, - 48, - 0xc, - 0x68, - 0x65, - 0x6c, - 0x6c, - 0x6f, - 0x2c, - 0x20, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, - ]); - assert.deepEqual(parser.parse(buffer), { - selector: '0010', // -> choice 2 - length: 12, - message: 'hello, world', - }); - buffer = Buffer.from([48, 49, 49, 49, 0x4e, 0x61, 0xbc, 0x00]); - assert.deepEqual(parser.parse(buffer), { - selector: '0111', // -> choice 7 - number: 12345678, - }); - }); - }); - - describe('Nest parser', function () { - it('should parse nested parsers', function () { - var nameParser = new Parser() - .string('firstName', { - zeroTerminated: true, - }) - .string('lastName', { - zeroTerminated: true, - }); - var infoParser = new Parser().uint8('age'); - var personParser = new Parser() - .nest('name', { - type: nameParser, - }) - .nest('info', { - type: infoParser, - }); - - var buffer = Buffer.from([ - ...Buffer.from(new TextEncoder().encode('John\0Doe\0')), - ...Buffer.from([0x20]), - ]); - assert.deepEqual(personParser.parse(buffer), { - name: { - firstName: 'John', - lastName: 'Doe', - }, - info: { - age: 0x20, - }, - }); - }); - - it('should format parsed nested parser', function () { - var nameParser = new Parser() - .string('firstName', { - zeroTerminated: true, - }) - .string('lastName', { - zeroTerminated: true, - }); - var personParser = new Parser().nest('name', { - type: nameParser, - formatter: function (name) { - return name.firstName + ' ' + name.lastName; - }, - }); - - var buffer = Buffer.from(new TextEncoder().encode('John\0Doe\0')); - assert.deepEqual(personParser.parse(buffer), { - name: 'John Doe', - }); - }); - - it("should 'flatten' output when using null varName", function () { - var parser = new Parser() - .string('s1', { zeroTerminated: true }) - .nest(null, { - type: new Parser().string('s2', { zeroTerminated: true }), - }); - - var buf = Buffer.from(new TextEncoder().encode('foo\0bar\0')); - - assert.deepEqual(parser.parse(buf), { s1: 'foo', s2: 'bar' }); - }); - - it("should 'flatten' output when omitting varName", function () { - var parser = new Parser().string('s1', { zeroTerminated: true }).nest({ - type: new Parser().string('s2', { zeroTerminated: true }), - }); - - var buf = Buffer.from(new TextEncoder().encode('foo\0bar\0')); - - assert.deepEqual(parser.parse(buf), { s1: 'foo', s2: 'bar' }); - }); - }); - - describe('Constructors', function () { - it('should create a custom object type', function () { - function Person() { - this.name = ''; - } - Person.prototype.toString = function () { - return '[object Person]'; - }; - var parser = Parser.start().create(Person).string('name', { - zeroTerminated: true, - }); - - var buffer = Buffer.from(new TextEncoder().encode('John Doe\0')); - var person = parser.parse(buffer); - assert.ok(person instanceof Person); - assert.equal(person.name, 'John Doe'); - }); - }); - - describe('Pointer parser', function () { - it('should move pointer to specified offset', function () { - var parser = Parser.start().pointer('x', { type: 'uint8', offset: 2 }); - var buf = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5]); - - assert.deepEqual(parser.parse(buf), { x: 3 }); - }); - - it('should restore pointer to original position', function () { - var parser = Parser.start() - .pointer('x', { type: 'uint8', offset: 2 }) - .uint16be('y'); - var buf = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5]); - - assert.deepEqual(parser.parse(buf), { x: 0x3, y: 0x0102 }); - }); - - it('should work with child parser', function () { - var parser = Parser.start() - .uint32le('x') - .pointer('y', { - type: Parser.start().string('s', { zeroTerminated: true }), - offset: 4, - }); - var buf = Buffer.from(new TextEncoder().encode('\1\2\3\4hello\0\6')); - - assert.deepEqual(parser.parse(buf), { - x: 0x04030201, - y: { s: 'hello' }, - }); - }); - - it('should pass variable context to child parser', function () {}); - var parser = Parser.start() - .uint16be('len') - .pointer('child', { - offset: 4, - type: Parser.start().array('a', { - type: 'uint8', - length: function (vars) { - return vars.len; - }, - }), - }); - var buf = Buffer.from(new TextEncoder().encode('\0\6\0\0\1\2\3\4\5\6')); - - assert.deepEqual(parser.parse(buf), { - len: 6, - child: { a: [1, 2, 3, 4, 5, 6] }, - }); - }); - - describe('SaveOffset', () => { - it('should save the offset', () => { - const buff = Buffer.from([0x01, 0x00, 0x02]); - const parser = Parser.start() - .int8('a') - .int16('b') - .saveOffset('bytesRead'); - - assert.deepEqual(parser.parse(buff), { - a: 1, - b: 2, - bytesRead: 3, - }); - }); - - it('should save the offset if not at end', () => { - const buff = Buffer.from([0x01, 0x00, 0x02]); - const parser = Parser.start() - .int8('a') - .saveOffset('bytesRead') - .int16('b'); - - assert.deepEqual(parser.parse(buff), { - a: 1, - b: 2, - bytesRead: 1, - }); - }); - - it('should save the offset with a dynamic parser', () => { - const buff = Buffer.from([0x74, 0x65, 0x73, 0x74, 0x00]); - const parser = Parser.start() - .string('name', { zeroTerminated: true }) - .saveOffset('bytesRead'); - - assert.deepEqual(parser.parse(buff), { - name: 'test', - bytesRead: 5, - }); - }); - }); - - describe('Utilities', function () { - it('should count size for fixed size structs', function () { - var parser = Parser.start() - .int8('a') - .int32le('b') - .string('msg', { length: 10 }) - .seek(2) - .array('data', { - length: 3, - type: 'int8', - }) - .buffer('raw', { length: 8 }); - - assert.equal(parser.sizeOf(), 1 + 4 + 10 + 2 + 3 + 8); - }); - it('should assert parsed values', function () { - var parser = Parser.start().string('msg', { - encoding: 'utf8', - zeroTerminated: true, - assert: 'hello, world', - }); - var buffer = hexToBuf('68656c6c6f2c20776f726c6400'); - assert.doesNotThrow(function () { - parser.parse(buffer); - }); - - buffer = hexToBuf('68656c6c6f2c206a7300'); - assert.throws(function () { - parser.parse(buffer); - }); - - parser = new Parser() - .int16le('a') - .int16le('b') - .int16le('c', { - assert: function (x) { - return this.a + this.b === x; - }, - }); - - buffer = hexToBuf('d2042e16001b'); - assert.doesNotThrow(function () { - parser.parse(buffer); - }); - buffer = hexToBuf('2e16001bd204'); - assert.throws(function () { - parser.parse(buffer); - }); - }); - }); - - describe('Parse other fields after bit', function () { - it('Parse uint8', function () { - var buffer = Buffer.from([0, 1, 0, 4]); - for (var i = 17; i <= 24; i++) { - var parser = Parser.start()['bit' + i]('a').uint8('b'); - - assert.deepEqual(parser.parse(buffer), { - a: 1 << (i - 16), - b: 4, - }); - } - }); - }); - }); - -suite(Buffer); -suite(Uint8Array); diff --git a/test/composite_parser.ts b/test/composite_parser.ts new file mode 100644 index 00000000..da744cf3 --- /dev/null +++ b/test/composite_parser.ts @@ -0,0 +1,1461 @@ +import { deepStrictEqual, throws, doesNotThrow, ok } from "assert"; +import { deflateRawSync, inflateRawSync } from "zlib"; +import { Parser } from "../lib/binary_parser"; + +function compositeParserTests( + name: string, + factory: (array: Uint8Array | number[]) => Uint8Array, +) { + describe(`Composite parser (${name})`, () => { + function hexToBuf(hex: string): Uint8Array { + return factory(hex.match(/.{1,2}/g)!.map((byte) => parseInt(byte, 16))); + } + + describe("Array parser", () => { + it("should parse array of primitive types", () => { + const parser = Parser.start().uint8("length").array("message", { + length: "length", + type: "uint8", + }); + + const buffer = factory([12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]); + deepStrictEqual(parser.parse(buffer), { + length: 12, + message: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], + }); + }); + it("should parse array of primitive types with lengthInBytes", () => { + const parser = Parser.start().uint8("length").array("message", { + lengthInBytes: "length", + type: "uint8", + }); + + const buffer = factory([12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]); + deepStrictEqual(parser.parse(buffer), { + length: 12, + message: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], + }); + }); + it("should parse array of user defined types", () => { + const elementParser = new Parser().uint8("key").int16le("value"); + + const parser = Parser.start().uint16le("length").array("message", { + length: "length", + type: elementParser, + }); + + const buffer = factory([ + 0x02, 0x00, 0xca, 0xd2, 0x04, 0xbe, 0xd3, 0x04, + ]); + deepStrictEqual(parser.parse(buffer), { + length: 0x02, + message: [ + { key: 0xca, value: 1234 }, + { key: 0xbe, value: 1235 }, + ], + }); + }); + it("should parse array of user defined types and have access to parent context", () => { + const elementParser = new Parser().uint8("key").array("value", { + type: "uint8", + length: function (this: any) { + return this.$parent.valueLength; + }, + }); + + const parser = Parser.start() + .useContextVars() + .uint16le("length") + .uint16le("valueLength") + .array("message", { + length: "length", + type: elementParser, + }); + + const buffer = factory([ + 0x02, 0x00, 0x02, 0x00, 0xca, 0xd2, 0x04, 0xbe, 0xd3, 0x04, + ]); + deepStrictEqual(parser.parse(buffer), { + length: 0x02, + valueLength: 0x02, + message: [ + { key: 0xca, value: [0xd2, 0x04] }, + { key: 0xbe, value: [0xd3, 0x04] }, + ], + }); + }); + it("should parse array of user defined types and have access to root context", () => { + const elementParser = new Parser().uint8("key").nest("data", { + type: new Parser().array("value", { + type: "uint8", + length: "$root.valueLength", + }), + }); + + const parser = Parser.start() + .useContextVars() + .uint16le("length") + .uint16le("valueLength") + .array("message", { + length: "length", + type: elementParser, + }); + + const buffer = factory([ + 0x02, 0x00, 0x02, 0x00, 0xca, 0xd2, 0x04, 0xbe, 0xd3, 0x04, + ]); + deepStrictEqual(parser.parse(buffer), { + length: 0x02, + valueLength: 0x02, + message: [ + { key: 0xca, data: { value: [0xd2, 0x04] } }, + { key: 0xbe, data: { value: [0xd3, 0x04] } }, + ], + }); + }); + it("should parse array of user defined types with lengthInBytes", () => { + const elementParser = new Parser().uint8("key").int16le("value"); + + const parser = Parser.start().uint16le("length").array("message", { + lengthInBytes: "length", + type: elementParser, + }); + + const buffer = factory([ + 0x06, 0x00, 0xca, 0xd2, 0x04, 0xbe, 0xd3, 0x04, + ]); + deepStrictEqual(parser.parse(buffer), { + length: 0x06, + message: [ + { key: 0xca, value: 1234 }, + { key: 0xbe, value: 1235 }, + ], + }); + }); + it("should parse array of user defined types with lengthInBytes literal", () => { + const elementParser = new Parser().uint8("key").int16le("value"); + + const parser = Parser.start().array("message", { + lengthInBytes: 0x06, + type: elementParser, + }); + + const buffer = factory([0xca, 0xd2, 0x04, 0xbe, 0xd3, 0x04]); + deepStrictEqual(parser.parse(buffer), { + message: [ + { key: 0xca, value: 1234 }, + { key: 0xbe, value: 1235 }, + ], + }); + }); + it("should parse array of user defined types with lengthInBytes function", () => { + const elementParser = new Parser().uint8("key").int16le("value"); + + const parser = Parser.start() + .uint16le("length") + .array("message", { + lengthInBytes: function (this: any) { + return this.length; + }, + type: elementParser, + }); + + const buffer = factory([ + 0x06, 0x00, 0xca, 0xd2, 0x04, 0xbe, 0xd3, 0x04, + ]); + deepStrictEqual(parser.parse(buffer), { + length: 0x06, + message: [ + { key: 0xca, value: 1234 }, + { key: 0xbe, value: 1235 }, + ], + }); + }); + it("should parse array of arrays", () => { + const rowParser = Parser.start().uint8("length").array("cols", { + length: "length", + type: "int32le", + }); + + const parser = Parser.start().uint8("length").array("rows", { + length: "length", + type: rowParser, + }); + + const size = 1 + 10 * (1 + 5 * 4); + const buffer = Buffer.alloc ? Buffer.alloc(size) : new Buffer(size); + const dataView = new DataView(buffer.buffer); + + let iterator = 0; + buffer[iterator] = 10; + iterator += 1; + for (let i = 0; i < 10; i++) { + buffer[iterator] = 5; + iterator += 1; + for (let j = 0; j < 5; j++) { + dataView.setInt32(iterator, i * j, true); + iterator += 4; + } + } + + deepStrictEqual(parser.parse(buffer), { + length: 10, + rows: [ + { length: 5, cols: [0, 0, 0, 0, 0] }, + { length: 5, cols: [0, 1, 2, 3, 4] }, + { length: 5, cols: [0, 2, 4, 6, 8] }, + { length: 5, cols: [0, 3, 6, 9, 12] }, + { length: 5, cols: [0, 4, 8, 12, 16] }, + { length: 5, cols: [0, 5, 10, 15, 20] }, + { length: 5, cols: [0, 6, 12, 18, 24] }, + { length: 5, cols: [0, 7, 14, 21, 28] }, + { length: 5, cols: [0, 8, 16, 24, 32] }, + { length: 5, cols: [0, 9, 18, 27, 36] }, + ], + }); + }); + it("should parse until eof when readUntil is specified", () => { + const parser = Parser.start().array("data", { + readUntil: "eof", + type: "uint8", + }); + + const buffer = factory([ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + ]); + deepStrictEqual(parser.parse(buffer), { + data: [0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff], + }); + }); + it("should parse until function returns true when readUntil is function", () => { + const parser = Parser.start().array("data", { + readUntil: (item: number, _: Buffer) => item === 0, + type: "uint8", + }); + + const buffer = factory([ + 0xff, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, + ]); + deepStrictEqual(parser.parse(buffer), { + data: [0xff, 0xff, 0xff, 0x01, 0x00], + }); + }); + it("should parse until function returns true when readUntil is function (using read-ahead)", () => { + const parser = Parser.start().array("data", { + readUntil: (_: number, buf: Buffer) => buf.length > 0 && buf[0] === 0, + type: "uint8", + }); + + const buffer = factory([ + 0xff, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, + ]); + deepStrictEqual(parser.parse(buffer), { + data: [0xff, 0xff, 0xff, 0x01], + }); + }); + it("should parse associative arrays", () => { + const parser = Parser.start() + .int8("numlumps") + .array("lumps", { + type: Parser.start() + .int32le("filepos") + .int32le("size") + .string("name", { length: 8, encoding: "utf8" }), + length: "numlumps", + key: "name", + }); + + const buffer = factory([ + 0x02, 0xd2, 0x04, 0x00, 0x00, 0x2e, 0x16, 0x00, 0x00, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x2e, 0x16, 0x00, 0x00, 0xd2, + 0x04, 0x00, 0x00, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, + ]); + deepStrictEqual(parser.parse(buffer), { + numlumps: 2, + lumps: { + AAAAAAAA: { + filepos: 1234, + size: 5678, + name: "AAAAAAAA", + }, + bbbbbbbb: { + filepos: 5678, + size: 1234, + name: "bbbbbbbb", + }, + }, + }); + }); + it("should use formatter to transform parsed array", () => { + const parser = Parser.start().array("data", { + type: "uint8", + length: 4, + formatter: (arr: number[]) => arr.join("."), + }); + + const buffer = factory([0x0a, 0x0a, 0x01, 0x6e]); + deepStrictEqual(parser.parse(buffer), { + data: "10.10.1.110", + }); + }); + it("should be able to go into recursion", () => { + const parser = Parser.start() + .namely("self") + .uint8("length") + .array("data", { + type: "self", + length: "length", + }); + + const buffer = factory([1, 1, 1, 0]); + deepStrictEqual(parser.parse(buffer), { + length: 1, + data: [ + { + length: 1, + data: [ + { + length: 1, + data: [{ length: 0, data: [] }], + }, + ], + }, + ], + }); + }); + it("should be able to go into even deeper recursion", () => { + const parser = Parser.start() + .namely("self") + .uint8("length") + .array("data", { + type: "self", + length: "length", + }); + + // 2 + // / \ + // 3 1 + // / | \ \ + // 1 0 2 0 + // / / \ + // 0 1 0 + // / + // 0 + + // prettier-ignore + const buffer = factory([ + 2, + /* 0 */ 3, + /* 0 */ 1, + /* 0 */ 0, + /* 1 */ 0, + /* 2 */ 2, + /* 0 */ 1, + /* 0 */ 0, + /* 1 */ 0, + /* 1 */ 1, + /* 0 */ 0, + ]); + deepStrictEqual(parser.parse(buffer), { + length: 2, + data: [ + { + length: 3, + data: [ + { length: 1, data: [{ length: 0, data: [] }] }, + { length: 0, data: [] }, + { + length: 2, + data: [ + { length: 1, data: [{ length: 0, data: [] }] }, + { length: 0, data: [] }, + ], + }, + ], + }, + { + length: 1, + data: [{ length: 0, data: [] }], + }, + ], + }); + }); + it("should allow parent parser attributes as choice key", () => { + const ChildParser = Parser.start().choice("data", { + tag: (vars: { version: number }) => vars.version, + choices: { + 1: Parser.start().uint8("v1"), + 2: Parser.start().uint16("v2"), + }, + }); + + const ParentParser = Parser.start() + .uint8("version") + .nest("child", { type: ChildParser }); + + const buffer1 = factory([0x1, 0x2]); + deepStrictEqual(ParentParser.parse(buffer1), { + version: 1, + child: { data: { v1: 2 } }, + }); + + const buffer2 = factory([0x2, 0x3, 0x4]); + deepStrictEqual(ParentParser.parse(buffer2), { + version: 2, + child: { data: { v2: 0x0304 } }, + }); + }); + it("should be able to access to index context variable when using length", () => { + const elementParser = new Parser() + .uint8("key", { + formatter: function (this: any, item: number) { + return this.$index % 2 === 0 ? item : String.fromCharCode(item); + }, + }) + .nest("data", { + type: new Parser().array("value", { + type: "uint8", + length: "$root.valueLength", + }), + }); + + const parser = Parser.start() + .useContextVars() + .uint16le("length") + .uint16le("valueLength") + .array("message", { + length: "length", + type: elementParser, + }); + + const buffer = factory([ + 0x02, 0x00, 0x02, 0x00, 0x50, 0xd2, 0x04, 0x51, 0xd3, 0x04, + ]); + deepStrictEqual(parser.parse(buffer), { + length: 0x02, + valueLength: 0x02, + message: [ + { key: 0x50, data: { value: [0xd2, 0x04] } }, + { key: "Q", data: { value: [0xd3, 0x04] } }, + ], + }); + }); + it("should be able to access to index context variable when using length on named parser", () => { + // @ts-ignore + const elementParser = new Parser() + .uint8("key", { + formatter: function (this: any, item: number) { + return this.$index % 2 === 0 ? item : String.fromCharCode(item); + }, + }) + .nest("data", { + type: new Parser().array("value", { + type: "uint8", + length: "$root.valueLength", + }), + }) + .namely("ArrayLengthIndexTest"); + + const parser = Parser.start() + .useContextVars() + .uint16le("length") + .uint16le("valueLength") + .array("message", { + length: "length", + type: "ArrayLengthIndexTest", + }); + + const buffer = factory([ + 0x02, 0x00, 0x02, 0x00, 0x50, 0xd2, 0x04, 0x51, 0xd3, 0x04, + ]); + deepStrictEqual(parser.parse(buffer), { + length: 0x02, + valueLength: 0x02, + message: [ + { key: 0x50, data: { value: [0xd2, 0x04] } }, + { key: "Q", data: { value: [0xd3, 0x04] } }, + ], + }); + }); + }); + + describe("Choice parser", () => { + it("should parse choices of primitive types", () => { + const parser = Parser.start() + .uint8("tag1") + .choice("data1", { + tag: "tag1", + choices: { + 0: "int32le", + 1: "int16le", + }, + }) + .uint8("tag2") + .choice("data2", { + tag: "tag2", + choices: { + 0: "int32le", + 1: "int16le", + }, + }); + + const buffer = factory([0x0, 0x4e, 0x61, 0xbc, 0x00, 0x01, 0xd2, 0x04]); + deepStrictEqual(parser.parse(buffer), { + tag1: 0, + data1: 12345678, + tag2: 1, + data2: 1234, + }); + }); + it("should parse default choice", () => { + const parser = Parser.start() + .uint8("tag") + .choice("data", { + tag: "tag", + choices: { + 0: "int32le", + 1: "int16le", + }, + defaultChoice: "uint8", + }) + .int32le("test"); + + const buffer = factory([0x03, 0xff, 0x2f, 0xcb, 0x04, 0x0]); + deepStrictEqual(parser.parse(buffer), { + tag: 3, + data: 0xff, + test: 314159, + }); + }); + it("should parse choices of user defined types", () => { + const parser = Parser.start() + .uint8("tag") + .choice("data", { + tag: "tag", + choices: { + 1: Parser.start() + .uint8("length") + .string("message", { length: "length" }), + 3: Parser.start().int32le("number"), + }, + }); + + const buffer1 = factory([ + 0x1, 0xc, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72, + 0x6c, 0x64, + ]); + deepStrictEqual(parser.parse(buffer1), { + tag: 1, + data: { + length: 12, + message: "hello, world", + }, + }); + + const buffer2 = factory([0x03, 0x4e, 0x61, 0xbc, 0x00]); + deepStrictEqual(parser.parse(buffer2), { + tag: 3, + data: { + number: 12345678, + }, + }); + }); + it("should be able to go into recursion", () => { + const stop = Parser.start(); + + const parser = Parser.start() + .namely("self") + .uint8("type") + .choice("data", { + tag: "type", + choices: { + 0: stop, + 1: "self", + }, + }); + + const buffer = factory([1, 1, 1, 0]); + deepStrictEqual(parser.parse(buffer), { + type: 1, + data: { + type: 1, + data: { + type: 1, + data: { type: 0, data: {} }, + }, + }, + }); + }); + it("should be able to go into recursion with simple nesting", () => { + const stop = Parser.start(); + + const parser = Parser.start() + .namely("self") + .uint8("type") + .choice("data", { + tag: "type", + choices: { + 0: stop, + 1: "self", + 2: Parser.start() + .nest("left", { type: "self" }) + .nest("right", { type: stop }), + }, + }); + + const buffer = factory([2, /* left */ 1, 1, 0, /* right */ 0]); + deepStrictEqual(parser.parse(buffer), { + type: 2, + data: { + left: { + type: 1, + data: { type: 1, data: { type: 0, data: {} } }, + }, + right: {}, + }, + }); + }); + it("should be able to refer to other parsers by name", () => { + const parser = Parser.start().namely("self"); + + // @ts-ignore + const stop = Parser.start().namely("stop"); + + // @ts-ignore + const twoCells = Parser.start() + .namely("twoCells") + .nest("left", { type: "self" }) + .nest("right", { type: "stop" }); + + parser.uint8("type").choice("data", { + tag: "type", + choices: { + 0: "stop", + 1: "self", + 2: "twoCells", + }, + }); + + const buffer = factory([2, /* left */ 1, 1, 0, /* right */ 0]); + deepStrictEqual(parser.parse(buffer), { + type: 2, + data: { + left: { + type: 1, + data: { type: 1, data: { type: 0, data: {} } }, + }, + right: {}, + }, + }); + }); + it("should be able to refer to other parsers both directly and by name", () => { + const parser = Parser.start().namely("self"); + + const stop = Parser.start(); + + const twoCells = Parser.start() + .nest("left", { type: "self" }) + .nest("right", { type: stop }); + + parser.uint8("type").choice("data", { + tag: "type", + choices: { + 0: stop, + 1: "self", + 2: twoCells, + }, + }); + + const buffer = factory([2, /* left */ 1, 1, 0, /* right */ 0]); + deepStrictEqual(parser.parse(buffer), { + type: 2, + data: { + left: { + type: 1, + data: { type: 1, data: { type: 0, data: {} } }, + }, + right: {}, + }, + }); + }); + it("should be able to go into recursion with complex nesting", () => { + const stop = Parser.start(); + + const parser = Parser.start() + .namely("self") + .uint8("type") + .choice("data", { + tag: "type", + choices: { + 0: stop, + 1: "self", + 2: Parser.start() + .nest("left", { type: "self" }) + .nest("right", { type: "self" }), + 3: Parser.start() + .nest("one", { type: "self" }) + .nest("two", { type: "self" }) + .nest("three", { type: "self" }), + }, + }); + + // 2 + // / \ + // 3 1 + // / | \ \ + // 1 0 2 0 + // / / \ + // 0 1 0 + // / + // 0 + + // prettier-ignore + const buffer = factory([ + 2, + /* left -> */ 3, + /* one -> */ 1, + /* -> */ 0, + /* two -> */ 0, + /* three -> */ 2, + /* left -> */ 1, + /* -> */ 0, + /* right -> */ 0, + /* right -> */ 1, + /* -> */ 0, + ]); + deepStrictEqual(parser.parse(buffer), { + type: 2, + data: { + left: { + type: 3, + data: { + one: { type: 1, data: { type: 0, data: {} } }, + two: { type: 0, data: {} }, + three: { + type: 2, + data: { + left: { type: 1, data: { type: 0, data: {} } }, + right: { type: 0, data: {} }, + }, + }, + }, + }, + right: { + type: 1, + data: { type: 0, data: {} }, + }, + }, + }); + }); + it("should be able to 'flatten' choices when using null varName", () => { + const parser = Parser.start() + .uint8("tag") + .choice({ + tag: "tag", + choices: { + 1: Parser.start() + .uint8("length") + .string("message", { length: "length" }), + 3: Parser.start().int32le("number"), + }, + }); + const buffer1 = factory([ + 0x1, 0xc, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72, + 0x6c, 0x64, + ]); + deepStrictEqual(parser.parse(buffer1), { + tag: 1, + length: 12, + message: "hello, world", + }); + + const buffer2 = factory([0x03, 0x4e, 0x61, 0xbc, 0x00]); + deepStrictEqual(parser.parse(buffer2), { + tag: 3, + number: 12345678, + }); + }); + it("should be able to 'flatten' choices when omitting varName parameter", () => { + const parser = Parser.start() + .uint8("tag") + .choice({ + tag: "tag", + choices: { + 1: Parser.start() + .uint8("length") + .string("message", { length: "length" }), + 3: Parser.start().int32le("number"), + }, + }); + + const buffer1 = factory([ + 0x1, 0xc, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72, + 0x6c, 0x64, + ]); + deepStrictEqual(parser.parse(buffer1), { + tag: 1, + length: 12, + message: "hello, world", + }); + + const buffer2 = factory([0x03, 0x4e, 0x61, 0xbc, 0x00]); + deepStrictEqual(parser.parse(buffer2), { + tag: 3, + number: 12345678, + }); + }); + it("should be able to use function as the choice selector", () => { + const parser = Parser.start() + .string("selector", { length: 4 }) + .choice({ + tag: function (this: { selector: string }) { + return parseInt(this.selector, 2); // string base 2 to integer decimal + }, + choices: { + 2: Parser.start() + .uint8("length") + .string("message", { length: "length" }), + 7: Parser.start().int32le("number"), + }, + }); + + const buffer1 = factory([ + 48, 48, 49, 48, 0xc, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x77, + 0x6f, 0x72, 0x6c, 0x64, + ]); + deepStrictEqual(parser.parse(buffer1), { + selector: "0010", // -> choice 2 + length: 12, + message: "hello, world", + }); + + const buffer2 = factory([48, 49, 49, 49, 0x4e, 0x61, 0xbc, 0x00]); + deepStrictEqual(parser.parse(buffer2), { + selector: "0111", // -> choice 7 + number: 12345678, + }); + }); + it("should be able to use parsing context", () => { + const parser = Parser.start() + .useContextVars() + .uint8("tag") + .uint8("items") + .choice("data", { + tag: "tag", + choices: { + 1: Parser.start() + .uint8("length") + .string("message", { length: "length" }) + .array("value", { + type: "uint8", + length: "$parent.items", + }), + 3: Parser.start().int32le("number"), + }, + }); + + const buffer1 = factory([ + 0x1, 0x2, 0xc, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x77, 0x6f, + 0x72, 0x6c, 0x64, 0x01, 0x02, 0x02, 0x02, + ]); + deepStrictEqual(parser.parse(buffer1), { + tag: 1, + items: 2, + data: { + length: 12, + message: "hello, world", + value: [0x01, 0x02], + }, + }); + const buffer2 = factory([0x03, 0x0, 0x4e, 0x61, 0xbc, 0x00]); + deepStrictEqual(parser.parse(buffer2), { + tag: 3, + items: 0, + data: { + number: 12345678, + }, + }); + }); + }); + + describe("Nest parser", () => { + it("should parse nested parsers", () => { + const nameParser = new Parser() + .string("firstName", { + zeroTerminated: true, + }) + .string("lastName", { + zeroTerminated: true, + }); + const infoParser = new Parser().uint8("age"); + const personParser = new Parser() + .nest("name", { + type: nameParser, + }) + .nest("info", { + type: infoParser, + }); + + const name = Array.from(new TextEncoder().encode("John\0Doe\0")); + const age = [0x20]; + const buffer = [...name, ...age]; + + deepStrictEqual(personParser.parse(factory(buffer)), { + name: { + firstName: "John", + lastName: "Doe", + }, + info: { + age: 0x20, + }, + }); + }); + + it("should format parsed nested parser", () => { + const nameParser = new Parser() + .string("firstName", { + zeroTerminated: true, + }) + .string("lastName", { + zeroTerminated: true, + }); + const personParser = new Parser().nest("name", { + type: nameParser, + formatter: (name: { firstName: string; lastName: string }) => + name.firstName + " " + name.lastName, + }); + + const buffer = factory(new TextEncoder().encode("John\0Doe\0")); + deepStrictEqual(personParser.parse(buffer), { + name: "John Doe", + }); + }); + + it("should 'flatten' output when using null varName", () => { + const parser = new Parser() + .string("s1", { zeroTerminated: true }) + .nest({ + type: new Parser().string("s2", { zeroTerminated: true }), + }); + + const buf = factory(new TextEncoder().encode("foo\0bar\0")); + + deepStrictEqual(parser.parse(buf), { s1: "foo", s2: "bar" }); + }); + + it("should 'flatten' output when omitting varName", () => { + const parser = new Parser() + .string("s1", { zeroTerminated: true }) + .nest({ + type: new Parser().string("s2", { zeroTerminated: true }), + }); + + const buf = factory(new TextEncoder().encode("foo\0bar\0")); + + deepStrictEqual(parser.parse(buf), { s1: "foo", s2: "bar" }); + }); + + it("should be able to use parsing context", () => { + const parser = Parser.start() + .useContextVars() + .uint8("items") + .nest("data", { + type: Parser.start() + .uint8("length") + .string("message", { length: "length" }) + .array("value", { + type: "uint8", + length: "$parent.items", + }), + }); + + const buffer = factory([ + 0x2, 0xc, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72, + 0x6c, 0x64, 0x01, 0x02, 0x02, 0x02, + ]); + deepStrictEqual(parser.parse(buffer), { + items: 2, + data: { + length: 12, + message: "hello, world", + value: [0x01, 0x02], + }, + }); + }); + + it("standalone bit fields should work", () => { + const parser = Parser.start().bit6("one").bit8("two"); + const buffer = factory([0xa8, 0x78]); + const result = parser.parse(buffer); + deepStrictEqual(result.one, 0xa8 >> 2); + deepStrictEqual(result.two, 0x78 >> 2); + }); + + it("bit to nested bit should work", () => { + const parser = Parser.start() + .bit6("one") + .nest("nested", { + type: new Parser().bit8("two").uint8("three"), + }); + const buffer = factory([0xa8, 0x78, 0x45]); + const result = parser.parse(buffer); + deepStrictEqual(result.one, 0xa8 >> 2); + deepStrictEqual(result.nested.two, 0x78 >> 2); + // switching to uint8 should start at next byte (skipping two bits here) + deepStrictEqual(result.nested.three, 0x45); + }); + + it("bit before nest should work", () => { + const parser = Parser.start() + .useContextVars() + .bit8("items") + .nest("data", { + type: Parser.start() + .uint8("length") + .string("message", { length: "length" }) + .array("value", { + type: "uint8", + length: "$parent.items", + }), + }); + + const buffer = factory([ + 0x2, 0xc, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72, + 0x6c, 0x64, 0x01, 0x02, 0x02, 0x02, + ]); + deepStrictEqual(parser.parse(buffer), { + items: 2, + data: { + length: 12, + message: "hello, world", + value: [0x01, 0x02], + }, + }); + }); + }); + + describe("Constructors", () => { + it("should create a custom object type", () => { + class Person { + name: string = ""; + } + + const parser = Parser.start().create(Person).string("name", { + zeroTerminated: true, + }); + + const buffer = factory(new TextEncoder().encode("John Doe\0")); + const person = parser.parse(buffer); + ok(person instanceof Person); + deepStrictEqual(person.name, "John Doe"); + }); + }); + + describe("Pointer parser", () => { + it("should move pointer to specified offset", () => { + const parser = Parser.start().pointer("x", { + type: "uint8", + offset: 2, + }); + const buf = factory([0x1, 0x2, 0x3, 0x4, 0x5]); + + deepStrictEqual(parser.parse(buf), { x: 3 }); + }); + + it("should restore pointer to original position", () => { + const parser = Parser.start() + .pointer("x", { type: "uint8", offset: 2 }) + .uint16be("y"); + const buf = factory([0x1, 0x2, 0x3, 0x4, 0x5]); + + deepStrictEqual(parser.parse(buf), { x: 0x3, y: 0x0102 }); + }); + + it("should work with child parser", () => { + const parser = Parser.start() + .uint32le("x") + .pointer("y", { + type: Parser.start().string("s", { zeroTerminated: true }), + offset: 4, + }); + const buf = factory([ + 1, + 2, + 3, + 4, + ...Array.from(new TextEncoder().encode("hello")), + 0, + 6, + ]); + + deepStrictEqual(parser.parse(buf), { + x: 0x04030201, + y: { s: "hello" }, + }); + }); + + it("should pass variable context to child parser", () => {}); + const parser = Parser.start() + .uint16be("len") + .pointer("child", { + offset: 4, + type: Parser.start().array("a", { + type: "uint8", + length: (vars: { len: number }) => vars.len, + }), + }); + const buf = factory([0, 6, 0, 0, 1, 2, 3, 4, 5, 6]); + + deepStrictEqual(parser.parse(buf), { + len: 6, + child: { a: [1, 2, 3, 4, 5, 6] }, + }); + }); + + describe("SaveOffset", () => { + it("should save the offset", () => { + const buff = factory([0x01, 0x00, 0x02]); + const parser = Parser.start() + .int8("a") + .int16("b") + .saveOffset("bytesRead"); + + deepStrictEqual(parser.parse(buff), { + a: 1, + b: 2, + bytesRead: 3, + }); + }); + + it("should save the offset if not at end", () => { + const buff = factory([0x01, 0x00, 0x02]); + const parser = Parser.start() + .int8("a") + .saveOffset("bytesRead") + .int16("b"); + + deepStrictEqual(parser.parse(buff), { + a: 1, + b: 2, + bytesRead: 1, + }); + }); + + it("should save the offset with a dynamic parser", () => { + const buff = factory([0x74, 0x65, 0x73, 0x74, 0x00]); + const parser = Parser.start() + .string("name", { zeroTerminated: true }) + .saveOffset("bytesRead"); + + deepStrictEqual(parser.parse(buff), { + name: "test", + bytesRead: 5, + }); + }); + }); + + describe("Utilities", () => { + it("should count size for fixed size structs", () => { + const parser = Parser.start() + .int8("a") + .int32le("b") + .string("msg", { length: 10 }) + .seek(2) + .array("data", { + length: 3, + type: "int8", + }) + .buffer("raw", { length: 8 }); + + deepStrictEqual(parser.sizeOf(), 1 + 4 + 10 + 2 + 3 + 8); + }); + it("should assert parsed values", () => { + const parser1 = Parser.start().string("msg", { + encoding: "utf8", + zeroTerminated: true, + assert: "hello, world", + }); + const buffer1 = hexToBuf("68656c6c6f2c20776f726c6400"); + doesNotThrow(() => { + parser1.parse(buffer1); + }); + + const buffer2 = hexToBuf("68656c6c6f2c206a7300"); + throws(() => { + parser1.parse(buffer2); + }); + + let parser2 = new Parser() + .int16le("a") + .int16le("b") + .int16le("c", { + assert: function ( + this: { a: number; b: number }, + x: number | string, + ) { + return this.a + this.b === x; + }, + }); + + const buffer3 = hexToBuf("d2042e16001b"); + doesNotThrow(() => { + parser2.parse(buffer3); + }); + + const buffer4 = hexToBuf("2e16001bd204"); + throws(() => { + parser2.parse(buffer4); + }); + + const parser3 = new Parser() + .int16le("a") + .int16le("b") + .int16le("c", { + assert(this: { a: number; b: number }, x: number | string) { + return this.a + this.b === x; + }, + }); + + const buffer5 = hexToBuf("d2042e16001b"); + doesNotThrow(() => { + parser3.parse(buffer5); + }); + + const buffer6 = hexToBuf("2e16001bd204"); + throws(() => { + parser3.parse(buffer6); + }); + }); + }); + + describe("Parse other fields after bit", () => { + it("Parse uint8", () => { + const buffer = factory([0, 1, 0, 4]); + + const parser1 = Parser.start().bit17("a").uint8("b"); + deepStrictEqual(parser1.parse(buffer), { + a: 1 << 1, + b: 4, + }); + const parser2 = Parser.start().bit18("a").uint8("b"); + deepStrictEqual(parser2.parse(buffer), { + a: 1 << 2, + b: 4, + }); + const parser3 = Parser.start().bit19("a").uint8("b"); + deepStrictEqual(parser3.parse(buffer), { + a: 1 << 3, + b: 4, + }); + const parser4 = Parser.start().bit20("a").uint8("b"); + deepStrictEqual(parser4.parse(buffer), { + a: 1 << 4, + b: 4, + }); + const parser5 = Parser.start().bit21("a").uint8("b"); + deepStrictEqual(parser5.parse(buffer), { + a: 1 << 5, + b: 4, + }); + const parser6 = Parser.start().bit22("a").uint8("b"); + deepStrictEqual(parser6.parse(buffer), { + a: 1 << 6, + b: 4, + }); + const parser7 = Parser.start().bit23("a").uint8("b"); + deepStrictEqual(parser7.parse(buffer), { + a: 1 << 7, + b: 4, + }); + const parser8 = Parser.start().bit24("a").uint8("b"); + deepStrictEqual(parser8.parse(buffer), { + a: 1 << 8, + b: 4, + }); + }); + }); + + describe("Wrapper", () => { + it("should parse deflated then inflated data", () => { + const text = "This is compressible text.\0"; + const bufferBefore = factory([ + 12, + ...Array.from(new TextEncoder().encode(text)), + 34, + ]); + + // Skip if we are testing with Uint8Array since the zlib polyfill does + // not support Uint8Array + if (bufferBefore instanceof Uint8Array) return; + + const compressedData = factory(deflateRawSync(bufferBefore)); + + const buffer = factory([ + ...Array.from( + new Uint8Array(new Uint32Array([compressedData.length]).buffer), + ), + ...Array.from(compressedData), + 42, + ]); + + const bufferParser = Parser.start() + .uint8("a") + .string("b", { + zeroTerminated: true, + }) + .uint8("c"); + + const mainParser = Parser.start() + .uint32le("length") + .wrapped("compressedData", { + length: "length", + wrapper: (x: Uint8Array) => inflateRawSync(x), + type: bufferParser, + }) + .uint8("answer"); + deepStrictEqual(mainParser.parse(buffer), { + length: compressedData.length, + compressedData: { + a: 12, + b: text.substring(0, text.length - 1), + c: 34, + }, + answer: 42, + }); + }); + it("should embed parsed object in current object", () => { + const parserEmptyName = Parser.start() + .uint8("messageId") + .uint8("reportCount") + .array("reports", { + length: "reportCount", + type: Parser.start() + .uint8("reportId") + .uint8("reportLength") + .wrapped("", { + length: "reportLength", + wrapper: (buffer) => buffer, + type: Parser.start() + .nest("basicReport", { + type: Parser.start() + .uint8("dataPoint1") + .uint8("dataPoint2") + .uint8("dataPoint3") + .uint8("dataPoint4"), + }) + .array("extendedReport", { + readUntil: "eof", + type: Parser.start() + .uint8("dataType") + .uint8("dataLength") + .buffer("data", { length: "dataLength" }), + }), + }), + }); + + const parserWithoutName = Parser.start() + .uint8("messageId") + .uint8("reportCount") + .array("reports", { + length: "reportCount", + type: Parser.start() + .uint8("reportId") + .uint8("reportLength") + .wrapped({ + length: "reportLength", + wrapper: (buffer) => buffer, + type: Parser.start() + .nest("basicReport", { + type: Parser.start() + .uint8("dataPoint1") + .uint8("dataPoint2") + .uint8("dataPoint3") + .uint8("dataPoint4"), + }) + .array("extendedReport", { + readUntil: "eof", + type: Parser.start() + .uint8("dataType") + .uint8("dataLength") + .buffer("data", { length: "dataLength" }), + }), + }), + }); + + const buffer = Buffer.from( + "1002f11012345678a003303132a101dfa20255aaf21201020304a003343536a202aa55a101eb", + "hex", + ); + + deepStrictEqual(parserEmptyName.parse(buffer), { + messageId: 16, + reportCount: 2, + reports: [ + { + reportId: 241, + reportLength: 16, + basicReport: { + dataPoint1: 18, + dataPoint2: 52, + dataPoint3: 86, + dataPoint4: 120, + }, + extendedReport: [ + { + dataType: 160, + dataLength: 3, + data: Buffer.from([48, 49, 50]), + }, + { + dataType: 161, + dataLength: 1, + data: Buffer.from([223]), + }, + { + dataType: 162, + dataLength: 2, + data: Buffer.from([85, 170]), + }, + ], + }, + { + reportId: 242, + reportLength: 18, + basicReport: { + dataPoint1: 1, + dataPoint2: 2, + dataPoint3: 3, + dataPoint4: 4, + }, + extendedReport: [ + { + dataType: 160, + dataLength: 3, + data: Buffer.from([52, 53, 54]), + }, + { + dataType: 162, + dataLength: 2, + data: Buffer.from([170, 85]), + }, + { + dataType: 161, + dataLength: 1, + data: Buffer.from([235]), + }, + ], + }, + ], + }); + + deepStrictEqual( + parserEmptyName.parse(buffer), + parserWithoutName.parse(buffer), + ); + }); + }); + }); +} + +compositeParserTests("Buffer", (arr) => Buffer.from(arr)); +compositeParserTests("Uint8Array", (arr) => Uint8Array.from(arr)); diff --git a/test/primitive_parser.js b/test/primitive_parser.js deleted file mode 100644 index f005b14f..00000000 --- a/test/primitive_parser.js +++ /dev/null @@ -1,461 +0,0 @@ -var assert = require('assert'); -var TextEncoder = - typeof TextEncoder === 'undefined' - ? require('util').TextEncoder - : TextEncoder; -var Parser = require('../dist/binary_parser').Parser; - -const suite = (Buffer) => - describe(`Primitive parser (${Buffer.name})`, function () { - function hexToBuf(hex) { - return Buffer.from( - hex.match(/.{1,2}/g).map((byte) => parseInt(byte, 16)) - ); - } - describe('Primitive parsers', function () { - it('should nothing', function () { - var parser = Parser.start(); - - var buffer = Buffer.from([0xa, 0x14, 0x1e, 0x28, 0x32]); - assert.deepEqual(parser.parse(buffer), {}); - }); - it('should parse integer types', function () { - var parser = Parser.start().uint8('a').int16le('b').uint32be('c'); - - var buffer = Buffer.from([0x00, 0xd2, 0x04, 0x00, 0xbc, 0x61, 0x4e]); - assert.deepEqual(parser.parse(buffer), { a: 0, b: 1234, c: 12345678 }); - }); - describe('BigInt64 parsers', () => { - const [major] = process.version.replace('v', '').split('.'); - if (Number(major) >= 12) { - it('should parse biguints64', () => { - const parser = Parser.start().uint64be('a').uint64le('b'); - // from https://nodejs.org/api/buffer.html#buffer_buf_readbiguint64le_offset - const buf = Buffer.from([ - 0x00, - 0x00, - 0x00, - 0x00, - 0xff, - 0xff, - 0xff, - 0xff, - 0x00, - 0x00, - 0x00, - 0x00, - 0xff, - 0xff, - 0xff, - 0xff, - ]); - assert.deepEqual(parser.parse(buf), { - a: BigInt('4294967295'), - b: BigInt('18446744069414584320'), - }); - }); - - it('should parse bigints64', () => { - const parser = Parser.start() - .int64be('a') - .int64le('b') - .int64be('c') - .int64le('d'); - // from https://nodejs.org/api/buffer.html#buffer_buf_readbiguint64le_offset - const buf = Buffer.from([ - 0x00, - 0x00, - 0x00, - 0x00, - 0xff, - 0xff, - 0xff, - 0xff, - 0x01, - 0x00, - 0x00, - 0x00, - 0xff, - 0xff, - 0xff, - 0xff, - 0x00, - 0x00, - 0x00, - 0x00, - 0xff, - 0xff, - 0xff, - 0xff, - 0x01, - 0x00, - 0x00, - 0x00, - 0xff, - 0xff, - 0xff, - 0xff, - ]); - assert.deepEqual(parser.parse(buf), { - a: BigInt('4294967295'), - b: BigInt('-4294967295'), - c: BigInt('4294967295'), - d: BigInt('-4294967295'), - }); - }); - } else { - it('should throw when run under not v12', () => { - assert.throws(() => Parser.start().bigint64('a')); - }); - } - }); - it('should use formatter to transform parsed integer', function () { - var parser = Parser.start() - .uint8('a', { - formatter: function (val) { - return val * 2; - }, - }) - .int16le('b', { - formatter: function (val) { - return 'test' + String(val); - }, - }); - - var buffer = Buffer.from([0x01, 0xd2, 0x04]); - assert.deepEqual(parser.parse(buffer), { a: 2, b: 'test1234' }); - }); - it('should parse floating point types', function () { - var parser = Parser.start().floatbe('a').doublele('b'); - - var FLT_EPSILON = 0.00001; - var buffer = Buffer.from([ - 0x41, - 0x45, - 0x85, - 0x1f, - 0x7a, - 0x36, - 0xab, - 0x3e, - 0x57, - 0x5b, - 0xb1, - 0xbf, - ]); - var result = parser.parse(buffer); - - assert(Math.abs(result.a - 12.345) < FLT_EPSILON); - assert(Math.abs(result.b - -0.0678) < FLT_EPSILON); - }); - it('should handle endianess', function () { - var parser = Parser.start().int32le('little').int32be('big'); - - var buffer = Buffer.from([ - 0x4e, - 0x61, - 0xbc, - 0x00, - 0x00, - 0xbc, - 0x61, - 0x4e, - ]); - assert.deepEqual(parser.parse(buffer), { - little: 12345678, - big: 12345678, - }); - }); - it('should seek offset', function () { - var parser = Parser.start() - .uint8('a') - .seek(3) - .uint16le('b') - .uint32be('c'); - - var buffer = Buffer.from([ - 0x00, - 0xff, - 0xff, - 0xfe, - 0xd2, - 0x04, - 0x00, - 0xbc, - 0x61, - 0x4e, - ]); - assert.deepEqual(parser.parse(buffer), { a: 0, b: 1234, c: 12345678 }); - }); - }); - - describe('Bit field parsers', function () { - var binaryLiteral = function (s) { - var i; - var bytes = []; - - s = s.replace(/\s/g, ''); - for (i = 0; i < s.length; i += 8) { - bytes.push(parseInt(s.slice(i, i + 8), 2)); - } - - return Buffer.from(bytes); - }; - - it('binary literal helper should work', function () { - assert.deepEqual(binaryLiteral('11110000'), Buffer.from([0xf0])); - assert.deepEqual( - binaryLiteral('11110000 10100101'), - Buffer.from([0xf0, 0xa5]) - ); - }); - - it('should parse 1-byte-length bit field sequence', function () { - var parser = new Parser().bit1('a').bit2('b').bit4('c').bit1('d'); - - var buf = binaryLiteral('1 10 1010 0'); - assert.deepEqual(parser.parse(buf), { - a: 1, - b: 2, - c: 10, - d: 0, - }); - - parser = new Parser() - .endianess('little') - .bit1('a') - .bit2('b') - .bit4('c') - .bit1('d'); - - assert.deepEqual(parser.parse(buf), { - a: 0, - b: 2, - c: 10, - d: 1, - }); - }); - it('should parse 2-byte-length bit field sequence', function () { - var parser = new Parser().bit3('a').bit9('b').bit4('c'); - - var buf = binaryLiteral('101 111000111 0111'); - assert.deepEqual(parser.parse(buf), { - a: 5, - b: 455, - c: 7, - }); - - parser = new Parser().endianess('little').bit3('a').bit9('b').bit4('c'); - assert.deepEqual(parser.parse(buf), { - a: 7, - b: 398, - c: 11, - }); - }); - it('should parse 4-byte-length bit field sequence', function () { - var parser = new Parser() - .bit1('a') - .bit24('b') - .bit4('c') - .bit2('d') - .bit1('e'); - var buf = binaryLiteral('1 101010101010101010101010 1111 01 1'); - assert.deepEqual(parser.parse(buf), { - a: 1, - b: 11184810, - c: 15, - d: 1, - e: 1, - }); - - parser = new Parser() - .endianess('little') - .bit1('a') - .bit24('b') - .bit4('c') - .bit2('d') - .bit1('e'); - assert.deepEqual(parser.parse(buf), { - a: 1, - b: 11184829, - c: 10, - d: 2, - e: 1, - }); - }); - it('should parse nested bit fields', function () { - var parser = new Parser().bit1('a').nest('x', { - type: new Parser().bit2('b').bit4('c').bit1('d'), - }); - - var buf = binaryLiteral('11010100'); - - assert.deepEqual(parser.parse(buf), { - a: 1, - x: { - b: 2, - c: 10, - d: 0, - }, - }); - }); - }); - - describe('String parser', function () { - it('should parse UTF8 encoded string (ASCII only)', function () { - var text = 'hello, world'; - var buffer = Buffer.from(new TextEncoder().encode(text)); - var parser = Parser.start().string('msg', { - length: buffer.length, - encoding: 'utf8', - }); - - assert.equal(parser.parse(buffer).msg, text); - }); - it('should parse UTF8 encoded string', function () { - var text = 'こんにちは、せかい。'; - var buffer = Buffer.from(new TextEncoder().encode(text)); - var parser = Parser.start().string('msg', { - length: buffer.length, - encoding: 'utf8', - }); - - assert.equal(parser.parse(buffer).msg, text); - }); - it('should parse HEX encoded string', function () { - var text = 'cafebabe'; - var buffer = hexToBuf(text); - var parser = Parser.start().string('msg', { - length: buffer.length, - encoding: 'hex', - }); - - assert.equal(parser.parse(buffer).msg, text); - }); - it('should parse variable length string', function () { - var buffer = hexToBuf('0c68656c6c6f2c20776f726c64'); - var parser = Parser.start() - .uint8('length') - .string('msg', { length: 'length', encoding: 'utf8' }); - - assert.equal(parser.parse(buffer).msg, 'hello, world'); - }); - it('should parse zero terminated string', function () { - var buffer = hexToBuf('68656c6c6f2c20776f726c6400'); - var parser = Parser.start().string('msg', { - zeroTerminated: true, - encoding: 'utf8', - }); - - assert.deepEqual(parser.parse(buffer), { msg: 'hello, world' }); - }); - it('should parser zero terminated fixed-length string', function () { - var buffer = Buffer.from( - new TextEncoder().encode('abc\u0000defghij\u0000') - ); - var parser = Parser.start() - .string('a', { length: 5, zeroTerminated: true }) - .string('b', { length: 5, zeroTerminated: true }) - .string('c', { length: 5, zeroTerminated: true }); - - assert.deepEqual(parser.parse(buffer), { - a: 'abc', - b: 'defgh', - c: 'ij', - }); - }); - it('should strip trailing null characters', function () { - var buffer = hexToBuf('746573740000'); - var parser1 = Parser.start().string('str', { - length: 7, - stripNull: false, - }); - var parser2 = Parser.start().string('str', { - length: 7, - stripNull: true, - }); - - assert.equal(parser1.parse(buffer).str, 'test\u0000\u0000'); - assert.equal(parser2.parse(buffer).str, 'test'); - }); - it('should parse string greedily with zero-bytes internally', function () { - var buffer = Buffer.from( - new TextEncoder().encode('abc\u0000defghij\u0000') - ); - var parser = Parser.start().string('a', { greedy: true }); - - assert.deepEqual(parser.parse(buffer), { - a: 'abc\u0000defghij\u0000', - }); - }); - }); - - describe('Buffer parser', function () { - it('should parse as buffer', function () { - var parser = new Parser().uint8('len').buffer('raw', { - length: 'len', - }); - - var buf = hexToBuf('deadbeefdeadbeef'); - var result = parser.parse(Buffer.from([...Buffer.from([8]), ...buf])); - - assert.deepEqual(result.raw, buf); - }); - - it('should clone buffer if options.clone is true', function () { - var parser = new Parser().buffer('raw', { - length: 8, - clone: true, - }); - - var buf = hexToBuf('deadbeefdeadbeef'); - var result = parser.parse(buf); - assert.deepEqual(result.raw, buf); - result.raw[0] = 0xff; - assert.notDeepEqual(result.raw, buf); - }); - - it('should parse until function returns true when readUntil is function', function () { - var parser = new Parser() - .endianess('big') - .uint8('cmd') - .buffer('data', { - readUntil: function (item) { - return item === 2; - }, - }); - - var result = parser.parse(hexToBuf('aa')); - assert.deepEqual(result, { cmd: 0xaa, data: Buffer.from([]) }); - - var result = parser.parse(hexToBuf('aabbcc')); - assert.deepEqual(result, { cmd: 0xaa, data: hexToBuf('bbcc') }); - - var result = parser.parse(hexToBuf('aa02bbcc')); - assert.deepEqual(result, { cmd: 0xaa, data: Buffer.from([]) }); - - var result = parser.parse(hexToBuf('aabbcc02')); - assert.deepEqual(result, { cmd: 0xaa, data: hexToBuf('bbcc') }); - - var result = parser.parse(hexToBuf('aabbcc02dd')); - assert.deepEqual(result, { cmd: 0xaa, data: hexToBuf('bbcc') }); - }); - - // this is a test for testing a fix of a bug, that removed the last byte - // of the buffer parser - it('should return a buffer with same size', function () { - var bufferParser = new Parser().buffer('buf', { - readUntil: 'eof', - formatter: function (buffer) { - return buffer; - }, - }); - - var buffer = Buffer.from('John\0Doe\0'); - assert.deepEqual(bufferParser.parse(buffer), { buf: buffer }); - }); - }); - }); - -suite(Buffer); -suite(Uint8Array); diff --git a/test/primitive_parser.ts b/test/primitive_parser.ts new file mode 100644 index 00000000..e5983f23 --- /dev/null +++ b/test/primitive_parser.ts @@ -0,0 +1,448 @@ +import { deepStrictEqual, notDeepStrictEqual, ok } from "assert"; +import { Parser } from "../lib/binary_parser"; + +function primitiveParserTests( + name: string, + factory: (array: Uint8Array | number[]) => Uint8Array, +) { + describe(`Primitive parser (${name})`, () => { + function hexToBuf(hex: string): Uint8Array { + return factory(hex.match(/.{1,2}/g)!.map((byte) => parseInt(byte, 16))); + } + + describe("Primitive parsers", () => { + it("should nothing", () => { + const parser = Parser.start(); + const buffer = factory([0xa, 0x14, 0x1e, 0x28, 0x32]); + + deepStrictEqual(parser.parse(buffer), {}); + }); + it("should parse integer types", () => { + const parser = Parser.start().uint8("a").int16le("b").uint32be("c"); + + const buffer = factory([0x00, 0xd2, 0x04, 0x00, 0xbc, 0x61, 0x4e]); + deepStrictEqual(parser.parse(buffer), { + a: 0, + b: 1234, + c: 12345678, + }); + }); + describe("BigInt64 parsers", () => { + it("should parse uint64", () => { + const parser = Parser.start().uint64be("a").uint64le("b"); + // from https://nodejs.org/api/buffer.html#buffer_buf_readbiguint64le_offset + const buf = factory([ + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, + ]); + deepStrictEqual(parser.parse(buf), { + a: BigInt("4294967295"), + b: BigInt("18446744069414584320"), + }); + }); + + it("should parse int64", () => { + const parser = Parser.start() + .int64be("a") + .int64le("b") + .int64be("c") + .int64le("d"); + // from https://nodejs.org/api/buffer.html#buffer_buf_readbiguint64le_offset + const buf = factory([ + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + ]); + deepStrictEqual(parser.parse(buf), { + a: BigInt("4294967295"), + b: BigInt("-4294967295"), + c: BigInt("4294967295"), + d: BigInt("-4294967295"), + }); + }); + }); + it("should use formatter to transform parsed integer", () => { + const parser = Parser.start() + .uint8("a", { + formatter: (val: number) => val * 2, + }) + .int16le("b", { + formatter: (val: number) => "test" + String(val), + }); + + const buffer = factory([0x01, 0xd2, 0x04]); + deepStrictEqual(parser.parse(buffer), { a: 2, b: "test1234" }); + }); + it("should parse floating point types", () => { + const parser = Parser.start().floatbe("a").doublele("b"); + + const FLT_EPSILON = 0.00001; + const buffer = factory([ + 0x41, 0x45, 0x85, 0x1f, 0x7a, 0x36, 0xab, 0x3e, 0x57, 0x5b, 0xb1, + 0xbf, + ]); + const result = parser.parse(buffer); + + ok(Math.abs(result.a - 12.345) < FLT_EPSILON); + ok(Math.abs(result.b - -0.0678) < FLT_EPSILON); + }); + it("should handle endianness", () => { + const parser = Parser.start().int32le("little").int32be("big"); + + const buffer = factory([ + 0x4e, 0x61, 0xbc, 0x00, 0x00, 0xbc, 0x61, 0x4e, + ]); + deepStrictEqual(parser.parse(buffer), { + little: 12345678, + big: 12345678, + }); + }); + it("should seek offset", () => { + const parser = Parser.start() + .uint8("a") + .seek(3) + .uint16le("b") + .uint32be("c"); + + const buffer = factory([ + 0x00, 0xff, 0xff, 0xfe, 0xd2, 0x04, 0x00, 0xbc, 0x61, 0x4e, + ]); + deepStrictEqual(parser.parse(buffer), { + a: 0, + b: 1234, + c: 12345678, + }); + }); + }); + + describe("Bit field parsers", () => { + function binaryLiteral(s: string): Uint8Array { + const bytes = Array(); + + s = s.replace(/\s/g, ""); + deepStrictEqual(s.length % 8, 0); + for (let i = 0; i < s.length; i += 8) { + bytes.push(parseInt(s.slice(i, i + 8), 2)); + } + + return factory(bytes); + } + + it("binary literal helper should work", () => { + deepStrictEqual(binaryLiteral("11110000"), factory([0xf0])); + deepStrictEqual( + binaryLiteral("11110000 10100101"), + factory([0xf0, 0xa5]), + ); + }); + + it("should parse 1-byte-length bit field sequence", () => { + const parser1 = new Parser().bit1("a").bit2("b").bit4("c").bit1("d"); + + const buf = binaryLiteral("1 10 1010 0"); + deepStrictEqual(parser1.parse(buf), { + a: 1, + b: 2, + c: 10, + d: 0, + }); + + const parser2 = new Parser() + .endianness("little") + .bit1("a") + .bit2("b") + .bit4("c") + .bit1("d"); + + deepStrictEqual(parser2.parse(buf), { + a: 0, + b: 2, + c: 10, + d: 1, + }); + }); + it("should parse 2-byte-length bit field sequence", () => { + const parser1 = new Parser().bit3("a").bit9("b").bit4("c"); + + const buf = binaryLiteral("101 111000111 0111"); + deepStrictEqual(parser1.parse(buf), { + a: 5, + b: 455, + c: 7, + }); + + const parser2 = new Parser() + .endianness("little") + .bit3("a") + .bit9("b") + .bit4("c"); + deepStrictEqual(parser2.parse(buf), { + a: 7, + b: 398, + c: 11, + }); + }); + it("should parse 4-byte-length bit field sequence", () => { + const parser1 = new Parser() + .bit1("a") + .bit24("b") + .bit4("c") + .bit2("d") + .bit1("e"); + const buf = binaryLiteral("1 101010101010101010101010 1111 01 1"); + deepStrictEqual(parser1.parse(buf), { + a: 1, + b: 11184810, + c: 15, + d: 1, + e: 1, + }); + + const parser2 = new Parser() + .endianness("little") + .bit1("a") + .bit24("b") + .bit4("c") + .bit2("d") + .bit1("e"); + deepStrictEqual(parser2.parse(buf), { + a: 1, + b: 11184829, + c: 10, + d: 2, + e: 1, + }); + }); + it("should parse 32-bit fields", () => { + const parser1 = new Parser().bit32("a"); + const buf1 = binaryLiteral("10110101011101010111001010011101"); + deepStrictEqual(parser1.parse(buf1), { a: 3044373149 }); + const parser2 = new Parser().bit6("a").bit32("b").bit2("c"); + const buf2 = binaryLiteral( + "101101 10110101011101010111001010011101 11", + ); + deepStrictEqual(parser2.parse(buf2), { a: 45, b: 3044373149, c: 3 }); + }); + it("should parse arbitrarily large bit field sequence", () => { + const parser1 = new Parser() + .bit1("a") + .bit24("b") + .bit4("c") + .bit2("d") + .bit9("e"); + const buf = binaryLiteral( + "1 101010101010101010101010 1111 01 110100110", + ); + deepStrictEqual(parser1.parse(buf), { + a: 1, + b: 11184810, + c: 15, + d: 1, + e: 422, + }); + + const parser2 = new Parser() + .endianness("little") + .bit1("a") + .bit24("b") + .bit4("c") + .bit2("d") + .bit9("e"); + deepStrictEqual(parser2.parse(buf), { + a: 1, + b: 11184829, + c: 10, + d: 2, + e: 422, + }); + }); + it("should parse nested bit fields", () => { + const parser = new Parser().bit1("a").nest("x", { + type: new Parser().bit2("b").bit4("c").bit1("d"), + }); + + const buf = binaryLiteral("11010100"); + + deepStrictEqual(parser.parse(buf), { + a: 1, + x: { + b: 2, + c: 10, + d: 0, + }, + }); + }); + + it("should assert bit fields", () => { + const parser = new Parser() + .bit4("a", { assert: (v) => v === 10 }) + .bit3("b", { assert: (v) => v === 7 }) + .bit1("c", { assert: (v) => v === 1 }); + const buf = binaryLiteral("1010 111 1"); + deepStrictEqual(parser.parse(buf), { a: 10, b: 7, c: 1 }); + }); + + it("should format bit fields", () => { + const parser = new Parser() + .bit4("a", { formatter: (v) => v * 2 }) + .bit3("b", { formatter: (v) => v * 3 }) + .bit1("c", { formatter: (v) => v * 4 }); + const buf = binaryLiteral("1010 111 1"); + deepStrictEqual(parser.parse(buf), { a: 20, b: 21, c: 4 }); + }); + }); + + describe("String parser", () => { + it("should parse UTF8 encoded string (ASCII only)", () => { + const text = "hello, world"; + const buffer = factory(new TextEncoder().encode(text)); + const parser = Parser.start().string("msg", { + length: buffer.length, + encoding: "utf8", + }); + + deepStrictEqual(parser.parse(buffer).msg, text); + }); + it("should parse UTF8 encoded string", () => { + const text = "こんにちは、せかい。"; + const buffer = factory(new TextEncoder().encode(text)); + const parser = Parser.start().string("msg", { + length: buffer.length, + encoding: "utf8", + }); + + deepStrictEqual(parser.parse(buffer).msg, text); + }); + it("should parse HEX encoded string", () => { + const text = "cafebabe"; + const buffer = hexToBuf(text); + const parser = Parser.start().string("msg", { + length: buffer.length, + encoding: "hex", + }); + + deepStrictEqual(parser.parse(buffer).msg, text); + }); + it("should parse variable length string", () => { + const buffer = hexToBuf("0c68656c6c6f2c20776f726c64"); + const parser = Parser.start() + .uint8("length") + .string("msg", { length: "length", encoding: "utf8" }); + + deepStrictEqual(parser.parse(buffer).msg, "hello, world"); + }); + it("should parse zero terminated string", () => { + const buffer = hexToBuf("68656c6c6f2c20776f726c6400"); + const parser = Parser.start().string("msg", { + zeroTerminated: true, + encoding: "utf8", + }); + + deepStrictEqual(parser.parse(buffer), { msg: "hello, world" }); + }); + it("should parser zero terminated fixed-length string", () => { + const buffer = factory( + new TextEncoder().encode("abc\u0000defghij\u0000"), + ); + const parser = Parser.start() + .string("a", { length: 5, zeroTerminated: true }) + .string("b", { length: 5, zeroTerminated: true }) + .string("c", { length: 5, zeroTerminated: true }); + + deepStrictEqual(parser.parse(buffer), { + a: "abc", + b: "defgh", + c: "ij", + }); + }); + it("should strip trailing null characters", () => { + const buffer = hexToBuf("746573740000"); + const parser1 = Parser.start().string("str", { + length: 7, + stripNull: false, + }); + const parser2 = Parser.start().string("str", { + length: 7, + stripNull: true, + }); + + deepStrictEqual(parser1.parse(buffer).str, "test\u0000\u0000"); + deepStrictEqual(parser2.parse(buffer).str, "test"); + }); + it("should parse string greedily with zero-bytes internally", () => { + const buffer = factory( + new TextEncoder().encode("abc\u0000defghij\u0000"), + ); + const parser = Parser.start().string("a", { greedy: true }); + + deepStrictEqual(parser.parse(buffer), { + a: "abc\u0000defghij\u0000", + }); + }); + }); + + describe("Bytes parser", () => { + it("should parse as buffer", () => { + const parser = new Parser().uint8("len").buffer("raw", { + length: "len", + }); + + const hex = "deadbeefdeadbeef"; + + deepStrictEqual(parser.parse(hexToBuf("08" + hex)).raw, hexToBuf(hex)); + }); + + it("should clone buffer if options.clone is true", () => { + const parser = new Parser().buffer("raw", { + length: 8, + clone: true, + }); + + const buf = hexToBuf("deadbeefdeadbeef"); + const result = parser.parse(buf); + deepStrictEqual(result.raw, buf); + result.raw[0] = 0xff; + notDeepStrictEqual(result.raw, buf); + }); + + it("should parse until function returns true when readUntil is function", () => { + const parser = new Parser() + .endianness("big") + .uint8("cmd") + .buffer("data", { + readUntil: (item: number) => item === 2, + }); + + const result1 = parser.parse(hexToBuf("aa")); + deepStrictEqual(result1, { cmd: 0xaa, data: factory([]) }); + + const result2 = parser.parse(hexToBuf("aabbcc")); + deepStrictEqual(result2, { cmd: 0xaa, data: hexToBuf("bbcc") }); + + const result3 = parser.parse(hexToBuf("aa02bbcc")); + deepStrictEqual(result3, { cmd: 0xaa, data: factory([]) }); + + const result4 = parser.parse(hexToBuf("aabbcc02")); + deepStrictEqual(result4, { cmd: 0xaa, data: hexToBuf("bbcc") }); + + const result5 = parser.parse(hexToBuf("aabbcc02dd")); + deepStrictEqual(result5, { cmd: 0xaa, data: hexToBuf("bbcc") }); + }); + + // this is a test for testing a fix of a bug, that removed the last byte + // of the buffer parser + it("should return a buffer with same size", () => { + const bufferParser = new Parser().buffer("buf", { + readUntil: "eof", + formatter: (buffer: Uint8Array) => buffer, + }); + + const buffer = factory(new TextEncoder().encode("John\0Doe\0")); + deepStrictEqual(bufferParser.parse(buffer), { buf: buffer }); + }); + }); + }); +} + +primitiveParserTests("Buffer", (arr) => Buffer.from(arr)); +primitiveParserTests("Uint8Array", (arr) => Uint8Array.from(arr)); diff --git a/test/yy_primitive_encoder.js b/test/yy_primitive_encoder.js index ddbcaaa5..ecdd4ba7 100644 --- a/test/yy_primitive_encoder.js +++ b/test/yy_primitive_encoder.js @@ -1,117 +1,77 @@ -var assert = require('assert'); -var util = require('util'); -var Parser = require('../dist/binary_parser').Parser; +var assert = require("assert"); +var util = require("util"); +var Parser = require("../dist/binary_parser").Parser; -describe('Primitive encoder', function () { - describe('Primitive encoders', function () { - it('should nothing', function () { +describe("Primitive encoder", function () { + describe("Primitive encoders", function () { + it("should nothing", function () { var parser = Parser.start(); var buffer = parser.encode({ a: 0, b: 1 }); assert.deepEqual(buffer.length, 0); }); - it('should encode integer types', function () { - var parser = Parser.start().uint8('a').int16le('b').uint32be('c'); + it("should encode integer types", function () { + var parser = Parser.start().uint8("a").int16le("b").uint32be("c"); var buffer = Buffer.from([0x00, 0xd2, 0x04, 0x00, 0xbc, 0x61, 0x4e]); var parsed = parser.parse(buffer); var encoded = parser.encode(parsed); - assert.deepEqual(parsed, { a: 0, b: 1234, c: 12345678 }); + assert.deepEqual( + { a: parsed.a, b: parsed.b, c: parsed.c }, + { a: 0, b: 1234, c: 12345678 }, + ); assert.deepEqual(encoded, buffer); }); - describe('BigInt64 encoders', () => { - const [major] = process.version.replace('v', '').split('.'); + describe("BigInt64 encoders", () => { + const [major] = process.version.replace("v", "").split("."); if (Number(major) >= 12) { - it('should encode biguints64', () => { - const parser = Parser.start().uint64be('a').uint64le('b'); + it("should encode biguints64", () => { + const parser = Parser.start().uint64be("a").uint64le("b"); // from https://nodejs.org/api/buffer.html#buffer_buf_readbiguint64le_offset const buf = Buffer.from([ - 0x00, - 0x00, - 0x00, - 0x00, - 0xff, - 0xff, - 0xff, - 0xff, - 0x00, - 0x00, - 0x00, - 0x00, - 0xff, - 0xff, - 0xff, - 0xff, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, ]); let parsed = parser.parse(buf); assert.deepEqual(parsed, { - a: BigInt('4294967295'), - b: BigInt('18446744069414584320'), + a: BigInt("4294967295"), + b: BigInt("18446744069414584320"), }); let encoded = parser.encode(parsed); assert.deepEqual(encoded, buf); }); - it('should encode bigints64', () => { + it("should encode bigints64", () => { const parser = Parser.start() - .int64be('a') - .int64le('b') - .int64be('c') - .int64le('d'); + .int64be("a") + .int64le("b") + .int64be("c") + .int64le("d"); // from https://nodejs.org/api/buffer.html#buffer_buf_readbiguint64le_offset const buf = Buffer.from([ - 0x00, - 0x00, - 0x00, - 0x00, - 0xff, - 0xff, - 0xff, - 0xff, - 0x01, - 0x00, - 0x00, - 0x00, - 0xff, - 0xff, - 0xff, - 0xff, - 0x00, - 0x00, - 0x00, - 0x00, - 0xff, - 0xff, - 0xff, - 0xff, - 0x01, - 0x00, - 0x00, - 0x00, - 0xff, - 0xff, - 0xff, - 0xff, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, ]); let parsed = parser.parse(buf); assert.deepEqual(parsed, { - a: BigInt('4294967295'), - b: BigInt('-4294967295'), - c: BigInt('4294967295'), - d: BigInt('-4294967295'), + a: BigInt("4294967295"), + b: BigInt("-4294967295"), + c: BigInt("4294967295"), + d: BigInt("-4294967295"), }); let encoded = parser.encode(parsed); assert.deepEqual(encoded, buf); }); } else { - it('should throw when run under not v12', () => { - assert.throws(() => Parser.start().bigint64('a')); + it("should throw when run under not v12", () => { + assert.throws(() => Parser.start().bigint64("a")); }); } }); - it('should use encoder to transform to integer', function () { + it("should use encoder to transform to integer", function () { var parser = Parser.start() - .uint8('a', { + .uint8("a", { formatter: function (val) { return val * 2; }, @@ -119,12 +79,12 @@ describe('Primitive encoder', function () { return val / 2; }, }) - .int16le('b', { + .int16le("b", { formatter: function (val) { - return 'test' + String(val); + return "test" + String(val); }, encoder: function (val) { - return parseInt(val.substr('test'.length)); + return parseInt(val.substr("test".length)); }, }); @@ -132,26 +92,15 @@ describe('Primitive encoder', function () { var parsed = parser.parse(buffer); var parsedClone = Object.assign({}, parsed); var encoded = parser.encode(parsedClone); - assert.deepEqual(parsed, { a: 2, b: 'test1234' }); + assert.deepEqual(parsed, { a: 2, b: "test1234" }); assert.deepEqual(encoded, buffer); }); - it('should encode floating point types', function () { - var parser = Parser.start().floatbe('a').doublele('b'); + it("should encode floating point types", function () { + var parser = Parser.start().floatbe("a").doublele("b"); var FLT_EPSILON = 0.00001; var buffer = Buffer.from([ - 0x41, - 0x45, - 0x85, - 0x1f, - 0x7a, - 0x36, - 0xab, - 0x3e, - 0x57, - 0x5b, - 0xb1, - 0xbf, + 0x41, 0x45, 0x85, 0x1f, 0x7a, 0x36, 0xab, 0x3e, 0x57, 0x5b, 0xb1, 0xbf, ]); var result = parser.parse(buffer); @@ -160,18 +109,11 @@ describe('Primitive encoder', function () { var encoded = parser.encode(result); assert.deepEqual(encoded, buffer); }); - it('should handle endianess', function () { - var parser = Parser.start().int32le('little').int32be('big'); + it("should handle endianess", function () { + var parser = Parser.start().int32le("little").int32be("big"); var buffer = Buffer.from([ - 0x4e, - 0x61, - 0xbc, - 0x00, - 0x00, - 0xbc, - 0x61, - 0x4e, + 0x4e, 0x61, 0xbc, 0x00, 0x00, 0xbc, 0x61, 0x4e, ]); var parsed = parser.parse(buffer); assert.deepEqual(parsed, { @@ -181,12 +123,12 @@ describe('Primitive encoder', function () { var encoded = parser.encode(parsed); assert.deepEqual(encoded, buffer); }); - it('should skip when specified', function () { + it("should skip when specified", function () { var parser = Parser.start() - .uint8('a') + .uint8("a") .skip(3) - .uint16le('b') - .uint32be('c'); + .uint16le("b") + .uint32be("c"); var buffer = Buffer.from([ 0x00, @@ -207,12 +149,12 @@ describe('Primitive encoder', function () { }); }); - describe('Bit field encoders', function () { + describe("Bit field encoders", function () { var binaryLiteral = function (s) { var i; var bytes = []; - s = s.replace(/\s/g, ''); + s = s.replace(/\s/g, ""); for (i = 0; i < s.length; i += 8) { bytes.push(parseInt(s.slice(i, i + 8), 2)); } @@ -220,36 +162,36 @@ describe('Primitive encoder', function () { return Buffer.from(bytes); }; - it('binary literal helper should work', function () { - assert.deepEqual(binaryLiteral('11110000'), Buffer.from([0xf0])); + it("binary literal helper should work", function () { + assert.deepEqual(binaryLiteral("11110000"), Buffer.from([0xf0])); assert.deepEqual( - binaryLiteral('11110000 10100101'), - Buffer.from([0xf0, 0xa5]) + binaryLiteral("11110000 10100101"), + Buffer.from([0xf0, 0xa5]), ); }); - it('should encode 1-byte-length 8 bit field', function () { - var parser = new Parser().bit8('a'); + it("should encode 1-byte-length 8 bit field", function () { + var parser = new Parser().bit8("a"); - var buf = binaryLiteral('11111111'); + var buf = binaryLiteral("11111111"); assert.deepEqual(parser.parse(buf), { a: 255 }); assert.deepEqual(parser.encode({ a: 255 }), buf); }); - it('should encode 1-byte-length 2x 4 bit fields', function () { - var parser = new Parser().bit4('a').bit4('b'); + it("should encode 1-byte-length 2x 4 bit fields", function () { + var parser = new Parser().bit4("a").bit4("b"); - var buf = binaryLiteral('1111 1111'); + var buf = binaryLiteral("1111 1111"); assert.deepEqual(parser.parse(buf), { a: 15, b: 15 }); assert.deepEqual(parser.encode({ a: 15, b: 15 }), buf); }); - it('should encode 1-byte-length bit field sequence', function () { - var parser = new Parser().bit1('a').bit2('b').bit4('c').bit1('d'); + it("should encode 1-byte-length bit field sequence", function () { + var parser = new Parser().bit1("a").bit2("b").bit4("c").bit1("d"); - var buf = binaryLiteral('1 10 1010 0'); + var buf = binaryLiteral("1 10 1010 0"); var decoded = parser.parse(buf); assert.deepEqual(decoded, { a: 1, @@ -263,11 +205,11 @@ describe('Primitive encoder', function () { // Endianess will change nothing you still specify bits for left to right parser = new Parser() - .endianess('little') - .bit1('a') - .bit2('b') - .bit4('c') - .bit1('d'); + .endianess("little") + .bit1("a") + .bit2("b") + .bit4("c") + .bit1("d"); encoded = parser.encode({ a: 1, @@ -277,10 +219,10 @@ describe('Primitive encoder', function () { }); assert.deepEqual(encoded, buf); }); - it('should parse 2-byte-length bit field sequence', function () { - var parser = new Parser().bit3('a').bit9('b').bit4('c'); + it("should parse 2-byte-length bit field sequence", function () { + var parser = new Parser().bit3("a").bit9("b").bit4("c"); - var buf = binaryLiteral('101 111000111 0111'); + var buf = binaryLiteral("101 111000111 0111"); var decoded = parser.parse(buf); assert.deepEqual(decoded, { a: 5, @@ -290,14 +232,14 @@ describe('Primitive encoder', function () { var encoded = parser.encode(decoded); assert.deepEqual(encoded, buf); }); - it('should parse 4-byte-length bit field sequence', function () { + it("should parse 4-byte-length bit field sequence", function () { var parser = new Parser() - .bit1('a') - .bit24('b') - .bit4('c') - .bit2('d') - .bit1('e'); - var buf = binaryLiteral('1 101010101010101010101010 1111 01 1'); + .bit1("a") + .bit24("b") + .bit4("c") + .bit2("d") + .bit1("e"); + var buf = binaryLiteral("1 101010101010101010101010 1111 01 1"); var decoded = parser.parse(buf); assert.deepEqual(decoded, { a: 1, @@ -309,12 +251,12 @@ describe('Primitive encoder', function () { var encoded = parser.encode(decoded); assert.deepEqual(encoded, buf); }); - it('should parse nested bit fields', function () { - var parser = new Parser().bit1('a').nest('x', { - type: new Parser().bit2('b').bit4('c').bit1('d'), + it("should parse nested bit fields", function () { + var parser = new Parser().bit1("a").nest("x", { + type: new Parser().bit2("b").bit4("c").bit1("d"), }); - var buf = binaryLiteral('1 10 1010 0'); + var buf = binaryLiteral("1 10 1010 0"); var decoded = parser.parse(buf); assert.deepEqual(decoded, { a: 1, @@ -329,13 +271,13 @@ describe('Primitive encoder', function () { }); }); - describe('String encoder', function () { - it('should encode ASCII encoded string', function () { - var text = 'hello, world'; - var buffer = Buffer.from(text, 'utf8'); - var parser = Parser.start().string('msg', { + describe("String encoder", function () { + it("should encode ASCII encoded string", function () { + var text = "hello, world"; + var buffer = Buffer.from(text, "utf8"); + var parser = Parser.start().string("msg", { length: buffer.length, - encoding: 'utf8', + encoding: "utf8", }); var decoded = parser.parse(buffer); @@ -343,12 +285,12 @@ describe('Primitive encoder', function () { var encoded = parser.encode(decoded); assert.deepEqual(encoded, buffer); }); - it('should encode UTF8 encoded string', function () { - var text = 'こんにちは、せかい。'; - var buffer = Buffer.from(text, 'utf8'); - var parser = Parser.start().string('msg', { + it("should encode UTF8 encoded string", function () { + var text = "こんにちは、せかい。"; + var buffer = Buffer.from(text, "utf8"); + var parser = Parser.start().string("msg", { length: buffer.length, - encoding: 'utf8', + encoding: "utf8", }); var decoded = parser.parse(buffer); @@ -356,12 +298,12 @@ describe('Primitive encoder', function () { var encoded = parser.encode(decoded); assert.deepEqual(encoded, buffer); }); - it('should encode HEX encoded string', function () { - var text = 'cafebabe'; - var buffer = Buffer.from(text, 'hex'); - var parser = Parser.start().string('msg', { + it("should encode HEX encoded string", function () { + var text = "cafebabe"; + var buffer = Buffer.from(text, "hex"); + var parser = Parser.start().string("msg", { length: buffer.length, - encoding: 'hex', + encoding: "hex", }); var decoded = parser.parse(buffer); @@ -369,142 +311,142 @@ describe('Primitive encoder', function () { var encoded = parser.encode(decoded); assert.deepEqual(encoded, buffer); }); - it('should encode variable length string', function () { - var buffer = Buffer.from('0c68656c6c6f2c20776f726c64', 'hex'); + it("should encode variable length string", function () { + var buffer = Buffer.from("0c68656c6c6f2c20776f726c64", "hex"); var parser = Parser.start() - .uint8('length') - .string('msg', { length: 'length', encoding: 'utf8' }); + .uint8("length") + .string("msg", { length: "length", encoding: "utf8" }); var decoded = parser.parse(buffer); - assert.equal(decoded.msg, 'hello, world'); + assert.equal(decoded.msg, "hello, world"); var encoded = parser.encode(decoded); assert.deepEqual(encoded, buffer); }); - it('should encode zero terminated string', function () { - var buffer = Buffer.from('68656c6c6f2c20776f726c6400', 'hex'); - var parser = Parser.start().string('msg', { + it("should encode zero terminated string", function () { + var buffer = Buffer.from("68656c6c6f2c20776f726c6400", "hex"); + var parser = Parser.start().string("msg", { zeroTerminated: true, - encoding: 'utf8', + encoding: "utf8", }); var decoded = parser.parse(buffer); - assert.deepEqual(decoded, { msg: 'hello, world' }); + assert.deepEqual(decoded, { msg: "hello, world" }); var encoded = parser.encode(decoded); assert.deepEqual(encoded, buffer); }); - it('should encode zero terminated fixed-length string', function () { - var buffer = Buffer.from('abc\u0000defghij\u0000'); + it("should encode zero terminated fixed-length string", function () { + var buffer = Buffer.from("abc\u0000defghij\u0000"); var parser = Parser.start() - .string('a', { length: 5, zeroTerminated: true }) - .string('b', { length: 5, zeroTerminated: true }) - .string('c', { length: 5, zeroTerminated: true }); + .string("a", { length: 5, zeroTerminated: true }) + .string("b", { length: 5, zeroTerminated: true }) + .string("c", { length: 5, zeroTerminated: true }); var decoded = parser.parse(buffer); assert.deepEqual(decoded, { - a: 'abc', - b: 'defgh', - c: 'ij', + a: "abc", + b: "defgh", + c: "ij", }); let encoded = parser.encode(decoded); assert.deepEqual(encoded, buffer); encoded = parser.encode({ - a: 'a234', - b: 'b2345', - c: 'c2345678', + a: "a234", + b: "b2345", + c: "c2345678", }); - assert.deepEqual(encoded, Buffer.from('a234\u0000b2345c2345')); + assert.deepEqual(encoded, Buffer.from("a234\u0000b2345c2345")); }); - it('should strip trailing null characters', function () { - var buffer = Buffer.from('746573740000', 'hex'); - var parser1 = Parser.start().string('str', { + it("should strip trailing null characters", function () { + var buffer = Buffer.from("746573740000", "hex"); + var parser1 = Parser.start().string("str", { length: 6, stripNull: false, }); - var parser2 = Parser.start().string('str', { + var parser2 = Parser.start().string("str", { length: 6, stripNull: true, }); var decoded1 = parser1.parse(buffer); - assert.equal(decoded1.str, 'test\u0000\u0000'); + assert.equal(decoded1.str, "test\u0000\u0000"); var encoded1 = parser1.encode(decoded1); assert.deepEqual(encoded1, buffer); var decoded2 = parser2.parse(buffer); - assert.equal(decoded2.str, 'test'); + assert.equal(decoded2.str, "test"); var encoded2 = parser2.encode(decoded2); assert.deepEqual(encoded2, buffer); }); - it('should encode string with zero-bytes internally', function () { - var buffer = Buffer.from('abc\u0000defghij\u0000'); - var parser = Parser.start().string('a', { greedy: true }); + it("should encode string with zero-bytes internally", function () { + var buffer = Buffer.from("abc\u0000defghij\u0000"); + var parser = Parser.start().string("a", { greedy: true }); var decoded = parser.parse(buffer); assert.deepEqual(decoded, { - a: 'abc\u0000defghij\u0000', + a: "abc\u0000defghij\u0000", }); var encoded = parser.encode(decoded); assert.deepEqual(encoded, buffer); }); - it('should encode string with default right padding', function () { - var parser = Parser.start().string('a', { length: 6 }); - var encoded = parser.encode({ a: 'abcd' }); - assert.deepEqual(encoded, Buffer.from('abcd ')); - encoded = parser.encode({ a: 'abcdefgh' }); - assert.deepEqual(encoded, Buffer.from('abcdef')); + it("should encode string with default right padding", function () { + var parser = Parser.start().string("a", { length: 6 }); + var encoded = parser.encode({ a: "abcd" }); + assert.deepEqual(encoded, Buffer.from("abcd ")); + encoded = parser.encode({ a: "abcdefgh" }); + assert.deepEqual(encoded, Buffer.from("abcdef")); }); - it('should encode string with left padding', function () { - var parser = Parser.start().string('a', { length: 6, padding: 'left' }); - var encoded = parser.encode({ a: 'abcd' }); - assert.deepEqual(encoded, Buffer.from(' abcd')); - encoded = parser.encode({ a: 'abcdefgh' }); - assert.deepEqual(encoded, Buffer.from('abcdef')); + it("should encode string with left padding", function () { + var parser = Parser.start().string("a", { length: 6, padding: "left" }); + var encoded = parser.encode({ a: "abcd" }); + assert.deepEqual(encoded, Buffer.from(" abcd")); + encoded = parser.encode({ a: "abcdefgh" }); + assert.deepEqual(encoded, Buffer.from("abcdef")); }); - it('should encode string with right padding and provided padding char', function () { - var parser = Parser.start().string('a', { length: 6, padd: 'x' }); - var encoded = parser.encode({ a: 'abcd' }); - assert.deepEqual(encoded, Buffer.from('abcdxx')); - encoded = parser.encode({ a: 'abcdefgh' }); - assert.deepEqual(encoded, Buffer.from('abcdef')); + it("should encode string with right padding and provided padding char", function () { + var parser = Parser.start().string("a", { length: 6, padd: "x" }); + var encoded = parser.encode({ a: "abcd" }); + assert.deepEqual(encoded, Buffer.from("abcdxx")); + encoded = parser.encode({ a: "abcdefgh" }); + assert.deepEqual(encoded, Buffer.from("abcdef")); }); - it('should encode string with left padding and provided padding char', function () { - var parser = Parser.start().string('a', { + it("should encode string with left padding and provided padding char", function () { + var parser = Parser.start().string("a", { length: 6, - padding: 'left', - padd: '.', + padding: "left", + padd: ".", }); - var encoded = parser.encode({ a: 'abcd' }); - assert.deepEqual(encoded, Buffer.from('..abcd')); - encoded = parser.encode({ a: 'abcdefgh' }); - assert.deepEqual(encoded, Buffer.from('abcdef')); + var encoded = parser.encode({ a: "abcd" }); + assert.deepEqual(encoded, Buffer.from("..abcd")); + encoded = parser.encode({ a: "abcdefgh" }); + assert.deepEqual(encoded, Buffer.from("abcdef")); }); - it('should encode string with padding and padding char 0', function () { - var parser = Parser.start().string('a', { length: 6, padd: '\u0000' }); - var encoded = parser.encode({ a: 'abcd' }); - assert.deepEqual(encoded, Buffer.from('abcd\u0000\u0000')); + it("should encode string with padding and padding char 0", function () { + var parser = Parser.start().string("a", { length: 6, padd: "\u0000" }); + var encoded = parser.encode({ a: "abcd" }); + assert.deepEqual(encoded, Buffer.from("abcd\u0000\u0000")); }); - it('should encode string with padding and first byte of padding char', function () { - var parser = Parser.start().string('a', { length: 6, padd: '1234' }); - var encoded = parser.encode({ a: 'abcd' }); - assert.deepEqual(encoded, Buffer.from('abcd11')); + it("should encode string with padding and first byte of padding char", function () { + var parser = Parser.start().string("a", { length: 6, padd: "1234" }); + var encoded = parser.encode({ a: "abcd" }); + assert.deepEqual(encoded, Buffer.from("abcd11")); }); - it('should encode string with space padding when padd char is not encoded on 1 Byte', function () { - var parser = Parser.start().string('a', { length: 6, padd: 'こ' }); - var encoded = parser.encode({ a: 'abcd' }); - assert.deepEqual(encoded, Buffer.from('abcd ')); + it("should encode string with space padding when padd char is not encoded on 1 Byte", function () { + var parser = Parser.start().string("a", { length: 6, padd: "こ" }); + var encoded = parser.encode({ a: "abcd" }); + assert.deepEqual(encoded, Buffer.from("abcd ")); }); }); - describe('Buffer encoder', function () { - it('should encode buffer', function () { - var parser = new Parser().uint8('len').buffer('raw', { - length: 'len', + describe("Buffer encoder", function () { + it("should encode buffer", function () { + var parser = new Parser().uint8("len").buffer("raw", { + length: "len", }); - var buf = Buffer.from('deadbeefdeadbeef', 'hex'); + var buf = Buffer.from("deadbeefdeadbeef", "hex"); var result = parser.parse( - Buffer.concat([Buffer.from([8]), buf, Buffer.from('garbage at end')]) + Buffer.concat([Buffer.from([8]), buf, Buffer.from("garbage at end")]), ); assert.deepEqual(result, { diff --git a/test/zz_composite_encoder.js b/test/zz_composite_encoder.js index 5ef2ad4b..2c0e3d97 100644 --- a/test/zz_composite_encoder.js +++ b/test/zz_composite_encoder.js @@ -1,13 +1,13 @@ -var assert = require('assert'); -var util = require('util'); -var Parser = require('../dist/binary_parser').Parser; +var assert = require("assert"); +var util = require("util"); +var Parser = require("../dist/binary_parser").Parser; -describe('Composite encoder', function () { - describe('Array encoder', function () { - it('should encode array of primitive types', function () { - var parser = Parser.start().uint8('length').array('message', { - length: 'length', - type: 'uint8', +describe("Composite encoder", function () { + describe("Array encoder", function () { + it("should encode array of primitive types", function () { + var parser = Parser.start().uint8("length").array("message", { + length: "length", + type: "uint8", }); var buffer = Buffer.from([12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]); @@ -19,10 +19,10 @@ describe('Composite encoder', function () { var encoded = parser.encode(decoded); assert.deepEqual(encoded, buffer); }); - it('should encode array of primitive types with lengthInBytes', function () { - var parser = Parser.start().uint8('length').array('message', { - lengthInBytes: 'length', - type: 'uint8', + it("should encode array of primitive types with lengthInBytes", function () { + var parser = Parser.start().uint8("length").array("message", { + lengthInBytes: "length", + type: "uint8", }); var buffer = Buffer.from([12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]); @@ -34,10 +34,10 @@ describe('Composite encoder', function () { var encoded = parser.encode(decoded); assert.deepEqual(encoded, buffer); }); - it('should encode array of primitive types with lengthInBytes as a maximum but not minimum', function () { - var parser = Parser.start().uint8('length').array('message', { - lengthInBytes: 'length', - type: 'uint8', + it("should encode array of primitive types with lengthInBytes as a maximum but not minimum", function () { + var parser = Parser.start().uint8("length").array("message", { + lengthInBytes: "length", + type: "uint8", }); var encoded = parser.encode({ length: 5, @@ -50,23 +50,16 @@ describe('Composite encoder', function () { }); assert.deepEqual(encoded, Buffer.from([5, 1, 2, 3])); }); - it('should encode array of user defined types', function () { - var elementParser = new Parser().uint8('key').int16le('value'); + it("should encode array of user defined types", function () { + var elementParser = new Parser().uint8("key").int16le("value"); - var parser = Parser.start().uint16le('length').array('message', { - length: 'length', + var parser = Parser.start().uint16le("length").array("message", { + length: "length", type: elementParser, }); var buffer = Buffer.from([ - 0x02, - 0x00, - 0xca, - 0xd2, - 0x04, - 0xbe, - 0xd3, - 0x04, + 0x02, 0x00, 0xca, 0xd2, 0x04, 0xbe, 0xd3, 0x04, ]); var decoded = parser.parse(buffer); assert.deepEqual(decoded, { @@ -79,23 +72,16 @@ describe('Composite encoder', function () { var encoded = parser.encode(decoded); assert.deepEqual(encoded, buffer); }); - it('should encode array of user defined types with lengthInBytes', function () { - var elementParser = new Parser().uint8('key').int16le('value'); + it("should encode array of user defined types with lengthInBytes", function () { + var elementParser = new Parser().uint8("key").int16le("value"); - var parser = Parser.start().uint16le('length').array('message', { - lengthInBytes: 'length', + var parser = Parser.start().uint16le("length").array("message", { + lengthInBytes: "length", type: elementParser, }); var buffer = Buffer.from([ - 0x06, - 0x00, - 0xca, - 0xd2, - 0x04, - 0xbe, - 0xd3, - 0x04, + 0x06, 0x00, 0xca, 0xd2, 0x04, 0xbe, 0xd3, 0x04, ]); var decoded = parser.parse(buffer); assert.deepEqual(decoded, { @@ -108,12 +94,12 @@ describe('Composite encoder', function () { var encoded = parser.encode(decoded); assert.deepEqual(encoded, buffer); }); - it('should encode array of user defined types with length function', function () { - var elementParser = new Parser().uint8('key').int16le('value'); + it("should encode array of user defined types with length function", function () { + var elementParser = new Parser().uint8("key").int16le("value"); var parser = Parser.start() - .uint16le('length') - .array('message', { + .uint16le("length") + .array("message", { length: function () { return this.length; }, @@ -121,14 +107,7 @@ describe('Composite encoder', function () { }); var buffer = Buffer.from([ - 0x02, - 0x00, - 0xca, - 0xd2, - 0x04, - 0xbe, - 0xd3, - 0x04, + 0x02, 0x00, 0xca, 0xd2, 0x04, 0xbe, 0xd3, 0x04, ]); var decoded = parser.parse(buffer); assert.deepEqual(decoded, { @@ -141,14 +120,14 @@ describe('Composite encoder', function () { var encoded = parser.encode(decoded); assert.deepEqual(encoded, buffer); }); - it('should encode array of arrays', function () { - var rowParser = Parser.start().uint8('length').array('cols', { - length: 'length', - type: 'int32le', + it("should encode array of arrays", function () { + var rowParser = Parser.start().uint8("length").array("cols", { + length: "length", + type: "int32le", }); - var parser = Parser.start().uint8('length').array('rows', { - length: 'length', + var parser = Parser.start().uint8("length").array("rows", { + length: "length", type: rowParser, }); @@ -186,25 +165,16 @@ describe('Composite encoder', function () { var encoded = parser.encode(decoded); assert.deepEqual(encoded, buffer); }); - it('should encode until function returns true when readUntil is function', function () { - var parser = Parser.start().array('data', { + it("should encode until function returns true when readUntil is function", function () { + var parser = Parser.start().array("data", { readUntil: function (item, buf) { return item === 0; }, - type: 'uint8', + type: "uint8", }); var buffer = Buffer.from([ - 0xff, - 0xff, - 0xff, - 0x01, - 0x00, - 0xff, - 0xff, - 0xff, - 0xff, - 0xff, + 0xff, 0xff, 0xff, 0x01, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, ]); assert.deepEqual(parser.parse(buffer), { data: [0xff, 0xff, 0xff, 0x01, 0x00], @@ -216,16 +186,16 @@ describe('Composite encoder', function () { }); assert.deepEqual(encoded, Buffer.from([0xff, 0xff, 0xff, 0x01, 0x00])); }); - it('should not support associative arrays', function () { + it("should not support associative arrays", function () { var parser = Parser.start() - .int8('numlumps') - .array('lumps', { + .int8("numlumps") + .array("lumps", { type: Parser.start() - .int32le('filepos') - .int32le('size') - .string('name', { length: 8, encoding: 'ascii' }), - length: 'numlumps', - key: 'name', + .int32le("filepos") + .int32le("size") + .string("name", { length: 8, encoding: "ascii" }), + length: "numlumps", + key: "name", }); assert.throws(function () { @@ -235,41 +205,41 @@ describe('Composite encoder', function () { AAAAAAAA: { filepos: 1234, size: 5678, - name: 'AAAAAAAA', + name: "AAAAAAAA", }, bbbbbbbb: { filepos: 5678, size: 1234, - name: 'bbbbbbbb', + name: "bbbbbbbb", }, }, }); }, /Encoding associative array not supported/); }); - it('should use encoder to transform encoded array', function () { - var parser = Parser.start().array('data', { - type: 'uint8', + it("should use encoder to transform encoded array", function () { + var parser = Parser.start().array("data", { + type: "uint8", length: 4, formatter: function (arr) { - return arr.join('.'); + return arr.join("."); }, encoder: function (str) { - return str.split('.'); + return str.split("."); }, }); var buffer = Buffer.from([0x0a, 0x0a, 0x01, 0x6e]); var decoded = parser.parse(buffer); assert.deepEqual(decoded, { - data: '10.10.1.110', + data: "10.10.1.110", }); var encoded = parser.encode(decoded); assert.deepEqual(encoded, buffer); }); - it('should be able to go into recursion', function () { - var parser = Parser.start().namely('self').uint8('length').array('data', { - type: 'self', - length: 'length', + it("should be able to go into recursion", function () { + var parser = Parser.start().namely("self").uint8("length").array("data", { + type: "self", + length: "length", }); var buffer = Buffer.from([1, 1, 1, 0]); @@ -291,10 +261,10 @@ describe('Composite encoder', function () { var encoded = parser.encode(decoded); assert.deepEqual(encoded, buffer); }); - it('should be able to go into even deeper recursion', function () { - var parser = Parser.start().namely('self').uint8('length').array('data', { - type: 'self', - length: 'length', + it("should be able to go into even deeper recursion", function () { + var parser = Parser.start().namely("self").uint8("length").array("data", { + type: "self", + length: "length", }); // 2 @@ -308,17 +278,8 @@ describe('Composite encoder', function () { // 0 var buffer = Buffer.from([ - 2, - /* 0 */ 3, - /* 0 */ 1, - /* 0 */ 0, - /* 1 */ 0, - /* 2 */ 2, - /* 0 */ 1, - /* 0 */ 0, - /* 1 */ 0, - /* 1 */ 1, - /* 0 */ 0, + 2, /* 0 */ 3, /* 0 */ 1, /* 0 */ 0, /* 1 */ 0, /* 2 */ 2, /* 0 */ 1, + /* 0 */ 0, /* 1 */ 0, /* 1 */ 1, /* 0 */ 0, ]); var decoded = parser.parse(buffer); assert.deepEqual(decoded, { @@ -348,20 +309,20 @@ describe('Composite encoder', function () { assert.deepEqual(encoded, buffer); }); - it('should allow parent parser attributes as choice key', function () { - var ChildParser = Parser.start().choice('data', { + it("should allow parent parser attributes as choice key", function () { + var ChildParser = Parser.start().choice("data", { tag: function (vars) { return vars.version; }, choices: { - 1: Parser.start().uint8('v1'), - 2: Parser.start().uint16('v2'), + 1: Parser.start().uint8("v1"), + 2: Parser.start().uint16("v2"), }, }); var ParentParser = Parser.start() - .uint8('version') - .nest('child', { type: ChildParser }); + .uint8("version") + .nest("child", { type: ChildParser }); var buffer = Buffer.from([0x1, 0x2]); var decoded = ParentParser.parse(buffer); @@ -383,23 +344,23 @@ describe('Composite encoder', function () { }); }); - describe('Choice encoder', function () { - it('should encode choices of primitive types', function () { + describe("Choice encoder", function () { + it("should encode choices of primitive types", function () { var parser = Parser.start() - .uint8('tag1') - .choice('data1', { - tag: 'tag1', + .uint8("tag1") + .choice("data1", { + tag: "tag1", choices: { - 0: 'int32le', - 1: 'int16le', + 0: "int32le", + 1: "int16le", }, }) - .uint8('tag2') - .choice('data2', { - tag: 'tag2', + .uint8("tag2") + .choice("data2", { + tag: "tag2", choices: { - 0: 'int32le', - 1: 'int16le', + 0: "int32le", + 1: "int16le", }, }); @@ -414,18 +375,18 @@ describe('Composite encoder', function () { var encoded = parser.encode(decoded); assert.deepEqual(encoded, buffer); }); - it('should encode default choice', function () { + it("should encode default choice", function () { var parser = Parser.start() - .uint8('tag') - .choice('data', { - tag: 'tag', + .uint8("tag") + .choice("data", { + tag: "tag", choices: { - 0: 'int32le', - 1: 'int16le', + 0: "int32le", + 1: "int16le", }, - defaultChoice: 'uint8', + defaultChoice: "uint8", }) - .int32le('test'); + .int32le("test"); buffer = Buffer.from([0x03, 0xff, 0x2f, 0xcb, 0x04, 0x0]); var decoded = parser.parse(buffer); @@ -437,41 +398,29 @@ describe('Composite encoder', function () { var encoded = parser.encode(decoded); assert.deepEqual(encoded, buffer); }); - it('should parse choices of user defied types', function () { + it("should parse choices of user defied types", function () { var parser = Parser.start() - .uint8('tag') - .choice('data', { - tag: 'tag', + .uint8("tag") + .choice("data", { + tag: "tag", choices: { 1: Parser.start() - .uint8('length') - .string('message', { length: 'length' }), - 3: Parser.start().int32le('number'), + .uint8("length") + .string("message", { length: "length" }), + 3: Parser.start().int32le("number"), }, }); var buffer = Buffer.from([ - 0x1, - 0xc, - 0x68, - 0x65, - 0x6c, - 0x6c, - 0x6f, - 0x2c, - 0x20, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, + 0x1, 0xc, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72, + 0x6c, 0x64, ]); var decoded = parser.parse(buffer); assert.deepEqual(decoded, { tag: 1, data: { length: 12, - message: 'hello, world', + message: "hello, world", }, }); var encoded = parser.encode(decoded); @@ -487,17 +436,17 @@ describe('Composite encoder', function () { encoded = parser.encode(decoded); assert.deepEqual(encoded, buffer); }); - it('should be able to go into recursion', function () { + it("should be able to go into recursion", function () { var stop = Parser.start(); var parser = Parser.start() - .namely('self') - .uint8('type') - .choice('data', { - tag: 'type', + .namely("self") + .uint8("type") + .choice("data", { + tag: "type", choices: { 0: stop, - 1: 'self', + 1: "self", }, }); @@ -516,20 +465,20 @@ describe('Composite encoder', function () { var encoded = parser.encode(decoded); assert.deepEqual(encoded, buffer); }); - it('should be able to go into recursion with simple nesting', function () { + it("should be able to go into recursion with simple nesting", function () { var stop = Parser.start(); var parser = Parser.start() - .namely('self') - .uint8('type') - .choice('data', { - tag: 'type', + .namely("self") + .uint8("type") + .choice("data", { + tag: "type", choices: { 0: stop, - 1: 'self', + 1: "self", 2: Parser.start() - .nest('left', { type: 'self' }) - .nest('right', { type: stop }), + .nest("left", { type: "self" }) + .nest("right", { type: stop }), }, }); @@ -554,22 +503,22 @@ describe('Composite encoder', function () { var encoded = parser.encode(decoded); assert.deepEqual(encoded, buffer); }); - it('should be able to refer to other parsers by name', function () { - var parser = Parser.start().namely('self'); + it("should be able to refer to other parsers by name", function () { + var parser = Parser.start().namely("self"); - var stop = Parser.start().namely('stop'); + var stop = Parser.start().namely("stop"); var twoCells = Parser.start() - .namely('twoCells') - .nest('left', { type: 'self' }) - .nest('right', { type: 'stop' }); + .namely("twoCells") + .nest("left", { type: "self" }) + .nest("right", { type: "stop" }); - parser.uint8('type').choice('data', { - tag: 'type', + parser.uint8("type").choice("data", { + tag: "type", choices: { - 0: 'stop', - 1: 'self', - 2: 'twoCells', + 0: "stop", + 1: "self", + 2: "twoCells", }, }); @@ -588,20 +537,20 @@ describe('Composite encoder', function () { var encoded = parser.encode(decoded); assert.deepEqual(encoded, buffer); }); - it('should be able to refer to other parsers both directly and by name', function () { - var parser = Parser.start().namely('self'); + it("should be able to refer to other parsers both directly and by name", function () { + var parser = Parser.start().namely("self"); var stop = Parser.start(); var twoCells = Parser.start() - .nest('left', { type: 'self' }) - .nest('right', { type: stop }); + .nest("left", { type: "self" }) + .nest("right", { type: stop }); - parser.uint8('type').choice('data', { - tag: 'type', + parser.uint8("type").choice("data", { + tag: "type", choices: { 0: stop, - 1: 'self', + 1: "self", 2: twoCells, }, }); @@ -621,24 +570,24 @@ describe('Composite encoder', function () { var encoded = parser.encode(decoded); assert.deepEqual(encoded, buffer); }); - it('should be able to go into recursion with complex nesting', function () { + it("should be able to go into recursion with complex nesting", function () { var stop = Parser.start(); var parser = Parser.start() - .namely('self') - .uint8('type') - .choice('data', { - tag: 'type', + .namely("self") + .uint8("type") + .choice("data", { + tag: "type", choices: { 0: stop, - 1: 'self', + 1: "self", 2: Parser.start() - .nest('left', { type: 'self' }) - .nest('right', { type: 'self' }), + .nest("left", { type: "self" }) + .nest("right", { type: "self" }), 3: Parser.start() - .nest('one', { type: 'self' }) - .nest('two', { type: 'self' }) - .nest('three', { type: 'self' }), + .nest("one", { type: "self" }) + .nest("two", { type: "self" }) + .nest("three", { type: "self" }), }, }); @@ -653,17 +602,9 @@ describe('Composite encoder', function () { // 0 var buffer = Buffer.from([ - 2, - /* left -> */ 3, - /* one -> */ 1, - /* -> */ 0, - /* two -> */ 0, - /* three -> */ 2, - /* left -> */ 1, - /* -> */ 0, - /* right -> */ 0, - /* right -> */ 1, - /* -> */ 0, + 2, /* left -> */ 3, /* one -> */ 1, /* -> */ 0, /* two -> */ 0, + /* three -> */ 2, /* left -> */ 1, /* -> */ 0, /* right -> */ 0, + /* right -> */ 1, /* -> */ 0, ]); var decoded = parser.parse(buffer); assert.deepEqual(decoded, { @@ -694,38 +635,26 @@ describe('Composite encoder', function () { }); it("should be able to 'flatten' choices when using null varName", function () { var parser = Parser.start() - .uint8('tag') + .uint8("tag") .choice(null, { - tag: 'tag', + tag: "tag", choices: { 1: Parser.start() - .uint8('length') - .string('message', { length: 'length' }), - 3: Parser.start().int32le('number'), + .uint8("length") + .string("message", { length: "length" }), + 3: Parser.start().int32le("number"), }, }); var buffer = Buffer.from([ - 0x1, - 0xc, - 0x68, - 0x65, - 0x6c, - 0x6c, - 0x6f, - 0x2c, - 0x20, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, + 0x1, 0xc, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72, + 0x6c, 0x64, ]); var decoded = parser.parse(buffer); assert.deepEqual(decoded, { tag: 1, length: 12, - message: 'hello, world', + message: "hello, world", }); var encoded = parser.encode(decoded); assert.deepEqual(encoded, buffer); @@ -740,38 +669,26 @@ describe('Composite encoder', function () { }); it("should be able to 'flatten' choices when omitting varName paramater", function () { var parser = Parser.start() - .uint8('tag') + .uint8("tag") .choice({ - tag: 'tag', + tag: "tag", choices: { 1: Parser.start() - .uint8('length') - .string('message', { length: 'length' }), - 3: Parser.start().int32le('number'), + .uint8("length") + .string("message", { length: "length" }), + 3: Parser.start().int32le("number"), }, }); var buffer = Buffer.from([ - 0x1, - 0xc, - 0x68, - 0x65, - 0x6c, - 0x6c, - 0x6f, - 0x2c, - 0x20, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, + 0x1, 0xc, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72, + 0x6c, 0x64, ]); var decoded = parser.parse(buffer); assert.deepEqual(decoded, { tag: 1, length: 12, - message: 'hello, world', + message: "hello, world", }); var encoded = parser.encode(decoded); assert.deepEqual(encoded, buffer); @@ -784,52 +701,37 @@ describe('Composite encoder', function () { encoded = parser.encode(decoded); assert.deepEqual(encoded, buffer); }); - it('should be able to use function as the choice selector', function () { + it("should be able to use function as the choice selector", function () { var parser = Parser.start() - .string('selector', { length: 4 }) + .string("selector", { length: 4 }) .choice(null, { tag: function () { return parseInt(this.selector, 2); // string base 2 to integer decimal }, choices: { 2: Parser.start() - .uint8('length') - .string('message', { length: 'length' }), - 7: Parser.start().int32le('number'), + .uint8("length") + .string("message", { length: "length" }), + 7: Parser.start().int32le("number"), }, }); var buffer = Buffer.from([ - 48, - 48, - 49, - 48, - 0xc, - 0x68, - 0x65, - 0x6c, - 0x6c, - 0x6f, - 0x2c, - 0x20, - 0x77, - 0x6f, - 0x72, - 0x6c, - 0x64, + 48, 48, 49, 48, 0xc, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x77, + 0x6f, 0x72, 0x6c, 0x64, ]); var decoded = parser.parse(buffer); assert.deepEqual(decoded, { - selector: '0010', // -> choice 2 + selector: "0010", // -> choice 2 length: 12, - message: 'hello, world', + message: "hello, world", }); var encoded = parser.encode(decoded); assert.deepEqual(encoded, buffer); buffer = Buffer.from([48, 49, 49, 49, 0x4e, 0x61, 0xbc, 0x00]); decoded = parser.parse(buffer); assert.deepEqual(decoded, { - selector: '0111', // -> choice 7 + selector: "0111", // -> choice 7 number: 12345678, }); encoded = parser.encode(decoded); @@ -837,33 +739,33 @@ describe('Composite encoder', function () { }); }); - describe('Nest parser', function () { - it('should encode nested parsers', function () { + describe("Nest parser", function () { + it("should encode nested parsers", function () { var nameParser = new Parser() - .string('firstName', { + .string("firstName", { zeroTerminated: true, }) - .string('lastName', { + .string("lastName", { zeroTerminated: true, }); - var infoParser = new Parser().uint8('age'); + var infoParser = new Parser().uint8("age"); var personParser = new Parser() - .nest('name', { + .nest("name", { type: nameParser, }) - .nest('info', { + .nest("info", { type: infoParser, }); var buffer = Buffer.concat([ - Buffer.from('John\0Doe\0'), + Buffer.from("John\0Doe\0"), Buffer.from([0x20]), ]); var person = personParser.parse(buffer); assert.deepEqual(person, { name: { - firstName: 'John', - lastName: 'Doe', + firstName: "John", + lastName: "Doe", }, info: { age: 0x20, @@ -873,30 +775,30 @@ describe('Composite encoder', function () { assert.deepEqual(encoded, buffer); }); - it('should format parsed nested parser', function () { + it("should format parsed nested parser", function () { var nameParser = new Parser() - .string('firstName', { + .string("firstName", { zeroTerminated: true, }) - .string('lastName', { + .string("lastName", { zeroTerminated: true, }); - var personParser = new Parser().nest('name', { + var personParser = new Parser().nest("name", { type: nameParser, formatter: function (name) { - return name.firstName + ' ' + name.lastName; + return name.firstName + " " + name.lastName; }, encoder: function (name) { // Reverse of aboce formatter - var names = name.split(' '); + var names = name.split(" "); return { firstName: names[0], lastName: names[1] }; }, }); - var buffer = Buffer.from('John\0Doe\0'); + var buffer = Buffer.from("John\0Doe\0"); var person = personParser.parse(buffer); assert.deepEqual(person, { - name: 'John Doe', + name: "John Doe", }); var encoded = personParser.encode(person); assert.deepEqual(encoded, buffer); @@ -904,43 +806,43 @@ describe('Composite encoder', function () { it("should 'flatten' output when using null varName", function () { var parser = new Parser() - .string('s1', { zeroTerminated: true }) + .string("s1", { zeroTerminated: true }) .nest(null, { - type: new Parser().string('s2', { zeroTerminated: true }), + type: new Parser().string("s2", { zeroTerminated: true }), }); - var buf = Buffer.from('foo\0bar\0'); + var buf = Buffer.from("foo\0bar\0"); var decoded = parser.parse(buf); - assert.deepEqual(decoded, { s1: 'foo', s2: 'bar' }); + assert.deepEqual(decoded, { s1: "foo", s2: "bar" }); var encoded = parser.encode(decoded); assert.deepEqual(encoded, buf); }); it("should 'flatten' output when omitting varName", function () { - var parser = new Parser().string('s1', { zeroTerminated: true }).nest({ - type: new Parser().string('s2', { zeroTerminated: true }), + var parser = new Parser().string("s1", { zeroTerminated: true }).nest({ + type: new Parser().string("s2", { zeroTerminated: true }), }); - var buf = Buffer.from('foo\0bar\0'); + var buf = Buffer.from("foo\0bar\0"); var decoded = parser.parse(buf); - assert.deepEqual(decoded, { s1: 'foo', s2: 'bar' }); + assert.deepEqual(decoded, { s1: "foo", s2: "bar" }); var encoded = parser.encode(decoded); assert.deepEqual(encoded, buf); }); }); - describe('Buffer encoder', function () { + describe("Buffer encoder", function () { //this is a test for testing a fix of a bug, that removed the last byte of the //buffer parser - it('should return a buffer with same size', function () { - var bufferParser = new Parser().buffer('buf', { - readUntil: 'eof', + it("should return a buffer with same size", function () { + var bufferParser = new Parser().buffer("buf", { + readUntil: "eof", formatter: function (buffer) { return buffer; }, }); - var buffer = Buffer.from('John\0Doe\0'); + var buffer = Buffer.from("John\0Doe\0"); var decoded = bufferParser.parse(buffer); assert.deepEqual(decoded, { buf: buffer }); var encoded = bufferParser.encode(decoded); @@ -948,32 +850,32 @@ describe('Composite encoder', function () { }); }); - describe('Constructors', function () { - it('should create a custom object type', function () { + describe("Constructors", function () { + it("should create a custom object type", function () { function Person() { - this.name = ''; + this.name = ""; } Person.prototype.toString = function () { - return '[object Person]'; + return "[object Person]"; }; - var parser = Parser.start().create(Person).string('name', { + var parser = Parser.start().create(Person).string("name", { zeroTerminated: true, }); - var buffer = Buffer.from('John Doe\0'); + var buffer = Buffer.from("John Doe\0"); var person = parser.parse(buffer); assert.ok(person instanceof Person); - assert.equal(person.name, 'John Doe'); + assert.equal(person.name, "John Doe"); var encoded = parser.encode(person); assert.deepEqual(encoded, buffer); }); }); - describe('encode other fields after bit', function () { - it('Encode uint8', function () { + describe("encode other fields after bit", function () { + it("Encode uint8", function () { var buffer = Buffer.from([0, 1, 0, 4]); for (var i = 17; i <= 24; i++) { - var parser = Parser.start()['bit' + i]('a').uint8('b'); + var parser = Parser.start()["bit" + i]("a").uint8("b"); var decoded = parser.parse(buffer); assert.deepEqual(decoded, { a: 1 << (i - 16), diff --git a/test/zz_encoder_bugs.js b/test/zz_encoder_bugs.js index 12d8fc93..3dec7010 100644 --- a/test/zz_encoder_bugs.js +++ b/test/zz_encoder_bugs.js @@ -1,15 +1,15 @@ -var assert = require('assert'); -const { SmartBuffer } = require('smart-buffer/build/smartbuffer'); -var Parser = require('../dist/binary_parser').Parser; +var assert = require("assert"); +const { SmartBuffer } = require("smart-buffer/build/smartbuffer"); +var Parser = require("../dist/binary_parser").Parser; -describe('Specific bugs testing', function () { - describe('Array encoder with readUntil', function () { - it('should limit to array length even if readUntil is never true', function () { +describe("Specific bugs testing", function () { + describe("Array encoder with readUntil", function () { + it("should limit to array length even if readUntil is never true", function () { var parser = Parser.start() - .uint16('len') - .array('payloads', { - type: new Parser().uint8('cmd').array('params', { - type: new Parser().uint8('param'), + .uint16("len") + .array("payloads", { + type: new Parser().uint8("cmd").array("params", { + type: new Parser().uint8("param"), readUntil: function (item, buffer) { return buffer.length == 2; // Stop when 2 bytes left in parsed buffer }, @@ -18,9 +18,9 @@ describe('Specific bugs testing', function () { return this.len - 4; }, }) - .uint16('crc'); + .uint16("crc"); - var buffer = Buffer.from('0008AAB1B2B3FFFF', 'hex'); + var buffer = Buffer.from("0008AAB1B2B3FFFF", "hex"); var decoded = parser.parse(buffer); assert.deepEqual(decoded, { @@ -52,12 +52,12 @@ describe('Specific bugs testing', function () { assert.deepEqual(encoded, buffer); }); - it('is not the reverse of parsing when readUntil gives false information', function () { + it("is not the reverse of parsing when readUntil gives false information", function () { var parser = Parser.start() - .uint16('len') - .array('payloads', { - type: new Parser().uint8('cmd').array('params', { - type: new Parser().uint8('param'), + .uint16("len") + .array("payloads", { + type: new Parser().uint8("cmd").array("params", { + type: new Parser().uint8("param"), readUntil: function (item, buffer) { return buffer.length <= 2; // Stop when 2 bytes left in buffer }, @@ -66,9 +66,9 @@ describe('Specific bugs testing', function () { return this.len - 4; }, }) - .uint16('crc'); + .uint16("crc"); - var buffer = Buffer.from('0008AAB1B2B3FFFF', 'hex'); + var buffer = Buffer.from("0008AAB1B2B3FFFF", "hex"); var decoded = parser.parse(buffer); assert.deepEqual(decoded, { @@ -94,15 +94,15 @@ describe('Specific bugs testing', function () { var encoded = parser.encode(decoded); // Missing parms 178 and 179 as readUntil will be true at first run - assert.deepEqual(encoded, Buffer.from('0008AAB1FFFF', 'hex')); + assert.deepEqual(encoded, Buffer.from("0008AAB1FFFF", "hex")); }); - it('should ignore readUntil when encodeUntil is provided', function () { + it("should ignore readUntil when encodeUntil is provided", function () { var parser = Parser.start() - .uint16('len') - .array('payloads', { - type: new Parser().uint8('cmd').array('params', { - type: new Parser().uint8('param'), + .uint16("len") + .array("payloads", { + type: new Parser().uint8("cmd").array("params", { + type: new Parser().uint8("param"), readUntil: function (item, buffer) { return buffer.length == 2; // Stop when 2 bytes left in buffer }, @@ -114,9 +114,9 @@ describe('Specific bugs testing', function () { return this.len - 4; }, }) - .uint16('crc'); + .uint16("crc"); - var buffer = Buffer.from('0008AAB1B2B3FFFF', 'hex'); + var buffer = Buffer.from("0008AAB1B2B3FFFF", "hex"); var decoded = parser.parse(buffer); assert.deepEqual(decoded, { @@ -142,16 +142,16 @@ describe('Specific bugs testing', function () { var encoded = parser.encode(decoded); // Missing parms 179 as encodeUntil stops at 178 - assert.deepEqual(encoded, Buffer.from('0008AAB1B2FFFF', 'hex')); + assert.deepEqual(encoded, Buffer.from("0008AAB1B2FFFF", "hex")); }); - it('should accept readUntil=eof and no encodeUntil provided', function () { - var parser = Parser.start().array('arr', { - type: 'uint8', - readUntil: 'eof', // Read until end of buffer + it("should accept readUntil=eof and no encodeUntil provided", function () { + var parser = Parser.start().array("arr", { + type: "uint8", + readUntil: "eof", // Read until end of buffer }); - var buffer = Buffer.from('01020304050607', 'hex'); + var buffer = Buffer.from("01020304050607", "hex"); var decoded = parser.parse(buffer); assert.deepEqual(decoded, { @@ -159,16 +159,16 @@ describe('Specific bugs testing', function () { }); var encoded = parser.encode(decoded); - assert.deepEqual(encoded, Buffer.from('01020304050607', 'hex')); + assert.deepEqual(encoded, Buffer.from("01020304050607", "hex")); }); - it('should accept empty array to encode', function () { - var parser = Parser.start().array('arr', { - type: 'uint8', - readUntil: 'eof', // Read until end of buffer + it("should accept empty array to encode", function () { + var parser = Parser.start().array("arr", { + type: "uint8", + readUntil: "eof", // Read until end of buffer }); - var buffer = Buffer.from('', 'hex'); + var buffer = Buffer.from("", "hex"); var decoded = parser.parse(buffer); assert.deepEqual(decoded, { @@ -176,19 +176,19 @@ describe('Specific bugs testing', function () { }); var encoded = parser.encode(decoded); - assert.deepEqual(encoded, Buffer.from('', 'hex')); + assert.deepEqual(encoded, Buffer.from("", "hex")); }); - it('should accept empty array to encode and encodeUntil function', function () { - var parser = Parser.start().array('arr', { - type: 'uint8', - readUntil: 'eof', // Read until end of buffer + it("should accept empty array to encode and encodeUntil function", function () { + var parser = Parser.start().array("arr", { + type: "uint8", + readUntil: "eof", // Read until end of buffer encodeUntil: function (item, obj) { return false; // Never stop on content value }, }); - var buffer = Buffer.from('', 'hex'); + var buffer = Buffer.from("", "hex"); var decoded = parser.parse(buffer); assert.deepEqual(decoded, { @@ -196,16 +196,16 @@ describe('Specific bugs testing', function () { }); var encoded = parser.encode(decoded); - assert.deepEqual(encoded, Buffer.from('', 'hex')); + assert.deepEqual(encoded, Buffer.from("", "hex")); }); - it('should accept undefined or null array', function () { - var parser = Parser.start().array('arr', { - type: 'uint8', - readUntil: 'eof', // Read until end of buffer + it("should accept undefined or null array", function () { + var parser = Parser.start().array("arr", { + type: "uint8", + readUntil: "eof", // Read until end of buffer }); - var buffer = Buffer.from('', 'hex'); + var buffer = Buffer.from("", "hex"); var decoded = parser.parse(buffer); // Decode an empty buffer as an empty array @@ -216,31 +216,31 @@ describe('Specific bugs testing', function () { // Encode undefined, null or empty array as an empty buffer [{}, { arr: undefined }, { arr: null }, { arr: [] }].forEach((data) => { let encoded = parser.encode(data); - assert.deepEqual(encoded, Buffer.from('', 'hex')); + assert.deepEqual(encoded, Buffer.from("", "hex")); }); }); }); - describe('Issue #19 Little endianess incorrect', function () { + describe("Issue #19 Little endianess incorrect", function () { let binaryLiteral = function (s) { var i; var bytes = []; - s = s.replace(/\s/g, ''); + s = s.replace(/\s/g, ""); for (i = 0; i < s.length; i += 8) { bytes.push(parseInt(s.slice(i, i + 8), 2)); } return Buffer.from(bytes); }; - it('should parse 4-byte-length bit field sequence wit little endian', function () { - let buf = binaryLiteral('0000000000001111 1010000110100010'); // 000F A1A2 + it("should parse 4-byte-length bit field sequence wit little endian", function () { + let buf = binaryLiteral("0000000000001111 1010000110100010"); // 000F A1A2 // Parsed as two uint16 with little-endian (BYTES order) - let parser1 = new Parser().uint16le('a').uint16le('b'); + let parser1 = new Parser().uint16le("a").uint16le("b"); // Parsed as two 16 bits fields with little-endian - let parser2 = new Parser().endianess('little').bit16('a').bit16('b'); + let parser2 = new Parser().endianess("little").bit16("a").bit16("b"); let parsed1 = parser1.parse(buf); let parsed2 = parser2.parse(buf); @@ -257,39 +257,39 @@ describe('Specific bugs testing', function () { /* This is a little confusing. The endianess with bits fields affect the order of fields */ }); - it('should encode bit ranges with little endian correctly', function () { + it("should encode bit ranges with little endian correctly", function () { let bigParser = Parser.start() - .endianess('big') - .bit4('a') - .bit1('b') - .bit1('c') - .bit1('d') - .bit1('e') - .uint16('f') - .array('g', { type: 'uint8', readUntil: 'eof' }); + .endianess("big") + .bit4("a") + .bit1("b") + .bit1("c") + .bit1("d") + .bit1("e") + .uint16("f") + .array("g", { type: "uint8", readUntil: "eof" }); let littleParser = Parser.start() - .endianess('little') - .bit4('a') - .bit1('b') - .bit1('c') - .bit1('d') - .bit1('e') - .uint16('f') - .array('g', { type: 'uint8', readUntil: 'eof' }); + .endianess("little") + .bit4("a") + .bit1("b") + .bit1("c") + .bit1("d") + .bit1("e") + .uint16("f") + .array("g", { type: "uint8", readUntil: "eof" }); // Parser definition for a symetric encoding/decoding of little-endian bit fields let little2Parser = Parser.start() - .endianess('little') + .endianess("little") .encoderSetOptions({ bitEndianess: true }) - .bit4('a') - .bit1('b') - .bit1('c') - .bit1('d') - .bit1('e') - .uint16('f') - .array('g', { type: 'uint8', readUntil: 'eof' }); + .bit4("a") + .bit1("b") + .bit1("c") + .bit1("d") + .bit1("e") + .uint16("f") + .array("g", { type: "uint8", readUntil: "eof" }); let data = binaryLiteral( - '0011 0 1 0 1 0000000011111111 00000001 00000010 00000011' + "0011 0 1 0 1 0000000011111111 00000001 00000010 00000011", ); // 35 00FF 01 02 03 // in big endian: 3 0 1 0 1 00FF 1 2 3 // in little endian: 3 0 1 0 1 FF00 1 2 3 @@ -348,61 +348,61 @@ describe('Specific bugs testing', function () { }); }); - describe('Issue #20 Encoding fixed length null terminated or strip null strings', function () { - it('should encode zero terminated fixed-length string', function () { + describe("Issue #20 Encoding fixed length null terminated or strip null strings", function () { + it("should encode zero terminated fixed-length string", function () { // In that case parsing and encoding are not the exact oposite let buffer = Buffer.from( - '\u0000A\u0000AB\u0000ABC\u0000ABCD\u0000ABCDE\u0000' + "\u0000A\u0000AB\u0000ABC\u0000ABCD\u0000ABCDE\u0000", ); let parser = Parser.start() - .string('a', { length: 4, zeroTerminated: true }) - .string('b', { length: 4, zeroTerminated: true }) - .string('c', { length: 4, zeroTerminated: true }) - .string('d', { length: 4, zeroTerminated: true }) - .string('e', { length: 4, zeroTerminated: true }) - .string('f', { length: 4, zeroTerminated: true }) - .string('g', { length: 4, zeroTerminated: true }) - .string('h', { length: 4, zeroTerminated: true }); + .string("a", { length: 4, zeroTerminated: true }) + .string("b", { length: 4, zeroTerminated: true }) + .string("c", { length: 4, zeroTerminated: true }) + .string("d", { length: 4, zeroTerminated: true }) + .string("e", { length: 4, zeroTerminated: true }) + .string("f", { length: 4, zeroTerminated: true }) + .string("g", { length: 4, zeroTerminated: true }) + .string("h", { length: 4, zeroTerminated: true }); let decoded = parser.parse(buffer); assert.deepEqual(decoded, { - a: '', - b: 'A', - c: 'AB', - d: 'ABC', - e: 'ABCD', - f: '', - g: 'ABCD', - h: 'E', + a: "", + b: "A", + c: "AB", + d: "ABC", + e: "ABCD", + f: "", + g: "ABCD", + h: "E", }); let encoded = parser.encode(decoded); assert.deepEqual(encoded, buffer); }); - it('should encode fixed-length string with stripNull', function () { + it("should encode fixed-length string with stripNull", function () { let parser = Parser.start() - .string('a', { length: 8, zeroTerminated: false, stripNull: true }) - .string('b', { length: 8, zeroTerminated: false, stripNull: true }) - .string('z', { length: 2, zeroTerminated: false, stripNull: true }); - let buffer = Buffer.from('ABCD\u0000\u0000\u0000\u000012345678ZZ'); + .string("a", { length: 8, zeroTerminated: false, stripNull: true }) + .string("b", { length: 8, zeroTerminated: false, stripNull: true }) + .string("z", { length: 2, zeroTerminated: false, stripNull: true }); + let buffer = Buffer.from("ABCD\u0000\u0000\u0000\u000012345678ZZ"); let decoded = parser.parse(buffer); assert.deepEqual(decoded, { - a: 'ABCD', - b: '12345678', - z: 'ZZ', + a: "ABCD", + b: "12345678", + z: "ZZ", }); let encoded = parser.encode(decoded); assert.deepEqual(encoded, buffer); }); }); - describe('Issue #23 Unable to encode uint64', function () { - it('should not fail when encoding uint64', function () { + describe("Issue #23 Unable to encode uint64", function () { + it("should not fail when encoding uint64", function () { let ipHeader = new Parser() - .uint16('fragment_id') - .uint16('fragment_total') - .uint64('datetime'); + .uint16("fragment_id") + .uint16("fragment_total") + .uint64("datetime"); let anIpHeader = { fragment_id: 1, @@ -411,8 +411,8 @@ describe('Specific bugs testing', function () { }; try { - let result = ipHeader.encode(anIpHeader).toString('hex'); - assert.ok(true, 'No exception'); + let result = ipHeader.encode(anIpHeader).toString("hex"); + assert.ok(true, "No exception"); } catch (ex) { assert.fail(ex); } diff --git a/tsconfig.json b/tsconfig.json index 78292f53..f35ea426 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,63 +1,17 @@ -{ - "compilerOptions": { - /* Basic Options */ - // "incremental": true, /* Enable incremental compilation */ - "target": "es5", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */ - "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ - // "lib": [], /* Specify library files to be included in the compilation. */ - // "allowJs": true, /* Allow javascript files to be compiled. */ - // "checkJs": true, /* Report errors in .js files. */ - // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ - "declaration": true, /* Generates corresponding '.d.ts' file. */ - "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ - "sourceMap": true, /* Generates corresponding '.map' file. */ - // "outFile": "./", /* Concatenate and emit output to single file. */ - "outDir": "dist", /* Redirect output structure to the directory. */ - // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ - // "composite": true, /* Enable project compilation */ - // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ - // "removeComments": true, /* Do not emit comments to output. */ - // "noEmit": true, /* Do not emit outputs. */ - // "importHelpers": true, /* Import emit helpers from 'tslib'. */ - // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ - // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ - - /* Strict Type-Checking Options */ - "strict": false, /* Enable all strict type-checking options. */ - "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ - // "strictNullChecks": true, /* Enable strict null checks. */ - "strictFunctionTypes": true, /* Enable strict checking of function types. */ - "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ - // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ - "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ - // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ - - /* Additional Checks */ - "noUnusedLocals": true, /* Report errors on unused locals. */ - "noUnusedParameters": true, /* Report errors on unused parameters. */ - "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ - "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ - - /* Module Resolution Options */ - // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ - // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ - // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ - // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ - // "typeRoots": [], /* List of folders to include type definitions from. */ - "types": ["node"], /* Type declaration files to be included in compilation. */ - // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ - "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ - // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ - // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ - - /* Source Map Options */ - // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ - // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ - // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ - // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ - - /* Experimental Options */ - // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ - // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ - } -} +{ + "compilerOptions": { + "target": "es6", + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "types": ["node", "mocha"], + "esModuleInterop": true, + "moduleResolution": "NodeNext" + }, + "files": ["lib/binary_parser.ts"] +}