diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..ec6d3cd --- /dev/null +++ b/.prettierignore @@ -0,0 +1 @@ +package.json diff --git a/.travis.yml b/.travis.yml index ef336bb..fcf281d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,9 +1,9 @@ language: node_js node_js: - - "6" + - "10" script: - - npm run build:travis + - npm run build:travis cache: - directories: - - "node_modules" - - "jest_cache" + directories: + - "node_modules" + - "jest_cache" diff --git a/README.md b/README.md index b1138f7..33402c2 100644 --- a/README.md +++ b/README.md @@ -5,96 +5,62 @@ # ts-enum-util -Strictly typed utilities for working with TypeScript enums. +Strictly typed utilities for working with TypeScript enums (and string/number literal union types). + +NOTE: Be sure to read about supported TypeScript versions in the [Requirements](#requirements) section. # Contents - [What is it?](#what-is-it) -- [Other TypeScript Enum Projects](#other-typescript-enum-projects) + - [Enum Wrapper Utilities](#enum-wrapper-utilities) + - [Enum Value Visitor/Mapper](#enum-value-visitormapper) - [Installation](#installation) -- [Usage Examples](#usage-examples) - - [Basic setup for all examples](#basic-setup-for-all-examples) - - [Get an `EnumWrapper` instance for an enum](#get-an-enumwrapper-instance-for-an-enum) - - [Get count of enum entries](#get-count-of-enum-entries) - - [Get lists of enum data](#get-lists-of-enum-data) - - [Lookup value by key](#lookup-value-by-key) - - [Reverse lookup key by value](#reverse-lookup-key-by-value) - - [Validate/convert enum keys](#validateconvert-enum-keys) - - [Validate/convert enum values](#validateconvert-enum-values) - - [Iteration and Mapping](#iteration-and-mapping) - - [Wrapped enums are Array-Like](#wrapped-enums-are-array-like) - - [Wrapped enums are Map-Like](#wrapped-enums-are-map-like) +- [Getting Started](#getting-started) +- [Usage Documentation/Examples](#usage-documentationexamples) - [Requirements](#requirements) -- [Limitations](#limitations) -- [Known Issues](#known-issues) - - [`WeakMap` Polyfill](#weakmap-polyfill) -- [General Concepts](#general-concepts) - - [Enum-Like Object](#enum-like-object) - - [EnumWrapper](#enumwrapper) - - [Specific Typing](#specific-typing) - - [Map-Like Interface](#map-like-interface) - - [Array-Like Interface](#array-like-interface) - - [Guaranteed Order of Iteration](#guaranteed-order-of-iteration) - - [Caching](#caching) -- [API Reference](#api-reference) - - [Terminology](#terminology) - - [$enum](#enum) - - [Types](#types) - - [EnumWrapper](#enumwrapper-1) - - [EnumWrapper.Entry](#enumwrapperentry) - - [EnumWrapper.Iteratee](#enumwrapperiteratee) - - [Array-Like Interface](#array-like-interface-1) - - [EnumWrapper.prototype.length](#enumwrapperprototypelength) - - [EnumWrapper.prototype.[index]](#enumwrapperprototypeindex) - - [Map-Like Interface](#map-like-interface-1) - - [EnumWrapper.prototype.size](#enumwrapperprototypesize) - - [EnumWrapper.prototype.keys](#enumwrapperprototypekeys) - - [EnumWrapper.prototype.values](#enumwrapperprototypevalues) - - [EnumWrapper.prototype.entries](#enumwrapperprototypeentries) - - [EnumWrapper.prototype.@@iterator](#enumwrapperprototypeiterator) - - [EnumWrapper.prototype.forEach](#enumwrapperprototypeforeach) - - [Iteration](#iteration) - - [EnumWrapper.prototype.forEach](#enumwrapperprototypeforeach-1) - - [EnumWrapper.prototype.map](#enumwrapperprototypemap) - - [Get Arrays of Enum Data](#get-arrays-of-enum-data) - - [EnumWrapper.prototype.getKeys](#enumwrapperprototypegetkeys) - - [EnumWrapper.prototype.getValues](#enumwrapperprototypegetvalues) - - [EnumWrapper.prototype.getEntries](#enumwrapperprototypegetentries) - - [Key Validation/Typecasting](#key-validationtypecasting) - - [EnumWrapper.prototype.isKey](#enumwrapperprototypeiskey) - - [EnumWrapper.prototype.asKeyOrThrow](#enumwrapperprototypeaskeyorthrow) - - [EnumWrapper.prototype.asKeyOrDefault](#enumwrapperprototypeaskeyordefault) - - [Value Validation/Typecasting](#value-validationtypecasting) - - [EnumWrapper.prototype.isValue](#enumwrapperprototypeisvalue) - - [EnumWrapper.prototype.asValueOrThrow](#enumwrapperprototypeasvalueorthrow) - - [EnumWrapper.prototype.asValueOrDefault](#enumwrapperprototypeasvalueordefault) - - [Lookup Key by Value](#lookup-key-by-value) - - [EnumWrapper.prototype.getKeyOrThrow](#enumwrapperprototypegetkeyorthrow) - - [EnumWrapper.prototype.getKeyOrDefault](#enumwrapperprototypegetkeyordefault) - - [Lookup Value by Key](#lookup-value-by-key) - - [EnumWrapper.prototype.getValueOrThrow](#enumwrapperprototypegetvalueorthrow) - - [EnumWrapper.prototype.getValueOrDefault](#enumwrapperprototypegetvalueordefault) +- [Why is the main export named `$enum`?](#why-is-the-main-export-named-enum) ## What is it? -`ts-enum-util` provides utilities to improve the usefulness of enums. Examples include: +`ts-enum-util` provides type-safe utilities to improve the usefulness of TypeScript enums. +There are two major and distinct aspects to `ts-enum-util`. + +### Enum Wrapper Utilities + +A wrapper around an enum, or "enum-like object", that provides a variety of type-safe +utilities in terms of the run-time representation fo the enum's keys/values. Some +examples include: - Get a list of an enum's keys, values, or key/value pairs. -- Lookup values by key with run-time key validation and optional result defaulting. +- Look up values by key with run-time key validation and optional result defaulting. - Reverse lookup of keys by value (for string enums too!) with run-time value validation and optional result defaulting. - Run-time validation that a specified value or key is valid for a given enum, with compile-time type guards. -- Treat an enum like an Array. -- Treat an enum like a Map. +- Treat an enum similar to an Array of key/value tuples. +- Treat an enum similar to a Map of values. All of these utilities are very specifically typed for each enum via generics and type inference. -## Other TypeScript Enum Projects +### Enum Value Visitor/Mapper + +A visitor pattern for processing a single value whose type is an enum, or union of +string/number literals. It's like a switch statement that forces you to implement +every possible case (including `null` or `undefined`, if relevant), avoiding bugs +because you forgot to handle one of the enum's values, or because the enum +definition was updated with a new value and you forgot to update existing code to +handle the new value. + +The more generalized "visit" functionallity has you associate a different function +with each possible value of an enum or string/number literal union. +The appropriate function is executed (and its return value returned) based on +which value the argument is at run-time. -- `ts-string-visitor` [[github](https://github.com/UselessPickles/ts-string-visitor), [npm](https://www.npmjs.com/package/ts-string-visitor)] - Generic TypeScript Visitor and Mapper for String Enums and String Literal Union Types +A streamlined "map" functionality has you simply associate values (of any type) +with each possible value of an enum or string/number literal union. +The appropriate mapped value is returned based on which value the argument is at run-time. ## Installation @@ -104,714 +70,95 @@ Install via [NPM](https://www.npmjs.com/package/ts-enum-util): npm i -s ts-enum-util ``` -## Usage Examples +## Getting Started -Several small examples `ts-enum-util`'s capabilities to give you a quick overview of what it can do, as well as an organized "by example" reference. - -Pay special attention to the comments indicating the compile-time type of various results. See [Specific Typing](#specific-typing) for more about data types. - -See [API Reference](#api-reference) for more details about method signatures and behaviors. - -### Basic setup for all examples +Import `$enum`: ```ts -// import the $enum helper function import { $enum } from "ts-enum-util"; - -// Example string enum -// (basic numeric enums also supported) -// (enums with a mix of numeric and string values also supported) -enum RGB { - R = "r", - G = "g", - B = "b" -} ``` -### Get an `EnumWrapper` instance for an enum - -Use the [$enum](#enum) function to get an `EnumWrapper` instance for a particular enum. -Read about how `EnumWrapper` instances are cached: [Caching](#caching). +Define an `enum`: ```ts -// type: EnumWrapper -const wrappedRgb = $enum(RGB); -``` - -### Get count of enum entries - -See also: - -- [Wrapped enums are Array-Like](#wrapped-enums-are-array-like) -- [Wrapped enums are Map-Like](#wrapped-enums-are-map-like) - -```ts -// Part of the Map-like interface implementation -// type: number -// value: 3 -const size = $enum(RGB).size; - -// Part of the Array-like interface implementation -// type: number -// value: 3 -const length = $enum(RGB).length; -``` - -### Get lists of enum data - -See also: - -- [Guaranteed Order of Iteration](#guaranteed-order-of-iteration) -- [Wrapped enums are Array-Like](#wrapped-enums-are-array-like) -- [Wrapped enums are Map-Like](#wrapped-enums-are-map-like) - -```ts -// type: ("R" | "G" | "B")[] -// value: ["R", "G", "B"] -const keys = $enum(RGB).getKeys(); - -// type: RGB[] -// value: ["r", "g", "b"] -const values = $enum(RGB).getValues(); - -// List of key/value pair tuples -// type: [("R" | "G" | "B"), RGB][] -// value: [["R", "r"], ["G", "g"], ["B", "b"]] -const entries = $enum(RGB).getEntries(); -``` - -### Lookup value by key - -```ts -// type: RGB -// value: "g" -const value1 = $enum(RGB).getValueOrThrow("G"); - -// throws: Error("Unexpected value: blah. Expected one of: R,G,B") -const value2 = $enum(RGB).getValueOrThrow("blah"); - -// type: RGB | undefined -// value: undefined -const value3 = $enum(RGB).getValueOrDefault("blah"); - -// type: RGB -// value: "r" -const value4 = $enum(RGB).getValueOrDefault("blah", RGB.R); - -// type: string -// value: "BLAH!" -const value5 = $enum(RGB).getValueOrDefault("blah", "BLAH!"); +enum Color { + R, + G, + B +} ``` -### Reverse lookup key by value +Use `$enum()` as a function to access [Enum Wrapper Utilities](./docs/EnumWrapper.md) for your `enum`: ```ts -// type: ("R" | "G" | "B") -// value: "G" -const key1 = $enum(RGB).getKeyOrThrow("g"); - -// throws: Error("Unexpected value: blah. Expected one of: r,g,b") -const key2 = $enum(RGB).getKeyOrThrow("blah"); - -// type: ("R" | "G" | "B") | undefined -// value: undefined -const key3 = $enum(RGB).getKeyOrDefault("blah"); - -// type: ("R" | "G" | "B") -// value: "R" -const key4 = $enum(RGB).getKeyOrDefault("blah", "R"); - -// type: string -// value: "BLAH!" -const key4 = $enum(RGB).getKeyOrDefault("blah", "BLAH!"); +// type of "values": Color[] +// value of "values": [0, 1, 2] +const values = $enum(Color).getValues(); ``` -### Validate/convert enum keys +Use `$enum.visitValue()` or `$enum.mapValue()` to access [Enum Value Visitor/Mapper](./docs/EnumValueVisitor.md) functionality: ```ts -// Some arbitrary string -declare const str: string; - -// Returns `true` if 'str' is a valid key of RGB -if ($enum(RGB).isKey(str)) { - // isKey() is a type guard - // type of 'str' in here is ("R" | "G" | "B") +function doColorAction(color: Color): void { + $enum.visitValue(color).with({ + [Color.R]: () => { + window.alert("Red Alert!"); + }, + [Color.G]: () => { + window.location = "http://google.com"; + }, + [Color.B]: () => { + console.log("Blue"); + } + }); } -// type: ("R" | "G" | "B") -// throws error if 'str' is not a valid key for RGB -const key1 = $enum(RGB).asKeyOrThrow(str); - -// type: ("R" | "G" | "B") | undefined -// value is undefined if 'str' is not a valid key for RGB -const key2 = $enum(RGB).asKeyOrDefault(str); - -// type: ("R" | "G" | "B") -// value is "G" if 'str' is not a valid key for RGB -const key3 = $enum(RGB).asKeyOrDefault(str, "G"); -``` - -### Validate/convert enum values - -```ts -// Some arbitrary string -declare const str: string; - -// Returns `true` if 'str' is a valid value of RGB -if ($enum(RGB).isValue(str)) { - // isValue() is a type guard - // type of 'str' in here is RGB +function getColorLabel(color: Color | undefined): string { + return $enum.mapValue(color).with({ + [Color.R]: "Red", + [Color.G]: "Green", + [Color.B]: "Blue", + [$enum.handleUndefined]: "Unspecified" + }); } - -// type: RGB -// throws error if 'str' is not a valid value for RGB -const value1 = $enum(RGB).asValueOrThrow(str); - -// type: RGB | undefined -// value is undefined if 'str' is not a valid value for RGB -const value2 = $enum(RGB).asValueOrDefault(str); - -// type: RGB | undefined -// value is RGB.G if 'str' is not a valid value for RGB -const value3 = $enum(RGB).asValueOrDefault(str, RGB.G); -``` - -### Iteration and Mapping - -See also: - -- [Guaranteed Order of Iteration](#guaranteed-order-of-iteration) - -```ts -const wrappedRgb = $enum(RGB); - -// iterate all entries in the enum -wrappedRgb.forEach((value, key, wrappedEnum, index) => { - // type of value is RGB - // type of key is ("R" | "G" | "B") - // wrappedEnum is a reference to wrappedRgb - // index is based on sorted key order -}); - -// Convert all entries of the enum to an array of mapped values -// value: ["R: r", "G: g", "B: b"] -const mapped = wrappedRgb.map((value, key, wrappedEnum, index) => { - // type of value is RGB - // type of key is ("R" | "G" | "B") - // wrappedEnum is a reference to wrappedRgb - // index is based on sorted key order - return `${key}: ${value}`; -}); -``` - -### Wrapped enums are Array-Like - -A wrapped enum can be treated like an array of enum "entry" tuples. - -See also: - -- [Array-Like Interface](#array-like-interface) -- [Guaranteed Order of Iteration](#guaranteed-order-of-iteration) - -```ts -const wrappedRgb = $enum(RGB); - -// type: number -// value: 3 -const length = wrappedRgb.length; - -// type: [("R" | "G" | "B"), RGB] -// value: ["G", "g"] -const entry = wrappedRgb[1]; ``` -### Wrapped enums are Map-Like - -A wrapped enum is similar to a read-only `Map` of enum name -> enum value. - -See also: +## Usage Documentation/Examples -- [Map-Like Interface](#map-like-interface) (has explanation of why there's no `get()` or `has()` method) -- [Guaranteed Order of Iteration](#guaranteed-order-of-iteration) - -```ts -const wrappedRgb = $enum(RGB); - -// type: number -// value: 3 -const size = wrappedRgb.size; - -// EnumWrapper is directly iterable like a Map -for (const [key, value] of wrappedRgb) { - // type of key: ("R" | "G" | "B") - // type of value: RGB -} - -for (const key of wrappedRgb.keys()) { - // type of key: ("R" | "G" | "B") -} - -for (const value of wrappedRgb.values()) { - // type of value: RGB -} +To keep the size of the README under control, usage documentation and examples have +been split out to separate files: -wrappedRgb.forEach((value, key, wrappedEnum, index) => { - // type of value is RGB - // type of key is ("R" | "G" | "B") - // wrappedEnum is a reference to wrappedRgb - // index is based on sorted key order - // NOTE: index param is extra compared to Map's forEach -}); -``` +- [Enum Wrapper Utilities](./docs/EnumWrapper.md) +- [Enum Value Visitor/Mapper](./docs/EnumValueVisitor.md) + - [Migration Guide: from `ts-string-visitor`](./docs/migration_from_ts-string-visitor.md) ## Requirements -- _TypeScript 2.3-2.8_: Code that uses `ts-enum-util` will not compile properly with TypeScript versions prior to 2.3. You'll need TypeScript 2.4+ to take advantage of string enums, but you can still use `ts-enum-util` with [Enum-Like Objects](#enum-like-object) containing string values if you are stuck with TypeScript 2.3. Due to a breaking change to `keyof` in TypeScript 2.9, this version of `ts-enum-util` is not compatible with TypeScript 2.9+. Upgrade to `ts-enum-util` v3+ for TypeScript 2.9 compatibility. -- _ES6 Features_: The following ES6 features are used by `ts-enum-util`, so they must exist (either natively or via polyfill) in the run-time environment: +- _TypeScript 2.9+_: `ts-enum-util` is all about strictly type-safe utilities + around TypeScript enums, so it would be much less useful in a plain JavaScript + project. More specifically, TypeScript 2.9 included advancements in handling + number literals as property names of object types, which is necessary for + implementing some `ts-enum-util` functionality consistently for both string and + number enum types. + - _Stuck with an older version of TypeScript_? + - For Value Visitor/Mapper functionality, check out `ts-string-visitor` + ([npm](https://www.npmjs.com/package/ts-string-visitor), + [github](https://github.com/UselessPickles/ts-string-visitor)). NOTE: + numeric value visiting/mapping not supported! + - For Enum Wrapper + functionality, check out v3 or v2 of `ts-enum-util`. +- _ES6 Features_: The following ES6 features are used by `ts-enum-util`, so they + must exist (either natively or via polyfill) in the run-time environment: - `Map` - `WeakMap` + - `Symbol` - `Symbol.iterator` + - `Symbol.toStringTag` -## Limitations - -- Does not work with enums that are merged with a namespace containing values (variables, functions, etc.), or otherwise have any additional properties added to the enum's runtime object. -- Requires the `preserveConstEnums` TypeScript compiler option to work with `const enums`. -- For certain `Iterable` features of `WrappedEnum` to work, you must either compile with a target of `es6` or higher, or enable the `downlevelIteration` compiler option. - -## Known Issues - -### `WeakMap` Polyfill - -`WeakMap` polyfills typically store values directly on the "key" object (the run-time `enum` object, in this case) as a non-enumerable "secret" (randomly generated) property. This allows for quick O(1) constant time lookups and garbage collection of the value along with the key object, but does add a property to the object. The `WeakMap` secret property will NOT be iterated in `for ... in` loops, and will NOT be included in the results of `Object.keys()`, but it WILL be included in the result of `Object.getOwnPropertyNames()`. - -It's hard to imagine this actually causing any problems, and all mainstream browsers have natively supported `WeakMap` since about 2014-2015, so I have decided to go ahead with relying on `WeakMap`. If you run into a problem caused by this, please [report an issue on github](https://github.com/UselessPickles/ts-enum-util/issues). - -Read more about the use of `WeakMap` for caching `EnumWrapper` instances here: [Caching](#caching) - -## General Concepts - -### Enum-Like Object - -`ts-enum-util` technically works with any "enum-like" object, which is any object whose property values are of type `string` or `number`. - -The most obvious example is a TypeScript `enum`. It can be a standard enum of numeric values, a string enum, or even an enum with a mix of numeric and string values. - -### EnumWrapper - -The bulk of `ts-enum-util`'s functionality is implemented via an `EnumWrapper` class, which is instantiated with a reference to an enum-like object and implements all the useful utility methods for that enum. - -You likely won't ever directly reference the `EnumWrapper` class because it's much more convenient to use the [$enum](#enum) function to obtain a reference to an `EnumWrapper` instance. - -### Specific Typing - -The various methods of `ts-enum-util` are generic and overloaded to ensure that params and results are as specifically-typed as possible. This is acheived through generics, type inference, and overloading of the `$enum` function signature that is used to obtain an `EnumWrapper` instance for a particular enum. - -For example, when obtaining a key or keys from an `EnumWrapper`, the data type will be a string literal union containing only the specific key names that exist in the enum. - -This helps maximize the usefulness of `ts-enum-util` by making it compatible with other strictly typed code related to enums. - -### Map-Like Interface - -A subset of `EnumWrapper`'s interface overlaps with much of the ES6 `Map` interface. `EnumWrapper` is similar to a read-only `Map` of enum values, keyed by the enum names. The following Map-like features are implemented: - -- [size](#enumwrapperprototypesize) property. -- [keys](#enumwrapperprototypekeys), [values](#enumwrapperprototypevalues), and [entries](#enumwrapperprototypeentries) methods. -- [forEach](#enumwrapperprototypeforeach) method. -- [@@iterator](#enumwrapperprototypeiterator) method (`EnumWrapper` is iterable!). - -NOTE: The `Map` interface's `has()` and `get()` methods are intentionally NOT implemented in the interest of clarity and consistency of naming with respect to other `EnumWrapper`-specific methods. The equivalent methods are [isKey](#enumwrapperprototypeiskey) and [getValueOrDefault](#enumwrapperprototypegetvalueordefault) (with second param omitted). - -### Array-Like Interface - -`EnumWrapper` implements the `ArrayLike` interface. It is usable as a readonly array of [EnumWrapper.Entry](#enumwrapperentry). This allows you to pass an `EnumWrapper` instance to any method that is designed read/iterate an array-like value, such as most of [lodash](#https://lodash.com/)'s methods for collections and arrays. - -### Guaranteed Order of Iteration - -ECMAScript does not guarantee a specific order when iterating properties/keys of objects. While many implementations do consistently iterate object properties/keys in the order in which they were added to the object, it is not safe to rely upon an assumption that all implementations will do the same. - -`EnumWrapper` sorts the keys of the enum and uses this sorted order to guarantee consistent ordering of all array/iterator results across all implementations. Just beware that the order may not be what you expect. - -Example: - -```ts -// enum defined with keys alphabetically out of order -enum ABC = { - B, - A, - C -} - -// keys are sorted: ["A", "B", "C"] -const values = $enum(ABC).getKeys(); - -// values are ordered by sorted key order: [1, 0, 2] -const values = $enum(ABC).getValues(); -``` - -### Caching - -`EnumWrapper` instances are cached using an ES6 `WeakMap` for quick subsequent retrieval via the [$enum](#enum) function. This allows you to easily access the `EnumWrapper` functionality for a given enum via the `$enum` function throughout your codebase without worrying about storing a reference to an `EnumWrapper` that is accessible by all of the relevant code. - -The use of the `WeakMap` means that even if you use `ts-enum-util` on temporary, dynamically-generated, enum-like objects, there will be no excessive cache bloat or memory leaks. A cached `EnumWrapper` instance will be garbage collected when the enum-like object it is mapped to is garbage collected. - -Although `WeakMap` lookups can be extremely efficient (constant time lookups in typical implementations), beware that the ECMAScript specification only requires lookups to be "on average" less than O(n) linear time. As such, you should still excercise caution against needlessly obtaining cached references via `$enum` when making heavy use of `EnumWrapper` functionality. Consider storing the result of `$enum()` in a local variable before making multiple calls to its methods, especially if the `EnumWrapper`'s features are used within a loop. - -Despite the above warning, it is noteworthy that even the worst case implementation still produces extremely quick lookups for a relatively small number of items (like the number of enums that you are likely have in a project). For example, see [this performance test](https://www.measurethat.net/Benchmarks/Show/2513/5/map-keyed-by-object) of lookups into maps containing 500 entries, including a simple `Map` polyfill implementation. - -Read about a potential [`WeakMap` Polyfill issue](#weakmap-polyfill). - -Read more about `WeakMap` on the [MDN website](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap). - -## API Reference - -Also see the source code or the distributed `index.d.ts` file for complete details of method signatures/overloads, detailed method/param documentation, etc. - -See [Usage Examples](#usage-examples) if you prefer a "by example" reference. - -### Terminology - -Throughout this reference, the following aliases for types will be used: - -- `EnumLike`: An enum-like object type. See [Enum-Like Object](#enum-like-object). -- `KeyType`: The type of the enum's keys. This is usually a string literal union type of the enum's names, but may also simply be `string` if an `EnumWrapper` was created for an object whose possible property names are not known at compile time. -- `EnumType`: The specific enum type of the enum values. This is usually the enum type itself, but may also simply be the same as `ValueType` (see below) if a `EnumWrapper` was created for an object that is not actually an enum, but is only "enum-like". -- `ValueType`: The widened type of the enum's values. Will be `number`, `string`, or `number | string`, depending on whether the wrapped enum-like object contains only number, only string, or both number and string values. - -### $enum - -This is where it all begins. This method returns an [EnumWrapper](#enum-wrapper-1) instance that provides useful utilities for `enumObj`. - -See [Caching](#caching) for more about caching of `EnumWrapper` instances. - -```ts -function $enum(enumObj: EnumLike): EnumWrapper; -``` - -- `enumObj` - An enum or "enum-like" object. - -### Types - -#### EnumWrapper - -This is the class that implements all the enum utilities. It's a generic class that requires an overloaded helper function to properly instantiate, so the constructor is private. Use [$enum()](#enum) to get/create an instance of `EnumWrapper`. - -```ts -class EnumWrapper -``` - -#### EnumWrapper.Entry - -A generic type alias for a tuple containing a key and value pair, representing a complete "entry" in the enum. The tuple is defined as `Readonly` to prevent accidental corruption of the `EnumWrapper` instance's data. - -```ts -type EnumWrapper.Entry = Readonly<[KeyType, EnumType]> -``` - -#### EnumWrapper.Iteratee - -A generic type alias for a function signature to be used in iteration methods. This is compliant with the signature of an iteratee for a `Map.forEach()` method, but also has an additional `index` param at the end of the parameter list. - -See [Guaranteed Order of Iteration](#guaranteed-order-of-iteration) for details about the ordering. - -```ts -type EnumWrapper.Iteratee = ( - value: EnumType, - key: KeyType, - enumWrapper: EnumWrapper, - index: number -) => R -``` - -- `R` - Generic type param for the return type of the function. The signifigance of the return type/value depends on teh context in which the iteratee is being used. -- `value` - The value of the enum entry. -- `key` - The key of the enum entry. -- `enumWrapper` - A reference to the `EnumWrapper` instance that is being iterated. -- `index` - The index of the enum entry - -### Array-Like Interface +## Why is the main export named `$enum`? -See also: [Array-Like Interface](#array-like-interface) +I wanted something short, simple, and easy to remember that was unlikely to conflict with anything else so that no one would have to alias it when importing it. By exporting a clear, memorable, and uniquely named "thing", this allows you to simply start writing code that uses `$enum` and most IDEs can take care of inserting the import { \$enum } from "ts-enum-util"; for you (either automatically, or with a quick keyboard shortcut). -#### EnumWrapper.prototype.length +I ended up using inspiration from the naming of jquery's `$()` function. Many javascript developers are familiar with jquery, and the fact that `$()` gives you a wrapper around a raw DOM element to expose additional/simplified functionality around the DOM element. -A read-only property containing the number of entries in the enum. - -```ts -readonly EnumWrapper.prototype.length: number -``` - -#### EnumWrapper.prototype.[index] - -The index signature is implemented on `EnumWrapper` to allow you to access `[key, value]` tuples by index like an array. The values accessed by indexing are readonly. - -See [Guaranteed Order of Iteration](#guaranteed-order-of-iteration) for details about the ordering. - -```ts -readonly EnumWrapper.prototype.[index: number]: EnumWrapper.Entry -``` - -### Map-Like Interface - -See also: [Map-Like Interface](#map-like-interface) - -#### EnumWrapper.prototype.size - -A read-only property containing the number of entries in the enum. - -```ts -readonly EnumWrapper.prototype.size: number -``` - -#### EnumWrapper.prototype.keys - -Returns an `Iterator` that will iterate all keys of the enum. - -See [Guaranteed Order of Iteration](#guaranteed-order-of-iteration) for details about the ordering. - -```ts -EnumWrapper.prototype.keys(): IterableIterator -``` - -#### EnumWrapper.prototype.values - -Returns an `Iterator` that will iterate all values of the enum. - -See [Guaranteed Order of Iteration](#guaranteed-order-of-iteration) for details about the ordering. - -```ts -EnumWrapper.prototype.values(): IterableIterator -``` - -#### EnumWrapper.prototype.entries - -Returns an `Iterator` that will iterate all [key, value] pairs of the enum. - -See [Guaranteed Order of Iteration](#guaranteed-order-of-iteration) for details about the ordering. - -```ts -EnumWrapper.prototype.entries(): IterableIterator -``` - -#### EnumWrapper.prototype.@@iterator - -Same as [EnumWrapper.prototype.entries](#enumwrapperprototypeentries). - -Allows an `EnumWrapper` to be directly iterated as a collection of `[key, value]` tuples. - -```ts -EnumWrapper.prototype.@@iterator(): IterableIterator -``` - -#### EnumWrapper.prototype.forEach - -Iterates every entry in the enum and calls the provided `iteratee` function. - -See [Guaranteed Order of Iteration](#guaranteed-order-of-iteration) for details about the ordering. - -```ts -EnumWrapper.prototype.forEach( - iteratee: EnumWrapper.Iteratee, - context?: any -): void -``` - -- `iteratee`: See [EnumWrapper.Iteratee](#enumwraperriteratee). The return value of this function is ignored. -- `context`: If provided, then the value will be used as the `this` context when executing `iteratee`. - -### Iteration - -#### EnumWrapper.prototype.forEach - -See [EnumWrapper.prototype.forEach](#enumwrapperprototypeforeach) in the [Map-Like Interface](#map-like-interface-1) section. - -#### EnumWrapper.prototype.map - -Builds and returns a new array containing the results of calling the provided `iteratee` function on every entry in the enum. - -See [Guaranteed Order of Iteration](#guaranteed-order-of-iteration) for details about the ordering. - -```ts -EnumWrapper.prototype.map( - iteratee: EnumWrapper.Iteratee, - context?: any -): R[] -``` - -- `R`: Generic type param that indicates the type of entries in the resulting array. If not specified, then it will be inferred from the return type of `iteratee`. -- `iteratee`: See [EnumWrapper.Iteratee](#enumwraperriteratee). -- `context`: If provided, then the value will be used as the `this` context when executing `iteratee`. - -### Get Arrays of Enum Data - -#### EnumWrapper.prototype.getKeys - -Returns an array of all keys in the enum. - -See [Guaranteed Order of Iteration](#guaranteed-order-of-iteration) for details about the ordering. - -```ts -EnumWrapper.prototype.getKeys(): KeyType[] -``` - -#### EnumWrapper.prototype.getValues - -Returns an array of all values in the enum. If the enum contains any duplicate values, then so will the returned array. - -See [Guaranteed Order of Iteration](#guaranteed-order-of-iteration) for details about the ordering. - -```ts -EnumWrapper.prototype.getValues(): EnumType[] -``` - -#### EnumWrapper.prototype.getEntries - -Returns a list of `[key, value]` tuples representing all entries in the enum. - -See [Guaranteed Order of Iteration](#guaranteed-order-of-iteration) for details about the ordering. - -```ts -EnumWrapper.prototype.getEntries(): EnumWrapper.Entry[] -``` - -### Key Validation/Typecasting - -#### EnumWrapper.prototype.isKey - -```ts -Returns `true` if the provided `key` is a valid key for the enum. - -Also acts as a type guard to tell the compiler that the provided `key` is the more specific `KeyType` type. -EnumWrapper.prototype.isKey( - key: string | null | undefined -): key is KeyType -``` - -#### EnumWrapper.prototype.asKeyOrThrow - -If the provided `key` is a valid key for the enum, then the `key` is returned, but cast to the more specific `KeyType` type. - -If the provided `key` is NOT valid, then an `Error` is thrown. - -```ts -EnumWrapper.prototype.asKeyOrThrow( - key: string | null | undefined -): KeyType -``` - -#### EnumWrapper.prototype.asKeyOrDefault - -If the provided `key` is a valid key for the enum, then the `key` is returned, but cast to the more specific `KeyType` type. - -If the provided `key` is NOT valid, then `defaultKey` is returned. - -This method is overloaded so that its return type is as specific as possible, depending on the type of the `defaultKey` param. - -```ts -EnumWrapper.prototype.asKeyOrDefault( - key: string | null | undefined, - defaultKey?: KeyType | string -): KeyType | string | undefined -``` - -### Value Validation/Typecasting - -#### EnumWrapper.prototype.isValue - -Returns `true` if the provided `value` is a valid value for the enum. - -Also acts as a type guard to tell the compiler that the provided `value` is the more specific `EnumType` type. - -```ts -EnumWrapper.prototype.isValue( - value: ValueType | null | undefined -): key is EnumType -``` - -#### EnumWrapper.prototype.asValueOrThrow - -If the provided `value` is a valid value for the enum, then the `value` is returned, but cast to the more specific `EnumType` type. - -If the provided `value` is NOT valid, then an `Error` is thrown. - -```ts -EnumWrapper.prototype.asValueOrThrow( - value: ValueType | null | undefined -): EnumType -``` - -#### EnumWrapper.prototype.asValueOrDefault - -If the provided `value` is a valid value for the enum, then the `value` is returned, but cast to the more specific `EnumType` type. - -If the provided `value` is NOT valid, then `defaultValue` is returned. - -This method is overloaded so that its return type is as specific as possible, depending on the type of the `defaultValue` param. - -```ts -EnumWrapper.prototype.asValueOrDefault( - value: ValueType | null | undefined, - defaultValue?: EnumType | ValueType -): EnumType | ValueType | undefined -``` - -### Lookup Key by Value - -#### EnumWrapper.prototype.getKeyOrThrow - -Performs a reverse lookup to get the key that corresponds to the provided `value`. - -If the enum has duplicate values matching the provided `value`, then the key for the last duplicate entry (in order specified by the [Guaranteed Order of Iteration](#guaranteed-order-of-iteration) section) is returned. - -If the provided `value` is NOT valid, then an `Error` is thrown. - -```ts -EnumWrapper.prototype.getKeyOrThrow( - value: ValueType | null | undefined -): KeyType -``` - -#### EnumWrapper.prototype.getKeyOrDefault - -Performs a reverse lookup to get the key that corresponds to the provided `value`. - -If the enum has duplicate values matching the provided `value`, then the key for the last duplicate entry (in order specified by the [Guaranteed Order of Iteration](#guaranteed-order-of-iteration) section) is returned. - -If the provided `value` is NOT valid, then `defaultKey` is returned. - -This method is overloaded so that its return type is as specific as possible, depending on the type of the `defaultKey` param. - -```ts -EnumWrapper.prototype.getKeyOrDefault( - value: ValueType | null | undefined, - defaultKey?: KeyType | string -): KeyType | string | undefined -``` - -### Lookup Value by Key - -#### EnumWrapper.prototype.getValueOrThrow - -Returns the value corresponding to the provided `key`. - -If the provided `key` is NOT valid, then an `Error` is thrown. - -```ts -EnumWrapper.prototype.getValueOrThrow( - key: string | null | undefined -): EnumType -``` - -#### EnumWrapper.prototype.getValueOrDefault - -Returns the value corresponding to the provided `key`. - -If the provided `key` is NOT valid, then `defaultValue` is returned. - -This method is overloaded so that its return type is as specific as possible, depending on the type of the `defaultValue` param. - -```ts -EnumWrapper.prototype.getValueOrDefault( - key: string | null | undefined, - defaultValue?: EnumType | ValueType -): EnumType | ValueType | undefined -``` +Similarly, `$enum()` gives you a wrapper around a raw enum to expose additional/simplified functionality around the enum. diff --git a/docs/EnumValueVisitor.md b/docs/EnumValueVisitor.md new file mode 100644 index 0000000..bcccfbb --- /dev/null +++ b/docs/EnumValueVisitor.md @@ -0,0 +1,530 @@ +# ts-enum-util | Enum Value Visitor/Mapper + +Generic TypeScript Visitor and Mapper for Enums and String/Number Literal Type Unions + +# Contents + + + +- [Basic Usage Examples](#basic-usage-examples) + - [Visitor](#visitor) + - [Mapper](#mapper) +- [General Usage and Terminology](#general-usage-and-terminology) + - [Visitor](#visitor-1) + - [Mapper](#mapper-1) +- [Handling Null/Undefined](#handling-nullundefined) +- [Handling Unexpected Values at Run Time](#handling-unexpected-values-at-run-time) +- [Choosing to Not Handle Certain Values](#choosing-to-not-handle-certain-values) +- [Visitor Method Return Values](#visitor-method-return-values) +- [Being Explicit About Visitor/Mapper Result Type](#being-explicit-about-visitormapper-result-type) +- [Visitor Method Parameters](#visitor-method-parameters) +- [Sharing Visitor Methods Across Multiple Values](#sharing-visitor-methods-across-multiple-values) + - [Without Using Visitor Method Parameters](#without-using-visitor-method-parameters) + - [Using Visitor Method Parameters](#using-visitor-method-parameters) +- [Visiting/Mapping Enums](#visitingmapping-enums) + - [Visits/Maps Enum _Values_ - Not Names](#visitsmaps-enum-_values_---not-names) + - [Enum Visitor Method Parameter Types](#enum-visitor-method-parameter-types) + - [Only Literal "Union Enums" Are Supported](#only-literal-union-enums-are-supported) + - [Both String and Numeric Enums Are Supported](#both-string-and-numeric-enums-are-supported) +- [What's up with this chained `$enum.visitValue().with()` syntax?](#whats-up-with-this-chained-enumvisitvaluewith-syntax) + + + +## Migrating from `ts-string-visitor` + +See [Migration Guide: Upgrading From `ts-string-visitor`](./docs/migration_from_ts-string-visitor.md) + +## Basic Usage Examples + +### Visitor + +Example of the generalized visitor. + +```ts +import { $enum } from "ts-enum-util"; + +type RGB = "r" | "g" | "b"; + +// Example function that uses $enum.visitValue() to convert a RGB value +// to a display label +function getRgbLabel(rgb: RGB): string { + // Pass the value to $enum.visitValue(), and provide a visitor + // implementation to $enum.visitValue().with() + return $enum.visitValue(rgb).with({ + // The visitor must have a function property for every + // possible value of the string literal union type. + // TypeScript compilation will fail if you miss any values, + // or if you include extras that don't exist in the type. + r: () => { + return "Red"; + }, + g: () => { + // This function is called when "g" is passed in as the + // value for 'rgb'. The return value of this function is + // returned by $enum.visitValue().with(). + return "Green"; + }, + b: () => { + return "Blue"; + } + }); +} + +const result = getRgbLabel("g"); // result === "Green" +``` + +### Mapper + +Example of the simpler Mapper, for when you just need to map string/number literal union or enum values to some other value without any logic. + +```ts +import { $enum } from "ts-enum-util"; + +type RGB = "r" | "g" | "b"; + +// Example function that uses $enum.mapValue() to convert a RGB value +// to a display label +function getRgbLabel(rgb: RGB): string { + // Pass the value to $enum.mapValue(), and provide a mapper + // implementation to $enum.mapValue().with() + return $enum.mapValue(rgb).with({ + // The mapper must have a property for every + // possible value of the string literal union type. + // TypeScript compilation will fail if you miss any values, + // or if you include extras that don't exist in the type. + r: "Red", + // This propery's value is looked up and returned when + // "g" is passed in as the value for 'rgb'. + g: "Green", + b: "Blue" + }); +} + +const result = getRgbLabel("g"); // result === "Green" +``` + +## General Usage and Terminology + +This section explains in general how to use `ts-enum-util`'s Enum value Visitor/Mapper, and defines some terminology that is used throughout this document. + +### Visitor + +A visitor is used to execute a function based on the value of a string/number literal union or enum type. + +The `$enum.visitValue` method is used to "visit" a string/number literal union or enum value as follows: + +`[result] = $enum.visitValue([value]).with([visitor])` + +Where: + +- `[value]` is a value whose type is either a string/number literal union or enum. +- `[visitor]` is an object whose property names match all possible values of `[value]`'s type, and the property values are functions that will be called when the corresponding property name value is passed to `$enum.visitValue`. +- `[result]` is the value returned by whichever visitor function is called. NOTE: Visitors are not required to return a value. You may choose to implement a visitor that only performs logic for each possible string literal/enum value. + +Note: Every visitor method must have the same return type. You may want to consider [Being Explicit About Visitor/Mapper Result Type](#being-explicit-about-visitormapper-result-type). + +See the [Visitor](#visitor) usage example. + +### Mapper + +A mapper is used to simply convert the value of a string/number literal union or enum type into some other value. This is less powerful than a visitor, but also simpler with less boilerplate code. + +The `$enum.mapValue` method is used to "map" a string/number literal union or enum value as follows: + +`[result] = $enum.mapValue([value]).with([mapper])` + +Where: + +- `[value]` is a value whose type is either a string/number literal union or enum. +- `[mapper]` is an object whose property names match all possible values of `[value]`'s type, and the property values are the mapped values that will be returned when the corresponding property name value is passed to `$enum.mapValue`. +- `[result]` is the value of whichever `[mapper]` property matched `[value]`. + +Note: Every property of your mapper must be of the same type. You may want to consider [Being Explicit About Visitor/Mapper Result Type](#being-explicit-about-visitormapper-result-type). + +See the [Mapper](#mapper) usage example. + +## Handling Null/Undefined + +The `$enum.visitValue` and `$enum.mapValue` methods are overloaded to handle every combination of its parameter being possibly `null` and/or `undefined`. + +If (and only if) the parameter may be `null`, then your visitor/mapper MUST include a property named `[$enum.handleNull]`. The value of this property will be used to visit/map `null` values. + +If (and only if) the parameter may be `undefined`, then your visitor/mapper MUST include a property named `[$enum.handleUndefined]`. The value of this property will be used to visit/map `undefined` values. + +`$enum.handleNull` and `$enum.handleUndefined` are both unique symbols that guarantee zero possibility of +naming collision with actual values that you may be visiting/mapping. + +Example (Visitor): + +```ts +type RGB = "r" | "g" | "b"; + +function getRgbLabel(rgb: RGB | null): string { + // The type of 'rgb' includes 'null', so the visitor must + // handle null + return $enum.visitValue(rgb).with({ + r: () => { + return "Red"; + }, + g: () => { + return "Green"; + }, + b: () => { + return "Blue"; + }, + [$enum.handleNull]: () => { + return "null"; + } + }); +} + +const result = getRgbLabel(null); // result === "null" +``` + +Example (Mapper): + +```ts +type RGB = "r" | "g" | "b"; + +function getRgbLabel(rgb: RGB | null): string { + // The type of 'rgb' includes 'null', so the mapper must + // handle null + return $enum.mapValue(rgb).with({ + r: "Red", + g: "Green", + b: "Blue", + [$enum.handleNull]: "null" + }); +} + +const result = getRgbLabel(null); // result === "null" +``` + +## Handling Unexpected Values at Run Time + +When processing data from an external source at run time (e.g., data from an API), there's no guarantee that it will be constrained to the expected types/values in your TypeScript code. Both `$enum.visitValue` and `$enum.mapValue` will detect unexpected values at run time. The default behavior is to throw an error when an unexpected value is encountered at run time. The encountered value is included in the error message for convenience. + +If you would like to override the default behavior, then you may provide the optional `[$enum.handleUnexpected]` property in your visitor or mapper implementation. + +`$enum.handleUndefined` is a unique symbol that guarantee zero possibility of +naming collision with actual values that you may be visiting/mapping. + +The parameter of the `handleUnexpected` method in a visitor is of type `string`, possibly unioned with type `null` and/or `undefined`, depending on whether `null`/`undefined` are unexpected values for the particular usage of `$enum.visitValue`. + +See also: [Visitor Method Parameters](#visitor-method-parameters) and [Handling Null/Undefined](#handling-nullundefined). + +Example (Visitor): + +```ts +type RGB = "r" | "g" | "b"; + +function getRgbLabel(rgb: RGB): string { + return $enum.visitValue(rgb).with({ + r: () => { + return "Red"; + }, + g: () => { + return "Green"; + }, + b: () => { + return "Blue"; + }, + [$enum.handleUnexpected]: () => { + return "Unexpected!"; + } + }); +} + +// Type casting to force an unexpected value at run time +const result = getRgbLabel(("blah" as unknown) as RGB); // result === "Unexpected" +``` + +Example (Mapper): + +```ts +type RGB = "r" | "g" | "b"; + +function getRgbLabel(rgb: RGB): string { + return $enum.mapValue(rgb).with({ + r: "Red", + g: "Green", + b: "Blue", + [$enum.handleUnexpected]: "Unexpected!" + }); +} + +// Type casting to force an unexpected value at run time +const result = getRgbLabel(("blah" as unknown) as RGB); // result === "Unexpected!" +``` + +## Choosing to Not Handle Certain Values + +Sometimes you need to write code that is intentionally designed to only expect/handle a subset of possibilities, and you really just want to throw an error if one of the unsupported values is encountered. Simply provide `$enum.unhandledEntry` as the entry for an unhandled value in a visitor/mapper implementation, and an error will be thrown if that value is encountered at runtime. + +Example (Visitor): + +```ts +type RGB = "r" | "g" | "b"; + +function getRgbLabel(rgb: RGB): string { + return $enum.visitValue(rgb).with({ + r: () => { + return "Red"; + }, + g: $enum.unhandledEntry, + b: () => { + return "Blue"; + } + }); +} + +// Throws error: "Unhandled value: g" +const result = getRgbLabel("g"); +``` + +Example (Mapper): + +```ts +type RGB = "r" | "g" | "b"; + +function getRgbLabel(rgb: RGB): string { + return $enum.mapValue(rgb).with({ + r: "Red", + g: $enum.mapValue.unhandled, + b: "Blue" + }); +} + +// Throws error: "Unhandled value: g" +const result = getRgbLabel("g"); +``` + +## Visitor Method Return Values + +Your visitor methods can return a value, which will be returned by the call to `$enum.visitValue().with()`. + +BEWARE: All visitor methods within a given visitor MUST have the same return type. If you have a mixture of return types, then the compiler will decide that one of them is correct, and the others are wrong. The resulting compiler error may be confusing if you and the compiler do not agree on what the correct return type should have been. + +Keep reading to learn how to avoid this confusion... + +## Being Explicit About Visitor/Mapper Result Type + +When designing a visitor/mapper to return a value, it is often helpful to explicitly provide the desired return type as a template parameter to the `with()` function. + +Example (Visitor): + +```ts +type RGB = "r" | "g" | "b"; + +function getRgbLabel(rgb: RGB): string { + // Tell the compiler that you intend to return a string from the + // visitor + return $enum.visitValue(rgb).with({ + // Compiler error for this property + r: () => { + return 10; + }, + g: () => { + return "Green"; + }, + b: () => { + return "Blue"; + } + }); +} +``` + +Example (Mapper): + +```ts +type RGB = "r" | "g" | "b"; + +function getRgbLabel(rgb: RGB): string { + // Tell the compiler that you intend to return a string from the + // mapper + return $enum.mapValue(rgb).with({ + // Compiler error for this property + r: 10, + g: "Green", + b: "Blue" + }); +} +``` + +In the above examples, it is guaranteed that the compiler will complain about the `"r"` property being/returning type `number` instead of `string`. If you did not provide the hint then the compiler may infer the return type of the visitor/mapper to be `number` and confusingly complain that the OTHER properties are wrong! + +## Visitor Method Parameters + +The methods of the visitor implementation receive a single parameter: the value being visited. The type of the parameter for each method is EXACTLY the type of the value handled by that method. +Here's a simple (albeit pointless) identity visitor implementation to demonstrate: + +```ts +type RGB = "r" | "g" | "b"; + +function rgbIdentity(rgb: RGB | null | undefined): RGB | null | undefined { + return $enum.visitValue(rgb).with({ + r: (value) => { + // type of 'value' is exactly "r" + // (not RGB | null | undefined) + return value; + }, + g: (value) => { + // type of 'value' is exactly "g" + return value; + }, + b: (value) => { + // type of 'value' is exactly "b" + return value; + }, + [$enum.handleNull]: (value) => { + // type of 'value' is exactly null + return value; + }, + [$enum.handleUndefined]: (value) => { + // type of 'value' is exactly undefined + return value; + } + }); +} + +const result = rgbIdentity("g"); // result === "g" +``` + +## Sharing Visitor Methods Across Multiple Values + +Sometimes you want to handle multiple values in the same way, but duplicating code is bad. Here's some examples of how you can share code across multiple values in a visitor. + +### Without Using Visitor Method Parameters + +If your shared code does not need to reference the value being visited, then it is very simple to share visitor methods across multiple values: + +```ts +type RGB = "r" | "g" | "b"; + +// test if a color value is "supported" +function isSupportedColor(rgb: RGB | null | undefined): boolean { + // pre-define a handler for all "supported" values + const handleSupported = (): boolean => { + return true; + }; + + // pre-defined a handler for all "unsupported" values + const handleUnsupported = (): boolean => { + return false; + }; + + return $enum.visitValue(rgb).with({ + r: handleSupported, + // Green is ugly - UNSUPPORTED! + g: handleUnsupported, + b: handleSupported, + [$enum.handleNull]: handleUnsupported, + [$enum.handleUndefined]: handleUnsupported + }); +} +``` + +### Using Visitor Method Parameters + +If your shared code needs to reference the value being visited, then you have to be conscious of the parameter types involved. The type of the parameter of the shared method must include the types of all values it will handle. Let's enhance the previous example to log every value that is visited. + +```ts +type RGB = "r" | "g" | "b"; + +// test if a color value is "supported" +function isSupportedColor(rgb: RGB | null | undefined): boolean { + // Since this handler is not used for null/undefined, there's no + // need to include those types for the param. + // The type technically only needs to be ("r" | "b"), but type + // RGB is more convenient and there's no harm in being overly + // permissive in this case. + const handleSupported = (value: RGB): boolean => { + // Since the type 'value' does not include null/undefined, we + // can safely call value.toupperCase() without performing a + // null check first. + // This is an example of why being restrictive with the type + // of shared handler can be beneficial. + console.log(`handling supported value: ${value.toUpperCase()}`); + return true; + }; + + // This handler is used to handle null/undefined, so it MUST + // include those types for the param. + // Again, the type only technically needs to be + // ("g" | null | undefined), but being more permissive can be + // more convenient when it's not harmful. + const handleUnsupported = (value: RGB | null | undefined): boolean => { + console.warn(`unsupported color encountered: ${value}`); + return false; + }; + + return $enum.visitValue(rgb).with({ + r: handleSupported, + // Green is ugly - UNSUPPORTED! + g: handleUnsupported, + b: handleSupported, + [$enum.handleNull]: handleUnsupported, + [$enum.handleUndefined]: handleUnsupported + }); +} +``` + +## Visiting/Mapping Enums + +### Visits/Maps Enum _Values_ - Not Names + +TypeScript enums can be visited/mapped with `ts-enum-util`. The important detail to understand is that the _values_ (not the identifiers/names) of the enums are used as the visitor/mapper property names. + +```ts +enum RGB { + // "R" is the name of the identifier. + // "r" is the value. + R = "r", + G = "g", + B = "b" +} + +function getRgbLabel(rgb: RGB): string { + return $enum.visitValue(rgb).with({ + // This works (my preferred style) + [RGB.R]: () => { + return "Red"; + }, + // This also works + g: () => { + return "Green"; + }, + // This does NOT work! + B: () => { + return "Blue"; + } + }); +} +``` + +### Enum Visitor Method Parameter Types + +Be aware that the type of an enum value is a more specific type than a string literal type. For maximum compile-time type checking benefit, you should treat enums as enum types whenever possible, rather than string literals: + +- Compare against members of the enum, rather than string literals. +- Use the enum type for variables, params, return types, etc., rather than type string. + +### Only Literal "Union Enums" Are Supported + +`ts-enum-util`'s Enum value Visitor/Mapper can only work on enums that qualify as "union enums". All members must have literal (non-calculated) values. + +Read more about "Union enums and enum member types" here: [Enums - TypeScript](https://www.typescriptlang.org/docs/handbook/enums.html) + +### Both String and Numeric Enums Are Supported + +String enums are fine. Numeric enums are fine. Even heterogeneous enums (mix of both string and numeric values) +are supported, if you like that kind of thing. + +## What's up with this chained `$enum.visitValue().with()` syntax? + +You might wonder why I didn't implement `ts-enum-util`'s Enum Value Visitor as a single overloaded `$enum.visitValue` method that accepts both the value AND the visitor. The chained approach I settled on was necessary to: + +- Ensure that the type of visitor (whether it needs to handle null and/or undefined) is driven by whether the visited value may possibly be null/undefined. This is necessary to provide relevant compiler error messages when something isn't right with your code. +- Allow the return type to be explicitly provided, while allowing the compiler to infer the type of the visited value. + +Read more details about other approaches I tried and their flaws in [this github issue comment](https://github.com/Microsoft/TypeScript/issues/20643#issuecomment-352328395). diff --git a/docs/EnumWrapper.md b/docs/EnumWrapper.md new file mode 100644 index 0000000..f82a5af --- /dev/null +++ b/docs/EnumWrapper.md @@ -0,0 +1,850 @@ +# ts-enum-util | Enum Wrapper Utilities + +Usage documentation for the `EnumWrapper` portion of `ts-enum-util`. + +# Contents + + + +- [Usage Examples](#usage-examples) + - [Basic setup for all examples](#basic-setup-for-all-examples) + - [Get an `EnumWrapper` instance for an enum](#get-an-enumwrapper-instance-for-an-enum) + - [Get count of enum entries](#get-count-of-enum-entries) + - [Get lists of enum data](#get-lists-of-enum-data) + - [Lookup value by key](#lookup-value-by-key) + - [Reverse lookup key by value](#reverse-lookup-key-by-value) + - [Validate/convert enum keys](#validateconvert-enum-keys) + - [Validate/convert enum values](#validateconvert-enum-values) + - [Iteration and Mapping](#iteration-and-mapping) + - [Wrapped enums are Array-Like](#wrapped-enums-are-array-like) + - [Wrapped enums are Map-Like](#wrapped-enums-are-map-like) +- [Limitations](#limitations) +- [Known Issues](#known-issues) + - [`WeakMap` Polyfill](#weakmap-polyfill) +- [General Concepts](#general-concepts) + - [Enum-Like Object](#enum-like-object) + - [EnumWrapper](#enumwrapper) + - [Specific Typing](#specific-typing) + - [Map-Like Interface](#map-like-interface) + - [Array-Like Interface](#array-like-interface) + - [Order of Iteration](#order-of-iteration) + - [Caching](#caching) +- [API Reference](#api-reference) + - [Terminology](#terminology) + - [\$enum](#\enum) + - [Types](#types) + - [EnumWrapper](#enumwrapper-1) + - [EnumWrapper.Entry](#enumwrapperentry) + - [EnumWrapper.Iteratee](#enumwrapperiteratee) + - [Array-Like Interface](#array-like-interface-1) + - [EnumWrapper.prototype.length](#enumwrapperprototypelength) + - [EnumWrapper.prototype.[index]](#enumwrapperprototypeindex) + - [Map-Like Interface](#map-like-interface-1) + - [EnumWrapper.prototype.size](#enumwrapperprototypesize) + - [EnumWrapper.prototype.keys](#enumwrapperprototypekeys) + - [EnumWrapper.prototype.values](#enumwrapperprototypevalues) + - [EnumWrapper.prototype.entries](#enumwrapperprototypeentries) + - [EnumWrapper.prototype.@@iterator](#enumwrapperprototypeiterator) + - [EnumWrapper.prototype.forEach](#enumwrapperprototypeforeach) + - [Iteration](#iteration) + - [EnumWrapper.prototype.forEach](#enumwrapperprototypeforeach-1) + - [EnumWrapper.prototype.map](#enumwrapperprototypemap) + - [Get Arrays of Enum Data](#get-arrays-of-enum-data) + - [EnumWrapper.prototype.getKeys](#enumwrapperprototypegetkeys) + - [EnumWrapper.prototype.getValues](#enumwrapperprototypegetvalues) + - [EnumWrapper.prototype.getEntries](#enumwrapperprototypegetentries) + - [Get Ordered Index of Keys/Values](#get-ordered-index-of-keysvalues) + - [EnumWrapper.prototype.indexOfKey](#enumwrapperprototypeindexofkey) + - [EnumWrapper.prototype.indexOfValue](#enumwrapperprototypeindexofvalue) + - [Key Validation/Typecasting](#key-validationtypecasting) + - [EnumWrapper.prototype.isKey](#enumwrapperprototypeiskey) + - [EnumWrapper.prototype.asKeyOrThrow](#enumwrapperprototypeaskeyorthrow) + - [EnumWrapper.prototype.asKeyOrDefault](#enumwrapperprototypeaskeyordefault) + - [Value Validation/Typecasting](#value-validationtypecasting) + - [EnumWrapper.prototype.isValue](#enumwrapperprototypeisvalue) + - [EnumWrapper.prototype.asValueOrThrow](#enumwrapperprototypeasvalueorthrow) + - [EnumWrapper.prototype.asValueOrDefault](#enumwrapperprototypeasvalueordefault) + - [Lookup Key by Value](#lookup-key-by-value) + - [EnumWrapper.prototype.getKeyOrThrow](#enumwrapperprototypegetkeyorthrow) + - [EnumWrapper.prototype.getKeyOrDefault](#enumwrapperprototypegetkeyordefault) + - [Lookup Value by Key](#lookup-value-by-key) + - [EnumWrapper.prototype.getValueOrThrow](#enumwrapperprototypegetvalueorthrow) + - [EnumWrapper.prototype.getValueOrDefault](#enumwrapperprototypegetvalueordefault) + - [Create a new enum-like object with a subset of an enum's entries](#create-a-new-enum-like-object-with-a-subset-of-an-enums-entries) + - [EnumWrapper.prototype.createEnumSubset](#enumwrapperprototypecreateenumsubset) + + + +## Usage Examples + +Here's several small examples `ts-enum-util`'s Enum Wrapper capabilities to give you a quick overview of what it can do, as well as an organized "by example" reference. + +Pay special attention to the comments indicating the compile-time type of various results. See [Specific Typing](#specific-typing) for more about data types. + +See [API Reference](#api-reference) for more details about method signatures and behaviors. + +### Basic setup for all examples + +```ts +// import the $enum helper function +import { $enum } from "ts-enum-util"; + +// Example string enum +// (basic numeric enums also supported) +// (enums with a mix of numeric and string values also supported) +enum RGB { + R = "r", + G = "g", + B = "b" +} +``` + +### Get an `EnumWrapper` instance for an enum + +Use the [\$enum](#enum) function to get an `EnumWrapper` instance for a particular enum. +Read about how `EnumWrapper` instances are cached: [Caching](#caching). + +```ts +// type: EnumWrapper +const wrappedRgb = $enum(RGB); +``` + +### Get count of enum entries + +See also: + +- [Wrapped enums are Array-Like](#wrapped-enums-are-array-like) +- [Wrapped enums are Map-Like](#wrapped-enums-are-map-like) + +```ts +// Part of the Map-like interface implementation +// type: number +// value: 3 +const size = $enum(RGB).size; + +// Part of the Array-like interface implementation +// type: number +// value: 3 +const length = $enum(RGB).length; +``` + +### Get lists of enum data + +See also: + +- [Order of Iteration](#order-of-iteration) +- [Wrapped enums are Array-Like](#wrapped-enums-are-array-like) +- [Wrapped enums are Map-Like](#wrapped-enums-are-map-like) + +```ts +// type: ("R" | "G" | "B")[] +// value: ["R", "G", "B"] +const keys = $enum(RGB).getKeys(); + +// type: RGB[] +// value: ["r", "g", "b"] +const values = $enum(RGB).getValues(); + +// List of key/value pair tuples +// type: [("R" | "G" | "B"), RGB][] +// value: [["R", "r"], ["G", "g"], ["B", "b"]] +const entries = $enum(RGB).getEntries(); +``` + +### Lookup value by key + +```ts +// type: RGB +// value: "g" +const value1 = $enum(RGB).getValueOrThrow("G"); + +// throws: Error("Unexpected value: blah. Expected one of: R,G,B") +const value2 = $enum(RGB).getValueOrThrow("blah"); + +// type: RGB | undefined +// value: undefined +const value3 = $enum(RGB).getValueOrDefault("blah"); + +// type: RGB +// value: "r" +const value4 = $enum(RGB).getValueOrDefault("blah", RGB.R); + +// type: string +// value: "BLAH!" +const value5 = $enum(RGB).getValueOrDefault("blah", "BLAH!"); +``` + +### Reverse lookup key by value + +```ts +// type: ("R" | "G" | "B") +// value: "G" +const key1 = $enum(RGB).getKeyOrThrow("g"); + +// throws: Error("Unexpected value: blah. Expected one of: r,g,b") +const key2 = $enum(RGB).getKeyOrThrow("blah"); + +// type: ("R" | "G" | "B") | undefined +// value: undefined +const key3 = $enum(RGB).getKeyOrDefault("blah"); + +// type: ("R" | "G" | "B") +// value: "R" +const key4 = $enum(RGB).getKeyOrDefault("blah", "R"); + +// type: string +// value: "BLAH!" +const key4 = $enum(RGB).getKeyOrDefault("blah", "BLAH!"); +``` + +### Validate/convert enum keys + +```ts +// Some arbitrary string +declare const str: string; + +// Returns `true` if 'str' is a valid key of RGB +if ($enum(RGB).isKey(str)) { + // isKey() is a type guard + // type of 'str' in here is ("R" | "G" | "B") +} + +// type: ("R" | "G" | "B") +// throws error if 'str' is not a valid key for RGB +const key1 = $enum(RGB).asKeyOrThrow(str); + +// type: ("R" | "G" | "B") | undefined +// value is undefined if 'str' is not a valid key for RGB +const key2 = $enum(RGB).asKeyOrDefault(str); + +// type: ("R" | "G" | "B") +// value is "G" if 'str' is not a valid key for RGB +const key3 = $enum(RGB).asKeyOrDefault(str, "G"); +``` + +### Validate/convert enum values + +```ts +// Some arbitrary string +declare const str: string; + +// Returns `true` if 'str' is a valid value of RGB +if ($enum(RGB).isValue(str)) { + // isValue() is a type guard + // type of 'str' in here is RGB +} + +// type: RGB +// throws error if 'str' is not a valid value for RGB +const value1 = $enum(RGB).asValueOrThrow(str); + +// type: RGB | undefined +// value is undefined if 'str' is not a valid value for RGB +const value2 = $enum(RGB).asValueOrDefault(str); + +// type: RGB +// value is RGB.G if 'str' is not a valid value for RGB +const value3 = $enum(RGB).asValueOrDefault(str, RGB.G); +``` + +### Iteration and Mapping + +See also: + +- [Order of Iteration](#order-of-iteration) + +```ts +const wrappedRgb = $enum(RGB); + +// iterate all entries in the enum +wrappedRgb.forEach((value, key, wrappedEnum, index) => { + // type of value is RGB + // type of key is ("R" | "G" | "B") + // wrappedEnum is a reference to wrappedRgb + // index is based on original defined order of the enum +}); + +// Convert all entries of the enum to an array of mapped values +// value: ["R: r", "G: g", "B: b"] +const mapped = wrappedRgb.map((value, key, wrappedEnum, index) => { + // type of value is RGB + // type of key is ("R" | "G" | "B") + // wrappedEnum is a reference to wrappedRgb + // index is based on original defined order of the enum + return `${key}: ${value}`; +}); +``` + +### Wrapped enums are Array-Like + +A wrapped enum is simialr to a readonly array of enum "entry" tuples. + +See also: + +- [Array-Like Interface](#array-like-interface) +- [Order of Iteration](#order-of-iteration) + +```ts +const wrappedRgb = $enum(RGB); + +// type: number +// value: 3 +const length = wrappedRgb.length; + +// type: [("R" | "G" | "B"), RGB] +// value: ["G", "g"] +const entry = wrappedRgb[1]; +``` + +### Wrapped enums are Map-Like + +A wrapped enum is similar to a read-only `Map` of enum name -> enum value. + +See also: + +- [Map-Like Interface](#map-like-interface) (has explanation of why there's no `get()` or `has()` method) +- [Order of Iteration](#order-of-iteration) + +```ts +const wrappedRgb = $enum(RGB); + +// type: number +// value: 3 +const size = wrappedRgb.size; + +// EnumWrapper is directly iterable like a Map +for (const [key, value] of wrappedRgb) { + // type of key: ("R" | "G" | "B") + // type of value: RGB +} + +for (const key of wrappedRgb.keys()) { + // type of key: ("R" | "G" | "B") +} + +for (const value of wrappedRgb.values()) { + // type of value: RGB +} + +wrappedRgb.forEach((value, key, wrappedEnum, index) => { + // type of value is RGB + // type of key is ("R" | "G" | "B") + // wrappedEnum is a reference to wrappedRgb + // index is based on original defined order of the enum + // NOTE: index param is extra compared to Map's forEach +}); +``` + +## Limitations + +- Does not work with enums that are merged with a namespace containing values (variables, functions, etc.), or otherwise have any additional properties added to the enum's runtime object. +- Requires the `preserveConstEnums` TypeScript compiler option to work with `const enums`. +- For certain `Iterable` features of `WrappedEnum` to work, you must either compile with a target of `es6` or higher, or enable the `downlevelIteration` compiler option. + +## Known Issues + +### `WeakMap` Polyfill + +`WeakMap` polyfills typically store values directly on the "key" object (the run-time `enum` object, in this case) as a non-enumerable "secret" (randomly generated) property. This allows for quick O(1) constant time lookups and garbage collection of the value along with the key object, but does add a property to the object. The `WeakMap` secret property will NOT be iterated in `for ... in` loops, and will NOT be included in the results of `Object.keys()`, but it WILL be included in the result of `Object.getOwnPropertyNames()`. + +It's hard to imagine this actually causing any problems, and all mainstream browsers have natively supported `WeakMap` since about 2014-2015, so I have decided to go ahead with relying on `WeakMap`. If you run into a problem caused by this, please [report an issue on github](https://github.com/UselessPickles/ts-enum-util/issues). + +Read more about the use of `WeakMap` for caching `EnumWrapper` instances here: [Caching](#caching) + +## General Concepts + +### Enum-Like Object + +`ts-enum-util` technically works with any "enum-like" object, which is any object whose property values are of type `string` or `number`. + +The most obvious example is a TypeScript `enum`. It can be a standard enum of numeric values, a string enum, or even an enum with a mix of numeric and string values. + +### EnumWrapper + +The `EnumWrapper` class wraps around an enum-like object and implements all the useful utility methods for that enum. + +You likely won't ever directly reference the `EnumWrapper` class because it's much more convenient to use the [\$enum()](#enum) function to obtain a reference to an `EnumWrapper` instance. + +### Specific Typing + +`EnumWrapper` is genericly typed based on the wrapped enum-like object with several method overloaded to ensure that params and results are as specifically-typed as possible. + +For example, when obtaining a key or keys from an `EnumWrapper`, the data type will be a string literal union containing only the specific key names that exist in the enum. + +This helps maximize the usefulness of `EnumWrapper` by making it compatible with other strictly typed code related to enums. + +### Map-Like Interface + +A subset of `EnumWrapper`'s interface overlaps with much of the ES6 `Map` interface. `EnumWrapper` is similar to a read-only `Map` of enum values, keyed by the enum names. The following Map-like features are implemented: + +- [size](#enumwrapperprototypesize) property. +- [keys](#enumwrapperprototypekeys), [values](#enumwrapperprototypevalues), and [entries](#enumwrapperprototypeentries) methods. +- [forEach](#enumwrapperprototypeforeach) method. +- [@@iterator](#enumwrapperprototypeiterator) method (`EnumWrapper` is iterable!). + +NOTE: The `Map` interface's `has()` and `get()` methods are intentionally NOT implemented in the interest of clarity and consistency of naming with respect to other `EnumWrapper`-specific methods. The equivalent methods are [isKey](#enumwrapperprototypeiskey) and [getValueOrDefault](#enumwrapperprototypegetvalueordefault) (with second param omitted). + +### Array-Like Interface + +`EnumWrapper` implements the `ArrayLike` interface. It is usable as a readonly array of [EnumWrapper.Entry](#enumwrapperentry). This allows you to pass an `EnumWrapper` instance to any method that is designed read/iterate an array-like value, such as most of [lodash](#https://lodash.com/)'s methods for collections and arrays. + +### Order of Iteration + +`EnumWrapper` does its best to retain the order in which the enum's entries were +originally listed in source code. + +When executed in an environment with an ES6-compliant implementation of +`Object.getOwnPropertyNames`, then the order of iteration is _guaranteed_ to match +the order in which the enum was originally defined in source code. + +If `Object.getOwnPropertyNames` is not available in the run-time environment, then +there techincally is no official guarantee of the order in which the enum will be +processed by `EnumWrapper`. However, a variety of de-facto standards of how various +browsers and JS run-time environments have implemented object key/property ordering +combined with limited subset of keys/properties processed by `EnumUtil` +(own, enumerable, non-array-index properties only) allows for extremely high practical +confidence that order of definition within the source code will be retained. + +Example: + +```ts +// enum defined with keys alphabetically out of order and +// values out of order +enum ABC = { + B = 3, + A = 1, + C = 2 +} + +// defined order is retained: ["B", "A", "C"] +const values = $enum(ABC).getKeys(); + +// defined order is retained: [3, 1, 2] +const values = $enum(ABC).getValues(); +``` + +### Caching + +`EnumWrapper` instances are cached using an ES6 `WeakMap` for quick subsequent retrieval via the [\$enum](#enum) function. This allows you to easily access the `EnumWrapper` functionality for a given enum via the `$enum` function throughout your codebase without worrying about storing a reference to an `EnumWrapper` that is accessible by all of the relevant code. + +The use of the `WeakMap` means that even if you use `ts-enum-util` on temporary, dynamically-generated, enum-like objects, there will be no excessive cache bloat or memory leaks. A cached `EnumWrapper` instance will be garbage collected when the enum-like object it is mapped to is garbage collected. + +Although `WeakMap` lookups can be extremely efficient (constant time lookups in typical implementations), beware that the ECMAScript specification only requires lookups to be "on average" less than O(n) linear time. As such, you should still excercise caution against needlessly obtaining cached references via `$enum` when making heavy use of `EnumWrapper` functionality. Consider storing the result of `$enum()` in a local variable before making multiple calls to its methods, especially if the `EnumWrapper`'s features are used within a loop. + +Despite the above warning, it is noteworthy that even the worst case implementation still produces extremely quick lookups for a relatively small number of items (like the number of enums that you are likely have in a project). For example, see [this performance test](https://www.measurethat.net/Benchmarks/Show/2513/5/map-keyed-by-object) of lookups into maps containing 500 entries, including a simple `Map` polyfill implementation. + +Read about a potential [`WeakMap` Polyfill issue](#weakmap-polyfill). + +Read more about `WeakMap` on the [MDN website](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap). + +## API Reference + +Also see the source code or the distributed `.d.ts` types files for complete details of method signatures/overloads, detailed method/param documentation, etc. + +See [Usage Examples](#usage-examples) if you prefer a "by example" reference. + +### Terminology + +Throughout this reference, the following aliases for types will be used: + +- `EnumLike`: An enum-like object type. See [Enum-Like Object](#enum-like-object). +- `KeyType`: The type of the enum's keys. This is usually a string literal union type of the enum's names, but may also simply be `string` if an `EnumWrapper` was created for an object whose possible property names are not known at compile time. +- `EnumType`: The specific enum type of the enum values. This is usually the enum type itself, but may also simply be the same as `ValueType` (see below) if a `EnumWrapper` was created for an object that is not actually an enum, but is only "enum-like". +- `ValueType`: The widened type of the enum's values. Will be `number`, `string`, or `number | string`, depending on whether the wrapped enum-like object contains only number, only string, or both number and string values. + +### \$enum + +This is where it all begins. This method returns an [EnumWrapper](#enum-wrapper-1) instance that provides useful utilities for `enumObj`. + +See [Caching](#caching) for more about caching of `EnumWrapper` instances. + +```ts +function $enum(enumObj: EnumLike): EnumWrapper; +``` + +- `enumObj` - An enum or "enum-like" object. + +### Types + +#### EnumWrapper + +This is the class that implements all the enum utilities. It's a generic class that requires an overloaded helper function to properly instantiate, so the constructor is private. Use [\$enum()](#enum) to get/create an instance of `EnumWrapper`. + +```ts +class EnumWrapper +``` + +#### EnumWrapper.Entry + +A generic type alias for a tuple containing a key and value pair, representing a complete "entry" in the enum. The tuple is defined as `Readonly` to prevent accidental corruption of the `EnumWrapper` instance's data. + +```ts +type EnumWrapper.Entry = Readonly<[KeyType, EnumType]> +``` + +#### EnumWrapper.Iteratee + +A generic type alias for a function signature to be used in iteration methods. This is compliant with the signature of an iteratee for a `Map.forEach()` method, but also has an additional `index` param at the end of the parameter list. + +See [Order of Iteration](#order-of-iteration) for details about the ordering. + +```ts +type EnumWrapper.Iteratee = ( + value: EnumType, + key: KeyType, + enumWrapper: EnumWrapper, + index: number +) => R +``` + +- `R` - Generic type param for the return type of the function. The signifigance of the return type/value depends on teh context in which the iteratee is being used. +- `value` - The value of the enum entry. +- `key` - The key of the enum entry. +- `enumWrapper` - A reference to the `EnumWrapper` instance that is being iterated. +- `index` - The index of the enum entry + +### Array-Like Interface + +See also: [Array-Like Interface](#array-like-interface) + +#### EnumWrapper.prototype.length + +A read-only property containing the number of entries in the enum. + +```ts +readonly EnumWrapper.prototype.length: number +``` + +#### EnumWrapper.prototype.[index] + +The index signature is implemented on `EnumWrapper` to allow you to access `[key, value]` tuples by index like an array. The values accessed by indexing are readonly. + +See [Order of Iteration](#order-of-iteration) for details about the ordering. + +```ts +readonly EnumWrapper.prototype.[index: number]: EnumWrapper.Entry +``` + +### Map-Like Interface + +See also: [Map-Like Interface](#map-like-interface) + +#### EnumWrapper.prototype.size + +A read-only property containing the number of entries in the enum. + +```ts +readonly EnumWrapper.prototype.size: number +``` + +#### EnumWrapper.prototype.keys + +Returns an `Iterator` that will iterate all keys of the enum. + +See [Order of Iteration](#order-of-iteration) for details about the ordering. + +```ts +EnumWrapper.prototype.keys(): IterableIterator +``` + +#### EnumWrapper.prototype.values + +Returns an `Iterator` that will iterate all values of the enum. + +See [Order of Iteration](#order-of-iteration) for details about the ordering. + +```ts +EnumWrapper.prototype.values(): IterableIterator +``` + +#### EnumWrapper.prototype.entries + +Returns an `Iterator` that will iterate all [key, value] pairs of the enum. + +See [Order of Iteration](#order-of-iteration) for details about the ordering. + +```ts +EnumWrapper.prototype.entries(): IterableIterator +``` + +#### EnumWrapper.prototype.@@iterator + +Same as [EnumWrapper.prototype.entries](#enumwrapperprototypeentries). + +Allows an `EnumWrapper` to be directly iterated as a collection of `[key, value]` tuples. + +```ts +EnumWrapper.prototype.@@iterator(): IterableIterator +``` + +#### EnumWrapper.prototype.forEach + +Iterates every entry in the enum and calls the provided `iteratee` function. + +See [Order of Iteration](#order-of-iteration) for details about the ordering. + +```ts +EnumWrapper.prototype.forEach( + iteratee: EnumWrapper.Iteratee, + context?: any +): void +``` + +- `iteratee`: See [EnumWrapper.Iteratee](#enumwraperriteratee). The return value of this function is ignored. +- `context`: If provided, then the value will be used as the `this` context when executing `iteratee`. + +### Iteration + +#### EnumWrapper.prototype.forEach + +See [EnumWrapper.prototype.forEach](#enumwrapperprototypeforeach) in the [Map-Like Interface](#map-like-interface-1) section. + +#### EnumWrapper.prototype.map + +Builds and returns a new array containing the results of calling the provided `iteratee` function on every entry in the enum. + +See [Order of Iteration](#order-of-iteration) for details about the ordering. + +```ts +EnumWrapper.prototype.map( + iteratee: EnumWrapper.Iteratee, + context?: any +): R[] +``` + +- `R`: Generic type param that indicates the type of entries in the resulting array. If not specified, then it will be inferred from the return type of `iteratee`. +- `iteratee`: See [EnumWrapper.Iteratee](#enumwraperriteratee). +- `context`: If provided, then the value will be used as the `this` context when executing `iteratee`. + +### Get Arrays of Enum Data + +#### EnumWrapper.prototype.getKeys + +Returns an array of all keys in the enum. + +See [Order of Iteration](#order-of-iteration) for details about the ordering. + +```ts +EnumWrapper.prototype.getKeys(): KeyType[] +``` + +#### EnumWrapper.prototype.getValues + +Returns an array of all values in the enum. If the enum contains any duplicate values, then so will the returned array. + +See [Order of Iteration](#order-of-iteration) for details about the ordering. + +```ts +EnumWrapper.prototype.getValues(): EnumType[] +``` + +#### EnumWrapper.prototype.getEntries + +Returns a list of `[key, value]` tuples representing all entries in the enum. + +See [Order of Iteration](#order-of-iteration) for details about the ordering. + +```ts +EnumWrapper.prototype.getEntries(): EnumWrapper.Entry[] +``` + +### Get Ordered Index of Keys/Values + +#### EnumWrapper.prototype.indexOfKey + +Returns the ordered index of a key of the enum. +This can be useful for implementing comparators based on the iteration order +of the enum, for example. + +See [Order of Iteration](#order-of-iteration) for details about the ordering. + +```ts +EnumWrapper.prototype.indexOfKey(key: KeyType): number +``` + +- `key`: A valid key of the enum. + +#### EnumWrapper.prototype.indexOfValue + +Returns the ordered index of a value of the enum. +This can be useful for implementing comparators based on the iteration order +of the enum, for example. + +See [Order of Iteration](#order-of-iteration) for details about the ordering. + +```ts +EnumWrapper.prototype.indexOfValue(value: EnumType): number +``` + +- `value`: A valid value of the enum. + +### Key Validation/Typecasting + +#### EnumWrapper.prototype.isKey + +Returns `true` if the provided `key` is a valid key for the enum. + +Also acts as a type guard to tell the compiler that the provided `key` is the more specific `KeyType` type. + +```ts +EnumWrapper.prototype.isKey( + key: string | null | undefined +): key is KeyType +``` + +#### EnumWrapper.prototype.asKeyOrThrow + +If the provided `key` is a valid key for the enum, then the `key` is returned, but cast to the more specific `KeyType` type. + +If the provided `key` is NOT valid, then an `Error` is thrown. + +```ts +EnumWrapper.prototype.asKeyOrThrow( + key: string | null | undefined +): KeyType +``` + +#### EnumWrapper.prototype.asKeyOrDefault + +If the provided `key` is a valid key for the enum, then the `key` is returned, but cast to the more specific `KeyType` type. + +If the provided `key` is NOT valid, then `defaultKey` is returned. + +This method is overloaded so that its return type is as specific as possible, depending on the type of the `defaultKey` param. + +```ts +EnumWrapper.prototype.asKeyOrDefault( + key: string | null | undefined, + defaultKey?: KeyType | string +): KeyType | string | undefined +``` + +### Value Validation/Typecasting + +#### EnumWrapper.prototype.isValue + +Returns `true` if the provided `value` is a valid value for the enum. + +Also acts as a type guard to tell the compiler that the provided `value` is the more specific `EnumType` type. + +```ts +EnumWrapper.prototype.isValue( + value: ValueType | null | undefined +): key is EnumType +``` + +#### EnumWrapper.prototype.asValueOrThrow + +If the provided `value` is a valid value for the enum, then the `value` is returned, but cast to the more specific `EnumType` type. + +If the provided `value` is NOT valid, then an `Error` is thrown. + +```ts +EnumWrapper.prototype.asValueOrThrow( + value: ValueType | null | undefined +): EnumType +``` + +#### EnumWrapper.prototype.asValueOrDefault + +If the provided `value` is a valid value for the enum, then the `value` is returned, but cast to the more specific `EnumType` type. + +If the provided `value` is NOT valid, then `defaultValue` is returned. + +This method is overloaded so that its return type is as specific as possible, depending on the type of the `defaultValue` param. + +```ts +EnumWrapper.prototype.asValueOrDefault( + value: ValueType | null | undefined, + defaultValue?: EnumType | ValueType +): EnumType | ValueType | undefined +``` + +### Lookup Key by Value + +#### EnumWrapper.prototype.getKeyOrThrow + +Performs a reverse lookup to get the key that corresponds to the provided `value`. + +If the enum has duplicate values matching the provided `value`, then the key for the last duplicate entry (in order specified by the [Order of Iteration](#order-of-iteration) section) is returned. + +If the provided `value` is NOT valid, then an `Error` is thrown. + +```ts +EnumWrapper.prototype.getKeyOrThrow( + value: ValueType | null | undefined +): KeyType +``` + +#### EnumWrapper.prototype.getKeyOrDefault + +Performs a reverse lookup to get the key that corresponds to the provided `value`. + +If the enum has duplicate values matching the provided `value`, then the key for the last duplicate entry (in order specified by the [Order of Iteration](#order-of-iteration) section) is returned. + +If the provided `value` is NOT valid, then `defaultKey` is returned. + +This method is overloaded so that its return type is as specific as possible, depending on the type of the `defaultKey` param. + +```ts +EnumWrapper.prototype.getKeyOrDefault( + value: ValueType | null | undefined, + defaultKey?: KeyType | string +): KeyType | string | undefined +``` + +### Lookup Value by Key + +#### EnumWrapper.prototype.getValueOrThrow + +Returns the value corresponding to the provided `key`. + +If the provided `key` is NOT valid, then an `Error` is thrown. + +```ts +EnumWrapper.prototype.getValueOrThrow( + key: string | null | undefined +): EnumType +``` + +#### EnumWrapper.prototype.getValueOrDefault + +Returns the value corresponding to the provided `key`. + +If the provided `key` is NOT valid, then `defaultValue` is returned. + +This method is overloaded so that its return type is as specific as possible, depending on the type of the `defaultValue` param. + +```ts +EnumWrapper.prototype.getValueOrDefault( + key: string | null | undefined, + defaultValue?: EnumType | ValueType +): EnumType | ValueType | undefined +``` + +### Create a new enum-like object with a subset of an enum's entries + +#### EnumWrapper.prototype.createEnumSubset + +Use this method to create a new well-typed [Enum-Like Object](#enum-like-object) that contains +a subset of entries from the original enum. + +```ts +EnumWrapper.prototype.createEnumSubset( + ...keys: readonly KeyType[] +): EnumLike +``` + +Example: + +```ts +enum Numbers { + One = 1, + Two = 2, + Three = 3, + Four = 4 +} + +const EvenNumbers = $enum(Numbers).createEnumSubset("Two", "Four"); +type EvenNumbers = typeof EvenNumbers[keyof typeof EvenNumbers]; +``` diff --git a/docs/migration_from_ts-string-visitor.md b/docs/migration_from_ts-string-visitor.md new file mode 100644 index 0000000..1ad8b4f --- /dev/null +++ b/docs/migration_from_ts-string-visitor.md @@ -0,0 +1,125 @@ +# Migration Guide: from `ts-string-visitor` + +The functionality of `ts-string-visitor` +([npm](https://www.npmjs.com/package/ts-string-visitor), +[github](https://github.com/UselessPickles/ts-string-visitor)) was merged into +`ts-enum-util` v4. This guide will help you convert existing `ts-string-visitor`-based +code to use equivalent functionality in `ts-enum-util`. + +# Contents + + + +- [By Example](#by-example) + - [String Visitor](#string-visitor) + - [String Mapper](#string-mapper) +- [Notes About Differences](#notes-about-differences) + - [Numeric Values Now Supported!](#numeric-values-now-supported) + - [Simplified imports](#simplified-imports) + - [Special keys for handling `null`/`undefined`/unexpected values](#special-keys-for-handling-nullundefinedunexpected-values) + + + +## By Example + +Here's a couple simple code examples of `ts-string-visitor` code and equivalent +code using `ts-enum-util` to demonstrate the differences. + +All examples assume a variable named `value` of type `RGB | null |undefined` +exists, where `RGB` is defined as: + +```ts +enum RGB { + R = "r", + G = "g", + B = "b" +} +``` + +### String Visitor + +Using `ts-string-visitor`: + +```ts +import { visitString } from "ts-string-visitor"; + +visitString(value).with({ + [RGB.R]: () => {}, + // explicitly unhandled entry + [RGB.G]: visitString.unhandled, + [RGB.B]: () => {}, + handleNull: () => {}, + handleUndefined: () => {}, + handleUnexpected: () => {} +}); +``` + +Using `ts-enum-util`: + +```ts +import { $enum } from "ts-enum-util"; + +$enum.visitValue(value).with({ + [RGB.R]: () => {}, + // explicitly unhandled entry + [RGB.G]: $enum.unhandledEntry, + [RGB.B]: () => {}, + [$enum.handleNull]: () => {}, + [$enum.handleUndefined]: () => {}, + [$enum.handleUnexpected]: () => {} +}); +``` + +### String Mapper + +Using `ts-string-visitor`: + +```ts +import { mapString } from "ts-string-visitor"; + +const result = mapString(value).with({ + [RGB.R]: 1, + // explicitly unhandled entry + [RGB.G]: mapString.unhandled, + [RGB.B]: 2, + handleNull: 3, + handleUndefined: 4, + handleUnexpected: 5 +}); +``` + +Using `ts-enum-util`: + +```ts +import { $enum } from "ts-enum-util"; + +const result = $enum.mapValue(value).with({ + [RGB.R]: 1, + // explicitly unhandled entry + [RGB.G]: $enum.unhandledEntry, + [RGB.B]: 2, + [$enum.handleNull]: 3, + [$enum.handleUndefined]: 4, + [$enum.handleUnexpected]: 5 +}); +``` + +## Notes About Differences + +### Numeric Values Now Supported! + +`ts-string-visitor` only supported visiting/mapping string literal/enum types. Thanks to advancements in key types in TypeScript 2.9, `ts-enum-util`'s Value Visitor/Mapper functionality now supports numeric literal/enum types too! + +### Simplified imports + +Everything now is now conveniently accessible as a property of `$enum`, so there's +less for you to remember. Just start typing `$enum.` and your IDE should be able +to help you with adding the `import` statement and suggesting available +methods/properties of `$enum`. + +### Special keys for handling `null`/`undefined`/unexpected values + +The special keys for handling `null`, `undefined`, and unexpected values +used to be simple string keys. Now they are `unique symbol` keys, which guarantee +zero chance of collision between the special handler keys and legitimate string +literal or string enum values to be visited/mapped, in case you really are processing a value that could literally be `"handleNull"`, etc. diff --git a/package-lock.json b/package-lock.json index 6362d0e..fb4af91 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,2259 +1,10664 @@ { "name": "ts-enum-util", - "version": "2.0.3", - "lockfileVersion": 1, + "version": "4.1.0", + "lockfileVersion": 2, "requires": true, - "dependencies": { - "@babel/code-frame": { - "version": "7.0.0-beta.49", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.49.tgz", - "integrity": "sha1-vs2AVIJzREDJ0TfkbXc0DmTX9Rs=", + "packages": { + "": { + "version": "4.1.0", + "license": "MIT", + "devDependencies": { + "@types/jest": "26.0.18", + "coveralls": "3.1.0", + "dtslint": "4.0.7", + "jest": "26.6.3", + "npm-run-all": "4.1.5", + "prettier": "1.19.1", + "rimraf": "3.0.2", + "ts-jest": "26.4.4", + "tslint": "5.20.1", + "tslint-config-prettier": "1.18.0", + "typescript": "4.1.2" + } + }, + "node_modules/@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==", "dev": true, - "requires": { - "@babel/highlight": "7.0.0-beta.49" + "dependencies": { + "@babel/highlight": "^7.10.4" } }, - "@babel/highlight": { - "version": "7.0.0-beta.49", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.49.tgz", - "integrity": "sha1-lr3GtD4TSCASumaRsQGEktOWIsw=", + "node_modules/@babel/core": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.10.tgz", + "integrity": "sha512-eTAlQKq65zHfkHZV0sIVODCPGVgoo1HdBlbSLi9CqOzuZanMv2ihzY+4paiKr1mH+XmYESMAmJ/dpZ68eN6d8w==", "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^3.0.0" + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.10", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.5", + "@babel/parser": "^7.12.10", + "@babel/template": "^7.12.7", + "@babel/traverse": "^7.12.10", + "@babel/types": "^7.12.10", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "@types/jest": { - "version": "22.2.3", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-22.2.3.tgz", - "integrity": "sha512-e74sM9W/4qqWB6D4TWV9FQk0WoHtX1X4FJpbjxucMSVJHtFjbQOH3H6yp+xno4br0AKG0wz/kPtaN599GUOvAg==", - "dev": true - }, - "@types/node": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.3.0.tgz", - "integrity": "sha512-hWzNviaVFIr1TqcRA8ou49JaSHp+Rfabmnqg2kNvusKqLhPU0rIsGPUj5WJJ7ld4Bb7qdgLmIhLfCD1qS08IVA==", - "dev": true - }, - "@types/parsimmon": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@types/parsimmon/-/parsimmon-1.6.2.tgz", - "integrity": "sha512-QdjZG37I1uhpqfLuBbAm7KVW4egx+qQAkeCsIXEqbdEiCDlWjYhWbPqLpg7RCg8DuUgLSKaPFE6jNe6wi5YUlw==", - "dev": true - }, - "abab": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", - "integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4=", - "dev": true - }, - "acorn": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.6.0.tgz", - "integrity": "sha512-QatFQ4C0n+PLqemyC6zXEv04tSqRR0hRqe+uGKPEVgKe2G8kl8wJvHzRYWwz6vqqEqt6idPVMFojZ4P1zlyAzQ==", - "dev": true + "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" + } }, - "acorn-globals": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.1.0.tgz", - "integrity": "sha512-KjZwU26uG3u6eZcfGbTULzFcsoz6pegNKtHPksZPOUsiKo5bUmiBPa38FuHZ/Eun+XYh/JCCkS9AS3Lu4McQOQ==", + "node_modules/@babel/generator": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.10.tgz", + "integrity": "sha512-6mCdfhWgmqLdtTkhXjnIz0LcdVCd26wS2JXRtj2XY0u5klDsXBREA/pG5NVOuVnF2LUrBGNFtQkIqqTbblg0ww==", "dev": true, - "requires": { - "acorn": "^5.0.0" + "dependencies": { + "@babel/types": "^7.12.10", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" } }, - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "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, - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" + "engines": { + "node": ">=0.10.0" } }, - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "node_modules/@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==", "dev": true, - "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" + "dependencies": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" } }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true + "node_modules/@babel/helper-get-function-arity": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", + "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.10" + } }, - "ansi-escapes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", - "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", - "dev": true + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz", + "integrity": "sha512-DCsuPyeWxeHgh1Dus7APn7iza42i/qXqiFPWyBDdOFtvS581JQePsc1F/nD+fHrcswhLlRc2UpYS1NwERxZhHw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.7" + } }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true + "node_modules/@babel/helper-module-imports": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz", + "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.5" + } }, - "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "node_modules/@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==", "dev": true, - "requires": { - "color-convert": "^1.9.0" + "dependencies": { + "@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" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.10.tgz", + "integrity": "sha512-4tpbU0SrSTjjt65UMWSrUOPZTsgvPgGG4S8QSTNHacKzpS51IVWGDj0yCwyeZND/i+LSN2g/O63jEXEWm49sYQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.10" } }, - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", + "node_modules/@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", "dev": true }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "node_modules/@babel/helper-replace-supers": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz", + "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==", "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, "dependencies": { - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - } + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.5" } }, - "append-transform": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", - "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", + "node_modules/@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==", "dev": true, - "requires": { - "default-require-extensions": "^1.0.0" + "dependencies": { + "@babel/types": "^7.12.1" } }, - "argparse": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", - "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "node_modules/@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==", "dev": true, - "requires": { - "sprintf-js": "~1.0.2" + "dependencies": { + "@babel/types": "^7.11.0" } }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "node_modules/@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==", "dev": true }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true + "node_modules/@babel/helpers": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.5.tgz", + "integrity": "sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA==", + "dev": true, + "dependencies": { + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.5" + } }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true + "node_modules/@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==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } }, - "array-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", - "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", + "node_modules/@babel/highlight/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 }, - "array-filter": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", - "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=", - "dev": true + "node_modules/@babel/parser": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.10.tgz", + "integrity": "sha512-PJdRPwyoOqFAWfLytxrWwGrAxghCgh/yTNCYciOz8QgjflA7aZhECPZAa2VUedKg2+QMWkI0L9lynh2SNmNEgA==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } }, - "array-map": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", - "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=", - "dev": true + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + } }, - "array-reduce": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", - "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=", - "dev": true + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + } }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz", + "integrity": "sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + } }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + } }, - "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", - "dev": true + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + } }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + } }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + } }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + } }, - "async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", - "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, - "requires": { - "lodash": "^4.17.10" + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" } }, - "async-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", - "dev": true + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + } }, - "async-limiter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", - "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", - "dev": true + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + } }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz", + "integrity": "sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + } }, - "atob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz", - "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=", - "dev": true + "node_modules/@babel/template": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", + "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.12.7", + "@babel/types": "^7.12.7" + } }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true + "node_modules/@babel/traverse": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.10.tgz", + "integrity": "sha512-6aEtf0IeRgbYWzta29lePeYSk+YAFIC3kyqESeft8o5CkFlYIMX+EQDDWEiAQ9LHOA3d0oHdgrSsID/CKqXJlg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.10", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.12.10", + "@babel/types": "^7.12.10", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "node_modules/@babel/types": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.10.tgz", + "integrity": "sha512-sf6wboJV5mGyip2hIpDSKsr80RszPinEFjsHTalMxZAZkoQ2/2yQzxlcFN52SJqsyPfLtPmenL4g2KB3KJXPDw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } }, - "aws4": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", - "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==", + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "node_modules/@cnakazawa/watch": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", + "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", "dev": true, - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" + "dependencies": { + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" + }, + "bin": { + "watch": "cli.js" }, + "engines": { + "node": ">=0.1.95" + } + }, + "node_modules/@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==", + "dev": true, "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } + "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" + }, + "engines": { + "node": ">=8" } }, - "babel-core": { - "version": "6.26.3", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", - "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "babel-generator": "^6.26.0", - "babel-helpers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "convert-source-map": "^1.5.1", - "debug": "^2.6.9", - "json5": "^0.5.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.4", - "path-is-absolute": "^1.0.1", - "private": "^0.1.8", - "slash": "^1.0.0", - "source-map": "^0.5.7" + "node_modules/@istanbuljs/schema": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", + "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", + "dev": true, + "engines": { + "node": ">=8" } }, - "babel-generator": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", - "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "node_modules/@jest/console": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", + "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", "dev": true, - "requires": { - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "detect-indent": "^4.0.0", - "jsesc": "^1.3.0", - "lodash": "^4.17.4", - "source-map": "^0.5.7", - "trim-right": "^1.0.1" + "dependencies": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^26.6.2", + "jest-util": "^26.6.2", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" } }, - "babel-helpers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "node_modules/@jest/console/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" } }, - "babel-jest": { - "version": "23.0.1", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-23.0.1.tgz", - "integrity": "sha1-u6079SP7IC2gXtCmVAtIyE7tE6Y=", + "node_modules/@jest/console/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, - "requires": { - "babel-plugin-istanbul": "^4.1.6", - "babel-preset-jest": "^23.0.1" + "engines": { + "node": ">=8" } }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "node_modules/@jest/console/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, - "requires": { - "babel-runtime": "^6.22.0" + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "babel-plugin-istanbul": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz", - "integrity": "sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ==", + "node_modules/@jest/core": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", + "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", "dev": true, - "requires": { - "babel-plugin-syntax-object-rest-spread": "^6.13.0", - "find-up": "^2.1.0", - "istanbul-lib-instrument": "^1.10.1", - "test-exclude": "^4.2.1" + "dependencies": { + "@jest/console": "^26.6.2", + "@jest/reporters": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-changed-files": "^26.6.2", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-resolve-dependencies": "^26.6.3", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "jest-watcher": "^26.6.2", + "micromatch": "^4.0.2", + "p-each-series": "^2.1.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">= 10.14.2" } }, - "babel-plugin-jest-hoist": { - "version": "23.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.0.1.tgz", - "integrity": "sha1-6qEclkVjrqnCG+zvK994U/fzwUg=", - "dev": true + "node_modules/@jest/core/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } }, - "babel-plugin-syntax-object-rest-spread": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", - "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", - "dev": true + "node_modules/@jest/core/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" + } }, - "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.26.2", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", - "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", + "node_modules/@jest/core/node_modules/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": { - "babel-plugin-transform-strict-mode": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-types": "^6.26.0" + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" } }, - "babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "node_modules/@jest/core/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, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "babel-preset-jest": { - "version": "23.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-23.0.1.tgz", - "integrity": "sha1-YxzFRcbPAhlDATvK8i9F2H/mIZg=", + "node_modules/@jest/environment": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", + "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", "dev": true, - "requires": { - "babel-plugin-jest-hoist": "^23.0.1", - "babel-plugin-syntax-object-rest-spread": "^6.13.0" + "dependencies": { + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" } }, - "babel-register": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", - "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "node_modules/@jest/fake-timers": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", + "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", "dev": true, - "requires": { - "babel-core": "^6.26.0", - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "home-or-tmp": "^2.0.0", - "lodash": "^4.17.4", - "mkdirp": "^0.5.1", - "source-map-support": "^0.4.15" + "dependencies": { + "@jest/types": "^26.6.2", + "@sinonjs/fake-timers": "^6.0.1", + "@types/node": "*", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" } }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "node_modules/@jest/globals": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", + "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" + "dependencies": { + "@jest/environment": "^26.6.2", + "@jest/types": "^26.6.2", + "expect": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" } }, - "babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "node_modules/@jest/reporters": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", + "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "lodash": "^4.17.4" + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.4", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.3", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "node-notifier": "^8.0.0", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^7.0.0" + }, + "engines": { + "node": ">= 10.14.2" } }, - "babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "node_modules/@jest/reporters/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "debug": "^2.6.8", - "globals": "^9.18.0", - "invariant": "^2.2.2", - "lodash": "^4.17.4" + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" } }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "node_modules/@jest/reporters/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, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" + "engines": { + "node": ">=8" } }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true + "node_modules/@jest/reporters/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" + } }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "node_modules/@jest/source-map": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", + "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.4", + "source-map": "^0.6.0" + }, + "engines": { + "node": ">= 10.14.2" + } }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "node_modules/@jest/test-result": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", + "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" + "dependencies": { + "@jest/console": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", + "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", + "dev": true, "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } + "@jest/test-result": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3" + }, + "engines": { + "node": ">= 10.14.2" } }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "node_modules/@jest/transform": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", + "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", "dev": true, - "optional": true, - "requires": { - "tweetnacl": "^0.14.3" + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/types": "^26.6.2", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-util": "^26.6.2", + "micromatch": "^4.0.2", + "pirates": "^4.0.1", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" } }, - "binary-extensions": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", - "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", - "dev": true + "node_modules/@jest/transform/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/@jest/transform/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, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "engines": { + "node": ">=8" } }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "node_modules/@jest/transform/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, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "browser-process-hrtime": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz", - "integrity": "sha1-Ql1opY00R/AqBKqJQYf86K+Le44=", - "dev": true + "node_modules/@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } }, - "browser-resolve": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz", - "integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=", + "node_modules/@jest/types/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, - "requires": { - "resolve": "1.1.7" + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" } }, - "bser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz", - "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=", + "node_modules/@jest/types/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, - "requires": { - "node-int64": "^0.4.0" + "engines": { + "node": ">=8" } }, - "buffer-from": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", - "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==", - "dev": true + "node_modules/@jest/types/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" + } }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true + "node_modules/@sinonjs/commons": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.1.tgz", + "integrity": "sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "node_modules/@sinonjs/fake-timers": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", + "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" + "dependencies": { + "@sinonjs/commons": "^1.7.0" } }, - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "dev": true - }, - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true, - "optional": true - }, - "capture-exit": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-1.2.0.tgz", - "integrity": "sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28=", - "dev": true, - "requires": { - "rsvp": "^3.3.3" - } - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "node_modules/@types/babel__core": { + "version": "7.1.12", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.12.tgz", + "integrity": "sha512-wMTHiiTiBAAPebqaPiPDLFA4LYPKr6Ph0Xq/6rq1Ur3v66HXyG+clfR9CNETkD7MQS8ZHvpQOtA53DLws5WAEQ==", "dev": true, - "optional": true, - "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" } }, - "chalk": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz", - "integrity": "sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g==", + "node_modules/@types/babel__generator": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", + "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.2.0" + "dependencies": { + "@babel/types": "^7.0.0" } }, - "chokidar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "node_modules/@types/babel__template": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz", + "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==", "dev": true, - "requires": { - "anymatch": "^1.3.0", - "async-each": "^1.0.0", - "fsevents": "^1.0.0", - "glob-parent": "^2.0.0", - "inherits": "^2.0.1", - "is-binary-path": "^1.0.0", - "is-glob": "^2.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0" - }, "dependencies": { - "anymatch": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", - "dev": true, - "requires": { - "micromatch": "^2.1.5", - "normalize-path": "^2.0.0" - } - } + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" } }, - "ci-info": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.3.tgz", - "integrity": "sha512-SK/846h/Rcy8q9Z9CAwGBLfCJ6EkjJWdpelWDufQpqVDYq2Wnnv8zlSO6AMQap02jvhVruKKpEtQOufo3pFhLg==", - "dev": true - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "node_modules/@types/babel__traverse": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.11.0.tgz", + "integrity": "sha512-kSjgDMZONiIfSH1Nxcr5JIRMwUetDki63FSQfpTCz8ogF3Ulqm8+mr5f78dUYs6vMiB6gBusQqfQmBvHZj/lwg==", "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } + "@babel/types": "^7.3.0" } }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "node_modules/@types/graceful-fs": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.4.tgz", + "integrity": "sha512-mWA/4zFQhfvOA8zWkXobwJvBD7vzcxgrOQ0J5CH1votGqdq9m7+FwtGaqyCZqC3NyyBkc9z4m+iry4LlqcMWJg==", "dev": true, - "optional": true, - "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - }, "dependencies": { - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true, - "optional": true - } + "@types/node": "*" } }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", "dev": true }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" + "dependencies": { + "@types/istanbul-lib-coverage": "*" } }, - "color-convert": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", - "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "node_modules/@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", "dev": true, - "requires": { - "color-name": "^1.1.1" + "dependencies": { + "@types/istanbul-lib-report": "*" } }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "combined-stream": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "node_modules/@types/jest": { + "version": "26.0.18", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.18.tgz", + "integrity": "sha512-scDPs+mELZgsFetTgBSsIxKGrlitn9t/d2ecP+S1QSIGD+31fkMBEftLfOAX5k3tU06/0PjreJIQ+gWEbbHqpw==", "dev": true, - "requires": { - "delayed-stream": "~1.0.0" + "dependencies": { + "jest-diff": "^26.0.0", + "pretty-format": "^26.0.0" } }, - "commander": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "node_modules/@types/node": { + "version": "14.14.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.11.tgz", + "integrity": "sha512-BJ97wAUuU3NUiUCp44xzUFquQEvnk1wu7q4CMEUYKJWjdkr0YWYDsm4RFtAvxYsNjLsKcrFt6RvK8r+mnzMbEQ==", "dev": true }, - "compare-versions": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.2.1.tgz", - "integrity": "sha512-2y2nHcopMG/NAyk6vWXlLs86XeM9sik4jmx1tKIgzMi9/RQ2eo758RGpxQO3ErihHmg0RlQITPqgz73y6s7quA==", + "node_modules/@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", "dev": true }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "node_modules/@types/parsimmon": { + "version": "1.10.6", + "resolved": "https://registry.npmjs.org/@types/parsimmon/-/parsimmon-1.10.6.tgz", + "integrity": "sha512-FwAQwMRbkhx0J6YELkwIpciVzCcgEqXEbIrIn3a2P5d3kGEHQ3wVhlN3YdVepYP+bZzCYO6OjmD4o9TGOZ40rA==", "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=", + "node_modules/@types/prettier": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.1.5.tgz", + "integrity": "sha512-UEyp8LwZ4Dg30kVU2Q3amHHyTn1jEdhCIE59ANed76GaT1Vp76DD3ZWSAxgCrw6wJ0TqeoBpqmfUHiUDPs//HQ==", "dev": true }, - "convert-source-map": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", - "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", + "node_modules/@types/stack-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", + "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", "dev": true }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true + "node_modules/@types/yargs": { + "version": "15.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.11.tgz", + "integrity": "sha512-jfcNBxHFYJ4nPIacsi3woz1+kvUO6s1CyeEhtnDHBjHUMNj5UlW2GynmnSgiJJEdNg9yW5C8lfoNRZrHGv5EqA==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } }, - "core-js": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", - "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==", + "node_modules/@types/yargs-parser": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", + "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==", "dev": true }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "node_modules/abab": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", "dev": true }, - "coveralls": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.0.1.tgz", - "integrity": "sha512-FAzXwiDOYLGDWH+zgoIA+8GbWv50hlx+kpEJyvzLKOdnIBv9uWoVl4DhqGgyUHpiRjAlF8KYZSipWXYtllWH6Q==", + "node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true, - "requires": { - "js-yaml": "^3.6.1", - "lcov-parse": "^0.0.10", - "log-driver": "^1.2.5", - "minimist": "^1.2.0", - "request": "^2.79.0" + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" } }, - "cpx": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/cpx/-/cpx-1.5.0.tgz", - "integrity": "sha1-GFvgGFEdhycN7czCkxceN2VauI8=", + "node_modules/acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", "dev": true, - "requires": { - "babel-runtime": "^6.9.2", - "chokidar": "^1.6.0", - "duplexer": "^0.1.1", - "glob": "^7.0.5", - "glob2base": "^0.0.12", - "minimatch": "^3.0.2", - "mkdirp": "^0.5.1", - "resolve": "^1.1.7", - "safe-buffer": "^5.0.1", - "shell-quote": "^1.6.1", - "subarg": "^1.0.0" + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" } }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "engines": { + "node": ">=0.4.0" } }, - "cssom": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.2.tgz", - "integrity": "sha1-uANhcMefB6kP8vFuIihAJ6JDhIs=", - "dev": true - }, - "cssstyle": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.3.1.tgz", - "integrity": "sha512-tNvaxM5blOnxanyxI6panOsnfiyLRj3HV4qjqqS45WPNS1usdYWRUQjqTEEELK73lpeP/1KoIGYUwrBn/VcECA==", + "node_modules/ajv": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", "dev": true, - "requires": { - "cssom": "0.3.x" + "dependencies": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "node_modules/ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", "dev": true, - "requires": { - "assert-plus": "^1.0.0" + "dependencies": { + "type-fest": "^0.11.0" + }, + "engines": { + "node": ">=8" } }, - "data-urls": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.0.0.tgz", - "integrity": "sha512-ai40PPQR0Fn1lD2PPie79CibnlMN2AYiDhwFX/rZHVsxbs5kNJSjegqXIprhouGXlRdEnfybva7kqRGnB6mypA==", + "node_modules/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, - "requires": { - "abab": "^1.0.4", - "whatwg-mimetype": "^2.0.0", - "whatwg-url": "^6.4.0" + "engines": { + "node": ">=8" } }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "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, - "requires": { - "ms": "2.0.0" + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" } }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true + "node_modules/ansi-styles/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" + } }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "node_modules/ansi-styles/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 }, - "default-require-extensions": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", - "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", + "node_modules/anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", "dev": true, - "requires": { - "strip-bom": "^2.0.0" + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" } }, - "define-properties": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", - "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", + "node_modules/aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true, - "requires": { - "foreach": "^2.0.5", - "object-keys": "^1.0.8" - } + "optional": true }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "node_modules/are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, + "optional": true, "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" } }, - "definitelytyped-header-parser": { - "version": "github:Microsoft/definitelytyped-header-parser#f152526f82f51d2baf91a99a397b449342b52db1", - "from": "github:Microsoft/definitelytyped-header-parser#production", + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, - "requires": { - "@types/parsimmon": "^1.3.0", - "parsimmon": "^1.2.0" + "dependencies": { + "sprintf-js": "~1.0.2" } }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "detect-indent": { + "node_modules/arr-diff": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", "dev": true, - "requires": { - "repeating": "^2.0.0" + "engines": { + "node": ">=0.10.0" } }, - "detect-newline": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", - "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", - "dev": true - }, - "diff": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.4.0.tgz", - "integrity": "sha512-QpVuMTEoJMF7cKzi6bvWhRulU1fZqZnvyVQgNhPaxxuTYwyjn/j1v9falseQ/uXWwPnO56RBfwtg4h/EQXmucA==", - "dev": true - }, - "domexception": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", - "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", "dev": true, - "requires": { - "webidl-conversions": "^4.0.2" + "engines": { + "node": ">=0.10.0" } }, - "dtslint": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/dtslint/-/dtslint-0.3.0.tgz", - "integrity": "sha512-3oWL8MD+2nKaxmNzrt8EAissP63hNSJ4OLr/itvNnPdAAl+7vxnjQ8p2Zdk0MNgdenqwk7GcaUDz7fQHaPgCyA==", + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", "dev": true, - "requires": { - "definitelytyped-header-parser": "github:Microsoft/definitelytyped-header-parser#f152526f82f51d2baf91a99a397b449342b52db1", - "fs-promise": "^2.0.0", - "strip-json-comments": "^2.0.1", - "tslint": "^5.9.1", - "typescript": "next" - }, - "dependencies": { - "typescript": { - "version": "3.0.0-dev.20180531", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.0.0-dev.20180531.tgz", - "integrity": "sha512-KOb6ecZRRWEGRQldW5z99TbIqxVujDxwHTWqzssrGPJLh0rNvORPaGVyLxlijZXbWfADYyurns0Ezmoe1ge5hg==", - "dev": true - } + "engines": { + "node": ">=0.10.0" } }, - "duplexer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "node_modules/array-filter": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", + "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=", "dev": true }, - "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "node_modules/array-map": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", + "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=", + "dev": true + }, + "node_modules/array-reduce": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", + "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=", + "dev": true + }, + "node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true, - "optional": true, - "requires": { - "jsbn": "~0.1.0" + "engines": { + "node": ">=0.10.0" } }, - "error-ex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "node_modules/asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", "dev": true, - "requires": { - "is-arrayish": "^0.2.1" + "dependencies": { + "safer-buffer": "~2.1.0" } }, - "es-abstract": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", - "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true, - "requires": { - "es-to-primitive": "^1.1.1", - "function-bind": "^1.1.1", - "has": "^1.0.1", - "is-callable": "^1.1.3", - "is-regex": "^1.0.4" + "engines": { + "node": ">=0.8" } }, - "es-to-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", - "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", "dev": true, - "requires": { - "is-callable": "^1.1.1", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.1" + "engines": { + "node": ">=0.10.0" } }, - "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=", + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, - "escodegen": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz", - "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==", + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", "dev": true, - "requires": { - "esprima": "^3.1.3", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" + "bin": { + "atob": "bin/atob.js" }, - "dependencies": { - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", - "dev": true - }, - "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, - "optional": true - } + "engines": { + "node": ">= 4.5.0" } }, - "esprima": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", - "dev": true + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true, + "engines": { + "node": "*" + } }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "node_modules/aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", "dev": true }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true + "node_modules/babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + } }, - "event-stream": { - "version": "3.3.4", - "resolved": "http://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", - "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", + "node_modules/babel-code-frame/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true, - "requires": { - "duplexer": "~0.1.1", - "from": "~0", - "map-stream": "~0.1.0", - "pause-stream": "0.0.11", - "split": "0.3", - "stream-combiner": "~0.0.4", - "through": "~2.3.1" + "engines": { + "node": ">=0.10.0" } }, - "exec-sh": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.1.tgz", - "integrity": "sha512-aLt95pexaugVtQerpmE51+4QfWrNc304uez7jvj6fWnN8GeEHpttB8F36n8N7uVhUMbH/1enbxQ9HImZ4w/9qg==", + "node_modules/babel-code-frame/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", "dev": true, - "requires": { - "merge": "^1.1.3" + "engines": { + "node": ">=0.10.0" } }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "node_modules/babel-code-frame/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true + "node_modules/babel-code-frame/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "node_modules/babel-jest": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", + "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==", "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "dependencies": { + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/babel__core": "^7.1.7", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "slash": "^3.0.0" }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/babel-jest/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" } }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "node_modules/babel-jest/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, - "requires": { - "fill-range": "^2.1.0" + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-jest/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/babel-plugin-istanbul": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", + "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", + "dev": true, "dependencies": { - "fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", - "dev": true, - "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" - } - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^4.0.0", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" } }, - "expect": { - "version": "23.1.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-23.1.0.tgz", - "integrity": "sha1-v9/VeiogFw2HWZnul4fMcfAcIF8=", + "node_modules/babel-plugin-jest-hoist": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", + "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==", "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "jest-diff": "^23.0.1", - "jest-get-type": "^22.1.0", - "jest-matcher-utils": "^23.0.1", - "jest-message-util": "^23.1.0", - "jest-regex-util": "^23.0.0" + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": ">= 10.14.2" } }, - "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.0.tgz", + "integrity": "sha512-mGkvkpocWJes1CmMKtgGUwCeeq0pOhALyymozzDWYomHTbDLwueDYG6p4TK1YOeYHCzBzYPsWkgTto10JubI1Q==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + } + }, + "node_modules/babel-preset-jest": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz", + "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^26.6.2", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "dependencies": { + "is-descriptor": "^1.0.0" }, + "engines": { + "node": ">=0.10.0" + } + }, + "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 + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } + "tweetnacl": "^0.14.3" } }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true + "node_modules/bl": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.3.tgz", + "integrity": "sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "dev": true + "node_modules/bl/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" + } }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true + "node_modules/block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "dev": true, + "dependencies": { + "inherits": "~2.0.0" + }, + "engines": { + "node": "0.4 || >=0.5.8" + } }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true + "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" + } }, - "fb-watchman": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", - "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", + "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, - "requires": { - "bser": "^2.0.0" + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" } }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", "dev": true }, - "fileset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", - "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", "dev": true, - "requires": { - "glob": "^7.0.3", - "minimatch": "^3.0.3" + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" } }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "node-int64": "^0.4.0" } }, - "find-index": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", - "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=", - "dev": true - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "dev": true, - "requires": { - "locate-path": "^2.0.0" + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "node_modules/buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "node_modules/builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", "dev": true, - "requires": { - "for-in": "^1.0.1" + "engines": { + "node": ">=0.10.0" } }, - "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "node_modules/builtins": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", + "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", "dev": true }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true + "node_modules/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } }, - "form-data": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", - "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "1.0.6", - "mime-types": "^2.1.12" + "engines": { + "node": ">=6" } }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, - "requires": { - "map-cache": "^0.2.2" + "engines": { + "node": ">=6" } }, - "from": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", + "node_modules/capture-exit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "dev": true, + "dependencies": { + "rsvp": "^4.8.4" + }, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", "dev": true }, - "fs-extra": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.0.tgz", - "integrity": "sha512-lk2cUCo8QzbiEWEbt7Cw3m27WMiRG321xsssbcIpfMhpRjrlC08WBOVQqj1/nQYYNnPtyIhP1oqLO3QwT2tPCw==", + "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, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "fs-promise": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/fs-promise/-/fs-promise-2.0.3.tgz", - "integrity": "sha1-9k5PhUvPaJqovdy6JokW2z20aFQ=", + "node_modules/chalk/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, - "requires": { - "any-promise": "^1.3.0", - "fs-extra": "^2.0.0", - "mz": "^2.6.0", - "thenify-all": "^1.6.0" + "dependencies": { + "color-convert": "^1.9.0" }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/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": { - "fs-extra": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-2.1.2.tgz", - "integrity": "sha1-BGxwFjzvmq1GsOSn+kZ/si1x3jU=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0" - } - }, - "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - } + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/charm": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/charm/-/charm-1.0.2.tgz", + "integrity": "sha1-it02cVOm2aWBMxBSxAkJkdqZXjU=", + "dev": true, + "dependencies": { + "inherits": "^2.0.1" + } + }, + "node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true }, - "fsevents": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", - "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", + "node_modules/cjs-module-lexer": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", + "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==", + "dev": true + }, + "node_modules/class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "dev": true, - "optional": true, - "requires": { - "nan": "^2.9.2", - "node-pre-gyp": "^0.10.0" + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/cliui/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/cliui/node_modules/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, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/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, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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/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/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/command-exists": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.8.tgz", + "integrity": "sha512-PM54PkseWbiiD/mMsbvW351/u+dafwTJ0ye2qB60G1aGQP9j3xK2gmMDc+R34L3nDtx4qMCitXT75mkbkGJDLw==", + "dev": true + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "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/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true, + "optional": true + }, + "node_modules/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==", + "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/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "node_modules/coveralls": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.1.0.tgz", + "integrity": "sha512-sHxOu2ELzW8/NC1UP5XVLbZDzO4S3VxfFye3XYCznopHy02YjNkHcj5bKaVw2O7hVaBdBjEdQGpie4II1mWhuQ==", + "dev": true, + "dependencies": { + "js-yaml": "^3.13.1", + "lcov-parse": "^1.0.0", + "log-driver": "^1.2.7", + "minimist": "^1.2.5", + "request": "^2.88.2" + }, + "bin": { + "coveralls": "bin/coveralls.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "dependencies": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decimal.js": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", + "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==", + "dev": true + }, + "node_modules/decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "node_modules/deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true, + "optional": true + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", + "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", + "dev": true, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dev": true, + "dependencies": { + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/domexception/node_modules/webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/dtslint": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/dtslint/-/dtslint-4.0.7.tgz", + "integrity": "sha512-gwpBnxky+vUfCL74U5ao+wQf4sw9jD+cZ9ukiTFrkwkhNibqfyOZyg4cnFf1lB0Hm5ZFSQdi09DdjarDQLgofA==", + "dev": true, + "dependencies": { + "@definitelytyped/header-parser": "latest", + "@definitelytyped/typescript-versions": "latest", + "@definitelytyped/utils": "latest", + "dts-critic": "latest", + "fs-extra": "^6.0.1", + "json-stable-stringify": "^1.0.1", + "strip-json-comments": "^2.0.1", + "tslint": "5.14.0", + "tsutils": "^2.29.0", + "yargs": "^15.1.0" + }, + "bin": { + "dtslint": "bin/index.js" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "typescript": ">= 3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.7.0-dev || >= 3.8.0-dev || >= 3.9.0-dev || >= 4.0.0-dev" + } + }, + "node_modules/dtslint/node_modules/@definitelytyped/header-parser": { + "version": "0.0.64", + "resolved": "https://registry.npmjs.org/@definitelytyped/header-parser/-/header-parser-0.0.64.tgz", + "integrity": "sha512-vwh6ojw0PYptEiAogAdKNrwYy2Dv0zZj6M5bjKAoF7/xOmY5B/QluJnNmgF7Q+fxLG2vVxYDbkc26r04xYIZQA==", + "dev": true, + "dependencies": { + "@definitelytyped/typescript-versions": "^0.0.64", + "@types/parsimmon": "^1.10.1", + "parsimmon": "^1.13.0" + } + }, + "node_modules/dtslint/node_modules/@definitelytyped/typescript-versions": { + "version": "0.0.64", + "resolved": "https://registry.npmjs.org/@definitelytyped/typescript-versions/-/typescript-versions-0.0.64.tgz", + "integrity": "sha512-h+RvQPzvC/yVtZ/FqttXoIac/X1htXrmuNbvmQP+RiVonGunKq7S8ona5tm7ckiheur6VvtKQGe+zQIDF3sErQ==", + "dev": true + }, + "node_modules/dtslint/node_modules/@definitelytyped/utils": { + "version": "0.0.64", + "resolved": "https://registry.npmjs.org/@definitelytyped/utils/-/utils-0.0.64.tgz", + "integrity": "sha512-ahxruUzplmVwWnJavaRcj8JN4B6znkYjmSTGyWSzgc+aL596nVZGyVRDlOL5mKSnJk1MzT4Uj4Gx0bg3l6CPHw==", + "dev": true, + "dependencies": { + "@definitelytyped/typescript-versions": "^0.0.64", + "@types/node": "^12.12.29", + "charm": "^1.0.2", + "fs-extra": "^8.1.0", + "fstream": "^1.0.12", + "npm-registry-client": "^8.6.0", + "tar": "^2.2.2", + "tar-stream": "^2.1.4" + } + }, + "node_modules/dtslint/node_modules/@definitelytyped/utils/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/dtslint/node_modules/@types/node": { + "version": "12.19.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.9.tgz", + "integrity": "sha512-yj0DOaQeUrk3nJ0bd3Y5PeDRJ6W0r+kilosLA+dzF3dola/o9hxhMSg2sFvVcA2UHS5JSOsZp4S0c1OEXc4m1Q==", + "dev": true + }, + "node_modules/dtslint/node_modules/dts-critic": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/dts-critic/-/dts-critic-3.3.4.tgz", + "integrity": "sha512-OjLTrSBCFbi1tDAiOXcP7G20W3HI3eIzkpSpLwvH7oDFZYdqFCMe9lsNhMZFXqsNcSTpRg3+PBS4fF27+h1qew==", + "dev": true, + "dependencies": { + "@definitelytyped/header-parser": "^0.0.64", + "command-exists": "^1.2.8", + "rimraf": "^3.0.2", + "semver": "^6.2.0", + "tmp": "^0.2.1", + "yargs": "^15.3.1" + }, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/dtslint/node_modules/dts-critic/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/dtslint/node_modules/tslint": { + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.14.0.tgz", + "integrity": "sha512-IUla/ieHVnB8Le7LdQFRGlVJid2T/gaJe5VkjzRVSRR6pA2ODYrnfR1hmxi+5+au9l50jBwpbBL34txgv4NnTQ==", + "dev": true, + "dependencies": { + "babel-code-frame": "^6.22.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^3.2.0", + "glob": "^7.1.1", + "js-yaml": "^3.7.0", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.8.0", + "tsutils": "^2.29.0" + }, + "bin": { + "tslint": "bin/tslint" + }, + "engines": { + "node": ">=4.8.0" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/emittery": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", + "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "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/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", + "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", + "dev": true, + "dependencies": { + "es-to-primitive": "^1.2.0", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/exec-sh": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", + "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==", + "dev": true + }, + "node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/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/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/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/expect": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", + "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "ansi-styles": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "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/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true, + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "node_modules/fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "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/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, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "node_modules/fs-extra": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz", + "integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "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.2.1", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.2.1.tgz", + "integrity": "sha512-bTLYHSeC0UH/EFXS9KqWnXuOl/wHK5Z/d+ghd5AsFMYN7wIGkUCOJyzy88+wJKkZPGON8u4Z9f6U4FdgURE9qA==", + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + }, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/fstream/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "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/gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "optional": true, + "dependencies": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "node_modules/gauge/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gauge/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "optional": true, + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gauge/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "optional": true, + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gauge/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "optional": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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-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, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "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": "*" + } + }, + "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.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "node_modules/growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, + "dependencies": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "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-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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/has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true, + "optional": true + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hosted-git-info": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "dev": true + }, + "node_modules/html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^1.0.5" + }, + "engines": { + "node": ">=10" + } + }, + "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-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true, + "engines": { + "node": ">=8.12.0" + } + }, + "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 + }, + "node_modules/import-local": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "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/ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-docker": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", + "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==", + "dev": true, + "optional": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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=", + "dev": true, + "optional": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz", + "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=", + "dev": true + }, + "node_modules/is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "dependencies": { + "has": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "node_modules/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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "optionalDependencies": { + "is-docker": "^2.0.0" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "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/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "node_modules/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==", + "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-instrument/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "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/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/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/jest": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.3.tgz", + "integrity": "sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==", + "dev": true, + "dependencies": { + "@jest/core": "^26.6.3", + "import-local": "^3.0.2", + "jest-cli": "^26.6.3" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-changed-files": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", + "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "execa": "^4.0.0", + "throat": "^5.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-changed-files/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/jest-changed-files/node_modules/execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-changed-files/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-changed-files/node_modules/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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-changed-files/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-changed-files/node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-changed-files/node_modules/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==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-changed-files/node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-changed-files/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/jest-cli": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", + "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", + "dev": true, + "dependencies": { + "@jest/core": "^26.6.3", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "import-local": "^3.0.2", + "is-ci": "^2.0.0", + "jest-config": "^26.6.3", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "prompts": "^2.0.1", + "yargs": "^15.4.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-cli/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-cli/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/jest-cli/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/jest-config": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", + "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^26.6.3", + "@jest/types": "^26.6.2", + "babel-jest": "^26.6.3", + "chalk": "^4.0.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.4", + "jest-environment-jsdom": "^26.6.2", + "jest-environment-node": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-jasmine2": "^26.6.3", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-config/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-config/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/jest-config/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/jest-diff": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", + "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-diff/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-diff/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/jest-diff/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/jest-docblock": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", + "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-each": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz", + "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-each/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-each/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/jest-each/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/jest-environment-jsdom": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz", + "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==", + "dev": true, + "dependencies": { + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2", + "jsdom": "^16.4.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-environment-node": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz", + "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==", + "dev": true, + "dependencies": { + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "dev": true, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-haste-map": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", + "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.1.2", + "graceful-fs": "^4.2.4", + "jest-regex-util": "^26.0.0", + "jest-serializer": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "micromatch": "^4.0.2", + "sane": "^4.0.3", + "walker": "^1.0.7" + }, + "engines": { + "node": ">= 10.14.2" + }, + "optionalDependencies": { + "fsevents": "^2.1.2" + } + }, + "node_modules/jest-jasmine2": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", + "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^26.6.2", + "is-generator-fn": "^2.0.0", + "jest-each": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2", + "throat": "^5.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-jasmine2/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-jasmine2/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/jest-jasmine2/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/jest-leak-detector": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", + "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==", + "dev": true, + "dependencies": { + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-matcher-utils": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", + "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-matcher-utils/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-matcher-utils/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/jest-matcher-utils/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/jest-message-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", + "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-message-util/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-message-util/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/jest-message-util/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/jest-mock": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", + "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "@types/node": "*" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-regex-util": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", + "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", + "dev": true, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-resolve": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz", + "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-snapshot": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-resolve/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-resolve/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/jest-resolve/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/jest-runner": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz", + "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==", + "dev": true, + "dependencies": { + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.7.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.3", + "jest-docblock": "^26.0.0", + "jest-haste-map": "^26.6.2", + "jest-leak-detector": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "source-map-support": "^0.5.6", + "throat": "^5.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-runner/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-runner/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/jest-runner/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/jest-runtime": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz", + "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", + "dev": true, + "dependencies": { + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/globals": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0", + "cjs-module-lexer": "^0.6.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^15.4.1" + }, + "bin": { + "jest-runtime": "bin/jest-runtime.js" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-runtime/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-runtime/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/jest-runtime/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/jest-serializer": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", + "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", + "dev": true, + "dependencies": { + "@types/node": "*", + "graceful-fs": "^4.2.4" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-snapshot": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz", + "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.0.0", + "chalk": "^4.0.0", + "expect": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-haste-map": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", + "natural-compare": "^1.4.0", + "pretty-format": "^26.6.2", + "semver": "^7.3.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-snapshot/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/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/jest-snapshot/node_modules/semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/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/jest-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-util/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-util/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/jest-util/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/jest-validate": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", + "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "camelcase": "^6.0.0", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "leven": "^3.1.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-validate/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" + } + }, + "node_modules/jest-validate/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-validate/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/jest-validate/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/jest-watcher": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", + "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", + "dev": true, + "dependencies": { + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^26.6.2", + "string-length": "^4.0.1" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-watcher/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-watcher/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/jest-watcher/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/jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/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/jest-worker/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/js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "node_modules/jsdom": { + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.4.0.tgz", + "integrity": "sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w==", + "dev": true, + "dependencies": { + "abab": "^2.0.3", + "acorn": "^7.1.1", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.2.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.0", + "domexception": "^2.0.1", + "escodegen": "^1.14.1", + "html-encoding-sniffer": "^2.0.1", + "is-potential-custom-element-name": "^1.0.0", + "nwsapi": "^2.2.0", + "parse5": "5.1.1", + "request": "^2.88.2", + "request-promise-native": "^1.0.8", + "saxes": "^5.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^3.0.1", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0", + "ws": "^7.2.3", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "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-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "dependencies": { + "jsonify": "~0.0.0" + } + }, + "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.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "node_modules/jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/lcov-parse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-1.0.0.tgz", + "integrity": "sha1-6w1GtUER68VhrLTECO+TY73I9+A=", + "dev": true, + "bin": { + "lcov-parse": "bin/cli.js" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "node_modules/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, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, + "node_modules/log-driver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", + "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", + "dev": true, + "engines": { + "node": ">=0.8.6" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "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" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-error": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", + "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", + "dev": true + }, + "node_modules/makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dev": true, + "dependencies": { + "tmpl": "1.0.x" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", + "dev": true, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mime-db": { + "version": "1.42.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.42.0.tgz", + "integrity": "sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.25", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.25.tgz", + "integrity": "sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg==", + "dev": true, + "dependencies": { + "mime-db": "1.42.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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/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/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node_modules/node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/node-notifier": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.1.tgz", + "integrity": "sha512-BvEXF+UmsnAfYfoapKM9nGxnP+Wn7P91YfXmrKnfcYCx6VBeoN5Ez5Ogck6I8Bi5k4RlpqRYaw75pAwzX9OphA==", + "dev": true, + "dependencies": { + "growly": "^1.3.0", + "is-wsl": "^2.2.0", + "semver": "^7.3.2", + "shellwords": "^0.1.1", + "uuid": "^8.3.0", + "which": "^2.0.2" + } + }, + "node_modules/node-notifier/node_modules/semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-notifier/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/node-notifier/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "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/npm-package-arg": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz", + "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.7.1", + "osenv": "^0.1.5", + "semver": "^5.6.0", + "validate-npm-package-name": "^3.0.0" + } + }, + "node_modules/npm-registry-client": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/npm-registry-client/-/npm-registry-client-8.6.0.tgz", + "integrity": "sha512-Qs6P6nnopig+Y8gbzpeN/dkt+n7IyVd8f45NTMotGk6Qo7GfBmzwYx6jRLoOOgKiMnaQfYxsuyQlD8Mc3guBhg==", + "dev": true, + "dependencies": { + "concat-stream": "^1.5.2", + "graceful-fs": "^4.1.6", + "normalize-package-data": "~1.0.1 || ^2.0.0", + "npm-package-arg": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0", + "npmlog": "2 || ^3.1.0 || ^4.0.0", + "once": "^1.3.3", + "request": "^2.74.0", + "retry": "^0.10.0", + "safe-buffer": "^5.1.1", + "semver": "2 >=2.2.1 || 3.x || 4 || 5", + "slide": "^1.1.3", + "ssri": "^5.2.4" + }, + "optionalDependencies": { + "npmlog": "2 || ^3.1.0 || ^4.0.0" + } + }, + "node_modules/npm-run-all": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", + "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "memorystream": "^0.3.1", + "minimatch": "^3.0.4", + "pidtree": "^0.3.0", + "read-pkg": "^3.0.0", + "shell-quote": "^1.6.1", + "string.prototype.padend": "^3.0.0" + }, + "bin": { + "npm-run-all": "bin/npm-run-all/index.js", + "run-p": "bin/run-p/index.js", + "run-s": "bin/run-s/index.js" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/npm-run-all/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/npm-run-all/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/npm-run-all/node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, + "optional": true, + "dependencies": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "node_modules/number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", + "dev": true + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-keys": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", + "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "dependencies": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "node_modules/p-each-series": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", + "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/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, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "dev": true + }, + "node_modules/parsimmon": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/parsimmon/-/parsimmon-1.13.0.tgz", + "integrity": "sha512-5UIrOCW+gjbILkjKPgTgmq8LKf8TT3Iy7kN2VD7OtQ81facKn8B4gG1X94jWqXYZsxG2KbJhrv/Yq/5H6BQn7A==", + "dev": true + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/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==", + "dev": true + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/pidtree": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.0.tgz", + "integrity": "sha512-9CT4NFlDcosssyg8KVFltgokyKZIFjoBxw8CTGy+5F38Y1eQWrt8tRayiUOXE+zVKQnYu5BR8JjCtvK3BcnBhg==", + "dev": true, + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "dev": true, + "dependencies": { + "node-modules-regexp": "^1.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", + "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/prompts": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz", + "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "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/qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/react-is": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz", + "integrity": "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA==", + "dev": true + }, + "node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/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/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "node_modules/repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request-promise-core": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "dev": true, + "dependencies": { + "lodash": "^4.17.19" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/request-promise-native": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", + "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", + "dev": true, + "dependencies": { + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + }, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/request-promise-native/node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/request/node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "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/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==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "dev": true, + "dependencies": { + "is-core-module": "^2.1.0", + "path-parse": "^1.0.6" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/retry": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", + "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=", + "dev": true, + "engines": { + "node": "*" + } + }, + "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" + } + }, + "node_modules/rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", + "dev": true, + "engines": { + "node": "6.* || >= 7.*" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", + "dev": true + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "dependencies": { + "ret": "~0.1.10" + } + }, + "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/sane": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "dev": true, + "dependencies": { + "@cnakazawa/watch": "^1.0.3", + "anymatch": "^2.0.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5" + }, + "bin": { + "sane": "src/cli.js" + }, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/sane/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/sane/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shell-quote": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", + "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", + "dev": true, + "dependencies": { + "array-filter": "~0.0.0", + "array-map": "~0.0.0", + "array-reduce": "~0.0.0", + "jsonify": "~0.0.0" + } + }, + "node_modules/shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true + }, + "node_modules/signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slide": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", + "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/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/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/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/snapdragon/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/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/source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "node_modules/spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.3.tgz", + "integrity": "sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g==", + "dev": true + }, + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "node_modules/sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ssri": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", + "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.1" + } + }, + "node_modules/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/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/string-length": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz", + "integrity": "sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-length/node_modules/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, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "optional": true, + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/string.prototype.padend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.0.0.tgz", + "integrity": "sha1-86rvfBcZ8XDF6rHDK/eA2W4h8vA=", + "dev": true, + "dependencies": { + "define-properties": "^1.1.2", + "es-abstract": "^1.4.3", + "function-bind": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "optional": true, + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true, + "optional": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/supports-hyperlinks": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz", + "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks/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/supports-hyperlinks/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/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "node_modules/tar": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", + "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", + "dev": true, + "dependencies": { + "block-stream": "*", + "fstream": "^1.0.12", + "inherits": "2" + } + }, + "node_modules/tar-stream": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.4.tgz", + "integrity": "sha512-o3pS2zlG4gxr67GmFYBLlq+dM8gyRGUOvsrHclSkvtVtQbjV0s/+ZE8OpICbaj8clrX3tjeHngYGP7rweaBnuw==", + "dev": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream/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/terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/throat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", + "dev": true + }, + "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/tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "dev": true + }, + "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-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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/tough-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "dev": true, + "dependencies": { + "ip-regex": "^2.1.0", + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", + "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-jest": { + "version": "26.4.4", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.4.4.tgz", + "integrity": "sha512-3lFWKbLxJm34QxyVNNCgXX1u4o/RV0myvA2y2Bxm46iGIjKlaY0own9gIckbjZJPn+WaJEnfPPJ20HHGpoq4yg==", + "dev": true, + "dependencies": { + "@types/jest": "26.x", + "bs-logger": "0.x", + "buffer-from": "1.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^26.1.0", + "json5": "2.x", + "lodash.memoize": "4.x", + "make-error": "1.x", + "mkdirp": "1.x", + "semver": "7.x", + "yargs-parser": "20.x" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/ts-jest/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-jest/node_modules/semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-jest/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/tslib": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", + "dev": true + }, + "node_modules/tslint": { + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.1.tgz", + "integrity": "sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^4.0.1", + "glob": "^7.1.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.8.0", + "tsutils": "^2.29.0" + }, + "bin": { + "tslint": "bin/tslint" + }, + "engines": { + "node": ">=4.8.0" + } + }, + "node_modules/tslint-config-prettier": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/tslint-config-prettier/-/tslint-config-prettier-1.18.0.tgz", + "integrity": "sha512-xPw9PgNPLG3iKRxmK7DWr+Ea/SzrvfHtjFt5LBl61gk2UBG/DB9kCXRjv+xyIU1rUtnayLeMUVJBcMX8Z17nDg==", + "dev": true, + "bin": { + "tslint-config-prettier-check": "bin/check.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/tslint/node_modules/diff": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", + "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.2.tgz", + "integrity": "sha512-thGloWsGH3SOxv1SoY7QojKi0tc+8FnOmiarEGMbd/lar7QOEd3hvlx3Fp5y6FlDUGl9L+pd4n2e+oToGMmhRQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/union-value/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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/uuid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", + "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/v8-to-istanbul": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.0.0.tgz", + "integrity": "sha512-fLL2rFuQpMtm9r8hrAV2apXX/WqHJ6+IC4/eQVdMDGBUgH/YMV4Gv3duk3kjmyg6uiQWBAA9nJwue4iJUOkHeA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/v8-to-istanbul/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/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/validate-npm-package-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", + "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", + "dev": true, + "dependencies": { + "builtins": "^1.0.3" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "dependencies": { + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dev": true, + "dependencies": { + "makeerror": "1.0.x" + } + }, + "node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true, + "engines": { + "node": ">=10.4" + } + }, + "node_modules/whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "node_modules/whatwg-url": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.4.0.tgz", + "integrity": "sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw==", + "dev": true, + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^2.0.2", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "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/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "node_modules/wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "optional": true, + "dependencies": { + "string-width": "^1.0.2 || 2" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/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/wrap-ansi/node_modules/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, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/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, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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/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==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.1.tgz", + "integrity": "sha512-pTsP8UAfhy3sk1lSk/O/s4tjD0CRwvMnzvwr4OKGX7ZvqZtUyx4KIJB5JWbkykPoc55tixMGgTNoh3k4FkNGFQ==", + "dev": true, + "engines": { + "node": ">=8.3.0" + } + }, + "node_modules/xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "node_modules/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==", + "dev": true + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/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, + "dependencies": { + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/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/yargs/node_modules/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, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/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, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + } + }, + "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==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/core": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.10.tgz", + "integrity": "sha512-eTAlQKq65zHfkHZV0sIVODCPGVgoo1HdBlbSLi9CqOzuZanMv2ihzY+4paiKr1mH+XmYESMAmJ/dpZ68eN6d8w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.10", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.5", + "@babel/parser": "^7.12.10", + "@babel/template": "^7.12.7", + "@babel/traverse": "^7.12.10", + "@babel/types": "^7.12.10", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "semver": "^5.4.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/generator": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.10.tgz", + "integrity": "sha512-6mCdfhWgmqLdtTkhXjnIz0LcdVCd26wS2JXRtj2XY0u5klDsXBREA/pG5NVOuVnF2LUrBGNFtQkIqqTbblg0ww==", + "dev": true, + "requires": { + "@babel/types": "^7.12.10", + "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-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==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", + "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", + "dev": true, + "requires": { + "@babel/types": "^7.12.10" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz", + "integrity": "sha512-DCsuPyeWxeHgh1Dus7APn7iza42i/qXqiFPWyBDdOFtvS581JQePsc1F/nD+fHrcswhLlRc2UpYS1NwERxZhHw==", + "dev": true, + "requires": { + "@babel/types": "^7.12.7" + } + }, + "@babel/helper-module-imports": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz", + "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.5" + } + }, + "@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==", + "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" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.10.tgz", + "integrity": "sha512-4tpbU0SrSTjjt65UMWSrUOPZTsgvPgGG4S8QSTNHacKzpS51IVWGDj0yCwyeZND/i+LSN2g/O63jEXEWm49sYQ==", + "dev": true, + "requires": { + "@babel/types": "^7.12.10" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + }, + "@babel/helper-replace-supers": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz", + "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.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==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@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==", + "dev": true, + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@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==", + "dev": true + }, + "@babel/helpers": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.5.tgz", + "integrity": "sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA==", + "dev": true, + "requires": { + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.5" + } + }, + "@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==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "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 + } + } + }, + "@babel/parser": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.10.tgz", + "integrity": "sha512-PJdRPwyoOqFAWfLytxrWwGrAxghCgh/yTNCYciOz8QgjflA7aZhECPZAa2VUedKg2+QMWkI0L9lynh2SNmNEgA==", + "dev": true + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz", + "integrity": "sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz", + "integrity": "sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/template": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", + "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.12.7", + "@babel/types": "^7.12.7" + } + }, + "@babel/traverse": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.10.tgz", + "integrity": "sha512-6aEtf0IeRgbYWzta29lePeYSk+YAFIC3kyqESeft8o5CkFlYIMX+EQDDWEiAQ9LHOA3d0oHdgrSsID/CKqXJlg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.10", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.12.10", + "@babel/types": "^7.12.10", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.10.tgz", + "integrity": "sha512-sf6wboJV5mGyip2hIpDSKsr80RszPinEFjsHTalMxZAZkoQ2/2yQzxlcFN52SJqsyPfLtPmenL4g2KB3KJXPDw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "@cnakazawa/watch": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", + "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", + "dev": true, + "requires": { + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" + } + }, + "@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==", + "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" + } + }, + "@istanbuljs/schema": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", + "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", + "dev": true + }, + "@jest/console": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", + "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^26.6.2", + "jest-util": "^26.6.2", + "slash": "^3.0.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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 + }, + "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" + } + } + } + }, + "@jest/core": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", + "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", + "dev": true, + "requires": { + "@jest/console": "^26.6.2", + "@jest/reporters": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-changed-files": "^26.6.2", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-resolve-dependencies": "^26.6.3", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "jest-watcher": "^26.6.2", + "micromatch": "^4.0.2", + "p-each-series": "^2.1.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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 + }, + "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" + } + }, + "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" + } + } + } + }, + "@jest/environment": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", + "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", + "dev": true, + "requires": { + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2" + } + }, + "@jest/fake-timers": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", + "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@sinonjs/fake-timers": "^6.0.1", + "@types/node": "*", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" + } + }, + "@jest/globals": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", + "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", + "dev": true, + "requires": { + "@jest/environment": "^26.6.2", + "@jest/types": "^26.6.2", + "expect": "^26.6.2" + } + }, + "@jest/reporters": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", + "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.4", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.3", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "node-notifier": "^8.0.0", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^7.0.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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 + }, + "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" + } + } + } + }, + "@jest/source-map": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", + "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", + "dev": true, + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.4", + "source-map": "^0.6.0" + } + }, + "@jest/test-result": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", + "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", + "dev": true, + "requires": { + "@jest/console": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "@jest/test-sequencer": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", + "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", + "dev": true, + "requires": { + "@jest/test-result": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3" + } + }, + "@jest/transform": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", + "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^26.6.2", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-util": "^26.6.2", + "micromatch": "^4.0.2", + "pirates": "^4.0.1", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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 + }, + "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" + } + } + } + }, + "@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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 + }, + "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" + } + } + } + }, + "@sinonjs/commons": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.1.tgz", + "integrity": "sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", + "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@types/babel__core": { + "version": "7.1.12", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.12.tgz", + "integrity": "sha512-wMTHiiTiBAAPebqaPiPDLFA4LYPKr6Ph0Xq/6rq1Ur3v66HXyG+clfR9CNETkD7MQS8ZHvpQOtA53DLws5WAEQ==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", + "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz", + "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.11.0.tgz", + "integrity": "sha512-kSjgDMZONiIfSH1Nxcr5JIRMwUetDki63FSQfpTCz8ogF3Ulqm8+mr5f78dUYs6vMiB6gBusQqfQmBvHZj/lwg==", + "dev": true, + "requires": { + "@babel/types": "^7.3.0" + } + }, + "@types/graceful-fs": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.4.tgz", + "integrity": "sha512-mWA/4zFQhfvOA8zWkXobwJvBD7vzcxgrOQ0J5CH1votGqdq9m7+FwtGaqyCZqC3NyyBkc9z4m+iry4LlqcMWJg==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", + "dev": true + }, + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/jest": { + "version": "26.0.18", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.18.tgz", + "integrity": "sha512-scDPs+mELZgsFetTgBSsIxKGrlitn9t/d2ecP+S1QSIGD+31fkMBEftLfOAX5k3tU06/0PjreJIQ+gWEbbHqpw==", + "dev": true, + "requires": { + "jest-diff": "^26.0.0", + "pretty-format": "^26.0.0" + } + }, + "@types/node": { + "version": "14.14.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.11.tgz", + "integrity": "sha512-BJ97wAUuU3NUiUCp44xzUFquQEvnk1wu7q4CMEUYKJWjdkr0YWYDsm4RFtAvxYsNjLsKcrFt6RvK8r+mnzMbEQ==", + "dev": true + }, + "@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", + "dev": true + }, + "@types/parsimmon": { + "version": "1.10.6", + "resolved": "https://registry.npmjs.org/@types/parsimmon/-/parsimmon-1.10.6.tgz", + "integrity": "sha512-FwAQwMRbkhx0J6YELkwIpciVzCcgEqXEbIrIn3a2P5d3kGEHQ3wVhlN3YdVepYP+bZzCYO6OjmD4o9TGOZ40rA==", + "dev": true + }, + "@types/prettier": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.1.5.tgz", + "integrity": "sha512-UEyp8LwZ4Dg30kVU2Q3amHHyTn1jEdhCIE59ANed76GaT1Vp76DD3ZWSAxgCrw6wJ0TqeoBpqmfUHiUDPs//HQ==", + "dev": true + }, + "@types/stack-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", + "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", + "dev": true + }, + "@types/yargs": { + "version": "15.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.11.tgz", + "integrity": "sha512-jfcNBxHFYJ4nPIacsi3woz1+kvUO6s1CyeEhtnDHBjHUMNj5UlW2GynmnSgiJJEdNg9yW5C8lfoNRZrHGv5EqA==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", + "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==", + "dev": true + }, + "abab": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", + "dev": true + }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true + }, + "ajv": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + } + }, + "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 + }, + "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" + }, + "dependencies": { + "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": { + "color-name": "~1.1.4" + } + }, + "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 + } + } + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-filter": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", + "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=", + "dev": true + }, + "array-map": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", + "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=", + "dev": true + }, + "array-reduce": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", + "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "dev": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", "dev": true }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, - "optional": true + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } }, - "debug": { - "version": "2.6.9", - "bundled": true, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, - "optional": true, "requires": { - "ms": "2.0.0" + "ansi-regex": "^2.0.0" } - }, - "deep-extend": { - "version": "0.5.1", - "bundled": true, + } + } + }, + "babel-jest": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", + "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==", + "dev": true, + "requires": { + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/babel__core": "^7.1.7", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "slash": "^3.0.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, - "optional": true + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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 }, - "delegates": { + "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" + } + } + } + }, + "babel-plugin-istanbul": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", + "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^4.0.0", + "test-exclude": "^6.0.0" + } + }, + "babel-plugin-jest-hoist": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", + "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==", + "dev": true, + "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-preset-current-node-syntax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.0.tgz", + "integrity": "sha512-mGkvkpocWJes1CmMKtgGUwCeeq0pOhALyymozzDWYomHTbDLwueDYG6p4TK1YOeYHCzBzYPsWkgTto10JubI1Q==", + "dev": true, + "requires": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + } + }, + "babel-preset-jest": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz", + "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^26.6.2", + "babel-preset-current-node-syntax": "^1.0.0" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, + "requires": { + "is-descriptor": "^1.0.0" + } + } + } + }, + "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 + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "bl": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.3.tgz", + "integrity": "sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "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, - "optional": true + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "dev": true, + "requires": { + "inherits": "~2.0.0" + } + }, + "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": { + "fill-range": "^7.0.1" + } + }, + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "requires": { + "fast-json-stable-stringify": "2.x" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "builtins": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", + "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", + "dev": true + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "capture-exit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "dev": true, + "requires": { + "rsvp": "^4.8.4" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "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" + }, + "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" + } }, - "fs-minipass": { - "version": "1.2.5", - "bundled": 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" + } + } + } + }, + "char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true + }, + "charm": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/charm/-/charm-1.0.2.tgz", + "integrity": "sha1-it02cVOm2aWBMxBSxAkJkdqZXjU=", + "dev": true, + "requires": { + "inherits": "^2.0.1" + } + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "cjs-module-lexer": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", + "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==", + "dev": true + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, - "optional": true, "requires": { - "minipass": "^2.2.1" + "is-descriptor": "^0.1.0" } }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, - "optional": true, "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, - "glob": { - "version": "7.1.2", - "bundled": true, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, - "optional": true, "requires": { - "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" + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.21", - "bundled": true, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, - "optional": true, "requires": { - "safer-buffer": "^2.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" } }, - "ignore-walk": { - "version": "3.0.1", - "bundled": true, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "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" + }, + "dependencies": { + "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 + }, + "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, - "optional": true, "requires": { - "minimatch": "^3.0.4" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" } }, - "inflight": { - "version": "1.0.6", - "bundled": true, + "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, - "optional": true, "requires": { - "once": "^1.3.0", - "wrappy": "1" + "ansi-regex": "^5.0.0" } - }, - "inherits": { - "version": "2.0.3", - "bundled": true, + } + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true, + "optional": true + }, + "collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.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 + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "command-exists": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.8.tgz", + "integrity": "sha512-PM54PkseWbiiD/mMsbvW351/u+dafwTJ0ye2qB60G1aGQP9j3xK2gmMDc+R34L3nDtx4qMCitXT75mkbkGJDLw==", + "dev": true + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "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 + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true, + "optional": 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==", + "dev": true, + "requires": { + "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 + } + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "coveralls": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.1.0.tgz", + "integrity": "sha512-sHxOu2ELzW8/NC1UP5XVLbZDzO4S3VxfFye3XYCznopHy02YjNkHcj5bKaVw2O7hVaBdBjEdQGpie4II1mWhuQ==", + "dev": true, + "requires": { + "js-yaml": "^3.13.1", + "lcov-parse": "^1.0.0", + "log-driver": "^1.2.7", + "minimist": "^1.2.5", + "request": "^2.88.2" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + } + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "requires": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decimal.js": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", + "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true + }, + "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": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true, + "optional": true + }, + "detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "diff-sequences": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", + "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", + "dev": true + }, + "domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dev": true, + "requires": { + "webidl-conversions": "^5.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", "dev": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, + } + } + }, + "dtslint": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/dtslint/-/dtslint-4.0.7.tgz", + "integrity": "sha512-gwpBnxky+vUfCL74U5ao+wQf4sw9jD+cZ9ukiTFrkwkhNibqfyOZyg4cnFf1lB0Hm5ZFSQdi09DdjarDQLgofA==", + "dev": true, + "requires": { + "@definitelytyped/header-parser": "latest", + "@definitelytyped/typescript-versions": "latest", + "@definitelytyped/utils": "latest", + "dts-critic": "latest", + "fs-extra": "^6.0.1", + "json-stable-stringify": "^1.0.1", + "strip-json-comments": "^2.0.1", + "tslint": "5.14.0", + "tsutils": "^2.29.0", + "yargs": "^15.1.0" + }, + "dependencies": { + "@definitelytyped/header-parser": { + "version": "0.0.64", + "resolved": "https://registry.npmjs.org/@definitelytyped/header-parser/-/header-parser-0.0.64.tgz", + "integrity": "sha512-vwh6ojw0PYptEiAogAdKNrwYy2Dv0zZj6M5bjKAoF7/xOmY5B/QluJnNmgF7Q+fxLG2vVxYDbkc26r04xYIZQA==", "dev": true, "requires": { - "number-is-nan": "^1.0.0" + "@definitelytyped/typescript-versions": "^0.0.64", + "@types/parsimmon": "^1.10.1", + "parsimmon": "^1.13.0" } }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true + "@definitelytyped/typescript-versions": { + "version": "0.0.64", + "resolved": "https://registry.npmjs.org/@definitelytyped/typescript-versions/-/typescript-versions-0.0.64.tgz", + "integrity": "sha512-h+RvQPzvC/yVtZ/FqttXoIac/X1htXrmuNbvmQP+RiVonGunKq7S8ona5tm7ckiheur6VvtKQGe+zQIDF3sErQ==", + "dev": true }, - "minimatch": { - "version": "3.0.4", - "bundled": true, + "@definitelytyped/utils": { + "version": "0.0.64", + "resolved": "https://registry.npmjs.org/@definitelytyped/utils/-/utils-0.0.64.tgz", + "integrity": "sha512-ahxruUzplmVwWnJavaRcj8JN4B6znkYjmSTGyWSzgc+aL596nVZGyVRDlOL5mKSnJk1MzT4Uj4Gx0bg3l6CPHw==", "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "@definitelytyped/typescript-versions": "^0.0.64", + "@types/node": "^12.12.29", + "charm": "^1.0.2", + "fs-extra": "^8.1.0", + "fstream": "^1.0.12", + "npm-registry-client": "^8.6.0", + "tar": "^2.2.2", + "tar-stream": "^2.1.4" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } } }, - "minimist": { - "version": "0.0.8", - "bundled": true, + "@types/node": { + "version": "12.19.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.9.tgz", + "integrity": "sha512-yj0DOaQeUrk3nJ0bd3Y5PeDRJ6W0r+kilosLA+dzF3dola/o9hxhMSg2sFvVcA2UHS5JSOsZp4S0c1OEXc4m1Q==", "dev": true }, - "minipass": { - "version": "2.2.4", - "bundled": true, + "dts-critic": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/dts-critic/-/dts-critic-3.3.4.tgz", + "integrity": "sha512-OjLTrSBCFbi1tDAiOXcP7G20W3HI3eIzkpSpLwvH7oDFZYdqFCMe9lsNhMZFXqsNcSTpRg3+PBS4fF27+h1qew==", "dev": true, "requires": { - "safe-buffer": "^5.1.1", - "yallist": "^3.0.0" + "@definitelytyped/header-parser": "^0.0.64", + "command-exists": "^1.2.8", + "rimraf": "^3.0.2", + "semver": "^6.2.0", + "tmp": "^0.2.1", + "yargs": "^15.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, - "minizlib": { - "version": "1.1.0", - "bundled": true, + "tslint": { + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.14.0.tgz", + "integrity": "sha512-IUla/ieHVnB8Le7LdQFRGlVJid2T/gaJe5VkjzRVSRR6pA2ODYrnfR1hmxi+5+au9l50jBwpbBL34txgv4NnTQ==", "dev": true, - "optional": true, "requires": { - "minipass": "^2.2.1" + "babel-code-frame": "^6.22.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^3.2.0", + "glob": "^7.1.1", + "js-yaml": "^3.7.0", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.8.0", + "tsutils": "^2.29.0" } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, + } + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "emittery": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", + "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", + "dev": true + }, + "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 + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", + "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.0", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-keys": "^1.0.12" + } + }, + "es-to-primitive": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "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 + }, + "escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "exec-sh": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", + "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==", + "dev": true + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.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": { - "minimist": "0.0.8" + "ms": "2.0.0" } }, - "ms": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "needle": { - "version": "2.2.0", - "bundled": true, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, - "optional": true, "requires": { - "debug": "^2.1.2", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" + "is-descriptor": "^0.1.0" } }, - "node-pre-gyp": { - "version": "0.10.0", - "bundled": true, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, - "optional": true, "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.0", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.1.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" + "is-extendable": "^0.1.0" } }, - "nopt": { - "version": "4.0.1", - "bundled": true, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, - "optional": true, "requires": { - "abbrev": "1", - "osenv": "^0.1.4" + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, - "npm-bundled": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.1.10", - "bundled": true, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, - "optional": true, "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, - "npmlog": { - "version": "4.1.2", - "bundled": true, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, - "optional": true, "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" } }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", "dev": true }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true }, - "process-nextick-args": { + "ms": { "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.7", - "bundled": true, + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "expect": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", + "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "ansi-styles": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, - "optional": true, "requires": { - "deep-extend": "^0.5.1", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - } + "is-descriptor": "^1.0.0" } }, - "readable-stream": { - "version": "2.3.6", - "bundled": true, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, - "optional": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "is-extendable": "^0.1.0" } }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "dev": true, + "requires": { + "bser": "2.1.1" + } + }, + "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, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "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" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "fs-extra": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz", + "integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.2.1.tgz", + "integrity": "sha512-bTLYHSeC0UH/EFXS9KqWnXuOl/wHK5Z/d+ghd5AsFMYN7wIGkUCOJyzy88+wJKkZPGON8u4Z9f6U4FdgURE9qA==", + "dev": true, + "optional": true + }, + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + }, + "dependencies": { "rimraf": { - "version": "2.6.2", - "bundled": true, + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, - "optional": true, "requires": { - "glob": "^7.0.5" + "glob": "^7.1.3" } - }, - "safe-buffer": { - "version": "5.1.1", - "bundled": true, - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "dev": true, - "optional": true - }, - "semver": { - "version": "5.5.0", - "bundled": true, - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true, "optional": true }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, - "optional": true + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } }, "string-width": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", "strip-ansi": "^3.0.0" } }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, "strip-ansi": { "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "chownr": "^1.0.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.2.4", - "minizlib": "^1.1.0", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.1", - "yallist": "^3.0.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "optional": true, "requires": { - "string-width": "^1.0.2" + "ansi-regex": "^2.0.0" } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "yallist": { - "version": "3.0.2", - "bundled": true, - "dev": true } } }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "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 }, "get-caller-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", - "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", + "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 }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "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-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", @@ -2270,9 +10675,9 @@ } }, "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -2283,44 +10688,16 @@ "path-is-absolute": "^1.0.0" } }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" - } - }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "^2.0.0" - } - }, - "glob2base": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", - "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", - "dev": true, - "requires": { - "find-index": "^0.1.1" - } - }, "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "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 }, "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "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 }, "growly": { @@ -2329,35 +10706,6 @@ "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", "dev": true }, - "handlebars": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", - "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", - "dev": true, - "requires": { - "async": "^1.4.0", - "optimist": "^0.6.1", - "source-map": "^0.4.4", - "uglify-js": "^2.6" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -2365,22 +10713,22 @@ "dev": true }, "har-validator": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", - "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", "dev": true, "requires": { - "ajv": "^5.1.0", + "ajv": "^6.5.5", "har-schema": "^2.0.0" } }, "has": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", - "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "requires": { - "function-bind": "^1.0.2" + "function-bind": "^1.1.1" } }, "has-ansi": { @@ -2390,6 +10738,14 @@ "dev": true, "requires": { "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } } }, "has-flag": { @@ -2398,6 +10754,19 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true, + "optional": true + }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -2419,6 +10788,26 @@ "kind-of": "^4.0.0" }, "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "kind-of": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", @@ -2430,31 +10819,27 @@ } } }, - "home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.1" - } - }, "hosted-git-info": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", - "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", "dev": true }, "html-encoding-sniffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", "dev": true, "requires": { - "whatwg-encoding": "^1.0.1" + "whatwg-encoding": "^1.0.5" } }, + "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 + }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", @@ -2466,20 +10851,35 @@ "sshpk": "^1.7.0" } }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true + }, "iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", + "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 }, "import-local": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", - "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", "dev": true, "requires": { - "pkg-dir": "^2.0.0", - "resolve-cwd": "^2.0.0" + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" } }, "imurmurhash": { @@ -2499,33 +10899,24 @@ } }, "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dev": true, - "requires": { - "loose-envify": "^1.0.0" - } - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", "dev": true }, "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "^6.0.0" } }, "is-arrayish": { @@ -2534,52 +10925,43 @@ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "^1.0.0" - } - }, "is-callable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", - "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", "dev": true }, "is-ci": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.1.0.tgz", - "integrity": "sha512-c7TnwxLePuqIlxHgr7xtxzycJPegNHFuIrBkwbf8hc58//+Op1CqFkyS+xnIMkwn9UsJIwc174BIjkyBmSpjKg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "requires": { + "ci-info": "^2.0.0" + } + }, + "is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", "dev": true, "requires": { - "ci-info": "^1.0.0" + "has": "^1.0.3" } }, "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "^6.0.0" } }, "is-date-object": { @@ -2589,106 +10971,50 @@ "dev": true }, "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "is-docker": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", + "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==", "dev": true, - "requires": { - "is-primitive": "^2.0.0" - } + "optional": true }, "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { - "number-is-nan": "^1.0.0" + "is-plain-object": "^2.0.4" } }, "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=", - "dev": true + "dev": true, + "optional": true }, "is-generator-fn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-1.0.0.tgz", - "integrity": "sha1-lp1J4bszKfa7fwkIm+JleLLd1Go=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-odd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", - "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", - "dev": true, - "requires": { - "is-number": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - } - } + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true }, "is-plain-object": { "version": "2.0.4", @@ -2699,16 +11025,10 @@ "isobject": "^3.0.1" } }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "is-potential-custom-element-name": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz", + "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=", "dev": true }, "is-regex": { @@ -2727,10 +11047,13 @@ "dev": true }, "is-symbol": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", - "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", - "dev": true + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.0" + } }, "is-typedarray": { "version": "1.0.0", @@ -2738,18 +11061,21 @@ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "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==", "dev": true }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -2774,511 +11100,998 @@ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "dev": true }, - "istanbul-api": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.1.tgz", - "integrity": "sha512-duj6AlLcsWNwUpfyfHt0nWIeRiZpuShnP40YTxOGQgtaN8fd6JYSxsvxUphTDy8V5MfDXo4s/xVCIIvVCO808g==", - "dev": true, - "requires": { - "async": "^2.1.4", - "compare-versions": "^3.1.0", - "fileset": "^2.0.2", - "istanbul-lib-coverage": "^1.2.0", - "istanbul-lib-hook": "^1.2.0", - "istanbul-lib-instrument": "^1.10.1", - "istanbul-lib-report": "^1.1.4", - "istanbul-lib-source-maps": "^1.2.4", - "istanbul-reports": "^1.3.0", - "js-yaml": "^3.7.0", - "mkdirp": "^0.5.1", - "once": "^1.4.0" - } - }, "istanbul-lib-coverage": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.0.tgz", - "integrity": "sha512-GvgM/uXRwm+gLlvkWHTjDAvwynZkL9ns15calTrmhGgowlwJBbWMYzWbKqE2DT6JDP1AFXKa+Zi0EkqNCUqY0A==", + "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==", "dev": true }, - "istanbul-lib-hook": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.0.tgz", - "integrity": "sha512-p3En6/oGkFQV55Up8ZPC2oLxvgSxD8CzA0yBrhRZSh3pfv3OFj9aSGVC0yoerAi/O4u7jUVnOGVX1eVFM+0tmQ==", - "dev": true, - "requires": { - "append-transform": "^0.4.0" - } - }, "istanbul-lib-instrument": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz", - "integrity": "sha512-1dYuzkOCbuR5GRJqySuZdsmsNKPL3PTuyPevQfoCXJePT9C8y1ga75neU+Tuy9+yS3G/dgx8wgOmp2KLpgdoeQ==", + "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, "requires": { - "babel-generator": "^6.18.0", - "babel-template": "^6.16.0", - "babel-traverse": "^6.18.0", - "babel-types": "^6.18.0", - "babylon": "^6.18.0", - "istanbul-lib-coverage": "^1.2.0", - "semver": "^5.3.0" + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "istanbul-lib-report": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.4.tgz", - "integrity": "sha512-Azqvq5tT0U09nrncK3q82e/Zjkxa4tkFZv7E6VcqP0QCPn6oNljDPfrZEC/umNXds2t7b8sRJfs6Kmpzt8m2kA==", + "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, "requires": { - "istanbul-lib-coverage": "^1.2.0", - "mkdirp": "^0.5.1", - "path-parse": "^1.0.5", - "supports-color": "^3.1.2" + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" }, "dependencies": { "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "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": "^1.0.0" + "has-flag": "^4.0.0" } } } }, "istanbul-lib-source-maps": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.5.tgz", - "integrity": "sha512-8O2T/3VhrQHn0XcJbP1/GN7kXMiRAlPi+fj3uEHrjBD8Oz7Py0prSC25C09NuAZS6bgW1NNKAvCSHZXB0irSGA==", + "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, "requires": { - "debug": "^3.1.0", - "istanbul-lib-coverage": "^1.2.0", - "mkdirp": "^0.5.1", - "rimraf": "^2.6.1", - "source-map": "^0.5.3" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" } }, "istanbul-reports": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.3.0.tgz", - "integrity": "sha512-y2Z2IMqE1gefWUaVjrBm0mSKvUkaBy9Vqz8iwr/r40Y9hBbIteH5wqHG/9DLTfJ9xUnUT2j7A3+VVJ6EaYBllA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", "dev": true, "requires": { - "handlebars": "^4.0.3" + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" } }, "jest": { - "version": "23.1.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-23.1.0.tgz", - "integrity": "sha1-u7f4kxAKEadC3YvQ0EelSwlorRo=", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.3.tgz", + "integrity": "sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==", + "dev": true, + "requires": { + "@jest/core": "^26.6.3", + "import-local": "^3.0.2", + "jest-cli": "^26.6.3" + } + }, + "jest-changed-files": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", + "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", "dev": true, "requires": { - "import-local": "^1.0.0", - "jest-cli": "^23.1.0" + "@jest/types": "^26.6.2", + "execa": "^4.0.0", + "throat": "^5.0.0" }, "dependencies": { - "jest-cli": { - "version": "23.1.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-23.1.0.tgz", - "integrity": "sha1-64vdTODRUlCJLjGtm2m8mdKo9r8=", + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "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==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "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 + }, + "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==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "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 + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.1.11", - "import-local": "^1.0.0", - "is-ci": "^1.0.10", - "istanbul-api": "^1.3.1", - "istanbul-lib-coverage": "^1.2.0", - "istanbul-lib-instrument": "^1.10.1", - "istanbul-lib-source-maps": "^1.2.4", - "jest-changed-files": "^23.0.1", - "jest-config": "^23.1.0", - "jest-environment-jsdom": "^23.1.0", - "jest-get-type": "^22.1.0", - "jest-haste-map": "^23.1.0", - "jest-message-util": "^23.1.0", - "jest-regex-util": "^23.0.0", - "jest-resolve-dependencies": "^23.0.1", - "jest-runner": "^23.1.0", - "jest-runtime": "^23.1.0", - "jest-snapshot": "^23.0.1", - "jest-util": "^23.1.0", - "jest-validate": "^23.0.1", - "jest-watcher": "^23.1.0", - "jest-worker": "^23.0.1", - "micromatch": "^2.3.11", - "node-notifier": "^5.2.1", - "realpath-native": "^1.0.0", - "rimraf": "^2.5.4", - "slash": "^1.0.0", - "string-length": "^2.0.0", - "strip-ansi": "^4.0.0", - "which": "^1.2.12", - "yargs": "^11.0.0" + "isexe": "^2.0.0" } } } }, - "jest-changed-files": { - "version": "23.0.1", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-23.0.1.tgz", - "integrity": "sha1-95Vy0HIIROpd+EwqRI6GLCJU9gw=", + "jest-cli": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", + "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", "dev": true, "requires": { - "throat": "^4.0.0" + "@jest/core": "^26.6.3", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "import-local": "^3.0.2", + "is-ci": "^2.0.0", + "jest-config": "^26.6.3", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "prompts": "^2.0.1", + "yargs": "^15.4.1" + }, + "dependencies": { + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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 + }, + "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" + } + } } }, "jest-config": { - "version": "23.1.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-23.1.0.tgz", - "integrity": "sha1-cIyg9DHTVu5CT7SJXTMIAGvdgkE=", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", + "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", "dev": true, "requires": { - "babel-core": "^6.0.0", - "babel-jest": "^23.0.1", - "chalk": "^2.0.1", + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^26.6.3", + "@jest/types": "^26.6.2", + "babel-jest": "^26.6.3", + "chalk": "^4.0.0", + "deepmerge": "^4.2.2", "glob": "^7.1.1", - "jest-environment-jsdom": "^23.1.0", - "jest-environment-node": "^23.1.0", - "jest-get-type": "^22.1.0", - "jest-jasmine2": "^23.1.0", - "jest-regex-util": "^23.0.0", - "jest-resolve": "^23.1.0", - "jest-util": "^23.1.0", - "jest-validate": "^23.0.1", - "pretty-format": "^23.0.1" + "graceful-fs": "^4.2.4", + "jest-environment-jsdom": "^26.6.2", + "jest-environment-node": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-jasmine2": "^26.6.3", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2" + }, + "dependencies": { + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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 + }, + "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" + } + } } }, "jest-diff": { - "version": "23.0.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-23.0.1.tgz", - "integrity": "sha1-PUkTfO4SwyCktNK0pvpugtSRoWo=", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", + "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", "dev": true, "requires": { - "chalk": "^2.0.1", - "diff": "^3.2.0", - "jest-get-type": "^22.1.0", - "pretty-format": "^23.0.1" + "chalk": "^4.0.0", + "diff-sequences": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "dependencies": { + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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 + }, + "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" + } + } } }, "jest-docblock": { - "version": "23.0.1", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-23.0.1.tgz", - "integrity": "sha1-3t3RgzO+XcJBUmCgTvP86SdrVyU=", + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", + "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", "dev": true, "requires": { - "detect-newline": "^2.1.0" + "detect-newline": "^3.0.0" } }, "jest-each": { - "version": "23.1.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-23.1.0.tgz", - "integrity": "sha1-FhRrWSw1SGelrl4TzfFcbGW2lsY=", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz", + "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==", "dev": true, "requires": { - "chalk": "^2.0.1", - "pretty-format": "^23.0.1" + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2" + }, + "dependencies": { + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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 + }, + "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" + } + } } }, "jest-environment-jsdom": { - "version": "23.1.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-23.1.0.tgz", - "integrity": "sha1-hZKZFOI77TV32sl1X0EG0Gl8R5w=", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz", + "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==", "dev": true, "requires": { - "jest-mock": "^23.1.0", - "jest-util": "^23.1.0", - "jsdom": "^11.5.1" + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2", + "jsdom": "^16.4.0" } }, "jest-environment-node": { - "version": "23.1.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-23.1.0.tgz", - "integrity": "sha1-RSwL+UnPy7rNoeF2Lu7XC8eEx9U=", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz", + "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==", "dev": true, "requires": { - "jest-mock": "^23.1.0", - "jest-util": "^23.1.0" + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" } }, "jest-get-type": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz", - "integrity": "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==", + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", "dev": true }, "jest-haste-map": { - "version": "23.1.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-23.1.0.tgz", - "integrity": "sha1-GObH1ajScTb5G32YUvhd4McHTEk=", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", + "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", "dev": true, "requires": { + "@jest/types": "^26.6.2", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", - "graceful-fs": "^4.1.11", - "jest-docblock": "^23.0.1", - "jest-serializer": "^23.0.1", - "jest-worker": "^23.0.1", - "micromatch": "^2.3.11", - "sane": "^2.0.0" + "fsevents": "^2.1.2", + "graceful-fs": "^4.2.4", + "jest-regex-util": "^26.0.0", + "jest-serializer": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "micromatch": "^4.0.2", + "sane": "^4.0.3", + "walker": "^1.0.7" } }, "jest-jasmine2": { - "version": "23.1.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-23.1.0.tgz", - "integrity": "sha1-SvqzFym2VN3NKwdK3YSTlvE7MLg=", - "dev": true, - "requires": { - "chalk": "^2.0.1", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", + "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", + "dev": true, + "requires": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", "co": "^4.6.0", - "expect": "^23.1.0", - "is-generator-fn": "^1.0.0", - "jest-diff": "^23.0.1", - "jest-each": "^23.1.0", - "jest-matcher-utils": "^23.0.1", - "jest-message-util": "^23.1.0", - "jest-snapshot": "^23.0.1", - "jest-util": "^23.1.0", - "pretty-format": "^23.0.1" + "expect": "^26.6.2", + "is-generator-fn": "^2.0.0", + "jest-each": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2", + "throat": "^5.0.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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 + }, + "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" + } + } } }, "jest-leak-detector": { - "version": "23.0.1", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-23.0.1.tgz", - "integrity": "sha1-nboHUFrDSVw50+wJrB5WRZnoYaA=", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", + "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==", "dev": true, "requires": { - "pretty-format": "^23.0.1" + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" } }, "jest-matcher-utils": { - "version": "23.0.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-23.0.1.tgz", - "integrity": "sha1-DGwNrt+YM8Kn82I2Bp7+y0w/bl8=", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", + "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", "dev": true, "requires": { - "chalk": "^2.0.1", - "jest-get-type": "^22.1.0", - "pretty-format": "^23.0.1" + "chalk": "^4.0.0", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "dependencies": { + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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 + }, + "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" + } + } } }, "jest-message-util": { - "version": "23.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-23.1.0.tgz", - "integrity": "sha1-moCbpIfsrFzlEdTmmO47XuJGHqk=", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", + "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.2" + }, + "dependencies": { + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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 + }, + "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" + } + } + } + }, + "jest-mock": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", + "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0-beta.35", - "chalk": "^2.0.1", - "micromatch": "^2.3.11", - "slash": "^1.0.0", - "stack-utils": "^1.0.1" + "@jest/types": "^26.6.2", + "@types/node": "*" } }, - "jest-mock": { - "version": "23.1.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-23.1.0.tgz", - "integrity": "sha1-o4HDGxIasfYMRiotrbe4bczKxIc=", + "jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", "dev": true }, "jest-regex-util": { - "version": "23.0.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-23.0.0.tgz", - "integrity": "sha1-3Vwf3gxG9DcTFM8Q96dRoj9Oj3Y=", + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", + "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", "dev": true }, "jest-resolve": { - "version": "23.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-23.1.0.tgz", - "integrity": "sha1-ueMW7s69bwC8UKOWDRUnuuZXktI=", - "dev": true, - "requires": { - "browser-resolve": "^1.11.2", - "chalk": "^2.0.1", - "realpath-native": "^1.0.0" + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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 + }, + "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" + } + } } }, "jest-resolve-dependencies": { - "version": "23.0.1", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-23.0.1.tgz", - "integrity": "sha1-0BoQ3a2RUsTOzfXqwriFccS2pk0=", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz", + "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==", "dev": true, "requires": { - "jest-regex-util": "^23.0.0", - "jest-snapshot": "^23.0.1" + "@jest/types": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-snapshot": "^26.6.2" } }, "jest-runner": { - "version": "23.1.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-23.1.0.tgz", - "integrity": "sha1-+iCpM//3MaVDKzVh5/ZCZZT6KbU=", - "dev": true, - "requires": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz", + "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==", + "dev": true, + "requires": { + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.7.1", "exit": "^0.1.2", - "graceful-fs": "^4.1.11", - "jest-config": "^23.1.0", - "jest-docblock": "^23.0.1", - "jest-haste-map": "^23.1.0", - "jest-jasmine2": "^23.1.0", - "jest-leak-detector": "^23.0.1", - "jest-message-util": "^23.1.0", - "jest-runtime": "^23.1.0", - "jest-util": "^23.1.0", - "jest-worker": "^23.0.1", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.3", + "jest-docblock": "^26.0.0", + "jest-haste-map": "^26.6.2", + "jest-leak-detector": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", "source-map-support": "^0.5.6", - "throat": "^4.0.0" + "throat": "^5.0.0" }, "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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 }, - "source-map-support": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz", - "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", + "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": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "has-flag": "^4.0.0" } } } }, "jest-runtime": { - "version": "23.1.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-23.1.0.tgz", - "integrity": "sha1-tK4OhyWeys/UqIS2OdsHz03WIK8=", - "dev": true, - "requires": { - "babel-core": "^6.0.0", - "babel-plugin-istanbul": "^4.1.6", - "chalk": "^2.0.1", - "convert-source-map": "^1.4.0", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz", + "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", + "dev": true, + "requires": { + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/globals": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0", + "cjs-module-lexer": "^0.6.0", + "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.1.11", - "jest-config": "^23.1.0", - "jest-haste-map": "^23.1.0", - "jest-message-util": "^23.1.0", - "jest-regex-util": "^23.0.0", - "jest-resolve": "^23.1.0", - "jest-snapshot": "^23.0.1", - "jest-util": "^23.1.0", - "jest-validate": "^23.0.1", - "micromatch": "^2.3.11", - "realpath-native": "^1.0.0", - "slash": "^1.0.0", - "strip-bom": "3.0.0", - "write-file-atomic": "^2.1.0", - "yargs": "^11.0.0" + "glob": "^7.1.3", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^15.4.1" }, "dependencies": { - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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 + }, + "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" + } } } }, "jest-serializer": { - "version": "23.0.1", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-23.0.1.tgz", - "integrity": "sha1-o3dq6zEekP6D+rnlM+hRAr0WQWU=", - "dev": true - }, - "jest-snapshot": { - "version": "23.0.1", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-23.0.1.tgz", - "integrity": "sha1-ZnT6Gbnraamcq+zUFb3cQtavPn4=", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", + "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", "dev": true, "requires": { - "chalk": "^2.0.1", - "jest-diff": "^23.0.1", - "jest-matcher-utils": "^23.0.1", - "mkdirp": "^0.5.1", + "@types/node": "*", + "graceful-fs": "^4.2.4" + } + }, + "jest-snapshot": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz", + "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.0.0", + "chalk": "^4.0.0", + "expect": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-haste-map": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", "natural-compare": "^1.4.0", - "pretty-format": "^23.0.1" + "pretty-format": "^26.6.2", + "semver": "^7.3.2" + }, + "dependencies": { + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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 + }, + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "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" + } + } } }, "jest-util": { - "version": "23.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-23.1.0.tgz", - "integrity": "sha1-wCUbrzRkTG3S/qeKli9CY6xVdy0=", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", "dev": true, "requires": { - "callsites": "^2.0.0", - "chalk": "^2.0.1", - "graceful-fs": "^4.1.11", - "is-ci": "^1.0.10", - "jest-message-util": "^23.1.0", - "mkdirp": "^0.5.1", - "slash": "^1.0.0", - "source-map": "^0.6.0" + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" }, "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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 + }, + "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" + } } } }, "jest-validate": { - "version": "23.0.1", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-23.0.1.tgz", - "integrity": "sha1-zZ8BqJ0mu4hfEqhmdxXpyGWldU8=", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", + "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", "dev": true, "requires": { - "chalk": "^2.0.1", - "jest-get-type": "^22.1.0", - "leven": "^2.1.0", - "pretty-format": "^23.0.1" + "@jest/types": "^26.6.2", + "camelcase": "^6.0.0", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "leven": "^3.1.0", + "pretty-format": "^26.6.2" + }, + "dependencies": { + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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 + }, + "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" + } + } } }, "jest-watcher": { - "version": "23.1.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-23.1.0.tgz", - "integrity": "sha1-qNWELjjZ+0r/+CPfartCpYrmzb0=", - "dev": true, - "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.1", - "string-length": "^2.0.0" + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", + "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", + "dev": true, + "requires": { + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^26.6.2", + "string-length": "^4.0.1" + }, + "dependencies": { + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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 + }, + "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" + } + } } }, "jest-worker": { - "version": "23.0.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-23.0.1.tgz", - "integrity": "sha1-nmSd2WP/QEYCb5HEAX8Dmmqkp7w=", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", "dev": true, "requires": { - "merge-stream": "^1.0.1" + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "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 + }, + "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" + } + } } }, "js-tokens": { @@ -3288,9 +12101,9 @@ "dev": true }, "js-yaml": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", - "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -3301,47 +12114,46 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true, - "optional": true + "dev": true }, "jsdom": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.11.0.tgz", - "integrity": "sha512-ou1VyfjwsSuWkudGxb03FotDajxAto6USAlmMZjE2lc0jCznt7sBWkhfRBRaWwbnmDqdMSTKTLT5d9sBFkkM7A==", - "dev": true, - "requires": { - "abab": "^1.0.4", - "acorn": "^5.3.0", - "acorn-globals": "^4.1.0", - "array-equal": "^1.0.0", - "cssom": ">= 0.3.2 < 0.4.0", - "cssstyle": ">= 0.3.1 < 0.4.0", - "data-urls": "^1.0.0", - "domexception": "^1.0.0", - "escodegen": "^1.9.0", - "html-encoding-sniffer": "^1.0.2", - "left-pad": "^1.2.0", - "nwsapi": "^2.0.0", - "parse5": "4.0.0", - "pn": "^1.1.0", - "request": "^2.83.0", - "request-promise-native": "^1.0.5", - "sax": "^1.2.4", - "symbol-tree": "^3.2.2", - "tough-cookie": "^2.3.3", - "w3c-hr-time": "^1.0.1", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.3", - "whatwg-mimetype": "^2.1.0", - "whatwg-url": "^6.4.1", - "ws": "^4.0.0", + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.4.0.tgz", + "integrity": "sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w==", + "dev": true, + "requires": { + "abab": "^2.0.3", + "acorn": "^7.1.1", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.2.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.0", + "domexception": "^2.0.1", + "escodegen": "^1.14.1", + "html-encoding-sniffer": "^2.0.1", + "is-potential-custom-element-name": "^1.0.0", + "nwsapi": "^2.2.0", + "parse5": "5.1.1", + "request": "^2.88.2", + "request-promise-native": "^1.0.8", + "saxes": "^5.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^3.0.1", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0", + "ws": "^7.2.3", "xml-name-validator": "^3.0.0" } }, "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, "json-parse-better-errors": { @@ -3350,6 +12162,12 @@ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", @@ -3357,11 +12175,20 @@ "dev": true }, "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "requires": { + "jsonify": "~0.0.0" + } + }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -3369,10 +12196,13 @@ "dev": true }, "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } }, "jsonfile": { "version": "4.0.0", @@ -3402,46 +12232,27 @@ } }, "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true, - "optional": true - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - } + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true }, - "lcov-parse": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", - "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=", + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true }, - "left-pad": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", - "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", + "lcov-parse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-1.0.0.tgz", + "integrity": "sha1-6w1GtUER68VhrLTECO+TY73I9+A=", "dev": true }, "leven": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", - "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true }, "levn": { @@ -3454,33 +12265,31 @@ "type-check": "~0.3.2" } }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - } + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true }, "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "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": "^2.0.0", - "path-exists": "^3.0.0" + "p-locate": "^4.1.0" } }, "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", "dev": true }, "lodash.sortby": { @@ -3495,31 +12304,38 @@ "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", "dev": true }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true - }, - "loose-envify": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { - "js-tokens": "^3.0.0" + "yallist": "^4.0.0" } }, - "lru-cache": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", - "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "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, "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, + "make-error": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", + "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", + "dev": true + }, "makeerror": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", @@ -3535,12 +12351,6 @@ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", "dev": true }, - "map-stream": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", - "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", - "dev": true - }, "map-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", @@ -3550,128 +12360,47 @@ "object-visit": "^1.0.0" } }, - "math-random": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", - "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", - "dev": true - }, - "mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, "memorystream": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", "dev": true }, - "merge": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz", - "integrity": "sha1-dTHjnUlJwoGma4xabgJl6LBYlNo=", + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, - "merge-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", - "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", "dev": true, "requires": { - "readable-stream": "^2.0.1" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - }, - "dependencies": { - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - } + "braces": "^3.0.1", + "picomatch": "^2.0.5" } }, "mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "version": "1.42.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.42.0.tgz", + "integrity": "sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ==", "dev": true }, "mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "version": "2.1.25", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.25.tgz", + "integrity": "sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg==", "dev": true, "requires": { - "mime-db": "~1.33.0" + "mime-db": "1.42.0" } }, "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, "minimatch": { @@ -3684,77 +12413,40 @@ } }, "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, "mixin-deep": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", "dev": true, "requires": { "for-in": "^1.0.2", "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } } }, "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "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": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - } + "minimist": "^1.2.5" } }, "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "requires": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "nan": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", - "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", - "dev": true, - "optional": true - }, "nanomatch": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", - "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", "dev": true, "requires": { "arr-diff": "^4.0.0", @@ -3762,21 +12454,12 @@ "define-property": "^2.0.2", "extend-shallow": "^3.0.2", "fragment-cache": "^0.2.1", - "is-odd": "^2.0.0", "is-windows": "^1.0.2", "kind-of": "^6.0.2", "object.pick": "^1.3.0", "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.1" - }, - "dependencies": { - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } } }, "natural-compare": { @@ -3786,9 +12469,9 @@ "dev": true }, "nice-try": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.4.tgz", - "integrity": "sha512-2NpiFHqC87y/zFke0fC0spBXL3bBsoh/p5H1EFhshxjCR5+0g2d6BiXbUFz9v1sAcxsk2htp2eQnNIci2dIYcA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, "node-int64": { @@ -3797,56 +12480,128 @@ "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", "dev": true }, + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "dev": true + }, "node-notifier": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.2.1.tgz", - "integrity": "sha512-MIBs+AAd6dJ2SklbbE8RUDRlIVhU8MaNLh1A9SUZDUHPiZkWLFde6UNwG41yQHZEToHgJMXqyVZ9UcS/ReOVTg==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.1.tgz", + "integrity": "sha512-BvEXF+UmsnAfYfoapKM9nGxnP+Wn7P91YfXmrKnfcYCx6VBeoN5Ez5Ogck6I8Bi5k4RlpqRYaw75pAwzX9OphA==", "dev": true, "requires": { "growly": "^1.3.0", - "semver": "^5.4.1", + "is-wsl": "^2.2.0", + "semver": "^7.3.2", "shellwords": "^0.1.1", - "which": "^1.3.0" + "uuid": "^8.3.0", + "which": "^2.0.2" + }, + "dependencies": { + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } } }, "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, "requires": { "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", + "resolve": "^1.10.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" } }, "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "npm-package-arg": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz", + "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==", "dev": true, "requires": { - "remove-trailing-separator": "^1.0.1" + "hosted-git-info": "^2.7.1", + "osenv": "^0.1.5", + "semver": "^5.6.0", + "validate-npm-package-name": "^3.0.0" + } + }, + "npm-registry-client": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/npm-registry-client/-/npm-registry-client-8.6.0.tgz", + "integrity": "sha512-Qs6P6nnopig+Y8gbzpeN/dkt+n7IyVd8f45NTMotGk6Qo7GfBmzwYx6jRLoOOgKiMnaQfYxsuyQlD8Mc3guBhg==", + "dev": true, + "requires": { + "concat-stream": "^1.5.2", + "graceful-fs": "^4.1.6", + "normalize-package-data": "~1.0.1 || ^2.0.0", + "npm-package-arg": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0", + "npmlog": "2 || ^3.1.0 || ^4.0.0", + "once": "^1.3.3", + "request": "^2.74.0", + "retry": "^0.10.0", + "safe-buffer": "^5.1.1", + "semver": "2 >=2.2.1 || 3.x || 4 || 5", + "slide": "^1.1.3", + "ssri": "^5.2.4" } }, "npm-run-all": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.3.tgz", - "integrity": "sha512-aOG0N3Eo/WW+q6sUIdzcV2COS8VnTZCmdji0VQIAZF3b+a3YWb0AD0vFIyjKec18A7beLGbaQ5jFTNI2bPt9Cg==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", + "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", "dev": true, "requires": { - "ansi-styles": "^3.2.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.4", + "ansi-styles": "^3.2.1", + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", "memorystream": "^0.3.1", "minimatch": "^3.0.4", - "ps-tree": "^1.1.0", + "pidtree": "^0.3.0", "read-pkg": "^3.0.0", "shell-quote": "^1.6.1", "string.prototype.padend": "^3.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" + } + }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -3925,29 +12680,44 @@ "path-key": "^2.0.0" } }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true + "dev": true, + "optional": true }, "nwsapi": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.0.1.tgz", - "integrity": "sha512-xOJJb7kAAGy6UOklbaIPA0iu/27VMHfAbMUgYJlXz4qRXytIkPGM2vwfbxa+tbaqcqHNsP6RN4eDZlePelWKpQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", "dev": true }, "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", "dev": true }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true + "dev": true, + "optional": true }, "object-copy": { "version": "0.1.0", @@ -3968,13 +12738,59 @@ "requires": { "is-descriptor": "^0.1.0" } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } } } }, "object-keys": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", - "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", + "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", "dev": true }, "object-visit": { @@ -3986,26 +12802,6 @@ "isobject": "^3.0.0" } }, - "object.getownpropertydescriptors": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", - "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.5.1" - } - }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, - "requires": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" - } - }, "object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", @@ -4024,44 +12820,27 @@ "wrappy": "1" } }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - }, - "dependencies": { - "minimist": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", - "dev": true - } + "mimic-fn": "^2.1.0" } }, "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "dev": true, "requires": { "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", + "fast-levenshtein": "~2.0.6", "levn": "~0.3.0", "prelude-ls": "~1.1.2", "type-check": "~0.3.2", - "wordwrap": "~1.0.0" - }, - "dependencies": { - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - } + "word-wrap": "~1.2.3" } }, "os-homedir": { @@ -4070,23 +12849,28 @@ "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "dev": true, - "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" - } - }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-each-series": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", + "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", + "dev": true + }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", @@ -4094,60 +12878,51 @@ "dev": true }, "p-limit": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", - "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", "dev": true, "requires": { - "p-try": "^1.0.0" + "p-try": "^2.0.0" } }, "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "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": "^1.1.0" + "p-limit": "^2.2.0" } }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" - } + "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==", + "dev": true }, "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", "dev": true, "requires": { - "error-ex": "^1.2.0" + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" } }, "parse5": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", - "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", "dev": true }, "parsimmon": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/parsimmon/-/parsimmon-1.7.3.tgz", - "integrity": "sha512-ZkEqdG3ygzGAa44cDEDAgQoslSSIOVuTw7k1Yct+2AX+3JkezNWBuzz2ON/j7RhxXptTQC7rwGxPg//rDFTvqQ==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/parsimmon/-/parsimmon-1.13.0.tgz", + "integrity": "sha512-5UIrOCW+gjbILkjKPgTgmq8LKf8TT3Iy7kN2VD7OtQ81facKn8B4gG1X94jWqXYZsxG2KbJhrv/Yq/5H6BQn7A==", "dev": true }, "pascalcase": { @@ -4157,9 +12932,9 @@ "dev": true }, "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "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 }, "path-is-absolute": { @@ -4175,73 +12950,47 @@ "dev": true }, "path-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "pause-stream": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", - "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", - "dev": true, - "requires": { - "through": "~2.3" - } - }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "dev": true }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", "dev": true }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "pidtree": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.0.tgz", + "integrity": "sha512-9CT4NFlDcosssyg8KVFltgokyKZIFjoBxw8CTGy+5F38Y1eQWrt8tRayiUOXE+zVKQnYu5BR8JjCtvK3BcnBhg==", "dev": true }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", "dev": true, "requires": { - "pinkie": "^2.0.0" + "node-modules-regexp": "^1.0.0" } }, "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "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==", "dev": true, "requires": { - "find-up": "^2.1.0" + "find-up": "^4.0.0" } }, - "pn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", - "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", - "dev": true - }, "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", @@ -4254,67 +13003,60 @@ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", "dev": true }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true - }, "prettier": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.13.3.tgz", - "integrity": "sha512-CIWJNU+cFFdeA0GJSzzFkxiq2WuMvWZMlz6cV/EXhPlRnI3esSFMh+lNmyZ8z/X8O8C1U60Sc8puXALj4/WmZw==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", + "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", "dev": true }, "pretty-format": { - "version": "23.0.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.0.1.tgz", - "integrity": "sha1-1h0GUmjkx1kIO8y8onoBrXx2AfQ=", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", "dev": true, "requires": { - "ansi-regex": "^3.0.0", - "ansi-styles": "^3.2.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - } + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" } }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true - }, "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, - "ps-tree": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.1.0.tgz", - "integrity": "sha1-tCGyQUDWID8e08dplrRCewjowBQ=", + "prompts": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz", + "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==", "dev": true, "requires": { - "event-stream": "~3.3.0" + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" } }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", "dev": true }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "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 }, "qs": { @@ -4323,77 +13065,55 @@ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "dev": true }, - "randomatic": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz", - "integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==", + "react-is": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz", + "integrity": "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA==", + "dev": true + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, "requires": { - "is-number": "^4.0.0", - "kind-of": "^6.0.0", - "math-random": "^1.0.1" + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" }, "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "dev": true } } }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } - }, "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "dev": true, "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" }, "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.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==", + "dev": true } } }, "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -4403,42 +13123,14 @@ "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" - } - }, - "readdirp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", - "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "minimatch": "^3.0.2", - "readable-stream": "^2.0.2", - "set-immediate-shim": "^1.0.1" - } - }, - "realpath-native": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.0.0.tgz", - "integrity": "sha512-XJtlRJ9jf0E1H1SLeJyQ9PGzQD7S65h1pRXEcAeK48doKOnKxcgPeNohJvD5u/2sI9J1oke6E8bZHS/fmW1UiQ==", - "dev": true, - "requires": { - "util.promisify": "^1.0.0" - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "dev": true, - "requires": { - "is-equal-shallow": "^0.1.3" + }, + "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 + } } }, "regex-not": { @@ -4458,9 +13150,9 @@ "dev": true }, "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", "dev": true }, "repeat-string": { @@ -4469,61 +13161,76 @@ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", "dev": true }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "^1.0.0" - } - }, "request": { - "version": "2.87.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", - "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", "dev": true, "requires": { "aws-sign2": "~0.7.0", - "aws4": "^1.6.0", + "aws4": "^1.8.0", "caseless": "~0.12.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.1", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", "forever-agent": "~0.6.1", - "form-data": "~2.3.1", - "har-validator": "~5.0.3", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", "http-signature": "~1.2.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.17", - "oauth-sign": "~0.8.2", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", "performance-now": "^2.1.0", - "qs": "~6.5.1", - "safe-buffer": "^5.1.1", - "tough-cookie": "~2.3.3", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", "tunnel-agent": "^0.6.0", - "uuid": "^3.1.0" + "uuid": "^3.3.2" + }, + "dependencies": { + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + } } }, "request-promise-core": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz", - "integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", "dev": true, "requires": { - "lodash": "^4.13.1" + "lodash": "^4.17.19" } }, "request-promise-native": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.5.tgz", - "integrity": "sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU=", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", + "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", "dev": true, "requires": { - "request-promise-core": "1.1.1", - "stealthy-require": "^1.1.0", - "tough-cookie": ">=2.3.3" + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + }, + "dependencies": { + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + } } }, "require-directory": { @@ -4533,30 +13240,34 @@ "dev": true }, "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "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==", "dev": true }, "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "dev": true, + "requires": { + "is-core-module": "^2.1.0", + "path-parse": "^1.0.6" + } }, "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, "requires": { - "resolve-from": "^3.0.0" + "resolve-from": "^5.0.0" } }, "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true }, "resolve-url": { @@ -4571,35 +13282,31 @@ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", "dev": true }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "dev": true, - "optional": true, - "requires": { - "align-text": "^0.1.1" - } + "retry": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", + "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=", + "dev": true }, "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "requires": { - "glob": "^7.0.5" + "glob": "^7.1.3" } }, "rsvp": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", - "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==", + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", "dev": true }, "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==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", "dev": true }, "safe-regex": { @@ -4611,29 +13318,117 @@ "ret": "~0.1.10" } }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, "sane": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/sane/-/sane-2.5.2.tgz", - "integrity": "sha1-tNwYYcIbQn6SlQej51HiosuKs/o=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", "dev": true, "requires": { + "@cnakazawa/watch": "^1.0.3", "anymatch": "^2.0.0", - "capture-exit": "^1.2.0", - "exec-sh": "^0.2.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", "fb-watchman": "^2.0.0", - "fsevents": "^1.2.3", "micromatch": "^3.1.4", "minimist": "^1.1.1", - "walker": "~1.0.5", - "watch": "~0.18.0" + "walker": "~1.0.5" }, "dependencies": { - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", "dev": true }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", @@ -4654,19 +13449,41 @@ "snapdragon": "^0.8.1", "to-regex": "^3.0.2" } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } } } }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true + "saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "requires": { + "xmlchars": "^2.2.0" + } }, "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", "dev": true }, "set-blocking": { @@ -4675,16 +13492,10 @@ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", - "dev": true - }, "set-value": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", "dev": true, "requires": { "extend-shallow": "^2.0.1", @@ -4701,6 +13512,12 @@ "requires": { "is-extendable": "^0.1.0" } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true } } }, @@ -4743,10 +13560,22 @@ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "slide": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", + "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", "dev": true }, "snapdragon": { @@ -4765,23 +13594,107 @@ "use": "^3.1.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" + } + }, "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true } } }, @@ -4804,41 +13717,6 @@ "requires": { "is-descriptor": "^1.0.0" } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true } } }, @@ -4849,21 +13727,32 @@ "dev": true, "requires": { "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, "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 }, "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", "dev": true, "requires": { - "atob": "^2.1.1", + "atob": "^2.1.2", "decode-uri-component": "^0.2.0", "resolve-url": "^0.2.1", "source-map-url": "^0.4.0", @@ -4871,12 +13760,13 @@ } }, "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", "dev": true, "requires": { - "source-map": "^0.5.6" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, "source-map-url": { @@ -4886,9 +13776,9 @@ "dev": true }, "spdx-correct": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", - "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", @@ -4896,9 +13786,9 @@ } }, "spdx-exceptions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", - "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", "dev": true }, "spdx-expression-parse": { @@ -4912,20 +13802,11 @@ } }, "spdx-license-ids": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", - "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.3.tgz", + "integrity": "sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g==", "dev": true }, - "split": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", - "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", - "dev": true, - "requires": { - "through": "2" - } - }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -4942,9 +13823,9 @@ "dev": true }, "sshpk": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", - "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", "dev": true, "requires": { "asn1": "~0.2.3", @@ -4954,14 +13835,35 @@ "ecc-jsbn": "~0.1.1", "getpass": "^0.1.1", "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", "tweetnacl": "~0.14.0" } }, + "ssri": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", + "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.1" + } + }, "stack-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.1.tgz", - "integrity": "sha1-1PM6tU6OOHeLDKXP07OvsS22hiA=", - "dev": true + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", + "dev": true, + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + } + } }, "static-extend": { "version": "0.1.2", @@ -4981,6 +13883,63 @@ "requires": { "is-descriptor": "^0.1.0" } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true } } }, @@ -4990,23 +13949,42 @@ "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", "dev": true }, - "stream-combiner": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", - "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "duplexer": "~0.1.1" + "safe-buffer": "~5.1.0" + }, + "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 + } } }, "string-length": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", - "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz", + "integrity": "sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw==", "dev": true, "requires": { - "astral-regex": "^1.0.0", - "strip-ansi": "^4.0.0" + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "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" + } + } } }, "string-width": { @@ -5014,6 +13992,7 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, + "optional": true, "requires": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" @@ -5030,20 +14009,12 @@ "function-bind": "^1.0.2" } }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, + "optional": true, "requires": { "ansi-regex": "^3.0.0" }, @@ -5052,18 +14023,16 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true + "dev": true, + "optional": true } } }, "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } + "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 }, "strip-eof": { "version": "1.0.0", @@ -5071,107 +14040,129 @@ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true }, - "subarg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", - "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", - "dev": true, - "requires": { - "minimist": "^1.1.0" - } - }, "supports-color": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.2.0.tgz", - "integrity": "sha512-F39vS48la4YvTZUPVeTqsjsFNrvcMwrV3RLZINsmHo+7djCvuUzSIeXOnZ5hmjef4bajL1dNccN+tg5XAliO5Q==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "supports-hyperlinks": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz", + "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "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 + }, + "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" + } + } } }, "symbol-tree": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", - "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, - "test-exclude": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.2.1.tgz", - "integrity": "sha512-qpqlP/8Zl+sosLxBcVKl9vYy26T9NPalxSzzCP/OY6K7j938ui2oKgo+kRZYfxAeIpLqpbVnsHq1tyV70E4lWQ==", + "tar": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", + "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", "dev": true, "requires": { - "arrify": "^1.0.1", - "micromatch": "^3.1.8", - "object-assign": "^4.1.0", - "read-pkg-up": "^1.0.1", - "require-main-filename": "^1.0.1" + "block-stream": "*", + "fstream": "^1.0.12", + "inherits": "2" + } + }, + "tar-stream": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.4.tgz", + "integrity": "sha512-o3pS2zlG4gxr67GmFYBLlq+dM8gyRGUOvsrHclSkvtVtQbjV0s/+ZE8OpICbaj8clrX3tjeHngYGP7rweaBnuw==", + "dev": true, + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" }, "dependencies": { - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "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": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } } } }, - "thenify": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz", - "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=", + "terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", "dev": true, "requires": { - "any-promise": "^1.0.0" + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" } }, - "thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", + "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==", "dev": true, "requires": { - "thenify": ">= 3.1.0 < 4" + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" } }, "throat": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", - "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", "dev": true }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true + "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" + } }, "tmpl": { "version": "1.0.4", @@ -5180,9 +14171,9 @@ "dev": true }, "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "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 }, "to-object-path": { @@ -5192,6 +14183,17 @@ "dev": true, "requires": { "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, "to-regex": { @@ -5206,337 +14208,122 @@ "safe-regex": "^1.1.0" } }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "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, "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" + "is-number": "^7.0.0" } }, "tough-cookie": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", - "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", "dev": true, "requires": { - "punycode": "^1.4.1" + "ip-regex": "^2.1.0", + "psl": "^1.1.28", + "punycode": "^2.1.1" } }, "tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", + "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", "dev": true, "requires": { - "punycode": "^2.1.0" - }, - "dependencies": { - "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 - } + "punycode": "^2.1.1" } }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true - }, "ts-jest": { - "version": "22.4.6", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-22.4.6.tgz", - "integrity": "sha512-kYQ6g1G1AU+bOO9rv+SSQXg4WTcni6Wx3AM48iHni0nP1vIuhdNRjKTE9Cxx36Ix/IOV7L85iKu07dgXJzH2pQ==", - "dev": true, - "requires": { - "babel-core": "^6.26.3", - "babel-plugin-istanbul": "^4.1.6", - "babel-plugin-transform-es2015-modules-commonjs": "^6.26.2", - "babel-preset-jest": "^22.4.3", - "cpx": "^1.5.0", - "fs-extra": "6.0.0", - "jest-config": "^22.4.3", - "lodash": "^4.17.10", - "pkg-dir": "^2.0.0", - "source-map-support": "^0.5.5", - "yargs": "^11.0.0" + "version": "26.4.4", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.4.4.tgz", + "integrity": "sha512-3lFWKbLxJm34QxyVNNCgXX1u4o/RV0myvA2y2Bxm46iGIjKlaY0own9gIckbjZJPn+WaJEnfPPJ20HHGpoq4yg==", + "dev": true, + "requires": { + "@types/jest": "26.x", + "bs-logger": "0.x", + "buffer-from": "1.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^26.1.0", + "json5": "2.x", + "lodash.memoize": "4.x", + "make-error": "1.x", + "mkdirp": "1.x", + "semver": "7.x", + "yargs-parser": "20.x" }, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "babel-plugin-jest-hoist": { - "version": "22.4.4", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-22.4.4.tgz", - "integrity": "sha512-DUvGfYaAIlkdnygVIEl0O4Av69NtuQWcrjMOv6DODPuhuGLDnbsARz3AwiiI/EkIMMlxQDUcrZ9yoyJvTNjcVQ==", - "dev": true - }, - "babel-preset-jest": { - "version": "22.4.4", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-22.4.4.tgz", - "integrity": "sha512-+dxMtOFwnSYWfum0NaEc0O03oSdwBsjx4tMSChRDPGwu/4wSY6Q6ANW3wkjKpJzzguaovRs/DODcT4hbSN8yiA==", - "dev": true, - "requires": { - "babel-plugin-jest-hoist": "^22.4.4", - "babel-plugin-syntax-object-rest-spread": "^6.13.0" - } - }, - "expect": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/expect/-/expect-22.4.3.tgz", - "integrity": "sha512-XcNXEPehqn8b/jm8FYotdX0YrXn36qp4HWlrVT4ktwQas1l1LPxiVWncYnnL2eyMtKAmVIaG0XAp0QlrqJaxaA==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "jest-diff": "^22.4.3", - "jest-get-type": "^22.4.3", - "jest-matcher-utils": "^22.4.3", - "jest-message-util": "^22.4.3", - "jest-regex-util": "^22.4.3" - } - }, - "jest-config": { - "version": "22.4.4", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-22.4.4.tgz", - "integrity": "sha512-9CKfo1GC4zrXSoMLcNeDvQBfgtqGTB1uP8iDIZ97oB26RCUb886KkKWhVcpyxVDOUxbhN+uzcBCeFe7w+Iem4A==", - "dev": true, - "requires": { - "chalk": "^2.0.1", - "glob": "^7.1.1", - "jest-environment-jsdom": "^22.4.1", - "jest-environment-node": "^22.4.1", - "jest-get-type": "^22.1.0", - "jest-jasmine2": "^22.4.4", - "jest-regex-util": "^22.1.0", - "jest-resolve": "^22.4.2", - "jest-util": "^22.4.1", - "jest-validate": "^22.4.4", - "pretty-format": "^22.4.0" - } - }, - "jest-diff": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-22.4.3.tgz", - "integrity": "sha512-/QqGvCDP5oZOF6PebDuLwrB2BMD8ffJv6TAGAdEVuDx1+uEgrHpSFrfrOiMRx2eJ1hgNjlQrOQEHetVwij90KA==", - "dev": true, - "requires": { - "chalk": "^2.0.1", - "diff": "^3.2.0", - "jest-get-type": "^22.4.3", - "pretty-format": "^22.4.3" - } - }, - "jest-environment-jsdom": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-22.4.3.tgz", - "integrity": "sha512-FviwfR+VyT3Datf13+ULjIMO5CSeajlayhhYQwpzgunswoaLIPutdbrnfUHEMyJCwvqQFaVtTmn9+Y8WCt6n1w==", - "dev": true, - "requires": { - "jest-mock": "^22.4.3", - "jest-util": "^22.4.3", - "jsdom": "^11.5.1" - } - }, - "jest-environment-node": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-22.4.3.tgz", - "integrity": "sha512-reZl8XF6t/lMEuPWwo9OLfttyC26A5AMgDyEQ6DBgZuyfyeNUzYT8BFo6uxCCP/Av/b7eb9fTi3sIHFPBzmlRA==", - "dev": true, - "requires": { - "jest-mock": "^22.4.3", - "jest-util": "^22.4.3" - } - }, - "jest-jasmine2": { - "version": "22.4.4", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-22.4.4.tgz", - "integrity": "sha512-nK3vdUl50MuH7vj/8at7EQVjPGWCi3d5+6aCi7Gxy/XMWdOdbH1qtO/LjKbqD8+8dUAEH+BVVh7HkjpCWC1CSw==", - "dev": true, - "requires": { - "chalk": "^2.0.1", - "co": "^4.6.0", - "expect": "^22.4.0", - "graceful-fs": "^4.1.11", - "is-generator-fn": "^1.0.0", - "jest-diff": "^22.4.0", - "jest-matcher-utils": "^22.4.0", - "jest-message-util": "^22.4.0", - "jest-snapshot": "^22.4.0", - "jest-util": "^22.4.1", - "source-map-support": "^0.5.0" - } - }, - "jest-matcher-utils": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-22.4.3.tgz", - "integrity": "sha512-lsEHVaTnKzdAPR5t4B6OcxXo9Vy4K+kRRbG5gtddY8lBEC+Mlpvm1CJcsMESRjzUhzkz568exMV1hTB76nAKbA==", - "dev": true, - "requires": { - "chalk": "^2.0.1", - "jest-get-type": "^22.4.3", - "pretty-format": "^22.4.3" - } - }, - "jest-message-util": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-22.4.3.tgz", - "integrity": "sha512-iAMeKxhB3Se5xkSjU0NndLLCHtP4n+GtCqV0bISKA5dmOXQfEbdEmYiu2qpnWBDCQdEafNDDU6Q+l6oBMd/+BA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0-beta.35", - "chalk": "^2.0.1", - "micromatch": "^2.3.11", - "slash": "^1.0.0", - "stack-utils": "^1.0.1" - } - }, - "jest-mock": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-22.4.3.tgz", - "integrity": "sha512-+4R6mH5M1G4NK16CKg9N1DtCaFmuxhcIqF4lQK/Q1CIotqMs/XBemfpDPeVZBFow6iyUNu6EBT9ugdNOTT5o5Q==", - "dev": true - }, - "jest-regex-util": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-22.4.3.tgz", - "integrity": "sha512-LFg1gWr3QinIjb8j833bq7jtQopiwdAs67OGfkPrvy7uNUbVMfTXXcOKXJaeY5GgjobELkKvKENqq1xrUectWg==", + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true }, - "jest-resolve": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-22.4.3.tgz", - "integrity": "sha512-u3BkD/MQBmwrOJDzDIaxpyqTxYH+XqAXzVJP51gt29H8jpj3QgKof5GGO2uPGKGeA1yTMlpbMs1gIQ6U4vcRhw==", - "dev": true, - "requires": { - "browser-resolve": "^1.11.2", - "chalk": "^2.0.1" - } - }, - "jest-snapshot": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-22.4.3.tgz", - "integrity": "sha512-JXA0gVs5YL0HtLDCGa9YxcmmV2LZbwJ+0MfyXBBc5qpgkEYITQFJP7XNhcHFbUvRiniRpRbGVfJrOoYhhGE0RQ==", - "dev": true, - "requires": { - "chalk": "^2.0.1", - "jest-diff": "^22.4.3", - "jest-matcher-utils": "^22.4.3", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "pretty-format": "^22.4.3" - } - }, - "jest-util": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-22.4.3.tgz", - "integrity": "sha512-rfDfG8wyC5pDPNdcnAlZgwKnzHvZDu8Td2NJI/jAGKEGxJPYiE4F0ss/gSAkG4778Y23Hvbz+0GMrDJTeo7RjQ==", - "dev": true, - "requires": { - "callsites": "^2.0.0", - "chalk": "^2.0.1", - "graceful-fs": "^4.1.11", - "is-ci": "^1.0.10", - "jest-message-util": "^22.4.3", - "mkdirp": "^0.5.1", - "source-map": "^0.6.0" - } - }, - "jest-validate": { - "version": "22.4.4", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-22.4.4.tgz", - "integrity": "sha512-dmlf4CIZRGvkaVg3fa0uetepcua44DHtktHm6rcoNVtYlpwe6fEJRkMFsaUVcFHLzbuBJ2cPw9Gl9TKfnzMVwg==", - "dev": true, - "requires": { - "chalk": "^2.0.1", - "jest-config": "^22.4.4", - "jest-get-type": "^22.1.0", - "leven": "^2.1.0", - "pretty-format": "^22.4.0" - } - }, - "pretty-format": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-22.4.3.tgz", - "integrity": "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==", + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", "dev": true, "requires": { - "ansi-regex": "^3.0.0", - "ansi-styles": "^3.2.0" + "lru-cache": "^6.0.0" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "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 - }, - "source-map-support": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz", - "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } } } }, "tslib": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.1.tgz", - "integrity": "sha512-avfPS28HmGLLc2o4elcc2EIq2FcH++Yo5YxpBZi9Yw93BCTGFthI4HPE4Rpep6vSYQaK8e69PelM44tPj+RaQg==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", "dev": true }, "tslint": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.10.0.tgz", - "integrity": "sha1-EeJrzLiK+gLdDZlWyuPUVAtfVMM=", + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.1.tgz", + "integrity": "sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg==", "dev": true, "requires": { - "babel-code-frame": "^6.22.0", + "@babel/code-frame": "^7.0.0", "builtin-modules": "^1.1.1", "chalk": "^2.3.0", "commander": "^2.12.1", - "diff": "^3.2.0", + "diff": "^4.0.1", "glob": "^7.1.1", - "js-yaml": "^3.7.0", + "js-yaml": "^3.13.1", "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", "resolve": "^1.3.2", "semver": "^5.3.0", "tslib": "^1.8.0", - "tsutils": "^2.12.1" + "tsutils": "^2.29.0" }, "dependencies": { - "resolve": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", - "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", - "dev": true, - "requires": { - "path-parse": "^1.0.5" - } + "diff": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", + "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==", + "dev": true } } }, "tslint-config-prettier": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslint-config-prettier/-/tslint-config-prettier-1.13.0.tgz", - "integrity": "sha512-assE77K7K8Q9j8CVIHiU3d1uoKc8N5v7UPpkQ9IE8BEPWkvSYR37lDuYekDlAMFqR1IpD6CrS+uOJLl6pw7Wdw==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/tslint-config-prettier/-/tslint-config-prettier-1.18.0.tgz", + "integrity": "sha512-xPw9PgNPLG3iKRxmK7DWr+Ea/SzrvfHtjFt5LBl61gk2UBG/DB9kCXRjv+xyIU1rUtnayLeMUVJBcMX8Z17nDg==", "dev": true }, "tsutils": { - "version": "2.27.1", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.27.1.tgz", - "integrity": "sha512-AE/7uzp32MmaHvNNFES85hhUDHFdFZp6OAiZcd6y4ZKKIg6orJTm8keYWBhIhrJQH3a4LzNKat7ZPXZt5aTf6w==", + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", "dev": true, "requires": { "tslib": "^1.8.1" @@ -5555,8 +14342,7 @@ "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true, - "optional": true + "dev": true }, "type-check": { "version": "0.3.2", @@ -5567,85 +14353,63 @@ "prelude-ls": "~1.1.2" } }, - "typescript": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.8.3.tgz", - "integrity": "sha512-K7g15Bb6Ra4lKf7Iq2l/I5/En+hLIHmxWZGq3D4DIRNFxMNV6j2SHSvDOqs2tGd4UvD/fJvrwopzQXjLrT7Itw==", + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", "dev": true }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "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==", "dev": true, - "optional": true, "requires": { - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" - }, - "dependencies": { - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "optional": true, - "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - } - } + "is-typedarray": "^1.0.0" } }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "dev": true, - "optional": true + "typescript": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.2.tgz", + "integrity": "sha512-thGloWsGH3SOxv1SoY7QojKi0tc+8FnOmiarEGMbd/lar7QOEd3hvlx3Fp5y6FlDUGl9L+pd4n2e+oToGMmhRQ==", + "dev": true }, "union-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", - "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", "dev": true, "requires": { "arr-union": "^3.1.0", "get-value": "^2.0.6", "is-extendable": "^0.1.1", - "set-value": "^0.4.3" + "set-value": "^2.0.1" }, "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" - } + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true } } }, "universalify": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", - "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true }, "unset-value": { @@ -5688,6 +14452,15 @@ } } }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, "urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", @@ -5695,21 +14468,10 @@ "dev": true }, "use": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", - "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true }, "util-deprecate": { "version": "1.0.2", @@ -5717,32 +14479,50 @@ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, - "util.promisify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", - "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "uuid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", + "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==", + "dev": true + }, + "v8-to-istanbul": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.0.0.tgz", + "integrity": "sha512-fLL2rFuQpMtm9r8hrAV2apXX/WqHJ6+IC4/eQVdMDGBUgH/YMV4Gv3duk3kjmyg6uiQWBAA9nJwue4iJUOkHeA==", "dev": true, "requires": { - "define-properties": "^1.1.2", - "object.getownpropertydescriptors": "^2.0.3" + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "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 + } } }, - "uuid": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", - "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==", - "dev": true - }, "validate-npm-package-license": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", - "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, "requires": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, + "validate-npm-package-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", + "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", + "dev": true, + "requires": { + "builtins": "^1.0.3" + } + }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", @@ -5755,12 +14535,21 @@ } }, "w3c-hr-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", - "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "requires": { + "browser-process-hrtime": "^1.0.0" + } + }, + "w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", "dev": true, "requires": { - "browser-process-hrtime": "^0.1.2" + "xml-name-validator": "^3.0.0" } }, "walker": { @@ -5772,46 +14561,36 @@ "makeerror": "1.0.x" } }, - "watch": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/watch/-/watch-0.18.0.tgz", - "integrity": "sha1-KAlUdsbffJDJYxOJkMClQj60uYY=", - "dev": true, - "requires": { - "exec-sh": "^0.2.0", - "minimist": "^1.2.0" - } - }, "webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", "dev": true }, "whatwg-encoding": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz", - "integrity": "sha512-jLBwwKUhi8WtBfsMQlL4bUUcT8sMkAtQinscJAe/M4KHCkHuUJAF6vuB0tueNIw4c8ziO6AkRmgY+jL3a0iiPw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", "dev": true, "requires": { - "iconv-lite": "0.4.19" + "iconv-lite": "0.4.24" } }, "whatwg-mimetype": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.1.0.tgz", - "integrity": "sha512-FKxhYLytBQiUKjkYteN71fAUA3g6KpNXoho1isLiLSB3N1G4F35Q5vUxWfKFhBwi5IWF27VE6WxhrnnC+m0Mew==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", "dev": true }, "whatwg-url": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.4.1.tgz", - "integrity": "sha512-FwygsxsXx27x6XXuExA/ox3Ktwcbf+OAvrKmLulotDAiO1Q6ixchPFaHYsis2zZBZSJTR0+dR+JVtf7MlbqZjw==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.4.0.tgz", + "integrity": "sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw==", "dev": true, "requires": { "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" + "tr46": "^2.0.2", + "webidl-conversions": "^6.1.0" } }, "which": { @@ -5829,56 +14608,57 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "dev": true, - "optional": true + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } }, - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true }, "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "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": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "dependencies": { "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } + "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 }, "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "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": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" } }, "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "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": "^2.0.0" + "ansi-regex": "^5.0.0" } } } @@ -5890,25 +14670,22 @@ "dev": true }, "write-file-atomic": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", - "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", + "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==", "dev": true, "requires": { - "graceful-fs": "^4.1.11", "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" } }, "ws": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-4.1.0.tgz", - "integrity": "sha512-ZGh/8kF9rrRNffkLFV4AzhvooEclrOH0xaugmqGsIfFgOE/pIz4fMc4Ef+5HSQqTEug2S9JZIWDR47duDSLfaA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0" - } + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.1.tgz", + "integrity": "sha512-pTsP8UAfhy3sk1lSk/O/s4tjD0CRwvMnzvwr4OKGX7ZvqZtUyx4KIJB5JWbkykPoc55tixMGgTNoh3k4FkNGFQ==", + "dev": true }, "xml-name-validator": { "version": "3.0.0", @@ -5916,66 +14693,79 @@ "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", "dev": true }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", "dev": true }, "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, "yargs": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.0.0.tgz", - "integrity": "sha512-Rjp+lMYQOWtgqojx1dEWorjCofi1YN7AoFvYV7b1gx/7dAAeuI4kN5SZiEvr0ZmsZTOpDRcCqrpI10L31tFkBw==", + "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": "^4.0.0", - "decamelize": "^1.1.1", - "find-up": "^2.1.0", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", + "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": "^1.0.1", + "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", - "string-width": "^2.0.0", + "string-width": "^4.2.0", "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^9.0.2" + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" }, "dependencies": { - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "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 + }, + "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": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" + "ansi-regex": "^5.0.0" } } } }, "yargs-parser": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", - "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", + "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": "^4.1.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - } + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } } } diff --git a/package.json b/package.json index c82add4..432e831 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ts-enum-util", - "version": "2.0.3", + "version": "4.1.0", "description": "TypeScript Enum Utilities", "repository": { "type": "git", @@ -27,16 +27,15 @@ "lint:fix": "npm run lint -- --fix", "prettier:test": "prettier --list-different \"{src,tests,type_tests}/**/*.ts\"", "prettier:fix": "prettier --write \"{src,tests,type_tests}/**/*.ts\"", - "build:types": "tsc --project src/tsconfig.json --pretty --noErrorTruncation --emitDeclarationOnly true --outDir dist/types", - "build:commonjs": "tsc --project src/tsconfig.json --pretty --noErrorTruncation --declaration false --outDir dist/commonjs", - "build:es": "tsc --project src/tsconfig.json --pretty --noErrorTruncation --declaration false -m es6 --outDir dist/es", + "build:types": "tsc --project src/tsconfig.json --pretty --noErrorTruncation --emitDeclarationOnly true --declarationMap true --outDir dist/types", + "build:commonjs": "tsc --project src/tsconfig.json --pretty --removeComments --noErrorTruncation --declaration false --outDir dist/commonjs", + "build:es": "tsc --project src/tsconfig.json --pretty --removeComments --noErrorTruncation --declaration false -m es6 --outDir dist/es", "build": "npm run clean:dist && run-p build:types build:es build:commonjs", "pack": "run-p clean:pack build && npm pack", "jest": "jest", "jest:coverage": "npm run clean:coverage && jest --coverage", - "dtslint:v2_3_plus": "dtslint type_tests/v2_3_plus", - "dtslint:v2_4_plus": "dtslint type_tests/v2_4_plus", - "dtslint": "run-s dtslint:v2_3_plus dtslint:v2_4_plus", + "dtslint:v2_9_plus": "dtslint --expectOnly --localTs node_modules/typescript/lib type_tests/v2_9_plus", + "dtslint": "run-s clean:dist build:types dtslint:v2_9_plus", "test": "run-s compile prettier:test lint dtslint jest", "test:coverage": "run-s compile prettier:test lint dtslint jest:coverage", "build:travis": "run-p test:coverage build && cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js" @@ -48,26 +47,24 @@ }, "license": "MIT", "devDependencies": { - "@types/jest": "22.2.3", - "@types/node": "10.3.0", - "coveralls": "3.0.1", - "dtslint": "0.3.0", - "jest": "23.1.0", - "npm-run-all": "4.1.3", - "prettier": "1.13.3", - "rimraf": "2.6.2", - "ts-jest": "22.4.6", - "tslint": "5.10.0", - "tslint-config-prettier": "1.13.0", - "typescript": "2.8.3" - }, - "peerDependencies": { - "typescript": ">= 2.3.1 < 2.9" + "@types/jest": "26.0.18", + "coveralls": "3.1.0", + "dtslint": "4.0.7", + "jest": "26.6.3", + "npm-run-all": "4.1.5", + "prettier": "1.19.1", + "rimraf": "3.0.2", + "ts-jest": "26.4.4", + "tslint": "5.20.1", + "tslint-config-prettier": "1.18.0", + "typescript": "4.1.2" }, "keywords": [ "typescript", "string", "number", + "literal", + "union", "enum", "util" ], diff --git a/src/$enum.ts b/src/$enum.ts new file mode 100644 index 0000000..55e1c51 --- /dev/null +++ b/src/$enum.ts @@ -0,0 +1,73 @@ +import { EnumWrapper } from "./EnumWrapper"; +import { StringKeyOf } from "./types"; +import * as symbols from "./symbols"; +import { visitEnumValue } from "./visitEnumValue"; +import { mapEnumValue } from "./mapEnumValue"; + +/** + * Map of enum object -> EnumWrapper instance. + * Used as a cache for {@link $enum}. + * NOTE: WeakMap has very fast lookups and avoids memory leaks if used on a + * temporary enum-like object. Even if a WeakMap implementation is very + * naiive (like a Map polyfill), lookups are plenty fast for this use case + * of a relatively small number of enums within a project. Just don't + * perform cached lookups inside tight loops when you could cache the + * result in a local variable, and you'll be fine :) + * {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap} + * {@link https://www.measurethat.net/Benchmarks/Show/2513/5/map-keyed-by-object} + */ +const enumWrapperInstancesCache = new WeakMap(); + +/** + * Gets a cached EnumWrapper for an enum-like object with number values. + * Creates and caches a new EnumWrapper if one is not already cached. + * @param enumObj - An enum-like object with number values. + * @return An instance of EnumWrapper for the provided enumObj. + * + * @template T - Type of the enum-like object that is being wrapped. + */ +export function $enum< + V extends number, + T extends Record, number> +>(enumObj: T): EnumWrapper; +/** + * Gets a cached EnumWrapper for an enum-like object with string values. + * Creates and caches a new EnumWrapper if one is not already cached. + * @param enumObj - An enum-like object with string values. + * @return An instance of EnumWrapper for the provided enumObj. + * + * @template T - Type of the enum-like object that is being wrapped. + */ +export function $enum, string>>( + enumObj: T +): EnumWrapper; +/** + * Gets a cached EnumWrapper for an enum-like object with a mixture of number + * and string values. + * Creates and caches a new EnumWrapper if one is not already cached. + * @param enumObj - An enum-like object with a mixture of number and string + * values. + * @return An instance of EnumWrapper for the provided enumObj. + * + * @template T - Type of the enum-like object that is being wrapped. + */ +export function $enum, number | string>>( + enumObj: T +): EnumWrapper; +export function $enum(enumObj: object): EnumWrapper { + let result = enumWrapperInstancesCache.get(enumObj); + + if (!result) { + result = new EnumWrapper(enumObj); + enumWrapperInstancesCache.set(enumObj, result); + } + + return result; +} + +$enum.handleNull = symbols.handleNull; +$enum.handleUndefined = symbols.handleUndefined; +$enum.handleUnexpected = symbols.handleUnexpected; +$enum.unhandledEntry = symbols.unhandledEntry; +$enum.visitValue = visitEnumValue; +$enum.mapValue = mapEnumValue; diff --git a/src/EnumValueMappee.ts b/src/EnumValueMappee.ts new file mode 100644 index 0000000..fe3534c --- /dev/null +++ b/src/EnumValueMappee.ts @@ -0,0 +1,190 @@ +import { createUnhandledEntryError } from "./createUnhandledEntryError"; +import { + EnumValueMapperCore, + EnumValueMapper, + EnumValueMapperWithNull, + EnumValueMapperWithUndefined, + EnumValueMapperWithNullAndUndefined +} from "./EnumValueMapper"; +import { + handleUnexpected, + handleNull, + handleUndefined, + unhandledEntry +} from "./symbols"; + +/** + * A wrapper around an enum or string/number literal value to be mapped. + * Do not use this class directly. Use the {@link $enum.mapValue} function to + * get an instance of this class. + * + * @template E - An enum or string/number literal type. + */ +export class EnumValueMappee { + /** + * Do not use this constructor directly. Use the {@link $enum.mapValue} + * function to get an instance of this class. + * @param value - The value to be wrapped by this "mappee". + */ + public constructor(private readonly value: E) {} + + /** + * Maps the wrapped value using the supplied mapper. + * Returns the value of the mapper's property whose name matches the wrapped + * value. + * + * @template T - The data type that the enum or string/number literal value + * will be mapped to. + * + * @param mapper - A mapper implementation for type E that returns type T. + * @returns The mapped value from the mapper. + */ + public with(mapper: EnumValueMapper): T { + if (mapper.hasOwnProperty(this.value)) { + return processEntry( + (mapper as EnumValueMapperCore)[this.value], + this.value + ); + } else if (mapper.hasOwnProperty(handleUnexpected)) { + return processEntry(mapper[handleUnexpected]!, this.value); + } else { + throw new Error(`Unexpected value: ${this.value}`); + } + } +} + +/** + * A wrapper around an enum or string/number literal value to be mapped. + * For values that may be null. + * Do not use this class directly. Use the {@link $enum.mapValue} function to + * get an instance of this class. + * + * NOTE: At run time, this class is used by {@link $enum.mapValue} ONLY for + * handling null values. + * {@link EnumValueMappee} contains the core run time implementation that is + * applicable to all "EnumValueMappee" classes. + * + * @template E - An enum or string/number literal type. + */ +export class EnumValueMappeeWithNull { + /** + * Maps the wrapped value using the supplied mapper. + * If the wrapped value is null, returns the mapper's + * {@link handleNull} value. + * Otherwise, returns the value of the mapper's property whose name matches + * the wrapped value. + * + * @template T - The data type that the enum or string/number literal value + * will be mapped to. + * + * @param mapper - A mapper implementation for type E that returns type T. + * @returns The mapped value from the mapper. + */ + public with(mapper: EnumValueMapperWithNull): T { + // This class is used at run time for mapping null values regardless of + // the compile time type being visited, so we actually have to check if + // handleNull exists. + if (mapper.hasOwnProperty(handleNull)) { + return processEntry(mapper[handleNull], null); + } else if (mapper.hasOwnProperty(handleUnexpected)) { + return processEntry(mapper[handleUnexpected]!, null); + } else { + throw new Error(`Unexpected value: null`); + } + } +} + +/** + * A wrapper around an enum or string/number literal value to be mapped. + * For values that may be undefined. + * Do not use this class directly. Use the {@link $enum.mapValue} function to + * get an instance of this class. + * + * NOTE: At run time, this class is used by {@link $enum.mapValue} ONLY for + * handling undefined values. + * {@link EnumValueMappee} contains the core run time implementation that is + * applicable to all "EnumValueMappee" classes. + * + * @template E - An enum or string/number literal type. + */ +export class EnumValueMappeeWithUndefined { + /** + * Maps the wrapped value using the supplied mapper. + * If the wrapped value is undefined, returns the mapper's + * {@link handleUndefined} value. + * Otherwise, returns the value of the mapper's property whose name matches + * the wrapped value. + * + * @template T - The data type that the enum or string/number literal value + * will be mapped to. + * + * @param mapper - A mapper implementation for type E that returns type T. + * @returns The mapped value from the mapper. + */ + public with(mapper: EnumValueMapperWithUndefined): T { + // This class is used at run time for mapping undefined values + // regardless of the compile time type being visited, so we actually + // have to check if handleUndefined exists. + if (mapper.hasOwnProperty(handleUndefined)) { + return processEntry(mapper[handleUndefined], undefined); + } else if (mapper.hasOwnProperty(handleUnexpected)) { + return processEntry(mapper[handleUnexpected]!, undefined); + } else { + throw new Error(`Unexpected value: undefined`); + } + } +} + +/** + * A wrapper around an enum or string/number literal value to be mapped. + * For values that may be null and undefined. + * Do not use this class directly. Use the {@link $enum.mapValue} function to + * get an instance of this class. + * + * NOTE: No run time implementation of this class actually exists. This is only + * used for compile-time typing. + * {@link EnumValueMappee} contains the core run time implementation that is + * applicable to all "EnumValueMappee" classes, while + * {@link EnumValueMappeeWithNull} and {@link EnumValueMappeeWithUndefined} + * are used at run time to handle null and undefined values. + * + * @template E - An enum or string/number literal type. + */ +export declare class EnumValueMappeeWithNullAndUndefined< + E extends string | number +> { + /** + * Maps the wrapped value using the supplied mapper. + * If the wrapped value is null, returns the mapper's + * {@link handleNull} value. + * If the wrapped value is undefined, returns the mapper's + * {@link handleUndefined} value. + * Otherwise, returns the value of the mapper's property whose name matches + * the wrapped value. + * + * @template T - The data type that the enum or string/number literal value + * will be mapped to. + * + * @param mapper - A mapper implementation for type E that returns type T. + * @returns The mapped value from the mapper. + */ + public with(mapper: EnumValueMapperWithNullAndUndefined): T; +} + +/** + * Common implementation for processing an entry of an enum value mapper. + * @param entry - Either the mapped value entry, or {@link unhandledEntry}. + * @param value - The value being mapped. + * @return The provided entry, if it is not an unhandledEntry. + * @throws {Error} If the provided entry is an unhandledEntry. + */ +function processEntry( + entry: T | typeof unhandledEntry, + value: string | number | null | undefined +): T { + if (entry === unhandledEntry) { + throw createUnhandledEntryError(value); + } else { + return entry; + } +} diff --git a/src/EnumValueMapper.ts b/src/EnumValueMapper.ts new file mode 100644 index 0000000..2e1397d --- /dev/null +++ b/src/EnumValueMapper.ts @@ -0,0 +1,108 @@ +import { + handleUnexpected, + handleNull, + handleUndefined, + unhandledEntry +} from "./symbols"; + +/** + * Core definition of all enum value mapper interfaces. + * Defines properties for each possible value of type `E`. + * + * @template E - An enum type or string/number literal union type. + * @template T - The type of the value that the enum value is mapped to. + */ +export type EnumValueMapperCore = { + [P in E]: T | typeof unhandledEntry; +}; + +/** + * Interface for an object that optionally maps an unexpected value to a value + * of type T. + * This is never used by itself, but combined with {@link EnumValueMapperCore}. + * + * @template T - The type of the value that the enum value is mapped to. + */ +export interface UnexpectedEnumValueMapper { + [handleUnexpected]?: T | typeof unhandledEntry; +} + +/** + * Interface for an object that maps a null value to a value of type T. + * This is never used by itself, but combined with {@link EnumValueMapper} as + * needed. + * + * @template T - The type of the value that the enum value is mapped to. + */ +export interface NullEnumValueMapper { + [handleNull]: T | typeof unhandledEntry; +} + +/** + * Interface for an object that maps an undefined value to a value of type T. + * This is never used by itself, but combined with {@link EnumValueMapper} as + * needed. + * + * @template T - The type of the value that the enum value is mapped to. + */ +export interface UndefinedEnumValueMapper { + [handleUndefined]: T | typeof unhandledEntry; +} + +/** + * Interface for an object that maps an enum or string/number literal value to a + * value of type T. + * + * @template E - An enum type or string/number literal union type. + * @template T - The type of the value that the enum value is mapped to. + */ +export type EnumValueMapper = EnumValueMapperCore< + E, + T +> & + UnexpectedEnumValueMapper; + +/** + * Combines {@link EnumValueMapper} with {@link NullEnumValueMapper} for mapping an enum + * or string/number literal value that may be null. + * + * @template E - An enum type or string/number literal union type. + * @template T - The type of the value that the enum value is mapped to. + */ +export type EnumValueMapperWithNull< + E extends string | number, + T +> = EnumValueMapper & + NullEnumValueMapper & + UnexpectedEnumValueMapper; + +/** + * Combines {@link EnumValueMapper} with {@link UndefinedEnumValueMapper} for mapping an + * enum or string/number literal value that may be undefined. + * + * @template E - An enum type or string/number literal union type. + * @template T - The type of the value that the enum value is mapped to. + */ +export type EnumValueMapperWithUndefined< + E extends string | number, + T +> = EnumValueMapper & + UndefinedEnumValueMapper & + UnexpectedEnumValueMapper; + +/** + * Combines {@link EnumValueMapper} with {@link NullEnumValueMapper} and + * {@link UndefinedEnumValueMapper} + * for mapping an enum or string/number literal value that may be null or + * undefined. + * + * @template E - An enum type or string/number literal union type. + * @template T - The type of the value that the enum value is mapped to. + */ +export type EnumValueMapperWithNullAndUndefined< + E extends string | number, + T +> = EnumValueMapper & + NullEnumValueMapper & + UndefinedEnumValueMapper & + UnexpectedEnumValueMapper; diff --git a/src/EnumValueVisitee.ts b/src/EnumValueVisitee.ts new file mode 100644 index 0000000..e17461d --- /dev/null +++ b/src/EnumValueVisitee.ts @@ -0,0 +1,176 @@ +import { + handleUnexpected, + handleNull, + handleUndefined, + unhandledEntry +} from "./symbols"; +import { createUnhandledEntryError } from "./createUnhandledEntryError"; +import { + WidenEnumType, + EnumValueVisitorHandler, + EnumValueVisitorCore, + EnumValueVisitor, + EnumValueVisitorWithNull, + EnumValueVisitorWithUndefined, + EnumValueVisitorWithNullAndUndefined +} from "./EnumValueVisitor"; + +/** + * A wrapper around a string literal or string enum value to be visited. + * Do not use this class directly. Use the {@link visitString} function to get an instance of this class. + * + * @template E - A string literal type or string enum type. + */ +export class EnumValueVisitee { + /** + * Do not use this constructor directly. Use the {@link visitString} function to get an instance of this class. + * @param value - The value to be wrapped by this "visitee". + */ + public constructor(private readonly value: E) {} + + /** + * Visits the wrapped value using the supplied visitor. + * Calls the visitor method whose name matches the wrapped value. + * + * @template R - The return type of the visitor methods. + * + * @param visitor - A visitor implementation for type E that returns type R. + * @returns The return value of the visitor method that is called. + */ + public with(visitor: EnumValueVisitor): R { + if (visitor.hasOwnProperty(this.value)) { + const handler = (visitor as EnumValueVisitorCore)[this.value]; + return processEntry(handler, this.value); + } else if (visitor[handleUnexpected]) { + return processEntry( + visitor[handleUnexpected]!, + (this.value as any) as WidenEnumType + ); + } else { + throw new Error(`Unexpected value: ${this.value}`); + } + } +} + +/** + * A wrapper around a string literal or string enum value to be visited. + * For values that may be null. + * Do not use this class directly. Use the {@link visitString} function to get an instance of this class. + * + * NOTE: At run time, this class is used by {@link visitString} ONLY for handling null values. + * {@link EnumValueVisitee} contains the core run time implementation that is applicable to all + * "EnumValueVisitee" classes. + * + * @template E - A string literal type or string enum type. + */ +export class EnumValueVisiteeWithNull { + /** + * Visits the wrapped value using the supplied visitor. + * If the wrapped value is null, calls the visitor's {@link StringNullVisitor#handleNull} method. + * Otherwise, calls the visitor method whose name matches the wrapped value. + * + * @template R - The return type of the visitor methods. + * + * @param visitor - A visitor implementation for type E that returns type R. + * @returns The return value of the visitor method that is called. + */ + public with(visitor: EnumValueVisitorWithNull): R { + // This class is used at run time for visiting null values regardless of the compile time + // type being visited, so we actually have to check if handleNull exists. + if (visitor[handleNull]) { + return processEntry(visitor[handleNull], null); + } else if (visitor[handleUnexpected]) { + return processEntry( + (visitor as EnumValueVisitor)[handleUnexpected]!, + null + ); + } else { + throw new Error(`Unexpected value: null`); + } + } +} + +/** + * A wrapper around a string literal or string enum value to be visited. + * For values that may be undefined. + * Do not use this class directly. Use the {@link visitString} function to get an instance of this class. + * + * NOTE: At run time, this class is used by {@link visitString} ONLY for handling undefined values. + * {@link EnumValueVisitee} contains the core run time implementation that is applicable to all + * "EnumValueVisitee" classes. + * + * @template E - A string literal type or string enum type. + */ +export class EnumValueVisiteeWithUndefined { + /** + * Visits the wrapped value using the supplied visitor. + * If the wrapped value is undefined, calls the visitor's {@link StringNullVisitor#handleUndefined} method. + * Otherwise, calls the visitor method whose name matches the wrapped value. + * + * @template R - The return type of the visitor methods. + * + * @param visitor - A visitor implementation for type E that returns type R. + * @returns The return value of the visitor method that is called. + */ + public with(visitor: EnumValueVisitorWithUndefined): R { + // This class is used at run time for visiting undefined values regardless of the compile time + // type being visited, so we actually have to check if handleUndefined exists. + if (visitor[handleUndefined]) { + return processEntry(visitor[handleUndefined], undefined); + } else if (visitor[handleUnexpected]) { + return processEntry( + (visitor as EnumValueVisitor)[handleUnexpected]!, + undefined + ); + } else { + throw new Error(`Unexpected value: undefined`); + } + } +} + +/** + * A wrapper around a string literal or string enum value to be visited. + * For values that may be null and undefined. + * Do not use this class directly. Use the {@link visitString} function to get an instance of this class. + * + * NOTE: No run time implementation of this class actually exists. This is only used for compile-time + * typing. {@link EnumValueVisitee} contains the core run time implementation that is applicable to all + * "EnumValueVisitee" classes, while {@link EnumValueVisiteeWithNull} and {@link EnumValueVisiteeWithUndefined} + * are used at run time to handle null and undefined values. + * + * @template E - A string literal type or string enum type. + */ +export declare class EnumValueVisiteeWithNullAndUndefined< + E extends string | number +> { + /** + * Visits the wrapped value using the supplied visitor. + * If the wrapped value is null, calls the visitor's {@link StringNullVisitor#handleNull} method. + * If the wrapped value is undefined, calls the visitor's {@link StringNullVisitor#handleUndefined} method. + * Otherwise, calls the visitor method whose name matches the wrapped value. + * + * @template R - The return type of the visitor methods. + * + * @param visitor - A visitor implementation for type E that returns type R. + * @returns The return value of the visitor method that is called. + */ + public with(visitor: EnumValueVisitorWithNullAndUndefined): R; +} + +/** + * Common implementation for processing an entry of an enum value visitor. + * @param entry - Either the visitor handler implementation for an entry, or an UnhandledEntry. + * @param value - The value being mapped. + * @return The result of executing the provided entry, if it is not an UnhandledEntry. + * @throws {Error} If the provided entry is an UnhandledEntry. + */ +function processEntry( + entry: EnumValueVisitorHandler | typeof unhandledEntry, + value: E +): R { + if (entry === unhandledEntry) { + throw createUnhandledEntryError(value); + } else { + return entry(value); + } +} diff --git a/src/EnumValueVisitor.ts b/src/EnumValueVisitor.ts new file mode 100644 index 0000000..f464b3e --- /dev/null +++ b/src/EnumValueVisitor.ts @@ -0,0 +1,125 @@ +import { + handleUnexpected, + handleNull, + handleUndefined, + unhandledEntry +} from "./symbols"; + +/** + * Helper type to widen a number/string enum/literal type to plain string or number. + */ +export type WidenEnumType = + | (E extends number ? number : never) + | (E extends string ? string : never); + +/** + * Generic method signature for a string visitor handler method. + * @template E - The type of the parameter to the handler. Must be a string literal, null, or undefined. + * @template R - The return type of the handler. Defaults to void. + * @param value - The value being visited by the visitor. + * @returns A result to be returned by the visitor, + */ +export type EnumValueVisitorHandler< + E extends string | number | null | undefined, + R = void +> = (value: E) => R; + +/** + * Core definition of all string visitor interfaces. + * Defines visitor handler properties for each possible value of type `E`. + * + * @template E - A string literal type or string enum type. + * @template R - The return type of the visitor methods. + */ +export type EnumValueVisitorCore = { + [P in E]: EnumValueVisitorHandler | typeof unhandledEntry; +}; + +/** + * A visitor interface for visiting a null value. + * This is never used by itself, but combined with {@link EnumValueVisitor} as needed. + * + * @template R - The return type of the visitor method. + */ +export interface NullEnumValueVisitor { + [handleNull]: EnumValueVisitorHandler | typeof unhandledEntry; +} + +/** + * A visitor interface for visiting an undefined value. + * This is never used by itself, but combined with {@link EnumValueVisitor} as needed. + * + * @template R - The return type of the visitor method. + */ +export interface UndefinedEnumValueVisitor { + [handleUndefined]: + | EnumValueVisitorHandler + | typeof unhandledEntry; +} + +/** + * A visitor interface for visiting the value of a string literal type or a string enum type. + * + * @template E - A string literal type or string enum type. + * @template R - The return type of the visitor methods. + */ +export type EnumValueVisitor< + E extends string | number, + R +> = EnumValueVisitorCore & { + [handleUnexpected]?: + | EnumValueVisitorHandler | null | undefined, R> + | typeof unhandledEntry; +}; + +/** + * Combines {@link EnumValueVisitor} with {@link NullEnumValueVisitor} for visiting a string literal/enum + * that may be null. + * + * @template E - A string literal type or string enum type. + * @template R - The return type of the visitor methods. + */ +export type EnumValueVisitorWithNull< + E extends string | number, + R +> = EnumValueVisitorCore & + NullEnumValueVisitor & { + [handleUnexpected]?: + | EnumValueVisitorHandler | undefined, R> + | typeof unhandledEntry; + }; + +/** + * Combines {@link EnumValueVisitor} with {@link UndefinedEnumValueVisitor} for visiting a string literal/enum + * that may be undefined. + * + * @template E - A string literal type or string enum type. + * @template R - The return type of the visitor methods. + */ +export type EnumValueVisitorWithUndefined< + E extends string | number, + R +> = EnumValueVisitorCore & + UndefinedEnumValueVisitor & { + [handleUnexpected]?: + | EnumValueVisitorHandler | null, R> + | typeof unhandledEntry; + }; + +/** + * Combines {@link EnumValueVisitor} with {@link NullEnumValueVisitor} and {@link UndefinedEnumValueVisitor} + * for visiting a string literal/enum that may be null or undefined. + * + * @template E - A string literal type or string enum type. + * @template R - The return type of the visitor methods. + */ +export type EnumValueVisitorWithNullAndUndefined< + E extends string | number, + R +> = EnumValueVisitorCore & + NullEnumValueVisitor & + UndefinedEnumValueVisitor & { + [handleUnexpected]?: + | EnumValueVisitorHandler, R> + | typeof unhandledEntry; + }; diff --git a/src/EnumWrapper.ts b/src/EnumWrapper.ts new file mode 100644 index 0000000..8b3e64d --- /dev/null +++ b/src/EnumWrapper.ts @@ -0,0 +1,853 @@ +import { StringKeyOf } from "./types"; +import { + isNonNumericKey, + getOwnEnumerableNonNumericKeys +} from "./objectKeysUtil"; + +/** + * A generic wrapper for any enum-like object. + * Provides utilities for runtime processing of an enum's values and keys, with strict compile-time + * type safety. + * + * EnumWrapper cannot be directly instantiated. Use {@link $enum} to get/create an EnumWrapper + * instance. + * + * @template V - Type of the enum value. + * @template T - Type of the enum-like object that is being wrapped. + */ +export class EnumWrapper< + V extends number | string = number | string, + T extends Record, V> = any +> implements Iterable>, ArrayLike> { + /** + * List of all keys for this enum, in the original defined order of the enum. + */ + private readonly keysList: ReadonlyArray>; + + /** + * List of all values for this enum, in the original defined order of the enum. + */ + private readonly valuesList: ReadonlyArray]>; + + /** + * Map of enum value -> enum key. + * Used for reverse key lookups. + * NOTE: Performance tests show that using a Map (even if it's a slow polyfill) is faster than building a lookup + * string key for values and using a plain Object: + * {@link https://www.measurethat.net/Benchmarks/Show/2514/1/map-keyed-by-string-or-number} + */ + private readonly keysByValueMap: ReadonlyMap>; + + /** + * The number of entries in this enum. + * Part of the Map-like interface. + */ + public readonly size: number; + + /** + * The number of entries in this enum. + * Part of the ArrayLike interface. + */ + public readonly length: number; + + /** + * Index signature. + * Part of the ArrayLike interface. + */ + readonly [key: number]: EnumWrapper.Entry; + + /** + * Create a new EnumWrapper instance. + * This is for internal use only. + * Use {@link $enum} to publicly get/create an EnumWrapper + * + * @param enumObj - An enum-like object. + */ + public constructor(private readonly enumObj: T) { + // Include only own enumerable keys that are not numeric. + // This is necessary to ignore the reverse-lookup entries that are automatically added + // by TypeScript to numeric enums. + this.keysList = Object.freeze(getOwnEnumerableNonNumericKeys(enumObj)); + + const length = this.keysList.length; + const valuesList = new Array]>(length); + const keysByValueMap = new Map>(); + + // According to multiple tests found on jsperf.com, a plain for loop is faster than using + // Array.prototype.forEach + for (let index = 0; index < length; ++index) { + const key = this.keysList[index]; + const value = enumObj[key]; + + valuesList[index] = value; + keysByValueMap.set(value, key); + // Type casting of "this" necessary to bypass readonly index signature for initialization. + (this as any)[index] = Object.freeze([key, value]); + } + + this.valuesList = Object.freeze(valuesList); + this.keysByValueMap = keysByValueMap; + this.size = this.length = length; + + // Make the EnumWrapper instance immutable + Object.freeze(this); + } + + /** + * @return "[object EnumWrapper]" + */ + public toString(): string { + // NOTE: overriding toString in addition to Symbol.toStringTag + // for maximum compatibility with older runtime environments + // that do not implement Object.prototype.toString in terms + // of Symbol.toStringTag + return "[object EnumWrapper]"; + } + + /** + * Get an iterator for this enum's keys. + * Iteration order is based on the original defined order of the enum. + * Part of the Map-like interface. + * @return An iterator that iterates over this enum's keys. + */ + public keys(): IterableIterator> { + let index = 0; + + return { + next: () => { + const isDone = index >= this.length; + const result: IteratorResult> = { + done: isDone, + value: this.keysList[index] + }; + + ++index; + + return result; + }, + + [Symbol.iterator](): IterableIterator> { + return this; + } + }; + } + + /** + * Get an iterator for this enum's values. + * Iteration order is based on the original defined order of the enum. + * Part of the Map-like interface. + * NOTE: If there are duplicate values in the enum, then there will also be duplicate values + * in the result. + * @return An iterator that iterates over this enum's values. + */ + public values(): IterableIterator]> { + let index = 0; + + return { + next: () => { + const isDone = index >= this.length; + const result: IteratorResult]> = { + done: isDone, + value: this.valuesList[index] + }; + + ++index; + + return result; + }, + + [Symbol.iterator](): IterableIterator]> { + return this; + } + }; + } + + /** + * Get an iterator for this enum's entries as [key, value] tuples. + * Iteration order is based on the original defined order of the enum. + * @return An iterator that iterates over this enum's entries as [key, value] tuples. + */ + public entries(): IterableIterator> { + let index = 0; + + return { + next: () => { + const isDone = index >= this.length; + const result: IteratorResult> = { + done: isDone, + // NOTE: defensive copy not necessary because entries are "frozen" + value: this[index] + }; + + ++index; + + return result; + }, + + [Symbol.iterator](): IterableIterator> { + return this; + } + }; + } + + /** + * Get an iterator for this enum's entries as [key, value] tuples. + * Iteration order is based on the original defined order of the enum. + * @return An iterator that iterates over this enum's entries as [key, value] tuples. + */ + public [Symbol.iterator](): IterableIterator> { + return this.entries(); + } + + /** + * Calls the provided iteratee on each item in this enum. + * Iteration order is based on the original defined order of the enum. + * See {@link EnumWrapper.Iteratee} for the signature of the iteratee. + * The return value of the iteratee is ignored. + * @param iteratee - The iteratee. + * @param context - If provided, then the iteratee will be called with the context as its "this" value. + */ + public forEach( + iteratee: EnumWrapper.Iteratee, + context?: any + ): void { + const length = this.length; + + // According to multiple tests found on jsperf.com, a plain for loop is faster than using + // Array.prototype.forEach + for (let index = 0; index < length; ++index) { + const entry = this[index]; + iteratee.call(context, entry[1], entry[0], this, index); + } + } + + /** + * Maps this enum's entries to a new list of values. + * Iteration order is based on the original defined order of the enum. + * Builds a new array containing the results of calling the provided iteratee on each item in this enum. + * See {@link EnumWrapper.Iteratee} for the signature of the iteratee. + * @param iteratee - The iteratee. + * @param context - If provided, then the iteratee will be called with the context as its "this" value. + * @return A new array containg the results of the iteratee. + * + * @template R - The of the mapped result for each entry. + */ + public map(iteratee: EnumWrapper.Iteratee, context?: any): R[] { + const length = this.length; + const result = new Array(length); + + // According to multiple tests found on jsperf.com, a plain for loop is faster than using Array.prototype.map + for (let index = 0; index < length; ++index) { + const entry = this[index]; + result[index] = iteratee.call( + context, + entry[1], + entry[0], + this, + index + ); + } + + return result; + } + + /** + * Get a list of this enum's keys. + * Order of items in the list is based on the original defined order of the enum. + * @return A list of this enum's keys. + */ + public getKeys(): StringKeyOf[] { + // need to return a copy of this.keysList so it can be returned as Array instead of ReadonlyArray. + return this.keysList.slice(); + } + + /** + * Get a list of this enum's values. + * Order of items in the list is based on the original defined order of the enum. + * NOTE: If there are duplicate values in the enum, then there will also be duplicate values + * in the result. + * @return A list of this enum's values. + */ + public getValues(): T[StringKeyOf][] { + // need to return a copy of this.valuesList so it can be returned as Array instead of ReadonlyArray. + return this.valuesList.slice(); + } + + /** + * Get a list of this enum's entries as [key, value] tuples. + * Order of items in the list is based on the original defined order of the enum. + * @return A list of this enum's entries as [key, value] tuples. + */ + public getEntries(): EnumWrapper.Entry[] { + // Create an array from the indexed entries of "this". + // NOTE: no need for defensive copy of each entry because all entries are "frozen". + return Array.prototype.slice.call(this); + } + + /** + * Get the index of a key based on the original defined order of this enum. + * @param key A valid key for this enum. + * @return The index of the key based on the original defined order of this enum. + */ + public indexOfKey(key: StringKeyOf): number { + return this.keysList.indexOf(key); + } + + /** + * Get the index of a value based on the original defined order of this enum. + * @param value A valid value for this enum. + * @return The index of the value based on the original defined order of this enum. + */ + public indexOfValue(value: T[StringKeyOf]): number { + return this.valuesList.indexOf(value); + } + + /** + * Tests if the provided string is actually a valid key for this enum + * Acts as a type guard to confirm that the provided value is actually the enum key type. + * @param key - A potential key value for this enum. + * @return True if the provided key is a valid key for this enum. + */ + public isKey(key: string | null | undefined): key is StringKeyOf { + return ( + key != null && + isNonNumericKey(key) && + this.enumObj.hasOwnProperty(key) + ); + } + + /** + * Casts a string to a properly-typed key for this enum. + * Throws an error if the key is invalid. + * @param key - A potential key value for this enum. + * @return The provided key value, cast to the type of this enum's keys. + * @throws {Error} if the provided string is not a valid key for this enum. + */ + public asKeyOrThrow(key: string | null | undefined): StringKeyOf { + if (this.isKey(key)) { + return key; + } else { + throw new Error( + `Unexpected key: ${key}. Expected one of: ${this.getValues()}` + ); + } + } + + /** + * Casts a string to a properly-typed key for this enum. + * Returns a default key if the provided key is invalid. + * @param key - A potential key value for this enum. + * @param defaultKey - The key to be returned if the provided key is invalid. + * @return The provided key value, cast to the type of this enum's keys. + * Returns `defaultKey` if the provided key is invalid. + */ + public asKeyOrDefault( + key: string | null | undefined, + defaultKey: StringKeyOf + ): StringKeyOf; + /** + * Casts a string to a properly-typed key for this enum. + * Returns a default key if the provided key is invalid. + * @param key - A potential key value for this enum. + * @param defaultKey - The key to be returned if the provided key is invalid. + * @return The provided key value, cast to the type of this enum's keys. + * Returns `defaultKey` if the provided key is invalid. + */ + public asKeyOrDefault( + key: string | null | undefined, + defaultKey?: StringKeyOf + ): StringKeyOf | undefined; + /** + * Casts a string to a properly-typed key for this enum. + * Returns a default key if the provided key is invalid. + * @param key - A potential key value for this enum. + * @param defaultKey - The key to be returned if the provided key is invalid. + * @return The provided key value, cast to the type of this enum's keys. + * Returns `defaultKey` if the provided key is invalid. + */ + public asKeyOrDefault( + key: string | null | undefined, + defaultKey: string + ): string; + /** + * Casts a string to a properly-typed key for this enum. + * Returns a default key if the provided key is invalid. + * @param key - A potential key value for this enum. + * @param defaultKey - The key to be returned if the provided key is invalid. + * @return The provided key value, cast to the type of this enum's keys. + * Returns `defaultKey` if the provided key is invalid. + */ + public asKeyOrDefault( + key: string | null | undefined, + defaultKey: string | undefined + ): string | undefined; + /** + * Casts a string to a properly-typed key for this enum. + * Returns a default key if the provided key is invalid. + * @param key - A potential key value for this enum. + * @param defaultKey - The key to be returned if the provided key is invalid. + * @return The provided key value, cast to the type of this enum's keys. + * Returns `defaultKey` if the provided key is invalid. + */ + public asKeyOrDefault( + key: string | null | undefined, + defaultKey?: StringKeyOf | string + ): string | undefined { + if (this.isKey(key)) { + return key; + } else { + return defaultKey; + } + } + + /** + * Tests if the provided value is a valid value for this enum. + * Acts as a type guard to confirm that the provided value is actually the enum value type. + * @param value - A potential value for this enum. + * @return True if the provided value is valid for this enum. + */ + public isValue(value: V | null | undefined): value is T[StringKeyOf] { + return value != null && this.keysByValueMap.has(value); + } + + /** + * Casts a value to a properly-typed value for this enum. + * Throws an error if the value is invalid. + * @param value - A potential value for this enum. + * @return The provided value, cast to the type of this enum's values. + * @throws {Error} if the provided value is not a valid value for this enum. + */ + public asValueOrThrow(value: V | null | undefined): T[StringKeyOf] { + if (this.isValue(value)) { + return value; + } else { + throw new Error( + `Unexpected value: ${value}. Expected one of: ${this.getValues()}` + ); + } + } + + /** + * Casts a value to a properly-typed value for this enum. + * Returns a default value if the provided value is invalid. + * @param value - A potential value for this enum. + * @param defaultValue - The value to be returned if the provided value is invalid. + * @return The provided value, cast to the type of this enum's values. + * Returns `defaultValue` if the provided value is invalid. + */ + public asValueOrDefault( + value: V | null | undefined, + defaultValue: T[StringKeyOf] + ): T[StringKeyOf]; + /** + * Casts a value to a properly-typed value for this enum. + * Returns a default value if the provided value is invalid. + * @param value - A potential value for this enum. + * @param defaultValue - The value to be returned if the provided value is invalid. + * @return The provided value, cast to the type of this enum's values. + * Returns `defaultValue` if the provided value is invalid. + */ + public asValueOrDefault( + value: V | null | undefined, + defaultValue?: T[StringKeyOf] + ): T[StringKeyOf] | undefined; + /** + * Casts a value to a properly-typed value for this enum. + * Returns a default value if the provided value is invalid. + * @param value - A potential value for this enum. + * @param defaultValue - The value to be returned if the provided value is invalid. + * @return The provided value, cast to the type of this enum's values. + * Returns `defaultValue` if the provided value is invalid. + */ + public asValueOrDefault(value: V | null | undefined, defaultValue: V): V; + /** + * Casts a value to a properly-typed value for this enum. + * Returns a default value if the provided value is invalid. + * @param value - A potential value for this enum. + * @param defaultValue - The value to be returned if the provided value is invalid. + * @return The provided value, cast to the type of this enum's values. + * Returns `defaultValue` if the provided value is invalid. + */ + public asValueOrDefault( + value: V | null | undefined, + defaultValue: V | undefined + ): V | undefined; + /** + * Casts a value to a properly-typed value for this enum. + * Returns a default value if the provided value is invalid. + * @param value - A potential value for this enum. + * @param defaultValue - The value to be returned if the provided value is invalid. + * @return The provided value, cast to the type of this enum's values. + * Returns `defaultValue` if the provided value is invalid. + */ + public asValueOrDefault( + value: V | null | undefined, + defaultValue?: T[StringKeyOf] | V + ): V | undefined { + if (this.isValue(value)) { + return value; + } else { + return defaultValue; + } + } + + /** + * Performs a reverse lookup from enum value to corresponding enum key. + * Throws an error if the value is invalid. + * NOTE: If this enum has any duplicate values, then one of the keys for the duplicated value is + * arbitrarily returned. + * @param value - A potential value for this enum. + * @return The key for the provided value. + * @throws {Error} if the provided value is not a valid value for this enum. + */ + public getKeyOrThrow(value: V | null | undefined): StringKeyOf { + // NOTE: Intentionally not using isValue() or asValueOrThrow() to avoid making two key lookups into the map + // for successful lookups. + const result = + value != null ? this.keysByValueMap.get(value) : undefined; + + if (result != null) { + return result; + } else { + throw new Error( + `Unexpected value: ${value}. Expected one of: ${this.getValues()}` + ); + } + } + + /** + * Performs a reverse lookup from enum value to corresponding enum key. + * Returns a default key if the provided value is invalid. + * NOTE: If this enum has any duplicate values, then one of the keys for the duplicated value is + * arbitrarily returned. + * @param value - A potential value for this enum. + * @param defaultKey - The key to be returned if the provided value is invalid. + * @return The key for the provided value. + * Returns `defaultKey` if the provided value is invalid. + */ + public getKeyOrDefault( + value: V | null | undefined, + defaultKey: StringKeyOf + ): StringKeyOf; + /** + * Performs a reverse lookup from enum value to corresponding enum key. + * Returns a default key if the provided value is invalid. + * NOTE: If this enum has any duplicate values, then one of the keys for the duplicated value is + * arbitrarily returned. + * @param value - A potential value for this enum. + * @param defaultKey - The key to be returned if the provided value is invalid. + * @return The key for the provided value. + * Returns `defaultKey` if the provided value is invalid. + */ + public getKeyOrDefault( + value: V | null | undefined, + defaultKey?: StringKeyOf + ): StringKeyOf | undefined; + /** + * Performs a reverse lookup from enum value to corresponding enum key. + * Returns a default key if the provided value is invalid. + * NOTE: If this enum has any duplicate values, then one of the keys for the duplicated value is + * arbitrarily returned. + * @param value - A potential value for this enum. + * @param defaultKey - The key to be returned if the provided value is invalid. + * @return The key for the provided value. + * Returns `defaultKey` if the provided value is invalid. + */ + public getKeyOrDefault( + value: V | null | undefined, + defaultKey: string + ): string; + /** + * Performs a reverse lookup from enum value to corresponding enum key. + * Returns a default key if the provided value is invalid. + * NOTE: If this enum has any duplicate values, then one of the keys for the duplicated value is + * arbitrarily returned. + * @param value - A potential value for this enum. + * @param defaultKey - The key to be returned if the provided value is invalid. + * @return The key for the provided value. + * Returns `defaultKey` if the provided value is invalid. + */ + public getKeyOrDefault( + value: V | null | undefined, + defaultKey: string | undefined + ): string | undefined; + /** + * Performs a reverse lookup from enum value to corresponding enum key. + * Returns a default key if the provided value is invalid. + * NOTE: If this enum has any duplicate values, then one of the keys for the duplicated value is + * arbitrarily returned. + * @param value - A potential value for this enum. + * @param defaultKey - The key to be returned if the provided value is invalid. + * @return The key for the provided value. + * Returns `defaultKey` if the provided value is invalid. + */ + public getKeyOrDefault( + value: V | null | undefined, + defaultKey?: StringKeyOf | string + ): string | undefined { + // NOTE: Intentionally not using isValue() to avoid making two key lookups into the map for successful lookups. + const result = + value != null ? this.keysByValueMap.get(value) : undefined; + + if (result != null) { + return result; + } else { + return defaultKey; + } + } + + /** + * Gets the enum value for the provided key. + * Throws an error if the provided key is invalid. + * @param key - A potential key value for this enum. + * @return The enum value for the provided key. + * @throws {Error} if the provided string is not a valid key for this enum. + */ + public getValueOrThrow(key: string | null | undefined): T[StringKeyOf] { + // NOTE: The key MUST be separately validated before looking up the entry in enumObj to avoid false positive + // lookups for keys that match properties on Object.prototype, or keys that match the index keys of + // reverse lookups on numeric enums. + return this.enumObj[this.asKeyOrThrow(key)]; + } + + /** + * Gets the enum value for the provided key. + * Returns a default value if the provided key is invalid. + * @param key - A potential key value for this enum. + * @param defaultValue - The value to be returned if the provided key is invalid. + * @return The enum value for the provided key. + * Returns `defaultValue` if the provided key is invalid. + */ + public getValueOrDefault( + key: string | null | undefined, + defaultValue: T[StringKeyOf] + ): T[StringKeyOf]; + /** + * Gets the enum value for the provided key. + * Returns a default value if the provided key is invalid. + * @param key - A potential key value for this enum. + * @param defaultValue - The value to be returned if the provided key is invalid. + * @return The enum value for the provided key. + * Returns `defaultValue` if the provided key is invalid. + */ + public getValueOrDefault( + key: string | null | undefined, + defaultValue?: T[StringKeyOf] + ): T[StringKeyOf] | undefined; + /** + * Gets the enum value for the provided key. + * Returns a default value if the provided key is invalid. + * @param key - A potential key value for this enum. + * @param defaultValue - The value to be returned if the provided key is invalid. + * @return The enum value for the provided key. + * Returns `defaultValue` if the provided key is invalid. + */ + public getValueOrDefault( + key: string | null | undefined, + defaultValue: V + ): V; + /** + * Gets the enum value for the provided key. + * Returns a default value if the provided key is invalid. + * @param key - A potential key value for this enum. + * @param defaultValue - The value to be returned if the provided key is invalid. + * @return The enum value for the provided key. + * Returns `defaultValue` if the provided key is invalid. + */ + public getValueOrDefault( + key: string | null | undefined, + defaultValue: V | undefined + ): V | undefined; + /** + * Gets the enum value for the provided key. + * Returns a default value if the provided key is invalid. + * @param key - A potential key value for this enum. + * @param defaultValue - The value to be returned if the provided key is invalid. + * @return The enum value for the provided key. + * Returns `defaultValue` if the provided key is invalid. + */ + public getValueOrDefault( + key: string | null | undefined, + defaultValue?: T[StringKeyOf] | V + ): V | undefined { + // NOTE: The key MUST be separately validated before looking up the entry in enumObj to avoid false positive + // lookups for keys that match properties on Object.prototype, or keys that match the index keys of + // reverse lookups on numeric enums. + if (this.isKey(key)) { + return this.enumObj[key]; + } else { + return defaultValue; + } + } + + /** + * Creates an enum-like object that contains a subset of entries of the + * original enum. + * @param keys - The keys to include in the new enum-like object. + * @returns A new enum-like object. + */ + public createEnumSubset>( + ...keys: readonly K[] + ): Pick { + return keys.reduce>((result, key) => { + result[key] = this.enumObj[key]; + return result; + }, {}) as Pick; + } +} + +// HACK: Forcefully overriding the value of the [Symbol.toStringTag] property. +// This was originally implemented in the class as recommended by MDN +// Symbol.toStringTag documentation: +// public get [Symbol.toStringTag](): string { return "EnumWrapper"; } +// +// However, after upgrading to TypeScript 3.7, this caused compiler errors +// when running dtslint due to the getter being emitted to the .d.ts file, +// but TSC complaining that getters aren't allowed in "ambient" contexts. +// This seems to be realated to a known breaking change: +// https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html#class-field-mitigations +// +// To avoid requiring TypeScript 3.6+ to use ts-enum-util, I no longer +// implement the getter on the class and instead simply set the value of +// the [Symbol.toStringTag] property on the class prototype to the desired +// string. +// +// I also tried implementing it as: +// public readonly [Symbol.toStringTag] = "EnumWrapper"; +// But this got emitted to the .d.ts file with the initializer, +// causing a compiler time error about initializers not allowed in an +// "ambient" context. So I had to omit the declaration of the +// [Symbol.toStringTag] in the class declaration and hackishly set its +// value here (not important to have it part of the class declaration +// as long as the value exists at runtime). +(EnumWrapper.prototype as any)[Symbol.toStringTag] = "EnumWrapper"; + +export namespace EnumWrapper { + /** + * A tuple containing the key and value of a single entry in an enum. + * @template T - Type of an enum-like object. + */ + export type Entry< + T extends Record, number | string> = any + > = Readonly<[StringKeyOf, T[StringKeyOf]]>; + + /** + * A function used in iterating all key/value entries in an enum. + * @param value - An enum value. + * @param key - An enum key. + * @param enumWrapper - The EnumWrapper instance being iterated.. + * @param index - The index of the enum entry, based on the original defined order of the enum. + * @return A result. The significance of the result depends on the type of iteration being performed. + * + * @template R - The type of the result. + * @template V - Type of the enum value. + * @template T - Type of an enum-like object. + */ + export type Iteratee< + R = any, + V extends number | string = number | string, + T extends Record, V> = any + > = ( + this: any, + value: T[StringKeyOf], + key: StringKeyOf, + enumWrapper: EnumWrapper, + index: number + ) => R; +} + +/** + * Type alias for an {@link EnumWrapper} for any type of enum-like object that contains only number values. + * + * @template T - Type of an enum-like object that contains only number values. + */ +export type NumberEnumWrapper< + T extends Record, number> = any +> = EnumWrapper; + +export namespace NumberEnumWrapper { + /** + * Type alias for an {@link EnumWrapper.Entry} for any type of enum-like object that contains only number values. + * + * @template T - Type of an enum-like object that contains only number values. + */ + export type Entry< + T extends Record, number> = any + > = EnumWrapper.Entry; + + /** + * Type alias for an {@link EnumWrapper.Iteratee} for any type of enum-like object that contains only number values. + * + * @template R - The type of the result. + * @template T - Type of an enum-like object that contains only number values. + */ + export type Iteratee< + R = any, + T extends Record, number> = any + > = EnumWrapper.Iteratee; +} + +/** + * Type alias for an {@link EnumWrapper} for any type of enum-like object that contains only string values. + * + * @template T - Type of an enum-like object that contains only string values. + */ +export type StringEnumWrapper< + T extends Record, string> = any +> = EnumWrapper; + +export namespace StringEnumWrapper { + /** + * Type alias for an {@link EnumWrapper.Entry} for any type of enum-like object that contains only string values. + * + * @template T - Type of an enum-like object that contains only string values. + */ + export type Entry< + T extends Record, string> = any + > = EnumWrapper.Entry; + + /** + * Type alias for an {@link EnumWrapper.Iteratee} for any type of enum-like object that contains only string values. + * + * @template R - The type of the result. + * @template T - Type of an enum-like object that contains only string values. + */ + export type Iteratee< + R = any, + T extends Record, string> = any + > = EnumWrapper.Iteratee; +} + +/** + * Type alias for an {@link EnumWrapper} for any type of enum-like object that contains a mix of + * number and string values. + * + * @template T - Type of an enum-like object that contains a mix of number and string values. + */ +export type MixedEnumWrapper< + T extends Record, number | string> = any +> = EnumWrapper; + +export namespace MixedEnumWrapper { + /** + * Type alias for an {@link EnumWrapper.Entry} for any type of enum-like object that contains a mix of + * number and string values. + * + * @template T - Type of an enum-like object that contains a mix of number and string values. + */ + export type Entry< + T extends Record, number | string> = any + > = EnumWrapper.Entry; + + /** + * Type alias for an {@link EnumWrapper.Iteratee} for any type of enum-like object that contains a mix of + * number and string values. + * + * @template R - The type of the result. + * @template T - Type of an enum-like object that contains a mix of number and string values. + */ + export type Iteratee< + R = any, + T extends Record, number | string> = any + > = EnumWrapper.Iteratee; +} diff --git a/src/createUnhandledEntryError.ts b/src/createUnhandledEntryError.ts new file mode 100644 index 0000000..24254ef --- /dev/null +++ b/src/createUnhandledEntryError.ts @@ -0,0 +1,12 @@ +/** + * Creates an Error with a message explaining that an unhandled + * value was encountered. + * @param unhandledValue - The unhandled value. + * @return an Error with a message explaining that an unhandled + * value was encountered. + */ +export function createUnhandledEntryError( + unhandledValue: string | number | null | undefined +): Error { + return new Error(`Unhandled value: ${unhandledValue}`); +} diff --git a/src/index.ts b/src/index.ts index 2927699..be2db5c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,906 +1,9 @@ -/** - * Used internally to verify that some type is enum-like. - * A type is enum-like if all its properties are of type number or string. - * @template V - Type of the enum value. - * @template K - String literal union of all keys of the enum-like type. - */ -export type EnumLike = { - [P in K]: V -}; - -/** - * A generic wrapper for any enum-like object (see {@link EnumLike}). - * Provides utilities for runtime processing of an enum's values and keys, with strict compile-time - * type safety. - * - * EnumWrapper cannot be directly instantiated. Use one of the following to get/create an EnumWrapper - * instance: - * - {@link $enum} - * - {@link EnumWrapper.getCachedInstance} - * - * @template V - Type of the enum value. - * @template T - Type of the enum-like object that is being wrapped. - */ -export class EnumWrapper< - V extends number | string = number | string, - T extends EnumLike = any -> - implements - Iterable>, - ArrayLike> { - /** - * Map of enum object -> EnumWrapper instance. - * Used as a cache for {@link EnumWrapper.getCachedInstance} (and {@link $enum}). - * NOTE: WeakMap has very fast lookups and avoids memory leaks if used on a temporary - * enum-like object. Even if a WeakMap implementation is very naiive (like a Map polyfill), - * lookups are plenty fast for this use case of a relatively small number of enums within - * a project. Just don't perform cached lookups inside tight loops when - * you could cache the result in a local variable, and you'll be fine :) - * {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap} - * {@link https://www.measurethat.net/Benchmarks/Show/2513/5/map-keyed-by-object} - */ - private static readonly instancesCache = new WeakMap(); - - /** - * List of all keys for this enum, in sorted order. - */ - private readonly keysList: ReadonlyArray; - - /** - * List of all values for this enum, in sorted key order. - */ - private readonly valuesList: ReadonlyArray; - - /** - * Map of enum value -> enum key. - * Used for reverse key lookups. - * NOTE: Performance tests show that using a Map (even if it's a slow polyfill) is faster than building a lookup - * string key for values and using a plain Object: - * {@link https://www.measurethat.net/Benchmarks/Show/2514/1/map-keyed-by-string-or-number} - */ - private readonly keysByValueMap: ReadonlyMap; - - /** - * The number of entries in this enum. - * Part of the Map-like interface. - */ - public readonly size: number; - - /** - * The number of entries in this enum. - * Part of the ArrayLike interface. - */ - public readonly length: number; - - /** - * Index signature. - * Part of the ArrayLike interface. - */ - readonly [key: number]: EnumWrapper.Entry; - - /** - * Gets a cached EnumWrapper for an enum-like object with number values. - * Creates and caches a new EnumWrapper if one is not already cached. - * @param enumObj - An enum-like object with number values. - * @return An instance of EnumWrapper for the provided enumObj. - * - * @template T - Type of the enum-like object that is being wrapped. - */ - public static getCachedInstance>( - enumObj: T - ): EnumWrapper; - /** - * Gets a cached EnumWrapper for an enum-like object with string values. - * Creates and caches a new EnumWrapper if one is not already cached. - * @param enumObj - An enum-like object with string values. - * @return An instance of EnumWrapper for the provided enumObj. - * - * @template T - Type of the enum-like object that is being wrapped. - */ - public static getCachedInstance>( - enumObj: T - ): EnumWrapper; - /** - * Gets a cached EnumWrapper for an enum-like object with a mixture of number and string values. - * Creates and caches a new EnumWrapper if one is not already cached. - * @param enumObj - An enum-like object with a mixture of number and string values. - * @return An instance of EnumWrapper for the provided enumObj. - * - * @template T - Type of the enum-like object that is being wrapped. - */ - public static getCachedInstance< - T extends EnumLike - >(enumObj: T): EnumWrapper; - /** - * Gets a cached EnumWrapper for an enum-like object. - * Creates and caches a new EnumWrapper if one is not already cached. - * @param enumObj - An enum-like object. - * @return An instance of EnumWrapper for the provided enumObj. - */ - public static getCachedInstance(enumObj: any): EnumWrapper { - let result = EnumWrapper.instancesCache.get(enumObj); - - if (!result) { - result = new EnumWrapper(enumObj); - EnumWrapper.instancesCache.set(enumObj, result); - } - - return result; - } - - /** - * Create a new EnumWrapper instance. - * This is for internal use only. - * Use one of the following to publicly get/create an EnumWrapper - * instance: - * - {@link $enum} - * - {@link EnumWrapper.getCachedInstance} - * - * @param enumObj - An enum-like object. See the {@link EnumLike} type for more explanation. - */ - private constructor(private readonly enumObj: T) { - this.keysList = Object.freeze( - Object.keys(enumObj) - // Include only keys that are not index keys. - // This is necessary to ignore the reverse-lookup entries that are automatically added - // by TypeScript to numeric enums. - .filter(isNonIndexKey) - // Order of Object.keys() is implementation-dependent, so sort the keys to guarantee - // a consistent order for iteration. - .sort() - ); - - const length = this.keysList.length; - const valuesList = new Array(length); - const keysByValueMap = new Map(); - - // According to multiple tests found on jsperf.com, a plain for loop is faster than using - // Array.prototype.forEach - for (let index = 0; index < length; ++index) { - const key = this.keysList[index]; - const value = enumObj[key]; - - valuesList[index] = value; - keysByValueMap.set(value, key); - // Type casting of "this" necessary to bypass readonly index signature for initialization. - ((this as any) as EnumWrapper.Entry[])[index] = Object.freeze( - [key, value] as EnumWrapper.Entry - ); - } - - this.valuesList = Object.freeze(valuesList); - this.keysByValueMap = keysByValueMap; - this.size = this.length = length; - - // Make the EnumWrapper instance immutable - Object.freeze(this); - } - - /** - * @return "[object EnumWrapper]" - */ - public toString(): string { - return "[object EnumWrapper]"; - } - - /** - * Get an iterator for this enum's keys. - * Iteration order is based on sorted order of keys. - * Part of the Map-like interface. - * @return An iterator that iterates over this enum's keys. - */ - public keys(): IterableIterator { - let index = 0; - - return { - next: () => { - const isDone = index >= this.length; - const result: IteratorResult = { - done: isDone, - // "as any" cast is necessary to work around this bug: - // https://github.com/Microsoft/TypeScript/issues/11375 - value: isDone ? (undefined as any) : this.keysList[index] - }; - - ++index; - - return result; - }, - - [Symbol.iterator](): IterableIterator { - return this; - } - }; - } - - /** - * Get an iterator for this enum's values. - * Iteration order is based on sorted order of keys. - * Part of the Map-like interface. - * NOTE: If there are duplicate values in the enum, then there will also be duplicate values - * in the result. - * @return An iterator that iterates over this enum's values. - */ - public values(): IterableIterator { - let index = 0; - - return { - next: () => { - const isDone = index >= this.length; - const result: IteratorResult = { - done: isDone, - // "as any" cast is necessary to work around this bug: - // https://github.com/Microsoft/TypeScript/issues/11375 - value: isDone ? (undefined as any) : this.valuesList[index] - }; - - ++index; - - return result; - }, - - [Symbol.iterator](): IterableIterator { - return this; - } - }; - } - - /** - * Get an iterator for this enum's entries as [key, value] tuples. - * Iteration order is based on sorted order of keys. - * @return An iterator that iterates over this enum's entries as [key, value] tuples. - */ - public entries(): IterableIterator> { - let index = 0; - - return { - next: () => { - const isDone = index >= this.length; - const result: IteratorResult> = { - done: isDone, - // "as any" cast is necessary to work around this bug: - // https://github.com/Microsoft/TypeScript/issues/11375 - // NOTE: defensive copy not necessary because entries are "frozen" - value: isDone ? (undefined as any) : this[index] - }; - - ++index; - - return result; - }, - - [Symbol.iterator](): IterableIterator> { - return this; - } - }; - } - - /** - * Get an iterator for this enum's entries as [key, value] tuples. - * Iteration order is based on sorted order of keys. - * @return An iterator that iterates over this enum's entries as [key, value] tuples. - */ - public [Symbol.iterator](): IterableIterator> { - return this.entries(); - } - - /** - * Calls the provided iteratee on each item in this enum. - * Iteration order is based on sorted order of keys. - * See {@link EnumWrapper.Iteratee} for the signature of the iteratee. - * The return value of the iteratee is ignored. - * @param iteratee - The iteratee. - * @param context - If provided, then the iteratee will be called with the context as its "this" value. - */ - public forEach( - iteratee: EnumWrapper.Iteratee, - context?: any - ): void { - const length = this.length; - - // According to multiple tests found on jsperf.com, a plain for loop is faster than using - // Array.prototype.forEach - for (let index = 0; index < length; ++index) { - const entry = this[index]; - iteratee.call(context, entry[1], entry[0], this, index); - } - } - - /** - * Maps this enum's entries to a new list of values. - * Iteration order is based on sorted order of keys. - * Builds a new array containing the results of calling the provided iteratee on each item in this enum. - * See {@link EnumWrapper.Iteratee} for the signature of the iteratee. - * @param iteratee - The iteratee. - * @param context - If provided, then the iteratee will be called with the context as its "this" value. - * @return A new array containg the results of the iteratee. - * - * @template R - The of the mapped result for each entry. - */ - public map(iteratee: EnumWrapper.Iteratee, context?: any): R[] { - const length = this.length; - const result = new Array(length); - - // According to multiple tests found on jsperf.com, a plain for loop is faster than using Array.prototype.map - for (let index = 0; index < length; ++index) { - const entry = this[index]; - result[index] = iteratee.call( - context, - entry[1], - entry[0], - this, - index - ); - } - - return result; - } - - /** - * Get a list of this enum's keys. - * Order of items in the list is based on sorted order of keys. - * @return A list of this enum's keys. - */ - public getKeys(): (keyof T)[] { - // need to return a copy of this.keysList so it can be returned as Array instead of ReadonlyArray. - return this.keysList.slice(); - } - - /** - * Get a list of this enum's values. - * Order of items in the list is based on sorted order of keys. - * NOTE: If there are duplicate values in the enum, then there will also be duplicate values - * in the result. - * @return A list of this enum's values. - */ - public getValues(): T[keyof T][] { - // need to return a copy of this.valuesList so it can be returned as Array instead of ReadonlyArray. - return this.valuesList.slice(); - } - - /** - * Get a list of this enum's entries as [key, value] tuples. - * Order of items in the list is based on sorted order of keys. - * @return A list of this enum's entries as [key, value] tuples. - */ - public getEntries(): EnumWrapper.Entry[] { - // Create an array from the indexed entries of "this". - // NOTE: no need for defensive copy of each entry because all entries are "frozen". - return Array.prototype.slice.call(this); - } - - /** - * Tests if the provided string is actually a valid key for this enum - * Acts as a type guard to confirm that the provided value is actually the enum key type. - * @param key - A potential key value for this enum. - * @return True if the provided key is a valid key for this enum. - */ - public isKey(key: string | null | undefined): key is keyof T { - return ( - key != null && - isNonIndexKey(key) && - this.enumObj.hasOwnProperty(key) - ); - } - - /** - * Casts a string to a properly-typed key for this enum. - * Throws an error if the key is invalid. - * @param key - A potential key value for this enum. - * @return The provided key value, cast to the type of this enum's keys. - * @throws {Error} if the provided string is not a valid key for this enum. - */ - public asKeyOrThrow(key: string | null | undefined): keyof T { - if (this.isKey(key)) { - return key; - } else { - throw new Error( - `Unexpected key: ${key}. Expected one of: ${this.getValues()}` - ); - } - } - - /** - * Casts a string to a properly-typed key for this enum. - * Returns a default key if the provided key is invalid. - * @param key - A potential key value for this enum. - * @param defaultKey - The key to be returned if the provided key is invalid. - * @return The provided key value, cast to the type of this enum's keys. - * Returns `defaultKey` if the provided key is invalid. - */ - public asKeyOrDefault( - key: string | null | undefined, - defaultKey: keyof T - ): keyof T; - /** - * Casts a string to a properly-typed key for this enum. - * Returns a default key if the provided key is invalid. - * @param key - A potential key value for this enum. - * @param defaultKey - The key to be returned if the provided key is invalid. - * @return The provided key value, cast to the type of this enum's keys. - * Returns `defaultKey` if the provided key is invalid. - */ - public asKeyOrDefault( - key: string | null | undefined, - defaultKey?: keyof T - ): keyof T | undefined; - /** - * Casts a string to a properly-typed key for this enum. - * Returns a default key if the provided key is invalid. - * @param key - A potential key value for this enum. - * @param defaultKey - The key to be returned if the provided key is invalid. - * @return The provided key value, cast to the type of this enum's keys. - * Returns `defaultKey` if the provided key is invalid. - */ - public asKeyOrDefault( - key: string | null | undefined, - defaultKey: string - ): string; - /** - * Casts a string to a properly-typed key for this enum. - * Returns a default key if the provided key is invalid. - * @param key - A potential key value for this enum. - * @param defaultKey - The key to be returned if the provided key is invalid. - * @return The provided key value, cast to the type of this enum's keys. - * Returns `defaultKey` if the provided key is invalid. - */ - public asKeyOrDefault( - key: string | null | undefined, - defaultKey: string | undefined - ): string | undefined; - /** - * Casts a string to a properly-typed key for this enum. - * Returns a default key if the provided key is invalid. - * @param key - A potential key value for this enum. - * @param defaultKey - The key to be returned if the provided key is invalid. - * @return The provided key value, cast to the type of this enum's keys. - * Returns `defaultKey` if the provided key is invalid. - */ - public asKeyOrDefault( - key: string | null | undefined, - defaultKey?: keyof T | string - ): string | undefined { - if (this.isKey(key)) { - // type cast required to work around TypeScript bug: - // https://github.com/Microsoft/TypeScript/issues/21950 - return key as keyof T; - } else { - return defaultKey; - } - } - - /** - * Tests if the provided value is a valid value for this enum. - * Acts as a type guard to confirm that the provided value is actually the enum value type. - * @param value - A potential value for this enum. - * @return True if the provided value is valid for this enum. - */ - public isValue(value: V | null | undefined): value is T[keyof T] { - return value != null && this.keysByValueMap.has(value); - } - - /** - * Casts a value to a properly-typed value for this enum. - * Throws an error if the value is invalid. - * @param value - A potential value for this enum. - * @return The provided value, cast to the type of this enum's values. - * @throws {Error} if the provided value is not a valid value for this enum. - */ - public asValueOrThrow(value: V | null | undefined): T[keyof T] { - if (this.isValue(value)) { - return value; - } else { - throw new Error( - `Unexpected value: ${value}. Expected one of: ${this.getValues()}` - ); - } - } - - /** - * Casts a value to a properly-typed value for this enum. - * Returns a default value if the provided value is invalid. - * @param value - A potential value for this enum. - * @param defaultValue - The value to be returned if the provided value is invalid. - * @return The provided value, cast to the type of this enum's values. - * Returns `defaultValue` if the provided value is invalid. - */ - public asValueOrDefault( - value: V | null | undefined, - defaultValue: T[keyof T] - ): T[keyof T]; - /** - * Casts a value to a properly-typed value for this enum. - * Returns a default value if the provided value is invalid. - * @param value - A potential value for this enum. - * @param defaultValue - The value to be returned if the provided value is invalid. - * @return The provided value, cast to the type of this enum's values. - * Returns `defaultValue` if the provided value is invalid. - */ - public asValueOrDefault( - value: V | null | undefined, - defaultValue?: T[keyof T] - ): T[keyof T] | undefined; - /** - * Casts a value to a properly-typed value for this enum. - * Returns a default value if the provided value is invalid. - * @param value - A potential value for this enum. - * @param defaultValue - The value to be returned if the provided value is invalid. - * @return The provided value, cast to the type of this enum's values. - * Returns `defaultValue` if the provided value is invalid. - */ - public asValueOrDefault(value: V | null | undefined, defaultValue: V): V; - /** - * Casts a value to a properly-typed value for this enum. - * Returns a default value if the provided value is invalid. - * @param value - A potential value for this enum. - * @param defaultValue - The value to be returned if the provided value is invalid. - * @return The provided value, cast to the type of this enum's values. - * Returns `defaultValue` if the provided value is invalid. - */ - public asValueOrDefault( - value: V | null | undefined, - defaultValue: V | undefined - ): V | undefined; - /** - * Casts a value to a properly-typed value for this enum. - * Returns a default value if the provided value is invalid. - * @param value - A potential value for this enum. - * @param defaultValue - The value to be returned if the provided value is invalid. - * @return The provided value, cast to the type of this enum's values. - * Returns `defaultValue` if the provided value is invalid. - */ - public asValueOrDefault( - value: V | null | undefined, - defaultValue?: T[keyof T] | V - ): V | undefined { - if (this.isValue(value)) { - return value; - } else { - return defaultValue; - } - } - - /** - * Performs a reverse lookup from enum value to corresponding enum key. - * Throws an error if the value is invalid. - * NOTE: If this enum has any duplicate values, then one of the keys for the duplicated value is - * arbitrarily returned. - * @param value - A potential value for this enum. - * @return The key for the provided value. - * @throws {Error} if the provided value is not a valid value for this enum. - */ - public getKeyOrThrow(value: V | null | undefined): keyof T { - // NOTE: Intentionally not using isValue() or asValueOrThrow() to avoid making two key lookups into the map - // for successful lookups. - const result = - value != null ? this.keysByValueMap.get(value) : undefined; - - if (result != null) { - return result; - } else { - throw new Error( - `Unexpected value: ${value}. Expected one of: ${this.getValues()}` - ); - } - } - - /** - * Performs a reverse lookup from enum value to corresponding enum key. - * Returns a default key if the provided value is invalid. - * NOTE: If this enum has any duplicate values, then one of the keys for the duplicated value is - * arbitrarily returned. - * @param value - A potential value for this enum. - * @param defaultKey - The key to be returned if the provided value is invalid. - * @return The key for the provided value. - * Returns `defaultKey` if the provided value is invalid. - */ - public getKeyOrDefault( - value: V | null | undefined, - defaultKey: keyof T - ): keyof T; - /** - * Performs a reverse lookup from enum value to corresponding enum key. - * Returns a default key if the provided value is invalid. - * NOTE: If this enum has any duplicate values, then one of the keys for the duplicated value is - * arbitrarily returned. - * @param value - A potential value for this enum. - * @param defaultKey - The key to be returned if the provided value is invalid. - * @return The key for the provided value. - * Returns `defaultKey` if the provided value is invalid. - */ - public getKeyOrDefault( - value: V | null | undefined, - defaultKey?: keyof T - ): keyof T | undefined; - /** - * Performs a reverse lookup from enum value to corresponding enum key. - * Returns a default key if the provided value is invalid. - * NOTE: If this enum has any duplicate values, then one of the keys for the duplicated value is - * arbitrarily returned. - * @param value - A potential value for this enum. - * @param defaultKey - The key to be returned if the provided value is invalid. - * @return The key for the provided value. - * Returns `defaultKey` if the provided value is invalid. - */ - public getKeyOrDefault( - value: V | null | undefined, - defaultKey: string - ): string; - /** - * Performs a reverse lookup from enum value to corresponding enum key. - * Returns a default key if the provided value is invalid. - * NOTE: If this enum has any duplicate values, then one of the keys for the duplicated value is - * arbitrarily returned. - * @param value - A potential value for this enum. - * @param defaultKey - The key to be returned if the provided value is invalid. - * @return The key for the provided value. - * Returns `defaultKey` if the provided value is invalid. - */ - public getKeyOrDefault( - value: V | null | undefined, - defaultKey: string | undefined - ): string | undefined; - /** - * Performs a reverse lookup from enum value to corresponding enum key. - * Returns a default key if the provided value is invalid. - * NOTE: If this enum has any duplicate values, then one of the keys for the duplicated value is - * arbitrarily returned. - * @param value - A potential value for this enum. - * @param defaultKey - The key to be returned if the provided value is invalid. - * @return The key for the provided value. - * Returns `defaultKey` if the provided value is invalid. - */ - public getKeyOrDefault( - value: V | null | undefined, - defaultKey?: keyof T | string - ): string | undefined { - // NOTE: Intentionally not using isValue() to avoid making two key lookups into the map for successful lookups. - const result = - value != null ? this.keysByValueMap.get(value) : undefined; - - if (result != null) { - return result; - } else { - return defaultKey; - } - } - - /** - * Gets the enum value for the provided key. - * Throws an error if the provided key is invalid. - * @param key - A potential key value for this enum. - * @return The enum value for the provided key. - * @throws {Error} if the provided string is not a valid key for this enum. - */ - public getValueOrThrow(key: string | null | undefined): T[keyof T] { - // NOTE: The key MUST be separately validated before looking up the entry in enumObj to avoid false positive - // lookups for keys that match properties on Object.prototype, or keys that match the index keys of - // reverse lookups on numeric enums. - return this.enumObj[this.asKeyOrThrow(key)]; - } - - /** - * Gets the enum value for the provided key. - * Returns a default value if the provided key is invalid. - * @param key - A potential key value for this enum. - * @param defaultValue - The value to be returned if the provided key is invalid. - * @return The enum value for the provided key. - * Returns `defaultValue` if the provided key is invalid. - */ - public getValueOrDefault( - key: string | null | undefined, - defaultValue: T[keyof T] - ): T[keyof T]; - /** - * Gets the enum value for the provided key. - * Returns a default value if the provided key is invalid. - * @param key - A potential key value for this enum. - * @param defaultValue - The value to be returned if the provided key is invalid. - * @return The enum value for the provided key. - * Returns `defaultValue` if the provided key is invalid. - */ - public getValueOrDefault( - key: string | null | undefined, - defaultValue?: T[keyof T] - ): T[keyof T] | undefined; - /** - * Gets the enum value for the provided key. - * Returns a default value if the provided key is invalid. - * @param key - A potential key value for this enum. - * @param defaultValue - The value to be returned if the provided key is invalid. - * @return The enum value for the provided key. - * Returns `defaultValue` if the provided key is invalid. - */ - public getValueOrDefault( - key: string | null | undefined, - defaultValue: V - ): V; - /** - * Gets the enum value for the provided key. - * Returns a default value if the provided key is invalid. - * @param key - A potential key value for this enum. - * @param defaultValue - The value to be returned if the provided key is invalid. - * @return The enum value for the provided key. - * Returns `defaultValue` if the provided key is invalid. - */ - public getValueOrDefault( - key: string | null | undefined, - defaultValue: V | undefined - ): V | undefined; - /** - * Gets the enum value for the provided key. - * Returns a default value if the provided key is invalid. - * @param key - A potential key value for this enum. - * @param defaultValue - The value to be returned if the provided key is invalid. - * @return The enum value for the provided key. - * Returns `defaultValue` if the provided key is invalid. - */ - public getValueOrDefault( - key: string | null | undefined, - defaultValue?: T[keyof T] | V - ): V | undefined { - // NOTE: The key MUST be separately validated before looking up the entry in enumObj to avoid false positive - // lookups for keys that match properties on Object.prototype, or keys that match the index keys of - // reverse lookups on numeric enums. - if (this.isKey(key)) { - // type cast required to work around TypeScript bug: - // https://github.com/Microsoft/TypeScript/issues/21950 - return this.enumObj[key as keyof T]; - } else { - return defaultValue; - } - } -} - -export namespace EnumWrapper { - /** - * A tuple containing the key and value of a single entry in an enum. - * @template V - Type of the enum value. - * @template T - Type of an enum-like object. - */ - export type Entry< - V extends number | string = number | string, - T extends EnumLike = any - > = Readonly<[keyof T, T[keyof T]]>; - - /** - * A function used in iterating all key/value entries in an enum. - * @param value - An enum value. - * @param key - An enum key. - * @param enumWrapper - The EnumWrapper instance being iterated.. - * @param index - The index of the enum entry, based on sorted order of keys. - * @return A result. The significance of the result depends on the type of iteration being performed. - * - * @template R - The type of the result. - * @template V - Type of the enum value. - * @template T - Type of an enum-like object. - */ - export type Iteratee< - R = any, - V extends number | string = number | string, - T extends EnumLike = any - > = ( - this: any, - value: T[keyof T], - key: keyof T, - enumWrapper: EnumWrapper, - index: number - ) => R; -} - -/** - * Type alias for an {@link EnumWrapper} for any type of enum-like object that contains only number values. - * - * @template T - Type of an enum-like object that contains only number values. - */ -export type NumberEnumWrapper< - T extends EnumLike = any -> = EnumWrapper; - -export namespace NumberEnumWrapper { - /** - * Type alias for an {@link EnumWrapper.Entry} for any type of enum-like object that contains only number values. - * - * @template T - Type of an enum-like object that contains only number values. - */ - export type Entry< - T extends EnumLike = any - > = EnumWrapper.Entry; - - /** - * Type alias for an {@link EnumWrapper.Iteratee} for any type of enum-like object that contains only number values. - * - * @template R - The type of the result. - * @template T - Type of an enum-like object that contains only number values. - */ - export type Iteratee< - R = any, - T extends EnumLike = any - > = EnumWrapper.Iteratee; -} - -/** - * Type alias for an {@link EnumWrapper} for any type of enum-like object that contains only string values. - * - * @template T - Type of an enum-like object that contains only string values. - */ -export type StringEnumWrapper< - T extends EnumLike = any -> = EnumWrapper; - -export namespace StringEnumWrapper { - /** - * Type alias for an {@link EnumWrapper.Entry} for any type of enum-like object that contains only string values. - * - * @template T - Type of an enum-like object that contains only string values. - */ - export type Entry< - T extends EnumLike = any - > = EnumWrapper.Entry; - - /** - * Type alias for an {@link EnumWrapper.Iteratee} for any type of enum-like object that contains only string values. - * - * @template R - The type of the result. - * @template T - Type of an enum-like object that contains only string values. - */ - export type Iteratee< - R = any, - T extends EnumLike = any - > = EnumWrapper.Iteratee; -} - -/** - * Type alias for an {@link EnumWrapper} for any type of enum-like object that contains a mix of - * number and string values. - * - * @template T - Type of an enum-like object that contains a mix of number and string values. - */ -export type MixedEnumWrapper< - T extends EnumLike = any -> = EnumWrapper; - -export namespace MixedEnumWrapper { - /** - * Type alias for an {@link EnumWrapper.Entry} for any type of enum-like object that contains a mix of - * number and string values. - * - * @template T - Type of an enum-like object that contains a mix of number and string values. - */ - export type Entry< - T extends EnumLike = any - > = EnumWrapper.Entry; - - /** - * Type alias for an {@link EnumWrapper.Iteratee} for any type of enum-like object that contains a mix of - * number and string values. - * - * @template R - The type of the result. - * @template T - Type of an enum-like object that contains a mix of number and string values. - */ - export type Iteratee< - R = any, - T extends EnumLike = any - > = EnumWrapper.Iteratee; -} - -/** - * Alias of {@link EnumWrapper.getCachedInstance} for convenience. - * Gets a cached EnumWrapper for an enum-like object. - * Creates and caches a new EnumWrapper if one is not already cached. - * @param enumObj - An enum-like object. - * @return An instance of EnumWrapper for the provided enumObj. - */ -export const $enum = EnumWrapper.getCachedInstance; - -/** - * Return true if the specified object key value is NOT an integer index key. - * @param key - An object key. - * @return true if the specified object key value is NOT an integer index key. - */ -function isNonIndexKey(key: string): boolean { - // If after converting the key to an integer, then back to a string, the result is different - // than the original key, then the key is NOT an integer index. - // See ECMAScript spec section 15.4: http://www.ecma-international.org/ecma-262/5.1/#sec-15.4 - return key !== String(parseInt(key, 10)); -} +export * from "./EnumWrapper"; +export * from "./EnumValueVisitor"; +export * from "./EnumValueVisitee"; +export * from "./EnumValueMapper"; +export * from "./EnumValueMappee"; +export * from "./$enum"; +export * from "./mapEnumValue"; +export * from "./visitEnumValue"; +export * from "./symbols"; diff --git a/src/mapEnumValue.ts b/src/mapEnumValue.ts new file mode 100644 index 0000000..eac19a3 --- /dev/null +++ b/src/mapEnumValue.ts @@ -0,0 +1,104 @@ +import { + EnumValueMappee, + EnumValueMappeeWithNull, + EnumValueMappeeWithUndefined, + EnumValueMappeeWithNullAndUndefined +} from "./EnumValueMappee"; + +/** + * Union of all "EnumValueMappee" types. + */ +type AnyEnumValueMappee = + | EnumValueMappee + | EnumValueMappeeWithNull + | EnumValueMappeeWithUndefined + | EnumValueMappeeWithNullAndUndefined; + +/** + * The first step to mapping the value of an enum or string/number literal type. + * This method creates a "mappee" wrapper object, whose "with()" method must be + * called with a mapper implementation. + * + * Example: mapEnumValue(aStringEnumValue).with({ ... }). + * + * See also, {@link EnumValueMappee#with} and {@link ValueMapper}. + * + * @template E - An enum or string/number literal type. + * + * @param value - The value to visit. Must be an enum or string/number literal. + * @return A "mappee" wrapper around the provided value, whose "with()" method + * must be called with a mapper implementation. + */ +export function mapEnumValue( + value: E +): EnumValueMappee; +/** + * The first step to mapping the value of an enum or string/number literal type. + * This method creates a "mappee" wrapper object, whose "with()" method must be + * called with a mapper implementation. + * + * Example: mapEnumValue(aStringEnumValue).with({ ... }). + * + * See also, {@link EnumValueMappeeWithNull#with} and {@link ValueMapperWithNull}. + * + * @template E - An enum or string/number literal type. + * + * @param value - The value to visit. Must be an enum or string/number literal. + * @return A "mappee" wrapper around the provided value, whose "with()" method + * must be called with a mapper implementation. + */ +export function mapEnumValue( + value: E | null +): EnumValueMappeeWithNull; +/** + * The first step to mapping the value of an enum or string/number literal type. + * This method creates a "mappee" wrapper object, whose "with()" method must be + * called with a mapper implementation. + * + * Example: mapEnumValue(aStringEnumValue).with({ ... }). + * + * See also, {@link EnumValueMappeeWithUndefined#with} and + * {@link ValueMapperWithUndefined}. + * + * @template E - An enum or string/number literal type. + * + * @param value - The value to visit. Must be an enum or string/number literal. + * @return A "mappee" wrapper around the provided value, whose "with()" method + * must be called with a mapper implementation. + */ +export function mapEnumValue( + value: E | undefined +): EnumValueMappeeWithUndefined; +/** + * The first step to mapping the value of an enum or string/number literal type. + * This method creates a "mappee" wrapper object, whose "with()" method must be + * called with a mapper implementation. + * + * Example: mapEnumValue(aStringEnumValue).with({ ... }). + * See also, {@link EnumValueMappeeWithNullAndUndefined#with} and + * {@link ValueMapperWithNullAndUndefined}. + * + * @template E - An enum or string/number literal type. + * + * @param value - The value to visit. Must be an enum or string/number literal. + * @return A "mappee" wrapper around the provided value, whose "with()" method + * must be called with a mapper implementation. + */ +export function mapEnumValue( + value: E | null | undefined +): EnumValueMappeeWithNullAndUndefined; + +export function mapEnumValue( + value: E | null | undefined +): AnyEnumValueMappee { + // NOTE: The run time type of EnumValueMappee created does not necessarily match + // the compile-time type. This results in unusual EnumValueMappee.with() + // implementations. + if (value === null) { + return new EnumValueMappeeWithNull(); + } else if (value === undefined) { + return new EnumValueMappeeWithUndefined(); + } else { + return new EnumValueMappee(value); + } +} diff --git a/src/objectKeysUtil.ts b/src/objectKeysUtil.ts new file mode 100644 index 0000000..94e66b4 --- /dev/null +++ b/src/objectKeysUtil.ts @@ -0,0 +1,88 @@ +import { StringKeyOf } from "./types"; + +/** + * Return true if the specified object key value is NOT a numeric key. + * @param key - An object key. + * @return true if the specified object key value is NOT a numeric key. + */ +export function isNonNumericKey(key: string): boolean { + return key !== String(parseFloat(key)); +} + +/** + * Get all own enumerable string (non-numeric) keys of an object. + * Implemented in terms of methods available in ES6. + * The order of the result is *guaranteed* to be in the same order in which the + * properties were added to the object, due to the specification of the + * Object.getOwnPropertyNames method. + * (first all numeric keys) + * @param obj - An object. + * @return A list of all the object's own enumerable string (non-numeric) keys. + */ +export function getOwnEnumerableNonNumericKeysES6< + T extends Record +>(obj: T): StringKeyOf[] { + return Object.getOwnPropertyNames(obj).filter((key) => { + return obj.propertyIsEnumerable(key) && isNonNumericKey(key); + }) as StringKeyOf[]; +} + +/** + * Get all own enumerable string (non-numeric) keys of an object. + * Implemented in terms of methods available in ES5. + * The order of the result is *most likely* to be in the same order in which the + * properties were added to the object, due to de-facto standards in most JS + * runtime environments' implementations of Object.keys + * @param obj - An object. + * @return A list of all the object's own enumerable string (non-numeric) keys. + */ +export function getOwnEnumerableNonNumericKeysES5< + T extends Record +>(obj: T): StringKeyOf[] { + return Object.keys(obj).filter(isNonNumericKey) as StringKeyOf[]; +} + +/** + * Get all own enumerable string (non-numeric) keys of an object. + * Implemented in terms of methods available in ES3. + * The order of the result is *most likely* to be in the same order in which the + * properties were added to the object, due to de-facto standards in most JS + * runtime environments' implementations of for/in object key iteration. + * @param obj - An object. + * @return A list of all the object's own enumerable string (non-numeric) keys. + */ +export function getOwnEnumerableNonNumericKeysES3< + T extends Record +>(obj: T): StringKeyOf[] { + const result: StringKeyOf[] = []; + + for (const key in obj) { + if ( + obj.hasOwnProperty(key) && + obj.propertyIsEnumerable(key) && + isNonNumericKey(key) + ) { + result.push(key); + } + } + + return result; +} + +/** + * Get all own enumerable string (non-numeric) keys of an object, using + * the best implementation available. + * The order of the result is either *guaranteed* or *most likely* to be in the + * same order in which the properties were added to the object, depending on + * the best available implementation. + * @see getEnumerableStringKeysES6 + * @see getEnumerableStringKeysES5 + * @see getEnumerableStringKeysES3 + * @param obj - An object. + * @return A list of all the object's own enumerable string (non-numeric) keys. + */ +export const getOwnEnumerableNonNumericKeys = !!Object.getOwnPropertyNames + ? getOwnEnumerableNonNumericKeysES6 + : !!Object.keys + ? getOwnEnumerableNonNumericKeysES5 + : getOwnEnumerableNonNumericKeysES3; diff --git a/src/symbols.ts b/src/symbols.ts new file mode 100644 index 0000000..a7c92c2 --- /dev/null +++ b/src/symbols.ts @@ -0,0 +1,33 @@ +/** + * Unique symbol to be used as the value of an entry in a value + * visitor/mapper implementation to indicate that the entry is explicitly + * not handled. + * If the corresponding value is encountered at run-time, then an error is + * thrown. + */ +export const unhandledEntry = Symbol("ts-enum-util:unhandledEntry"); + +/** + * Unique symbol used as a property name in value visitor/mapper + * implementations to define a special null value handler. + * A symbol is used to avoid any possibility of a collision with an actual + * string enum value. + */ +export const handleNull = Symbol("ts-enum-util:handleNull"); + +/** + * Unique symbol used as a property name in value visitor/mapper + * implementations to define a special undefined value handler. + * A symbol is used to avoid any possibility of a collision with an actual + * string enum value. + */ +export const handleUndefined = Symbol("ts-enum-util:handleUndefined"); + +/** + * Unique symbol used as a property name in value visitor/mapper + * implementations to define a special "unexpected" value handler (handles + * values at run-time that are unexpected based on compile time type). + * A symbol is used to avoid any possibility of a collision with an actual + * string enum value. + */ +export const handleUnexpected = Symbol("ts-enum-util:handleUnexpected"); diff --git a/src/types.ts b/src/types.ts new file mode 100644 index 0000000..00a6b58 --- /dev/null +++ b/src/types.ts @@ -0,0 +1,6 @@ +/** + * Extracts only keys of type T that are assignable to type `string`. + * This is necessary starting with TypeScript 2.9 because keyof T can now + * include `number` and `symbol` types. + */ +export type StringKeyOf = Extract; diff --git a/src/visitEnumValue.ts b/src/visitEnumValue.ts new file mode 100644 index 0000000..baddd7e --- /dev/null +++ b/src/visitEnumValue.ts @@ -0,0 +1,104 @@ +import { + EnumValueVisitee, + EnumValueVisiteeWithNull, + EnumValueVisiteeWithUndefined, + EnumValueVisiteeWithNullAndUndefined +} from "./EnumValueVisitee"; + +/** + * Union of all "EnumValueVisitee" types. + */ +type AnyEnumValueVisitee = + | EnumValueVisitee + | EnumValueVisiteeWithNull + | EnumValueVisiteeWithUndefined + | EnumValueVisiteeWithNullAndUndefined; + +/** + * The first step to mapping the value of an enum or string/number literal type. + * This method creates a "mappee" wrapper object, whose "with()" method must be + * called with a mapper implementation. + * + * Example: visitEnumValue(aStringEnumValue).with({ ... }). + * + * See also, {@link EnumValueVisitee#with} and {@link ValueMapper}. + * + * @template E - An enum or string/number literal type. + * + * @param value - The value to visit. Must be an enum or string/number literal. + * @return A "mappee" wrapper around the provided value, whose "with()" method + * must be called with a mapper implementation. + */ +export function visitEnumValue( + value: E +): EnumValueVisitee; +/** + * The first step to mapping the value of an enum or string/number literal type. + * This method creates a "mappee" wrapper object, whose "with()" method must be + * called with a mapper implementation. + * + * Example: visitEnumValue(aStringEnumValue).with({ ... }). + * + * See also, {@link EnumValueVisiteeWithNull#with} and {@link ValueMapperWithNull}. + * + * @template E - An enum or string/number literal type. + * + * @param value - The value to visit. Must be an enum or string/number literal. + * @return A "mappee" wrapper around the provided value, whose "with()" method + * must be called with a mapper implementation. + */ +export function visitEnumValue( + value: E | null +): EnumValueVisiteeWithNull; +/** + * The first step to mapping the value of an enum or string/number literal type. + * This method creates a "mappee" wrapper object, whose "with()" method must be + * called with a mapper implementation. + * + * Example: visitEnumValue(aStringEnumValue).with({ ... }). + * + * See also, {@link EnumValueVisiteeWithUndefined#with} and + * {@link ValueMapperWithUndefined}. + * + * @template E - An enum or string/number literal type. + * + * @param value - The value to visit. Must be an enum or string/number literal. + * @return A "mappee" wrapper around the provided value, whose "with()" method + * must be called with a mapper implementation. + */ +export function visitEnumValue( + value: E | undefined +): EnumValueVisiteeWithUndefined; +/** + * The first step to mapping the value of an enum or string/number literal type. + * This method creates a "mappee" wrapper object, whose "with()" method must be + * called with a mapper implementation. + * + * Example: visitEnumValue(aStringEnumValue).with({ ... }). + * See also, {@link EnumValueVisiteeWithNullAndUndefined#with} and + * {@link ValueMapperWithNullAndUndefined}. + * + * @template E - An enum or string/number literal type. + * + * @param value - The value to visit. Must be an enum or string/number literal. + * @return A "mappee" wrapper around the provided value, whose "with()" method + * must be called with a mapper implementation. + */ +export function visitEnumValue( + value: E | null | undefined +): EnumValueVisiteeWithNullAndUndefined; + +export function visitEnumValue( + value: E | null | undefined +): AnyEnumValueVisitee { + // NOTE: The run time type of EnumValueVisitee created does not necessarily match + // the compile-time type. This results in unusual EnumValueVisitee.with() + // implementations. + if (value === null) { + return new EnumValueVisiteeWithNull(); + } else if (value === undefined) { + return new EnumValueVisiteeWithUndefined(); + } else { + return new EnumValueVisitee(value); + } +} diff --git a/tests/$enum-both.test.ts b/tests/$enum-mixed.test.ts similarity index 100% rename from tests/$enum-both.test.ts rename to tests/$enum-mixed.test.ts diff --git a/tests/EnumWrapper-both.test.ts b/tests/EnumWrapper-mixed.test.ts similarity index 83% rename from tests/EnumWrapper-both.test.ts rename to tests/EnumWrapper-mixed.test.ts index c9f8921..169e6f1 100644 --- a/tests/EnumWrapper-both.test.ts +++ b/tests/EnumWrapper-mixed.test.ts @@ -1,7 +1,7 @@ -import { EnumWrapper } from "../src"; +import { $enum } from "../src"; -// NOTE: Intentionally out of order to test that EnumWrapper iteration is always based -// on sorted keys. +// NOTE: Intentionally out of order keys and values to confirm original +// defined order is retained enum TestEnum { D = 0, // duplicate of A B = "2", @@ -10,24 +10,21 @@ enum TestEnum { } describe("EnumWrapper: number+string enum", () => { - const enumWrapper = EnumWrapper.getCachedInstance(TestEnum); + const enumWrapper = $enum(TestEnum); - test("toString()", () => { - expect(String(enumWrapper)).toBe("[object EnumWrapper]"); + test("@@toStringTag()", () => { + expect(Object.prototype.toString.call(enumWrapper)).toBe( + "[object EnumWrapper]" + ); }); - test("getCachedInstance()", () => { - const result1 = EnumWrapper.getCachedInstance(TestEnum); - const result2 = EnumWrapper.getCachedInstance(TestEnum); - - expect(result1 instanceof EnumWrapper).toBe(true); - // returns cached instance - expect(result1).toBe(result2); + test("toString()", () => { + expect(enumWrapper.toString()).toBe("[object EnumWrapper]"); }); test("does not observably alter the enum", () => { // Wrap the enum, then confirm that there are no extra properties/keys available - EnumWrapper.getCachedInstance(TestEnum); + $enum(TestEnum); expect(Object.keys(TestEnum)).toEqual(["0", "2", "D", "B", "A", "C"]); expect(Object.getOwnPropertyNames(TestEnum)).toEqual([ @@ -40,11 +37,9 @@ describe("EnumWrapper: number+string enum", () => { ]); const result = []; + // tslint:disable-next-line:forin for (const key in TestEnum) { - if (true) { - // bypass tslint error - result.push(key); - } + result.push(key); } expect(result).toEqual(["0", "2", "D", "B", "A", "C"]); @@ -86,10 +81,10 @@ describe("EnumWrapper: number+string enum", () => { }); test("index signature", () => { - expect(enumWrapper[0]).toEqual(["A", TestEnum.A]); + expect(enumWrapper[0]).toEqual(["D", TestEnum.D]); expect(enumWrapper[1]).toEqual(["B", TestEnum.B]); - expect(enumWrapper[2]).toEqual(["C", TestEnum.C]); - expect(enumWrapper[3]).toEqual(["D", TestEnum.D]); + expect(enumWrapper[2]).toEqual(["A", TestEnum.A]); + expect(enumWrapper[3]).toEqual(["C", TestEnum.C]); }); }); @@ -105,12 +100,12 @@ describe("EnumWrapper: number+string enum", () => { expect(next).toEqual({ done: false, - value: "A" + value: "D" }); }); test("iterates all keys", () => { - const expected = ["A", "B", "C", "D"]; + const expected = ["D", "B", "A", "C"]; const result = Array.from(enumWrapper.keys()); expect(result).toEqual(expected); }); @@ -123,16 +118,16 @@ describe("EnumWrapper: number+string enum", () => { expect(next).toEqual({ done: false, - value: TestEnum.A + value: TestEnum.D }); }); test("iterates all values", () => { const expected = [ - TestEnum.A, + TestEnum.D, TestEnum.B, - TestEnum.C, - TestEnum.D + TestEnum.A, + TestEnum.C ]; const result = Array.from(enumWrapper.values()); expect(result).toEqual(expected); @@ -146,16 +141,16 @@ describe("EnumWrapper: number+string enum", () => { expect(next).toEqual({ done: false, - value: ["A", TestEnum.A] + value: ["D", TestEnum.D] }); }); test("iterates all entries", () => { const expected = [ - ["A", TestEnum.A], + ["D", TestEnum.D], ["B", TestEnum.B], - ["C", TestEnum.C], - ["D", TestEnum.D] + ["A", TestEnum.A], + ["C", TestEnum.C] ]; const result = Array.from(enumWrapper.entries()); @@ -182,16 +177,16 @@ describe("EnumWrapper: number+string enum", () => { expect(next).toEqual({ done: false, - value: ["A", TestEnum.A] + value: ["D", TestEnum.D] }); }); test("iterates all entries", () => { const expected = [ - ["A", TestEnum.A], + ["D", TestEnum.D], ["B", TestEnum.B], - ["C", TestEnum.C], - ["D", TestEnum.D] + ["A", TestEnum.A], + ["C", TestEnum.C] ]; const result = Array.from(enumWrapper[Symbol.iterator]()); @@ -224,10 +219,10 @@ describe("EnumWrapper: number+string enum", () => { enumWrapper.forEach(iterateeSpy); expect(iterateeSpy.mock.calls).toEqual([ - [TestEnum.A, "A", enumWrapper, 0], + [TestEnum.D, "D", enumWrapper, 0], [TestEnum.B, "B", enumWrapper, 1], - [TestEnum.C, "C", enumWrapper, 2], - [TestEnum.D, "D", enumWrapper, 3] + [TestEnum.A, "A", enumWrapper, 2], + [TestEnum.C, "C", enumWrapper, 3] ]); }); @@ -243,17 +238,27 @@ describe("EnumWrapper: number+string enum", () => { enumWrapper.forEach(iterateeSpy, context); expect(iterateeSpy.mock.calls).toEqual([ - [TestEnum.A, "A", enumWrapper, 0], + [TestEnum.D, "D", enumWrapper, 0], [TestEnum.B, "B", enumWrapper, 1], - [TestEnum.C, "C", enumWrapper, 2], - [TestEnum.D, "D", enumWrapper, 3] + [TestEnum.A, "A", enumWrapper, 2], + [TestEnum.C, "C", enumWrapper, 3] ]); }); }); }); + test("indexOfKey()", () => { + expect(enumWrapper.indexOfKey("B")).toBe(1); + expect(enumWrapper.indexOfKey("C")).toBe(3); + }); + + test("indexOfValue()", () => { + expect(enumWrapper.indexOfValue(TestEnum.B)).toBe(1); + expect(enumWrapper.indexOfValue(TestEnum.C)).toBe(3); + }); + test("getKeys()", () => { - const expected = ["A", "B", "C", "D"]; + const expected = ["D", "B", "A", "C"]; const result = enumWrapper.getKeys(); expect(result).toEqual(expected); @@ -263,7 +268,7 @@ describe("EnumWrapper: number+string enum", () => { }); test("getValues()", () => { - const expected = [TestEnum.A, TestEnum.B, TestEnum.C, TestEnum.D]; + const expected = [TestEnum.D, TestEnum.B, TestEnum.A, TestEnum.C]; const result = enumWrapper.getValues(); expect(result).toEqual(expected); @@ -275,10 +280,10 @@ describe("EnumWrapper: number+string enum", () => { describe("getEntries()", () => { test("returns array of entries", () => { const expected = [ - ["A", TestEnum.A], + ["D", TestEnum.D], ["B", TestEnum.B], - ["C", TestEnum.C], - ["D", TestEnum.D] + ["A", TestEnum.A], + ["C", TestEnum.C] ]; const result = enumWrapper.getEntries(); expect(result).toEqual(expected); @@ -314,13 +319,13 @@ describe("EnumWrapper: number+string enum", () => { const result = enumWrapper.map(iterateeSpy); - expect(result).toEqual(["A0", "B2", "C2", "D0"]); + expect(result).toEqual(["D0", "B2", "A0", "C2"]); expect(iterateeSpy.mock.calls).toEqual([ - [TestEnum.A, "A", enumWrapper, 0], + [TestEnum.D, "D", enumWrapper, 0], [TestEnum.B, "B", enumWrapper, 1], - [TestEnum.C, "C", enumWrapper, 2], - [TestEnum.D, "D", enumWrapper, 3] + [TestEnum.A, "A", enumWrapper, 2], + [TestEnum.C, "C", enumWrapper, 3] ]); }); @@ -336,13 +341,13 @@ describe("EnumWrapper: number+string enum", () => { const result = enumWrapper.map(iterateeSpy, context); - expect(result).toEqual(["A0", "B2", "C2", "D0"]); + expect(result).toEqual(["D0", "B2", "A0", "C2"]); expect(iterateeSpy.mock.calls).toEqual([ - [TestEnum.A, "A", enumWrapper, 0], + [TestEnum.D, "D", enumWrapper, 0], [TestEnum.B, "B", enumWrapper, 1], - [TestEnum.C, "C", enumWrapper, 2], - [TestEnum.D, "D", enumWrapper, 3] + [TestEnum.A, "A", enumWrapper, 2], + [TestEnum.C, "C", enumWrapper, 3] ]); }); }); @@ -452,12 +457,12 @@ describe("EnumWrapper: number+string enum", () => { }); test("getKeyOrThrow()", () => { - // A and D have duplicate values, but D is ordered after A, and last duplicate entry wins, - // so D's key is returned when looking up the value of A or D. - expect(enumWrapper.getKeyOrThrow(TestEnum.A)).toBe("D"); + // A and D have duplicate values, but A is ordered after D, and last duplicate entry wins, + // so A's key is returned when looking up the value of A or D. + expect(enumWrapper.getKeyOrThrow(TestEnum.A)).toBe("A"); expect(enumWrapper.getKeyOrThrow(TestEnum.B)).toBe("B"); expect(enumWrapper.getKeyOrThrow(TestEnum.C)).toBe("C"); - expect(enumWrapper.getKeyOrThrow(TestEnum.D)).toBe("D"); + expect(enumWrapper.getKeyOrThrow(TestEnum.D)).toBe("A"); expect(() => { enumWrapper.getKeyOrThrow(-1); @@ -482,12 +487,12 @@ describe("EnumWrapper: number+string enum", () => { }); test("getKeyOrDefault()", () => { - // A and D have duplicate values, but D is ordered after A, and last duplicate entry wins, - // so D's key is returned when looking up the value of A or D. - expect(enumWrapper.getKeyOrDefault(TestEnum.A)).toBe("D"); + // A and D have duplicate values, but A is ordered after D, and last duplicate entry wins, + // so A's key is returned when looking up the value of A or D. + expect(enumWrapper.getKeyOrDefault(TestEnum.A)).toBe("A"); expect(enumWrapper.getKeyOrDefault(TestEnum.B)).toBe("B"); expect(enumWrapper.getKeyOrDefault(TestEnum.C)).toBe("C"); - expect(enumWrapper.getKeyOrDefault(TestEnum.D)).toBe("D"); + expect(enumWrapper.getKeyOrDefault(TestEnum.D)).toBe("A"); expect(enumWrapper.getKeyOrDefault(-1)).toBe(undefined); expect(enumWrapper.getKeyOrDefault("blah")).toBe(undefined); @@ -537,4 +542,11 @@ describe("EnumWrapper: number+string enum", () => { ); expect(enumWrapper.getValueOrDefault(undefined, -1)).toBe(-1); }); + + test("createEnumSubset()", () => { + expect(enumWrapper.createEnumSubset("A", "C")).toEqual({ + A: TestEnum.A, + C: TestEnum.C + }); + }); }); diff --git a/tests/EnumWrapper-number.test.ts b/tests/EnumWrapper-number.test.ts index d1a9894..ff1cef3 100644 --- a/tests/EnumWrapper-number.test.ts +++ b/tests/EnumWrapper-number.test.ts @@ -1,62 +1,57 @@ -import { EnumWrapper } from "../src"; +import { $enum } from "../src"; -// NOTE: Intentionally out of order to test that EnumWrapper iteration is always based -// on sorted keys. +// NOTE: Intentionally out of order keys and values to confirm original +// defined order is retained enum TestEnum { D = 0, // duplicate of A - B = 1, + B = -1.7, // not a positive integer A = 0, C = 2 } describe("EnumWrapper: string enum", () => { - const enumWrapper = EnumWrapper.getCachedInstance(TestEnum); + const enumWrapper = $enum(TestEnum); - test("toString()", () => { - expect(String(enumWrapper)).toBe("[object EnumWrapper]"); + test("@@toStringTag()", () => { + expect(Object.prototype.toString.call(enumWrapper)).toBe( + "[object EnumWrapper]" + ); }); - test("getCachedInstance()", () => { - const result1 = EnumWrapper.getCachedInstance(TestEnum); - const result2 = EnumWrapper.getCachedInstance(TestEnum); - - expect(result1 instanceof EnumWrapper).toBe(true); - // returns cached instance - expect(result1).toBe(result2); + test("toString()", () => { + expect(enumWrapper.toString()).toBe("[object EnumWrapper]"); }); test("does not observably alter the enum", () => { // Wrap the enum, then confirm that there are no extra properties/keys available - EnumWrapper.getCachedInstance(TestEnum); + $enum(TestEnum); expect(Object.keys(TestEnum)).toEqual([ "0", - "1", "2", "D", "B", + "-1.7", "A", "C" ]); expect(Object.getOwnPropertyNames(TestEnum)).toEqual([ "0", - "1", "2", "D", "B", + "-1.7", "A", "C" ]); const result = []; + // tslint:disable-next-line:forin for (const key in TestEnum) { - if (true) { - // bypass tslint error - result.push(key); - } + result.push(key); } - expect(result).toEqual(["0", "1", "2", "D", "B", "A", "C"]); + expect(result).toEqual(["0", "2", "D", "B", "-1.7", "A", "C"]); }); describe("is immutable at run time", () => { @@ -95,10 +90,10 @@ describe("EnumWrapper: string enum", () => { }); test("index signature", () => { - expect(enumWrapper[0]).toEqual(["A", TestEnum.A]); + expect(enumWrapper[0]).toEqual(["D", TestEnum.D]); expect(enumWrapper[1]).toEqual(["B", TestEnum.B]); - expect(enumWrapper[2]).toEqual(["C", TestEnum.C]); - expect(enumWrapper[3]).toEqual(["D", TestEnum.D]); + expect(enumWrapper[2]).toEqual(["A", TestEnum.A]); + expect(enumWrapper[3]).toEqual(["C", TestEnum.C]); }); }); @@ -114,12 +109,12 @@ describe("EnumWrapper: string enum", () => { expect(next).toEqual({ done: false, - value: "A" + value: "D" }); }); test("iterates all keys", () => { - const expected = ["A", "B", "C", "D"]; + const expected = ["D", "B", "A", "C"]; const result = Array.from(enumWrapper.keys()); expect(result).toEqual(expected); }); @@ -132,16 +127,16 @@ describe("EnumWrapper: string enum", () => { expect(next).toEqual({ done: false, - value: TestEnum.A + value: TestEnum.D }); }); test("iterates all values", () => { const expected = [ - TestEnum.A, + TestEnum.D, TestEnum.B, - TestEnum.C, - TestEnum.D + TestEnum.A, + TestEnum.C ]; const result = Array.from(enumWrapper.values()); expect(result).toEqual(expected); @@ -155,16 +150,16 @@ describe("EnumWrapper: string enum", () => { expect(next).toEqual({ done: false, - value: ["A", TestEnum.A] + value: ["D", TestEnum.D] }); }); test("iterates all entries", () => { const expected = [ - ["A", TestEnum.A], + ["D", TestEnum.D], ["B", TestEnum.B], - ["C", TestEnum.C], - ["D", TestEnum.D] + ["A", TestEnum.A], + ["C", TestEnum.C] ]; const result = Array.from(enumWrapper.entries()); @@ -191,16 +186,16 @@ describe("EnumWrapper: string enum", () => { expect(next).toEqual({ done: false, - value: ["A", TestEnum.A] + value: ["D", TestEnum.D] }); }); test("iterates all entries", () => { const expected = [ - ["A", TestEnum.A], + ["D", TestEnum.D], ["B", TestEnum.B], - ["C", TestEnum.C], - ["D", TestEnum.D] + ["A", TestEnum.A], + ["C", TestEnum.C] ]; const result = Array.from(enumWrapper[Symbol.iterator]()); @@ -233,10 +228,10 @@ describe("EnumWrapper: string enum", () => { enumWrapper.forEach(iterateeSpy); expect(iterateeSpy.mock.calls).toEqual([ - [TestEnum.A, "A", enumWrapper, 0], + [TestEnum.D, "D", enumWrapper, 0], [TestEnum.B, "B", enumWrapper, 1], - [TestEnum.C, "C", enumWrapper, 2], - [TestEnum.D, "D", enumWrapper, 3] + [TestEnum.A, "A", enumWrapper, 2], + [TestEnum.C, "C", enumWrapper, 3] ]); }); @@ -252,17 +247,27 @@ describe("EnumWrapper: string enum", () => { enumWrapper.forEach(iterateeSpy, context); expect(iterateeSpy.mock.calls).toEqual([ - [TestEnum.A, "A", enumWrapper, 0], + [TestEnum.D, "D", enumWrapper, 0], [TestEnum.B, "B", enumWrapper, 1], - [TestEnum.C, "C", enumWrapper, 2], - [TestEnum.D, "D", enumWrapper, 3] + [TestEnum.A, "A", enumWrapper, 2], + [TestEnum.C, "C", enumWrapper, 3] ]); }); }); }); + test("indexOfKey()", () => { + expect(enumWrapper.indexOfKey("B")).toBe(1); + expect(enumWrapper.indexOfKey("C")).toBe(3); + }); + + test("indexOfValue()", () => { + expect(enumWrapper.indexOfValue(TestEnum.B)).toBe(1); + expect(enumWrapper.indexOfValue(TestEnum.C)).toBe(3); + }); + test("getKeys()", () => { - const expected = ["A", "B", "C", "D"]; + const expected = ["D", "B", "A", "C"]; const result = enumWrapper.getKeys(); expect(result).toEqual(expected); @@ -272,7 +277,7 @@ describe("EnumWrapper: string enum", () => { }); test("getValues()", () => { - const expected = [TestEnum.A, TestEnum.B, TestEnum.C, TestEnum.D]; + const expected = [TestEnum.D, TestEnum.B, TestEnum.A, TestEnum.C]; const result = enumWrapper.getValues(); expect(result).toEqual(expected); @@ -284,10 +289,10 @@ describe("EnumWrapper: string enum", () => { describe("getEntries()", () => { test("returns array of entries", () => { const expected = [ - ["A", TestEnum.A], + ["D", TestEnum.D], ["B", TestEnum.B], - ["C", TestEnum.C], - ["D", TestEnum.D] + ["A", TestEnum.A], + ["C", TestEnum.C] ]; const result = enumWrapper.getEntries(); expect(result).toEqual(expected); @@ -323,13 +328,13 @@ describe("EnumWrapper: string enum", () => { const result = enumWrapper.map(iterateeSpy); - expect(result).toEqual(["A0", "B1", "C2", "D0"]); + expect(result).toEqual(["D0", "B-1.7", "A0", "C2"]); expect(iterateeSpy.mock.calls).toEqual([ - [TestEnum.A, "A", enumWrapper, 0], + [TestEnum.D, "D", enumWrapper, 0], [TestEnum.B, "B", enumWrapper, 1], - [TestEnum.C, "C", enumWrapper, 2], - [TestEnum.D, "D", enumWrapper, 3] + [TestEnum.A, "A", enumWrapper, 2], + [TestEnum.C, "C", enumWrapper, 3] ]); }); @@ -345,13 +350,13 @@ describe("EnumWrapper: string enum", () => { const result = enumWrapper.map(iterateeSpy, context); - expect(result).toEqual(["A0", "B1", "C2", "D0"]); + expect(result).toEqual(["D0", "B-1.7", "A0", "C2"]); expect(iterateeSpy.mock.calls).toEqual([ - [TestEnum.A, "A", enumWrapper, 0], + [TestEnum.D, "D", enumWrapper, 0], [TestEnum.B, "B", enumWrapper, 1], - [TestEnum.C, "C", enumWrapper, 2], - [TestEnum.D, "D", enumWrapper, 3] + [TestEnum.A, "A", enumWrapper, 2], + [TestEnum.C, "C", enumWrapper, 3] ]); }); }); @@ -448,12 +453,12 @@ describe("EnumWrapper: string enum", () => { }); test("getKeyOrThrow()", () => { - // A and D have duplicate values, but D is ordered after A, and last duplicate entry wins, - // so D's key is returned when looking up the value of A or D. - expect(enumWrapper.getKeyOrThrow(TestEnum.A)).toBe("D"); + // A and D have duplicate values, but A is ordered after D, and last duplicate entry wins, + // so A's key is returned when looking up the value of A or D. + expect(enumWrapper.getKeyOrThrow(TestEnum.A)).toBe("A"); expect(enumWrapper.getKeyOrThrow(TestEnum.B)).toBe("B"); expect(enumWrapper.getKeyOrThrow(TestEnum.C)).toBe("C"); - expect(enumWrapper.getKeyOrThrow(TestEnum.D)).toBe("D"); + expect(enumWrapper.getKeyOrThrow(TestEnum.D)).toBe("A"); expect(() => { enumWrapper.getKeyOrThrow(-1); @@ -469,12 +474,12 @@ describe("EnumWrapper: string enum", () => { }); test("getKeyOrDefault()", () => { - // A and D have duplicate values, but D is ordered after A, and last duplicate entry wins, - // so D's key is returned when looking up the value of A or D. - expect(enumWrapper.getKeyOrDefault(TestEnum.A)).toBe("D"); + // A and D have duplicate values, but A is ordered after D, and last duplicate entry wins, + // so A's key is returned when looking up the value of A or D. + expect(enumWrapper.getKeyOrDefault(TestEnum.A)).toBe("A"); expect(enumWrapper.getKeyOrDefault(TestEnum.B)).toBe("B"); expect(enumWrapper.getKeyOrDefault(TestEnum.C)).toBe("C"); - expect(enumWrapper.getKeyOrDefault(TestEnum.D)).toBe("D"); + expect(enumWrapper.getKeyOrDefault(TestEnum.D)).toBe("A"); expect(enumWrapper.getKeyOrDefault(-1)).toBe(undefined); expect(enumWrapper.getKeyOrDefault(null, "A")).toBe("A"); @@ -519,4 +524,11 @@ describe("EnumWrapper: string enum", () => { ); expect(enumWrapper.getValueOrDefault(undefined, -1)).toBe(-1); }); + + test("createEnumSubset()", () => { + expect(enumWrapper.createEnumSubset("A", "C")).toEqual({ + A: TestEnum.A, + C: TestEnum.C + }); + }); }); diff --git a/tests/EnumWrapper-string.test.ts b/tests/EnumWrapper-string.test.ts index a4c95ca..65e2fd5 100644 --- a/tests/EnumWrapper-string.test.ts +++ b/tests/EnumWrapper-string.test.ts @@ -1,7 +1,7 @@ -import { EnumWrapper } from "../src"; +import { $enum } from "../src"; -// NOTE: Intentionally out of order to test that EnumWrapper iteration is always based -// on sorted keys. +// NOTE: Intentionally out of order keys and values to confirm original +// defined order is retained enum TestEnum { D = "a", // duplicate of A B = "b", @@ -10,24 +10,21 @@ enum TestEnum { } describe("EnumWrapper: string enum", () => { - const enumWrapper = EnumWrapper.getCachedInstance(TestEnum); + const enumWrapper = $enum(TestEnum); - test("toString()", () => { - expect(String(enumWrapper)).toBe("[object EnumWrapper]"); + test("@@toStringTag()", () => { + expect(Object.prototype.toString.call(enumWrapper)).toBe( + "[object EnumWrapper]" + ); }); - test("getCachedInstance()", () => { - const result1 = EnumWrapper.getCachedInstance(TestEnum); - const result2 = EnumWrapper.getCachedInstance(TestEnum); - - expect(result1 instanceof EnumWrapper).toBe(true); - // returns cached instance - expect(result1).toBe(result2); + test("toString()", () => { + expect(enumWrapper.toString()).toBe("[object EnumWrapper]"); }); test("does not observably alter the enum", () => { // Wrap the enum, then confirm that there are no extra properties/keys available - EnumWrapper.getCachedInstance(TestEnum); + $enum(TestEnum); expect(Object.keys(TestEnum)).toEqual(["D", "B", "A", "C"]); expect(Object.getOwnPropertyNames(TestEnum)).toEqual([ @@ -84,10 +81,10 @@ describe("EnumWrapper: string enum", () => { }); test("index signature", () => { - expect(enumWrapper[0]).toEqual(["A", TestEnum.A]); + expect(enumWrapper[0]).toEqual(["D", TestEnum.D]); expect(enumWrapper[1]).toEqual(["B", TestEnum.B]); - expect(enumWrapper[2]).toEqual(["C", TestEnum.C]); - expect(enumWrapper[3]).toEqual(["D", TestEnum.D]); + expect(enumWrapper[2]).toEqual(["A", TestEnum.A]); + expect(enumWrapper[3]).toEqual(["C", TestEnum.C]); }); }); @@ -103,12 +100,12 @@ describe("EnumWrapper: string enum", () => { expect(next).toEqual({ done: false, - value: "A" + value: "D" }); }); test("iterates all keys", () => { - const expected = ["A", "B", "C", "D"]; + const expected = ["D", "B", "A", "C"]; const result = Array.from(enumWrapper.keys()); expect(result).toEqual(expected); }); @@ -127,10 +124,10 @@ describe("EnumWrapper: string enum", () => { test("iterates all values", () => { const expected = [ - TestEnum.A, + TestEnum.D, TestEnum.B, - TestEnum.C, - TestEnum.D + TestEnum.A, + TestEnum.C ]; const result = Array.from(enumWrapper.values()); expect(result).toEqual(expected); @@ -144,16 +141,16 @@ describe("EnumWrapper: string enum", () => { expect(next).toEqual({ done: false, - value: ["A", TestEnum.A] + value: ["D", TestEnum.D] }); }); test("iterates all entries", () => { const expected = [ - ["A", TestEnum.A], + ["D", TestEnum.D], ["B", TestEnum.B], - ["C", TestEnum.C], - ["D", TestEnum.D] + ["A", TestEnum.A], + ["C", TestEnum.C] ]; const result = Array.from(enumWrapper.entries()); @@ -180,16 +177,16 @@ describe("EnumWrapper: string enum", () => { expect(next).toEqual({ done: false, - value: ["A", TestEnum.A] + value: ["D", TestEnum.D] }); }); test("iterates all entries", () => { const expected = [ - ["A", TestEnum.A], + ["D", TestEnum.D], ["B", TestEnum.B], - ["C", TestEnum.C], - ["D", TestEnum.D] + ["A", TestEnum.A], + ["C", TestEnum.C] ]; const result = Array.from(enumWrapper[Symbol.iterator]()); @@ -222,10 +219,10 @@ describe("EnumWrapper: string enum", () => { enumWrapper.forEach(iterateeSpy); expect(iterateeSpy.mock.calls).toEqual([ - [TestEnum.A, "A", enumWrapper, 0], + [TestEnum.D, "D", enumWrapper, 0], [TestEnum.B, "B", enumWrapper, 1], - [TestEnum.C, "C", enumWrapper, 2], - [TestEnum.D, "D", enumWrapper, 3] + [TestEnum.A, "A", enumWrapper, 2], + [TestEnum.C, "C", enumWrapper, 3] ]); }); @@ -241,17 +238,27 @@ describe("EnumWrapper: string enum", () => { enumWrapper.forEach(iterateeSpy, context); expect(iterateeSpy.mock.calls).toEqual([ - [TestEnum.A, "A", enumWrapper, 0], + [TestEnum.D, "D", enumWrapper, 0], [TestEnum.B, "B", enumWrapper, 1], - [TestEnum.C, "C", enumWrapper, 2], - [TestEnum.D, "D", enumWrapper, 3] + [TestEnum.A, "A", enumWrapper, 2], + [TestEnum.C, "C", enumWrapper, 3] ]); }); }); }); + test("indexOfKey()", () => { + expect(enumWrapper.indexOfKey("B")).toBe(1); + expect(enumWrapper.indexOfKey("C")).toBe(3); + }); + + test("indexOfValue()", () => { + expect(enumWrapper.indexOfValue(TestEnum.B)).toBe(1); + expect(enumWrapper.indexOfValue(TestEnum.C)).toBe(3); + }); + test("getKeys()", () => { - const expected = ["A", "B", "C", "D"]; + const expected = ["D", "B", "A", "C"]; const result = enumWrapper.getKeys(); expect(result).toEqual(expected); @@ -261,7 +268,7 @@ describe("EnumWrapper: string enum", () => { }); test("getValues()", () => { - const expected = [TestEnum.A, TestEnum.B, TestEnum.C, TestEnum.D]; + const expected = [TestEnum.D, TestEnum.B, TestEnum.A, TestEnum.C]; const result = enumWrapper.getValues(); expect(result).toEqual(expected); @@ -273,10 +280,10 @@ describe("EnumWrapper: string enum", () => { describe("getEntries()", () => { test("returns array of entries", () => { const expected = [ - ["A", TestEnum.A], + ["D", TestEnum.D], ["B", TestEnum.B], - ["C", TestEnum.C], - ["D", TestEnum.D] + ["A", TestEnum.A], + ["C", TestEnum.C] ]; const result = enumWrapper.getEntries(); expect(result).toEqual(expected); @@ -312,13 +319,13 @@ describe("EnumWrapper: string enum", () => { const result = enumWrapper.map(iterateeSpy); - expect(result).toEqual(["Aa", "Bb", "Cc", "Da"]); + expect(result).toEqual(["Da", "Bb", "Aa", "Cc"]); expect(iterateeSpy.mock.calls).toEqual([ - [TestEnum.A, "A", enumWrapper, 0], + [TestEnum.D, "D", enumWrapper, 0], [TestEnum.B, "B", enumWrapper, 1], - [TestEnum.C, "C", enumWrapper, 2], - [TestEnum.D, "D", enumWrapper, 3] + [TestEnum.A, "A", enumWrapper, 2], + [TestEnum.C, "C", enumWrapper, 3] ]); }); @@ -334,13 +341,13 @@ describe("EnumWrapper: string enum", () => { const result = enumWrapper.map(iterateeSpy, context); - expect(result).toEqual(["Aa", "Bb", "Cc", "Da"]); + expect(result).toEqual(["Da", "Bb", "Aa", "Cc"]); expect(iterateeSpy.mock.calls).toEqual([ - [TestEnum.A, "A", enumWrapper, 0], + [TestEnum.D, "D", enumWrapper, 0], [TestEnum.B, "B", enumWrapper, 1], - [TestEnum.C, "C", enumWrapper, 2], - [TestEnum.D, "D", enumWrapper, 3] + [TestEnum.A, "A", enumWrapper, 2], + [TestEnum.C, "C", enumWrapper, 3] ]); }); }); @@ -446,12 +453,12 @@ describe("EnumWrapper: string enum", () => { }); test("getKeyOrThrow()", () => { - // A and D have duplicate values, but D is ordered after A, and last duplicate entry wins, - // so D's key is returned when looking up the value of A or D. - expect(enumWrapper.getKeyOrThrow(TestEnum.A)).toBe("D"); + // A and D have duplicate values, but A is ordered after D, and last duplicate entry wins, + // so A's key is returned when looking up the value of A or D. + expect(enumWrapper.getKeyOrThrow(TestEnum.A)).toBe("A"); expect(enumWrapper.getKeyOrThrow(TestEnum.B)).toBe("B"); expect(enumWrapper.getKeyOrThrow(TestEnum.C)).toBe("C"); - expect(enumWrapper.getKeyOrThrow(TestEnum.D)).toBe("D"); + expect(enumWrapper.getKeyOrThrow(TestEnum.D)).toBe("A"); expect(() => { enumWrapper.getKeyOrThrow("foo"); @@ -472,12 +479,12 @@ describe("EnumWrapper: string enum", () => { }); test("getKeyOrDefault()", () => { - // A and D have duplicate values, but D is ordered after A, and last duplicate entry wins, - // so D's key is returned when looking up the value of A or D. - expect(enumWrapper.getKeyOrDefault(TestEnum.A)).toBe("D"); + // A and D have duplicate values, but A is ordered after D, and last duplicate entry wins, + // so A's key is returned when looking up the value of A or D. + expect(enumWrapper.getKeyOrDefault(TestEnum.A)).toBe("A"); expect(enumWrapper.getKeyOrDefault(TestEnum.B)).toBe("B"); expect(enumWrapper.getKeyOrDefault(TestEnum.C)).toBe("C"); - expect(enumWrapper.getKeyOrDefault(TestEnum.D)).toBe("D"); + expect(enumWrapper.getKeyOrDefault(TestEnum.D)).toBe("A"); expect(enumWrapper.getKeyOrDefault("blah")).toBe(undefined); // Name of a property on Object.prototype @@ -524,4 +531,11 @@ describe("EnumWrapper: string enum", () => { ); expect(enumWrapper.getValueOrDefault(undefined, "foo")).toBe("foo"); }); + + test("createEnumSubset()", () => { + expect(enumWrapper.createEnumSubset("A", "C")).toEqual({ + A: TestEnum.A, + C: TestEnum.C + }); + }); }); diff --git a/tests/mapValue-mixed.test.ts b/tests/mapValue-mixed.test.ts new file mode 100644 index 0000000..7457cff --- /dev/null +++ b/tests/mapValue-mixed.test.ts @@ -0,0 +1,395 @@ +import { + $enum, + EnumValueMapper, + EnumValueMapperWithNull, + EnumValueMapperWithUndefined, + EnumValueMapperWithNullAndUndefined +} from "../src"; + +enum RGB { + R = "r", + G = 1, + B = "b" +} + +describe("mapValue (string/number mix)", () => { + describe("Without null/undefined", () => { + interface TestEntry { + isUnexpected?: boolean; + value: RGB; + result: string; + } + + const TEST_ENTRIES: TestEntry[] = [ + { + value: RGB.R, + result: "Red!" + }, + { + value: RGB.G, + result: "Green!" + }, + { + value: RGB.B, + result: "Blue!" + }, + { + isUnexpected: true, + value: (null as any) as RGB, + result: "Unexpected!" + }, + { + isUnexpected: true, + value: (undefined as any) as RGB, + result: "Unexpected!" + }, + { + isUnexpected: true, + value: ("unexpected!" as any) as RGB, + result: "Unexpected!" + }, + { + isUnexpected: true, + // matches a standard property name on Object.prototype + value: ("toString" as any) as RGB, + result: "Unexpected!" + } + ]; + + const mappers: EnumValueMapper[] = [ + { + [RGB.R]: "Red!", + [RGB.G]: "Green!", + [RGB.B]: "Blue!" + }, + { + [RGB.R]: "Red!", + [RGB.G]: "Green!", + [RGB.B]: "Blue!", + [$enum.handleUnexpected]: "Unexpected!" + }, + { + [RGB.R]: $enum.unhandledEntry, + [RGB.G]: $enum.unhandledEntry, + [RGB.B]: $enum.unhandledEntry, + [$enum.handleUnexpected]: $enum.unhandledEntry + } + ]; + + for (const mapper of mappers) { + for (const testEntry of TEST_ENTRIES) { + if (mapper[RGB.R] === $enum.unhandledEntry) { + test(`Unhandled entry throws error (${testEntry.value}`, () => { + expect(() => { + $enum.mapValue(testEntry.value).with(mapper); + }).toThrowError(`Unhandled value: ${testEntry.value}`); + }); + } else if ( + mapper.hasOwnProperty($enum.handleUnexpected) || + !testEntry.isUnexpected + ) { + test(`Correct value is returned (${testEntry.value})`, () => { + const result = $enum + .mapValue(testEntry.value) + .with(mapper); + + expect(result).toBe(testEntry.result); + }); + } else { + test(`Unhandled unexpected value throws error (${testEntry.value})`, () => { + expect(() => { + $enum.mapValue(testEntry.value).with(mapper); + }).toThrowError(`Unexpected value: ${testEntry.value}`); + }); + } + } + } + }); + + describe("With null", () => { + interface TestEntry { + isUnexpected?: boolean; + value: RGB | null; + result: string; + } + + const TEST_ENTRIES: TestEntry[] = [ + { + value: RGB.R, + result: "Red!" + }, + { + value: RGB.G, + result: "Green!" + }, + { + value: RGB.B, + result: "Blue!" + }, + { + value: null, + result: "Null!" + }, + { + isUnexpected: true, + value: (undefined as any) as RGB, + result: "Unexpected!" + }, + { + isUnexpected: true, + value: ("unexpected!" as any) as RGB, + result: "Unexpected!" + }, + { + isUnexpected: true, + // matches a standard property name on Object.prototype + value: ("toString" as any) as RGB, + result: "Unexpected!" + } + ]; + + const mappers: EnumValueMapperWithNull[] = [ + { + [RGB.R]: "Red!", + [RGB.G]: "Green!", + [RGB.B]: "Blue!", + [$enum.handleNull]: "Null!" + }, + { + [RGB.R]: "Red!", + [RGB.G]: "Green!", + [RGB.B]: "Blue!", + [$enum.handleNull]: "Null!", + [$enum.handleUnexpected]: "Unexpected!" + }, + { + [RGB.R]: $enum.unhandledEntry, + [RGB.G]: $enum.unhandledEntry, + [RGB.B]: $enum.unhandledEntry, + [$enum.handleNull]: $enum.unhandledEntry, + [$enum.handleUnexpected]: $enum.unhandledEntry + } + ]; + + for (const mapper of mappers) { + for (const testEntry of TEST_ENTRIES) { + if (mapper[RGB.R] === $enum.unhandledEntry) { + test(`Unhandled entry throws error (${testEntry.value}`, () => { + expect(() => { + $enum.mapValue(testEntry.value).with(mapper); + }).toThrowError(`Unhandled value: ${testEntry.value}`); + }); + } else if ( + mapper.hasOwnProperty($enum.handleUnexpected) || + !testEntry.isUnexpected + ) { + test(`Correct value is returned (${testEntry.value})`, () => { + const result = $enum + .mapValue(testEntry.value) + .with(mapper); + + expect(result).toBe(testEntry.result); + }); + } else { + test(`Unhandled unexpected value throws error (${testEntry.value})`, () => { + expect(() => { + $enum.mapValue(testEntry.value).with(mapper); + }).toThrowError(`Unexpected value: ${testEntry.value}`); + }); + } + } + } + }); + + describe("With undefined", () => { + interface TestEntry { + isUnexpected?: boolean; + value: RGB | undefined; + result: string; + } + + const TEST_ENTRIES: TestEntry[] = [ + { + value: RGB.R, + result: "Red!" + }, + { + value: RGB.G, + result: "Green!" + }, + { + value: RGB.B, + result: "Blue!" + }, + { + value: undefined, + result: "Undefined!" + }, + { + isUnexpected: true, + value: (null as any) as RGB, + result: "Unexpected!" + }, + { + isUnexpected: true, + value: ("unexpected!" as any) as RGB, + result: "Unexpected!" + }, + { + isUnexpected: true, + // matches a standard property name on Object.prototype + value: ("toString" as any) as RGB, + result: "Unexpected!" + } + ]; + + const mappers: EnumValueMapperWithUndefined[] = [ + { + [RGB.R]: "Red!", + [RGB.G]: "Green!", + [RGB.B]: "Blue!", + [$enum.handleUndefined]: "Undefined!" + }, + { + [RGB.R]: "Red!", + [RGB.G]: "Green!", + [RGB.B]: "Blue!", + [$enum.handleUndefined]: "Undefined!", + [$enum.handleUnexpected]: "Unexpected!" + }, + { + [RGB.R]: $enum.unhandledEntry, + [RGB.G]: $enum.unhandledEntry, + [RGB.B]: $enum.unhandledEntry, + [$enum.handleUndefined]: $enum.unhandledEntry, + [$enum.handleUnexpected]: $enum.unhandledEntry + } + ]; + + for (const mapper of mappers) { + for (const testEntry of TEST_ENTRIES) { + if (mapper[RGB.R] === $enum.unhandledEntry) { + test(`Unhandled entry throws error (${testEntry.value}`, () => { + expect(() => { + $enum.mapValue(testEntry.value).with(mapper); + }).toThrowError(`Unhandled value: ${testEntry.value}`); + }); + } else if ( + mapper.hasOwnProperty($enum.handleUnexpected) || + !testEntry.isUnexpected + ) { + test(`Correct value is returned (${testEntry.value})`, () => { + const result = $enum + .mapValue(testEntry.value) + .with(mapper); + + expect(result).toBe(testEntry.result); + }); + } else { + test(`Unhandled unexpected value throws error (${testEntry.value})`, () => { + expect(() => { + $enum.mapValue(testEntry.value).with(mapper); + }).toThrowError(`Unexpected value: ${testEntry.value}`); + }); + } + } + } + }); + + describe("With null and undefined", () => { + interface TestEntry { + isUnexpected?: boolean; + value: RGB | null | undefined; + result: string; + } + + const TEST_ENTRIES: TestEntry[] = [ + { + value: RGB.R, + result: "Red!" + }, + { + value: RGB.G, + result: "Green!" + }, + { + value: RGB.B, + result: "Blue!" + }, + { + value: null, + result: "Null!" + }, + { + value: undefined, + result: "Undefined!" + }, + { + isUnexpected: true, + value: ("unexpected!" as any) as RGB, + result: "Unexpected!" + }, + { + isUnexpected: true, + // matches a standard property name on Object.prototype + value: ("toString" as any) as RGB, + result: "Unexpected!" + } + ]; + + const mappers: EnumValueMapperWithNullAndUndefined[] = [ + { + [RGB.R]: "Red!", + [RGB.G]: "Green!", + [RGB.B]: "Blue!", + [$enum.handleNull]: "Null!", + [$enum.handleUndefined]: "Undefined!" + }, + { + [RGB.R]: "Red!", + [RGB.G]: "Green!", + [RGB.B]: "Blue!", + [$enum.handleNull]: "Null!", + [$enum.handleUndefined]: "Undefined!", + [$enum.handleUnexpected]: "Unexpected!" + }, + { + [RGB.R]: $enum.unhandledEntry, + [RGB.G]: $enum.unhandledEntry, + [RGB.B]: $enum.unhandledEntry, + [$enum.handleNull]: $enum.unhandledEntry, + [$enum.handleUndefined]: $enum.unhandledEntry, + [$enum.handleUnexpected]: $enum.unhandledEntry + } + ]; + + for (const mapper of mappers) { + for (const testEntry of TEST_ENTRIES) { + if (mapper[RGB.R] === $enum.unhandledEntry) { + test(`Unhandled entry throws error (${testEntry.value}`, () => { + expect(() => { + $enum.mapValue(testEntry.value).with(mapper); + }).toThrowError(`Unhandled value: ${testEntry.value}`); + }); + } else if ( + mapper.hasOwnProperty($enum.handleUnexpected) || + !testEntry.isUnexpected + ) { + test(`Correct value is returned (${testEntry.value})`, () => { + const result = $enum + .mapValue(testEntry.value) + .with(mapper); + + expect(result).toBe(testEntry.result); + }); + } else { + test(`Unhandled unexpected value throws error (${testEntry.value})`, () => { + expect(() => { + $enum.mapValue(testEntry.value).with(mapper); + }).toThrowError(`Unexpected value: ${testEntry.value}`); + }); + } + } + } + }); +}); diff --git a/tests/mapValue-number.test.ts b/tests/mapValue-number.test.ts new file mode 100644 index 0000000..26e25b6 --- /dev/null +++ b/tests/mapValue-number.test.ts @@ -0,0 +1,426 @@ +import { + $enum, + EnumValueMapper, + EnumValueMapperWithNull, + EnumValueMapperWithUndefined, + EnumValueMapperWithNullAndUndefined +} from "../src"; + +enum RGB { + R, + G, + B +} + +describe("mapValue (number)", () => { + describe("Without null/undefined", () => { + interface TestEntry { + isUnexpected?: boolean; + value: RGB; + result: string; + } + + const TEST_ENTRIES: TestEntry[] = [ + { + value: RGB.R, + result: "Red!" + }, + { + value: RGB.G, + result: "Green!" + }, + { + value: RGB.B, + result: "Blue!" + }, + { + isUnexpected: true, + value: (null as any) as RGB, + result: "Unexpected!" + }, + { + isUnexpected: true, + value: (undefined as any) as RGB, + result: "Unexpected!" + }, + { + isUnexpected: true, + value: ("unexpected!" as any) as RGB, + result: "Unexpected!" + }, + { + isUnexpected: true, + // matches a standard property name on Object.prototype + value: ("toString" as any) as RGB, + result: "Unexpected!" + } + ]; + + const mappers: EnumValueMapper[] = [ + { + [RGB.R]: "Red!", + [RGB.G]: "Green!", + [RGB.B]: "Blue!" + }, + { + [RGB.R]: "Red!", + [RGB.G]: "Green!", + [RGB.B]: "Blue!", + [$enum.handleUnexpected]: "Unexpected!" + }, + { + [RGB.R]: $enum.unhandledEntry, + [RGB.G]: $enum.unhandledEntry, + [RGB.B]: $enum.unhandledEntry, + [$enum.handleUnexpected]: $enum.unhandledEntry + } + ]; + + for (const mapper of mappers) { + for (const testEntry of TEST_ENTRIES) { + if (mapper[RGB.R] === $enum.unhandledEntry) { + test(`Unhandled entry throws error (${testEntry.value}`, () => { + expect(() => { + $enum.mapValue(testEntry.value).with(mapper); + }).toThrowError(`Unhandled value: ${testEntry.value}`); + }); + } else if ( + mapper.hasOwnProperty($enum.handleUnexpected) || + !testEntry.isUnexpected + ) { + test(`Correct value is returned (${testEntry.value})`, () => { + const result = $enum + .mapValue(testEntry.value) + .with(mapper); + + expect(result).toBe(testEntry.result); + }); + } else { + test(`Unhandled unexpected value throws error (${testEntry.value})`, () => { + expect(() => { + $enum.mapValue(testEntry.value).with(mapper); + }).toThrowError(`Unexpected value: ${testEntry.value}`); + }); + } + } + } + }); + + describe("With null", () => { + interface TestEntry { + isUnexpected?: boolean; + value: RGB | null; + result: string; + } + + const TEST_ENTRIES: TestEntry[] = [ + { + value: RGB.R, + result: "Red!" + }, + { + value: RGB.G, + result: "Green!" + }, + { + value: RGB.B, + result: "Blue!" + }, + { + value: null, + result: "Null!" + }, + { + isUnexpected: true, + value: (undefined as any) as RGB, + result: "Unexpected!" + }, + { + isUnexpected: true, + value: ("unexpected!" as any) as RGB, + result: "Unexpected!" + }, + { + isUnexpected: true, + // matches a standard property name on Object.prototype + value: ("toString" as any) as RGB, + result: "Unexpected!" + } + ]; + + const mappers: EnumValueMapperWithNull[] = [ + { + [RGB.R]: "Red!", + [RGB.G]: "Green!", + [RGB.B]: "Blue!", + [$enum.handleNull]: "Null!" + }, + { + [RGB.R]: "Red!", + [RGB.G]: "Green!", + [RGB.B]: "Blue!", + [$enum.handleNull]: "Null!", + [$enum.handleUnexpected]: "Unexpected!" + }, + { + [RGB.R]: $enum.unhandledEntry, + [RGB.G]: $enum.unhandledEntry, + [RGB.B]: $enum.unhandledEntry, + [$enum.handleNull]: $enum.unhandledEntry, + [$enum.handleUnexpected]: $enum.unhandledEntry + } + ]; + + for (const mapper of mappers) { + for (const testEntry of TEST_ENTRIES) { + if (mapper[RGB.R] === $enum.unhandledEntry) { + test(`Unhandled entry throws error (${testEntry.value}`, () => { + expect(() => { + $enum.mapValue(testEntry.value).with(mapper); + }).toThrowError(`Unhandled value: ${testEntry.value}`); + }); + } else if ( + mapper.hasOwnProperty($enum.handleUnexpected) || + !testEntry.isUnexpected + ) { + test(`Correct value is returned (${testEntry.value})`, () => { + const result = $enum + .mapValue(testEntry.value) + .with(mapper); + + expect(result).toBe(testEntry.result); + }); + } else { + test(`Unhandled unexpected value throws error (${testEntry.value})`, () => { + expect(() => { + $enum.mapValue(testEntry.value).with(mapper); + }).toThrowError(`Unexpected value: ${testEntry.value}`); + }); + } + } + } + }); + + describe("With undefined", () => { + interface TestEntry { + isUnexpected?: boolean; + value: RGB | undefined; + result: string; + } + + const TEST_ENTRIES: TestEntry[] = [ + { + value: RGB.R, + result: "Red!" + }, + { + value: RGB.G, + result: "Green!" + }, + { + value: RGB.B, + result: "Blue!" + }, + { + value: undefined, + result: "Undefined!" + }, + { + isUnexpected: true, + value: (null as any) as RGB, + result: "Unexpected!" + }, + { + isUnexpected: true, + value: ("unexpected!" as any) as RGB, + result: "Unexpected!" + }, + { + isUnexpected: true, + // matches a standard property name on Object.prototype + value: ("toString" as any) as RGB, + result: "Unexpected!" + } + ]; + + const mappers: EnumValueMapperWithUndefined[] = [ + { + [RGB.R]: "Red!", + [RGB.G]: "Green!", + [RGB.B]: "Blue!", + [$enum.handleUndefined]: "Undefined!" + }, + { + [RGB.R]: "Red!", + [RGB.G]: "Green!", + [RGB.B]: "Blue!", + [$enum.handleUndefined]: "Undefined!", + [$enum.handleUnexpected]: "Unexpected!" + }, + { + [RGB.R]: $enum.unhandledEntry, + [RGB.G]: $enum.unhandledEntry, + [RGB.B]: $enum.unhandledEntry, + [$enum.handleUndefined]: $enum.unhandledEntry, + [$enum.handleUnexpected]: $enum.unhandledEntry + } + ]; + + for (const mapper of mappers) { + for (const testEntry of TEST_ENTRIES) { + if (mapper[RGB.R] === $enum.unhandledEntry) { + test(`Unhandled entry throws error (${testEntry.value}`, () => { + expect(() => { + $enum.mapValue(testEntry.value).with(mapper); + }).toThrowError(`Unhandled value: ${testEntry.value}`); + }); + } else if ( + mapper.hasOwnProperty($enum.handleUnexpected) || + !testEntry.isUnexpected + ) { + test(`Correct value is returned (${testEntry.value})`, () => { + const result = $enum + .mapValue(testEntry.value) + .with(mapper); + + expect(result).toBe(testEntry.result); + }); + } else { + test(`Unhandled unexpected value throws error (${testEntry.value})`, () => { + expect(() => { + $enum.mapValue(testEntry.value).with(mapper); + }).toThrowError(`Unexpected value: ${testEntry.value}`); + }); + } + } + } + }); + + describe("With null and undefined", () => { + interface TestEntry { + isUnexpected?: boolean; + value: RGB | null | undefined; + result: string; + } + + const TEST_ENTRIES: TestEntry[] = [ + { + value: RGB.R, + result: "Red!" + }, + { + value: RGB.G, + result: "Green!" + }, + { + value: RGB.B, + result: "Blue!" + }, + { + value: null, + result: "Null!" + }, + { + value: undefined, + result: "Undefined!" + }, + { + isUnexpected: true, + value: ("unexpected!" as any) as RGB, + result: "Unexpected!" + }, + { + isUnexpected: true, + // matches a standard property name on Object.prototype + value: ("toString" as any) as RGB, + result: "Unexpected!" + } + ]; + + const mappers: EnumValueMapperWithNullAndUndefined[] = [ + { + [RGB.R]: "Red!", + [RGB.G]: "Green!", + [RGB.B]: "Blue!", + [$enum.handleNull]: "Null!", + [$enum.handleUndefined]: "Undefined!" + }, + { + [RGB.R]: "Red!", + [RGB.G]: "Green!", + [RGB.B]: "Blue!", + [$enum.handleNull]: "Null!", + [$enum.handleUndefined]: "Undefined!", + [$enum.handleUnexpected]: "Unexpected!" + }, + { + [RGB.R]: $enum.unhandledEntry, + [RGB.G]: $enum.unhandledEntry, + [RGB.B]: $enum.unhandledEntry, + [$enum.handleNull]: $enum.unhandledEntry, + [$enum.handleUndefined]: $enum.unhandledEntry, + [$enum.handleUnexpected]: $enum.unhandledEntry + } + ]; + + for (const mapper of mappers) { + for (const testEntry of TEST_ENTRIES) { + if (mapper[RGB.R] === $enum.unhandledEntry) { + test(`Unhandled entry throws error (${testEntry.value}`, () => { + expect(() => { + $enum.mapValue(testEntry.value).with(mapper); + }).toThrowError(`Unhandled value: ${testEntry.value}`); + }); + } else if ( + mapper.hasOwnProperty($enum.handleUnexpected) || + !testEntry.isUnexpected + ) { + test(`Correct value is returned (${testEntry.value})`, () => { + const result = $enum + .mapValue(testEntry.value) + .with(mapper); + + expect(result).toBe(testEntry.result); + }); + } else { + test(`Unhandled unexpected value throws error (${testEntry.value})`, () => { + expect(() => { + $enum.mapValue(testEntry.value).with(mapper); + }).toThrowError(`Unexpected value: ${testEntry.value}`); + }); + } + } + } + }); + + test("Explicit undefined value for [$enum.handleUnexpected]", () => { + const result = $enum + .mapValue(("BLAH!" as any) as RGB) + .with({ + [RGB.R]: 1, + [RGB.G]: 2, + [RGB.B]: 3, + [$enum.handleUnexpected]: undefined + }); + + expect(result).toBe(undefined); + }); + + describe("Collisions with special symbols are impossible", () => { + test("unhandled entry symbol name", () => { + const result = $enum.mapValue(1).with({ + 1: "unhandledEntry" + }); + + expect(result).toBe("unhandledEntry"); + }); + + test("unhandled entry symbol description", () => { + const result = $enum.mapValue(1).with({ + 1: "ts-enum-util:unhandledEntry" + }); + + expect(result).toBe("ts-enum-util:unhandledEntry"); + }); + }); +}); diff --git a/tests/mapValue-string.test.ts b/tests/mapValue-string.test.ts new file mode 100644 index 0000000..0691dc4 --- /dev/null +++ b/tests/mapValue-string.test.ts @@ -0,0 +1,468 @@ +import { + $enum, + EnumValueMapper, + EnumValueMapperWithNull, + EnumValueMapperWithUndefined, + EnumValueMapperWithNullAndUndefined +} from "../src"; + +enum RGB { + R = "r", + G = "g", + B = "b" +} + +describe("mapValue (string)", () => { + describe("Without null/undefined", () => { + interface TestEntry { + isUnexpected?: boolean; + value: RGB; + result: string; + } + + const TEST_ENTRIES: TestEntry[] = [ + { + value: RGB.R, + result: "Red!" + }, + { + value: RGB.G, + result: "Green!" + }, + { + value: RGB.B, + result: "Blue!" + }, + { + isUnexpected: true, + value: (null as any) as RGB, + result: "Unexpected!" + }, + { + isUnexpected: true, + value: (undefined as any) as RGB, + result: "Unexpected!" + }, + { + isUnexpected: true, + value: ("unexpected!" as any) as RGB, + result: "Unexpected!" + }, + { + isUnexpected: true, + // matches a standard property name on Object.prototype + value: ("toString" as any) as RGB, + result: "Unexpected!" + } + ]; + + const mappers: EnumValueMapper[] = [ + { + [RGB.R]: "Red!", + [RGB.G]: "Green!", + [RGB.B]: "Blue!" + }, + { + [RGB.R]: "Red!", + [RGB.G]: "Green!", + [RGB.B]: "Blue!", + [$enum.handleUnexpected]: "Unexpected!" + }, + { + [RGB.R]: $enum.unhandledEntry, + [RGB.G]: $enum.unhandledEntry, + [RGB.B]: $enum.unhandledEntry, + [$enum.handleUnexpected]: $enum.unhandledEntry + } + ]; + + for (const mapper of mappers) { + for (const testEntry of TEST_ENTRIES) { + if (mapper[RGB.R] === $enum.unhandledEntry) { + test(`Unhandled entry throws error (${testEntry.value}`, () => { + expect(() => { + $enum.mapValue(testEntry.value).with(mapper); + }).toThrowError(`Unhandled value: ${testEntry.value}`); + }); + } else if ( + mapper.hasOwnProperty($enum.handleUnexpected) || + !testEntry.isUnexpected + ) { + test(`Correct value is returned (${testEntry.value})`, () => { + const result = $enum + .mapValue(testEntry.value) + .with(mapper); + + expect(result).toBe(testEntry.result); + }); + } else { + test(`Unhandled unexpected value throws error (${testEntry.value})`, () => { + expect(() => { + $enum.mapValue(testEntry.value).with(mapper); + }).toThrowError(`Unexpected value: ${testEntry.value}`); + }); + } + } + } + }); + + describe("With null", () => { + interface TestEntry { + isUnexpected?: boolean; + value: RGB | null; + result: string; + } + + const TEST_ENTRIES: TestEntry[] = [ + { + value: RGB.R, + result: "Red!" + }, + { + value: RGB.G, + result: "Green!" + }, + { + value: RGB.B, + result: "Blue!" + }, + { + value: null, + result: "Null!" + }, + { + isUnexpected: true, + value: (undefined as any) as RGB, + result: "Unexpected!" + }, + { + isUnexpected: true, + value: ("unexpected!" as any) as RGB, + result: "Unexpected!" + }, + { + isUnexpected: true, + // matches a standard property name on Object.prototype + value: ("toString" as any) as RGB, + result: "Unexpected!" + } + ]; + + const mappers: EnumValueMapperWithNull[] = [ + { + [RGB.R]: "Red!", + [RGB.G]: "Green!", + [RGB.B]: "Blue!", + [$enum.handleNull]: "Null!" + }, + { + [RGB.R]: "Red!", + [RGB.G]: "Green!", + [RGB.B]: "Blue!", + [$enum.handleNull]: "Null!", + [$enum.handleUnexpected]: "Unexpected!" + }, + { + [RGB.R]: $enum.unhandledEntry, + [RGB.G]: $enum.unhandledEntry, + [RGB.B]: $enum.unhandledEntry, + [$enum.handleNull]: $enum.unhandledEntry, + [$enum.handleUnexpected]: $enum.unhandledEntry + } + ]; + + for (const mapper of mappers) { + for (const testEntry of TEST_ENTRIES) { + if (mapper[RGB.R] === $enum.unhandledEntry) { + test(`Unhandled entry throws error (${testEntry.value}`, () => { + expect(() => { + $enum.mapValue(testEntry.value).with(mapper); + }).toThrowError(`Unhandled value: ${testEntry.value}`); + }); + } else if ( + mapper.hasOwnProperty($enum.handleUnexpected) || + !testEntry.isUnexpected + ) { + test(`Correct value is returned (${testEntry.value})`, () => { + const result = $enum + .mapValue(testEntry.value) + .with(mapper); + + expect(result).toBe(testEntry.result); + }); + } else { + test(`Unhandled unexpected value throws error (${testEntry.value})`, () => { + expect(() => { + $enum.mapValue(testEntry.value).with(mapper); + }).toThrowError(`Unexpected value: ${testEntry.value}`); + }); + } + } + } + }); + + describe("With undefined", () => { + interface TestEntry { + isUnexpected?: boolean; + value: RGB | undefined; + result: string; + } + + const TEST_ENTRIES: TestEntry[] = [ + { + value: RGB.R, + result: "Red!" + }, + { + value: RGB.G, + result: "Green!" + }, + { + value: RGB.B, + result: "Blue!" + }, + { + value: undefined, + result: "Undefined!" + }, + { + isUnexpected: true, + value: (null as any) as RGB, + result: "Unexpected!" + }, + { + isUnexpected: true, + value: ("unexpected!" as any) as RGB, + result: "Unexpected!" + }, + { + isUnexpected: true, + // matches a standard property name on Object.prototype + value: ("toString" as any) as RGB, + result: "Unexpected!" + } + ]; + + const mappers: EnumValueMapperWithUndefined[] = [ + { + [RGB.R]: "Red!", + [RGB.G]: "Green!", + [RGB.B]: "Blue!", + [$enum.handleUndefined]: "Undefined!" + }, + { + [RGB.R]: "Red!", + [RGB.G]: "Green!", + [RGB.B]: "Blue!", + [$enum.handleUndefined]: "Undefined!", + [$enum.handleUnexpected]: "Unexpected!" + }, + { + [RGB.R]: $enum.unhandledEntry, + [RGB.G]: $enum.unhandledEntry, + [RGB.B]: $enum.unhandledEntry, + [$enum.handleUndefined]: $enum.unhandledEntry, + [$enum.handleUnexpected]: $enum.unhandledEntry + } + ]; + + for (const mapper of mappers) { + for (const testEntry of TEST_ENTRIES) { + if (mapper[RGB.R] === $enum.unhandledEntry) { + test(`Unhandled entry throws error (${testEntry.value}`, () => { + expect(() => { + $enum.mapValue(testEntry.value).with(mapper); + }).toThrowError(`Unhandled value: ${testEntry.value}`); + }); + } else if ( + mapper.hasOwnProperty($enum.handleUnexpected) || + !testEntry.isUnexpected + ) { + test(`Correct value is returned (${testEntry.value})`, () => { + const result = $enum + .mapValue(testEntry.value) + .with(mapper); + + expect(result).toBe(testEntry.result); + }); + } else { + test(`Unhandled unexpected value throws error (${testEntry.value})`, () => { + expect(() => { + $enum.mapValue(testEntry.value).with(mapper); + }).toThrowError(`Unexpected value: ${testEntry.value}`); + }); + } + } + } + }); + + describe("With null and undefined", () => { + interface TestEntry { + isUnexpected?: boolean; + value: RGB | null | undefined; + result: string; + } + + const TEST_ENTRIES: TestEntry[] = [ + { + value: RGB.R, + result: "Red!" + }, + { + value: RGB.G, + result: "Green!" + }, + { + value: RGB.B, + result: "Blue!" + }, + { + value: null, + result: "Null!" + }, + { + value: undefined, + result: "Undefined!" + }, + { + isUnexpected: true, + value: ("unexpected!" as any) as RGB, + result: "Unexpected!" + }, + { + isUnexpected: true, + // matches a standard property name on Object.prototype + value: ("toString" as any) as RGB, + result: "Unexpected!" + } + ]; + + const mappers: EnumValueMapperWithNullAndUndefined[] = [ + { + [RGB.R]: "Red!", + [RGB.G]: "Green!", + [RGB.B]: "Blue!", + [$enum.handleNull]: "Null!", + [$enum.handleUndefined]: "Undefined!" + }, + { + [RGB.R]: "Red!", + [RGB.G]: "Green!", + [RGB.B]: "Blue!", + [$enum.handleNull]: "Null!", + [$enum.handleUndefined]: "Undefined!", + [$enum.handleUnexpected]: "Unexpected!" + }, + { + [RGB.R]: $enum.unhandledEntry, + [RGB.G]: $enum.unhandledEntry, + [RGB.B]: $enum.unhandledEntry, + [$enum.handleNull]: $enum.unhandledEntry, + [$enum.handleUndefined]: $enum.unhandledEntry, + [$enum.handleUnexpected]: $enum.unhandledEntry + } + ]; + + for (const mapper of mappers) { + for (const testEntry of TEST_ENTRIES) { + if (mapper[RGB.R] === $enum.unhandledEntry) { + test(`Unhandled entry throws error (${testEntry.value}`, () => { + expect(() => { + $enum.mapValue(testEntry.value).with(mapper); + }).toThrowError(`Unhandled value: ${testEntry.value}`); + }); + } else if ( + mapper.hasOwnProperty($enum.handleUnexpected) || + !testEntry.isUnexpected + ) { + test(`Correct value is returned (${testEntry.value})`, () => { + const result = $enum + .mapValue(testEntry.value) + .with(mapper); + + expect(result).toBe(testEntry.result); + }); + } else { + test(`Unhandled unexpected value throws error (${testEntry.value})`, () => { + expect(() => { + $enum.mapValue(testEntry.value).with(mapper); + }).toThrowError(`Unexpected value: ${testEntry.value}`); + }); + } + } + } + }); + + test("Explicit undefined value for [$enum.handleUnexpected]", () => { + const result = $enum + .mapValue(("BLAH!" as any) as "foo") + .with({ + foo: 1, + [$enum.handleUnexpected]: undefined + }); + + expect(result).toBe(undefined); + }); + + describe("Collisions with special symbols are impossible", () => { + test("special handler symbol name", () => { + const result1 = $enum + .mapValue("handleNull" as "handleNull" | null) + .with({ + handleNull: 1, + [$enum.handleNull]: 2 + }); + + expect(result1).toBe(1); + + const result2 = $enum + .mapValue(null as "handleNull" | null) + .with({ + handleNull: 1, + [$enum.handleNull]: 2 + }); + + expect(result2).toBe(2); + }); + + test("special handler symbol description", () => { + const result1 = $enum + .mapValue( + "ts-enum-util:handleNull" as + | "ts-enum-util:handleNull" + | null + ) + .with({ + "ts-enum-util:handleNull": 1, + [$enum.handleNull]: 2 + }); + + expect(result1).toBe(1); + + const result2 = $enum + .mapValue(null as "ts-enum-util:handleNull" | null) + .with({ + "ts-enum-util:handleNull": 1, + [$enum.handleNull]: 2 + }); + + expect(result2).toBe(2); + }); + + test("unhandled entry symbol name", () => { + const result = $enum.mapValue("foo" as "foo").with({ + foo: "unhandledEntry" + }); + + expect(result).toBe("unhandledEntry"); + }); + + test("unhandled entry symbol description", () => { + const result = $enum.mapValue("foo" as "foo").with({ + foo: "ts-enum-util:unhandledEntry" + }); + + expect(result).toBe("ts-enum-util:unhandledEntry"); + }); + }); +}); diff --git a/tests/objectKeysUtil.test.ts b/tests/objectKeysUtil.test.ts new file mode 100644 index 0000000..31e4613 --- /dev/null +++ b/tests/objectKeysUtil.test.ts @@ -0,0 +1,96 @@ +import { + isNonNumericKey, + getOwnEnumerableNonNumericKeysES6, + getOwnEnumerableNonNumericKeysES5, + getOwnEnumerableNonNumericKeysES3 +} from "../src/objectKeysUtil"; + +describe("objectKeysUtil", () => { + describe("isNonNumericKey", () => { + test("Integers are numeric keys", () => { + expect(isNonNumericKey("0")).toBe(false); + expect(isNonNumericKey("1")).toBe(false); + expect(isNonNumericKey("42")).toBe(false); + // 2^32-2 + expect(isNonNumericKey("4294967294")).toBe(false); + }); + + test("Integers >= 2^32-1 are numeric keys", () => { + // 2^32-1 + expect(isNonNumericKey("4294967295")).toBe(false); + // 2^32 + expect(isNonNumericKey("4294967296")).toBe(false); + }); + + test("Negative integers are numeric keys", () => { + expect(isNonNumericKey("-1")).toBe(false); + expect(isNonNumericKey("-42")).toBe(false); + }); + + test("Floating point numbers are numeric keys", () => { + expect(isNonNumericKey("3.14")).toBe(false); + expect(isNonNumericKey("-1.7")).toBe(false); + }); + + test("Integers with extra formatting are NOT numeric keys", () => { + expect(isNonNumericKey("01")).toBe(true); + expect(isNonNumericKey(" 1")).toBe(true); + expect(isNonNumericKey("1 ")).toBe(true); + expect(isNonNumericKey("1,000")).toBe(true); + }); + + test("Floating point numbers with extra formatting are NOT numeric keys", () => { + expect(isNonNumericKey("1.000")).toBe(true); + expect(isNonNumericKey("01.2")).toBe(true); + expect(isNonNumericKey(" 1.2")).toBe(true); + expect(isNonNumericKey("1.2 ")).toBe(true); + expect(isNonNumericKey("1,000.2")).toBe(true); + }); + + test("Non-numeric keys are NOT numeric keys", () => { + expect(isNonNumericKey("1A")).toBe(true); + expect(isNonNumericKey("Hello!")).toBe(true); + expect(isNonNumericKey(" ")).toBe(true); + expect(isNonNumericKey("")).toBe(true); + }); + }); + + describe("getOwnEnumerableNonNumericKeys", () => { + const obj = ["a", "b", "c"]; + + Object.defineProperty(obj, "B", { + value: 4, + enumerable: true + }); + + Object.defineProperty(obj, "A", { + value: 3, + enumerable: true + }); + + Object.defineProperty(obj, "D", { + value: 2, + enumerable: false + }); + + Object.defineProperty(obj, "C", { + value: 1, + enumerable: true + }); + + Object.defineProperty(obj, "1.2", { + value: 42, + enumerable: true + }); + + const expected = ["B", "A", "C"]; + + test.each([ + ["ES6", getOwnEnumerableNonNumericKeysES6], + ["ES5", getOwnEnumerableNonNumericKeysES5], + ["ES3", getOwnEnumerableNonNumericKeysES3] + ] as const)("getOwnEnumerableNonNumericKeys%s", (label, func) => { + expect(func(obj)).toEqual(expected); + }); + }); +}); diff --git a/tests/visitValue-mixed.test.ts b/tests/visitValue-mixed.test.ts new file mode 100644 index 0000000..0476106 --- /dev/null +++ b/tests/visitValue-mixed.test.ts @@ -0,0 +1,593 @@ +import { + $enum, + EnumValueVisitor, + EnumValueVisitorWithNull, + EnumValueVisitorWithUndefined, + EnumValueVisitorWithNullAndUndefined +} from "../src"; + +enum RGB { + R = "0", + G = 1, + B = "2" +} + +describe("visitValue (string/number mix)", () => { + const handlerMockR = jest.fn((value: RGB.R) => { + return "Red!"; + }); + + const handlerMockG = jest.fn((value: RGB.G) => { + return "Green!"; + }); + + const handlerMockB = jest.fn((value: RGB.B) => { + return "Blue!"; + }); + + const handlerMockNull = jest.fn((value: null) => { + return "Null!"; + }); + + const handlerMockUndefined = jest.fn((value: undefined) => { + return "Undefined!"; + }); + + const handlerMockUnexpected = jest.fn( + (value: string | number | null | undefined) => { + return `Unexpected! (${value})`; + } + ); + + const ALL_HANDLER_MOCKS = [ + handlerMockR, + handlerMockG, + handlerMockB, + handlerMockNull, + handlerMockUndefined, + handlerMockUnexpected + ]; + + beforeEach(() => { + // Clear all handler mocks for a fresh start before each test + for (const handlerMock of ALL_HANDLER_MOCKS) { + handlerMock.mockClear(); + } + }); + + describe("Without null/undefined", () => { + interface TestEntry { + isUnexpected?: boolean; + value: RGB; + handlerMock: jest.Mock; + result: string; + } + + const TEST_ENTRIES: TestEntry[] = [ + { + value: RGB.R, + handlerMock: handlerMockR, + result: "Red!" + }, + { + value: RGB.G, + handlerMock: handlerMockG, + result: "Green!" + }, + { + value: RGB.B, + handlerMock: handlerMockB, + result: "Blue!" + }, + { + isUnexpected: true, + value: (null as any) as RGB, + handlerMock: handlerMockUnexpected, + result: "Unexpected! (null)" + }, + { + isUnexpected: true, + value: (undefined as any) as RGB, + handlerMock: handlerMockUnexpected, + result: "Unexpected! (undefined)" + }, + { + isUnexpected: true, + value: ("unexpected!" as any) as RGB, + handlerMock: handlerMockUnexpected, + result: "Unexpected! (unexpected!)" + }, + { + isUnexpected: true, + // matches a standard property name on Object.prototype + value: ("toString" as any) as RGB, + handlerMock: handlerMockUnexpected, + result: "Unexpected! (toString)" + } + ]; + + const visitors: EnumValueVisitor[] = [ + { + [RGB.R]: handlerMockR, + [RGB.G]: handlerMockG, + [RGB.B]: handlerMockB + }, + { + [RGB.R]: handlerMockR, + [RGB.G]: handlerMockG, + [RGB.B]: handlerMockB, + [$enum.handleUnexpected]: handlerMockUnexpected + }, + { + [RGB.R]: $enum.unhandledEntry, + [RGB.G]: $enum.unhandledEntry, + [RGB.B]: $enum.unhandledEntry, + [$enum.handleUnexpected]: $enum.unhandledEntry + } + ]; + + for (const visitor of visitors) { + for (const testEntry of TEST_ENTRIES) { + if (visitor[RGB.R] === $enum.unhandledEntry) { + test(`Unhandled entry throws error (${testEntry.value}`, () => { + expect(() => { + $enum.visitValue(testEntry.value).with(visitor); + }).toThrowError(`Unhandled value: ${testEntry.value}`); + }); + } else if ( + visitor[$enum.handleUnexpected] || + !testEntry.isUnexpected + ) { + test(`Correct visitor method is called (${testEntry.value})`, () => { + $enum.visitValue(testEntry.value).with(visitor); + + for (const handlerMock of ALL_HANDLER_MOCKS) { + if (handlerMock === testEntry.handlerMock) { + expect(handlerMock.mock.calls.length).toBe(1); + } else { + expect(handlerMock.mock.calls.length).toBe(0); + } + } + }); + + test(`Value is passed to handler (${testEntry.value})`, () => { + $enum.visitValue(testEntry.value).with(visitor); + expect(testEntry.handlerMock.mock.calls.length).toBe(1); + const args = testEntry.handlerMock.mock.calls[0]; + expect(args.length).toBe(1); + expect(args[0]).toBe(testEntry.value); + }); + + test(`Handler result is returned (${testEntry.value})`, () => { + const result = $enum + .visitValue(testEntry.value) + .with(visitor); + expect(result).toBe(testEntry.result); + }); + } else { + test(`Unhandled unexpected value throws error (${testEntry.value})`, () => { + expect(() => { + $enum.visitValue(testEntry.value).with(visitor); + }).toThrowError(`Unexpected value: ${testEntry.value}`); + }); + + test(`No visitor method is called for unhandled unexpected value(${testEntry.value})`, () => { + try { + $enum.visitValue(testEntry.value).with(visitor); + } catch (error) { + // ignore error + } + + for (const handlerMock of ALL_HANDLER_MOCKS) { + expect(handlerMock.mock.calls.length).toBe(0); + } + }); + } + } + } + }); + + describe("With null", () => { + interface TestEntry { + isUnexpected?: boolean; + value: RGB | null; + handlerMock: jest.Mock; + result: string; + } + + const TEST_ENTRIES: TestEntry[] = [ + { + value: RGB.R, + handlerMock: handlerMockR, + result: "Red!" + }, + { + value: RGB.G, + handlerMock: handlerMockG, + result: "Green!" + }, + { + value: RGB.B, + handlerMock: handlerMockB, + result: "Blue!" + }, + { + value: null, + handlerMock: handlerMockNull, + result: "Null!" + }, + { + isUnexpected: true, + value: (undefined as any) as RGB, + handlerMock: handlerMockUnexpected, + result: "Unexpected! (undefined)" + }, + { + isUnexpected: true, + value: ("unexpected!" as any) as RGB, + handlerMock: handlerMockUnexpected, + result: "Unexpected! (unexpected!)" + }, + { + isUnexpected: true, + // matches a standard property name on Object.prototype + value: ("toString" as any) as RGB, + handlerMock: handlerMockUnexpected, + result: "Unexpected! (toString)" + } + ]; + + const visitors: EnumValueVisitorWithNull[] = [ + { + [RGB.R]: handlerMockR, + [RGB.G]: handlerMockG, + [RGB.B]: handlerMockB, + [$enum.handleNull]: handlerMockNull + }, + { + [RGB.R]: handlerMockR, + [RGB.G]: handlerMockG, + [RGB.B]: handlerMockB, + [$enum.handleNull]: handlerMockNull, + [$enum.handleUnexpected]: handlerMockUnexpected + }, + { + [RGB.R]: $enum.unhandledEntry, + [RGB.G]: $enum.unhandledEntry, + [RGB.B]: $enum.unhandledEntry, + [$enum.handleNull]: $enum.unhandledEntry, + [$enum.handleUnexpected]: $enum.unhandledEntry + } + ]; + + for (const visitor of visitors) { + for (const testEntry of TEST_ENTRIES) { + if (visitor[RGB.R] === $enum.unhandledEntry) { + test(`Unhandled entry throws error (${testEntry.value}`, () => { + expect(() => { + $enum.visitValue(testEntry.value).with(visitor); + }).toThrowError(`Unhandled value: ${testEntry.value}`); + }); + } else if ( + visitor[$enum.handleUnexpected] || + !testEntry.isUnexpected + ) { + test(`Correct visitor method is called (${testEntry.value})`, () => { + $enum.visitValue(testEntry.value).with(visitor); + + for (const handlerMock of ALL_HANDLER_MOCKS) { + if (handlerMock === testEntry.handlerMock) { + expect(handlerMock.mock.calls.length).toBe(1); + } else { + expect(handlerMock.mock.calls.length).toBe(0); + } + } + }); + + test(`Value is passed to handler (${testEntry.value})`, () => { + $enum.visitValue(testEntry.value).with(visitor); + expect(testEntry.handlerMock.mock.calls.length).toBe(1); + const args = testEntry.handlerMock.mock.calls[0]; + expect(args.length).toBe(1); + expect(args[0]).toBe(testEntry.value); + }); + + test(`Handler result is returned (${testEntry.value})`, () => { + const result = $enum + .visitValue(testEntry.value) + .with(visitor); + expect(result).toBe(testEntry.result); + }); + } else { + test(`unhandled unexpected value throws error (${testEntry.value})`, () => { + expect(() => { + $enum.visitValue(testEntry.value).with(visitor); + }).toThrowError(`Unexpected value: ${testEntry.value}`); + }); + + test(`No visitor method is called for unhandled unexpected value(${testEntry.value})`, () => { + try { + $enum.visitValue(testEntry.value).with(visitor); + } catch (error) { + // ignore error + } + + for (const handlerMock of ALL_HANDLER_MOCKS) { + expect(handlerMock.mock.calls.length).toBe(0); + } + }); + } + } + } + }); + + describe("With undefined", () => { + interface TestEntry { + isUnexpected?: boolean; + value: RGB | undefined; + handlerMock: jest.Mock; + result: string; + } + + const TEST_ENTRIES: TestEntry[] = [ + { + value: RGB.R, + handlerMock: handlerMockR, + result: "Red!" + }, + { + value: RGB.G, + handlerMock: handlerMockG, + result: "Green!" + }, + { + value: RGB.B, + handlerMock: handlerMockB, + result: "Blue!" + }, + { + value: undefined, + handlerMock: handlerMockUndefined, + result: "Undefined!" + }, + { + isUnexpected: true, + value: (null as any) as RGB, + handlerMock: handlerMockUnexpected, + result: "Unexpected! (null)" + }, + { + isUnexpected: true, + value: ("unexpected!" as any) as RGB, + handlerMock: handlerMockUnexpected, + result: "Unexpected! (unexpected!)" + }, + { + isUnexpected: true, + // matches a standard property name on Object.prototype + value: ("toString" as any) as RGB, + handlerMock: handlerMockUnexpected, + result: "Unexpected! (toString)" + } + ]; + + const visitors: EnumValueVisitorWithUndefined[] = [ + { + [RGB.R]: handlerMockR, + [RGB.G]: handlerMockG, + [RGB.B]: handlerMockB, + [$enum.handleUndefined]: handlerMockUndefined + }, + { + [RGB.R]: handlerMockR, + [RGB.G]: handlerMockG, + [RGB.B]: handlerMockB, + [$enum.handleUndefined]: handlerMockUndefined, + [$enum.handleUnexpected]: handlerMockUnexpected + }, + { + [RGB.R]: $enum.unhandledEntry, + [RGB.G]: $enum.unhandledEntry, + [RGB.B]: $enum.unhandledEntry, + [$enum.handleUndefined]: $enum.unhandledEntry, + [$enum.handleUnexpected]: $enum.unhandledEntry + } + ]; + + for (const visitor of visitors) { + for (const testEntry of TEST_ENTRIES) { + if (visitor[RGB.R] === $enum.unhandledEntry) { + test(`Unhandled entry throws error (${testEntry.value}`, () => { + expect(() => { + $enum.visitValue(testEntry.value).with(visitor); + }).toThrowError(`Unhandled value: ${testEntry.value}`); + }); + } else if ( + visitor[$enum.handleUnexpected] || + !testEntry.isUnexpected + ) { + test(`Correct visitor method is called (${testEntry.value})`, () => { + $enum.visitValue(testEntry.value).with(visitor); + + for (const handlerMock of ALL_HANDLER_MOCKS) { + if (handlerMock === testEntry.handlerMock) { + expect(handlerMock.mock.calls.length).toBe(1); + } else { + expect(handlerMock.mock.calls.length).toBe(0); + } + } + }); + + test(`Value is passed to handler (${testEntry.value})`, () => { + $enum.visitValue(testEntry.value).with(visitor); + expect(testEntry.handlerMock.mock.calls.length).toBe(1); + const args = testEntry.handlerMock.mock.calls[0]; + expect(args.length).toBe(1); + expect(args[0]).toBe(testEntry.value); + }); + + test(`Handler result is returned (${testEntry.value})`, () => { + const result = $enum + .visitValue(testEntry.value) + .with(visitor); + expect(result).toBe(testEntry.result); + }); + } else { + test(`Unhandled unexpected value throws error (${testEntry.value})`, () => { + expect(() => { + $enum.visitValue(testEntry.value).with(visitor); + }).toThrowError(`Unexpected value: ${testEntry.value}`); + }); + + test(`No visitor method is called for unhandled unexpected value(${testEntry.value})`, () => { + try { + $enum.visitValue(testEntry.value).with(visitor); + } catch (error) { + // ignore error + } + + for (const handlerMock of ALL_HANDLER_MOCKS) { + expect(handlerMock.mock.calls.length).toBe(0); + } + }); + } + } + } + }); + + describe("With null and undefined", () => { + interface TestEntry { + isUnexpected?: boolean; + value: RGB | null | undefined; + handlerMock: jest.Mock; + result: string; + } + + const TEST_ENTRIES: TestEntry[] = [ + { + value: RGB.R, + handlerMock: handlerMockR, + result: "Red!" + }, + { + value: RGB.G, + handlerMock: handlerMockG, + result: "Green!" + }, + { + value: RGB.B, + handlerMock: handlerMockB, + result: "Blue!" + }, + { + value: null, + handlerMock: handlerMockNull, + result: "Null!" + }, + { + value: undefined, + handlerMock: handlerMockUndefined, + result: "Undefined!" + }, + { + isUnexpected: true, + value: ("unexpected!" as any) as RGB, + handlerMock: handlerMockUnexpected, + result: "Unexpected! (unexpected!)" + }, + { + isUnexpected: true, + // matches a standard property name on Object.prototype + value: ("toString" as any) as RGB, + handlerMock: handlerMockUnexpected, + result: "Unexpected! (toString)" + } + ]; + + const visitors: EnumValueVisitorWithNullAndUndefined[] = [ + { + [RGB.R]: handlerMockR, + [RGB.G]: handlerMockG, + [RGB.B]: handlerMockB, + [$enum.handleNull]: handlerMockNull, + [$enum.handleUndefined]: handlerMockUndefined + }, + { + [RGB.R]: handlerMockR, + [RGB.G]: handlerMockG, + [RGB.B]: handlerMockB, + [$enum.handleNull]: handlerMockNull, + [$enum.handleUndefined]: handlerMockUndefined, + [$enum.handleUnexpected]: handlerMockUnexpected + }, + { + [RGB.R]: $enum.unhandledEntry, + [RGB.G]: $enum.unhandledEntry, + [RGB.B]: $enum.unhandledEntry, + [$enum.handleNull]: $enum.unhandledEntry, + [$enum.handleUndefined]: $enum.unhandledEntry, + [$enum.handleUnexpected]: $enum.unhandledEntry + } + ]; + + for (const visitor of visitors) { + for (const testEntry of TEST_ENTRIES) { + if (visitor[RGB.R] === $enum.unhandledEntry) { + test(`Unhandled entry throws error (${testEntry.value}`, () => { + expect(() => { + $enum.visitValue(testEntry.value).with(visitor); + }).toThrowError(`Unhandled value: ${testEntry.value}`); + }); + } else if ( + visitor[$enum.handleUnexpected] || + !testEntry.isUnexpected + ) { + test(`Correct visitor method is called (${testEntry.value})`, () => { + $enum.visitValue(testEntry.value).with(visitor); + + for (const handlerMock of ALL_HANDLER_MOCKS) { + if (handlerMock === testEntry.handlerMock) { + expect(handlerMock.mock.calls.length).toBe(1); + } else { + expect(handlerMock.mock.calls.length).toBe(0); + } + } + }); + + test(`Value is passed to handler (${testEntry.value})`, () => { + $enum.visitValue(testEntry.value).with(visitor); + expect(testEntry.handlerMock.mock.calls.length).toBe(1); + const args = testEntry.handlerMock.mock.calls[0]; + expect(args.length).toBe(1); + expect(args[0]).toBe(testEntry.value); + }); + + test(`Handler result is returned (${testEntry.value})`, () => { + const result = $enum + .visitValue(testEntry.value) + .with(visitor); + expect(result).toBe(testEntry.result); + }); + } else { + test(`Unhandled unexpected value throws error (${testEntry.value})`, () => { + expect(() => { + $enum.visitValue(testEntry.value).with(visitor); + }).toThrowError(`Unexpected value: ${testEntry.value}`); + }); + + test(`No visitor method is called for unhandled unexpected value(${testEntry.value})`, () => { + try { + $enum.visitValue(testEntry.value).with(visitor); + } catch (error) { + // ignore error + } + + for (const handlerMock of ALL_HANDLER_MOCKS) { + expect(handlerMock.mock.calls.length).toBe(0); + } + }); + } + } + } + }); +}); diff --git a/tests/visitValue-number.test.ts b/tests/visitValue-number.test.ts new file mode 100644 index 0000000..85492af --- /dev/null +++ b/tests/visitValue-number.test.ts @@ -0,0 +1,593 @@ +import { + $enum, + EnumValueVisitor, + EnumValueVisitorWithNull, + EnumValueVisitorWithUndefined, + EnumValueVisitorWithNullAndUndefined +} from "../src"; + +enum RGB { + R, + G, + B +} + +describe("visitValue (number)", () => { + const handlerMockR = jest.fn((value: RGB.R) => { + return "Red!"; + }); + + const handlerMockG = jest.fn((value: RGB.G) => { + return "Green!"; + }); + + const handlerMockB = jest.fn((value: RGB.B) => { + return "Blue!"; + }); + + const handlerMockNull = jest.fn((value: null) => { + return "Null!"; + }); + + const handlerMockUndefined = jest.fn((value: undefined) => { + return "Undefined!"; + }); + + const handlerMockUnexpected = jest.fn( + (value: number | null | undefined) => { + return `Unexpected! (${value})`; + } + ); + + const ALL_HANDLER_MOCKS = [ + handlerMockR, + handlerMockG, + handlerMockB, + handlerMockNull, + handlerMockUndefined, + handlerMockUnexpected + ]; + + beforeEach(() => { + // Clear all handler mocks for a fresh start before each test + for (const handlerMock of ALL_HANDLER_MOCKS) { + handlerMock.mockClear(); + } + }); + + describe("Without null/undefined", () => { + interface TestEntry { + isUnexpected?: boolean; + value: RGB; + handlerMock: jest.Mock; + result: string; + } + + const TEST_ENTRIES: TestEntry[] = [ + { + value: RGB.R, + handlerMock: handlerMockR, + result: "Red!" + }, + { + value: RGB.G, + handlerMock: handlerMockG, + result: "Green!" + }, + { + value: RGB.B, + handlerMock: handlerMockB, + result: "Blue!" + }, + { + isUnexpected: true, + value: (null as any) as RGB, + handlerMock: handlerMockUnexpected, + result: "Unexpected! (null)" + }, + { + isUnexpected: true, + value: (undefined as any) as RGB, + handlerMock: handlerMockUnexpected, + result: "Unexpected! (undefined)" + }, + { + isUnexpected: true, + value: ("unexpected!" as any) as RGB, + handlerMock: handlerMockUnexpected, + result: "Unexpected! (unexpected!)" + }, + { + isUnexpected: true, + // matches a standard property name on Object.prototype + value: ("toString" as any) as RGB, + handlerMock: handlerMockUnexpected, + result: "Unexpected! (toString)" + } + ]; + + const visitors: EnumValueVisitor[] = [ + { + [RGB.R]: handlerMockR, + [RGB.G]: handlerMockG, + [RGB.B]: handlerMockB + }, + { + [RGB.R]: handlerMockR, + [RGB.G]: handlerMockG, + [RGB.B]: handlerMockB, + [$enum.handleUnexpected]: handlerMockUnexpected + }, + { + [RGB.R]: $enum.unhandledEntry, + [RGB.G]: $enum.unhandledEntry, + [RGB.B]: $enum.unhandledEntry, + [$enum.handleUnexpected]: $enum.unhandledEntry + } + ]; + + for (const visitor of visitors) { + for (const testEntry of TEST_ENTRIES) { + if (visitor[RGB.R] === $enum.unhandledEntry) { + test(`Unhandled entry throws error (${testEntry.value}`, () => { + expect(() => { + $enum.visitValue(testEntry.value).with(visitor); + }).toThrowError(`Unhandled value: ${testEntry.value}`); + }); + } else if ( + visitor[$enum.handleUnexpected] || + !testEntry.isUnexpected + ) { + test(`Correct visitor method is called (${testEntry.value})`, () => { + $enum.visitValue(testEntry.value).with(visitor); + + for (const handlerMock of ALL_HANDLER_MOCKS) { + if (handlerMock === testEntry.handlerMock) { + expect(handlerMock.mock.calls.length).toBe(1); + } else { + expect(handlerMock.mock.calls.length).toBe(0); + } + } + }); + + test(`Value is passed to handler (${testEntry.value})`, () => { + $enum.visitValue(testEntry.value).with(visitor); + expect(testEntry.handlerMock.mock.calls.length).toBe(1); + const args = testEntry.handlerMock.mock.calls[0]; + expect(args.length).toBe(1); + expect(args[0]).toBe(testEntry.value); + }); + + test(`Handler result is returned (${testEntry.value})`, () => { + const result = $enum + .visitValue(testEntry.value) + .with(visitor); + expect(result).toBe(testEntry.result); + }); + } else { + test(`Unhandled unexpected value throws error (${testEntry.value})`, () => { + expect(() => { + $enum.visitValue(testEntry.value).with(visitor); + }).toThrowError(`Unexpected value: ${testEntry.value}`); + }); + + test(`No visitor method is called for unhandled unexpected value(${testEntry.value})`, () => { + try { + $enum.visitValue(testEntry.value).with(visitor); + } catch (error) { + // ignore error + } + + for (const handlerMock of ALL_HANDLER_MOCKS) { + expect(handlerMock.mock.calls.length).toBe(0); + } + }); + } + } + } + }); + + describe("With null", () => { + interface TestEntry { + isUnexpected?: boolean; + value: RGB | null; + handlerMock: jest.Mock; + result: string; + } + + const TEST_ENTRIES: TestEntry[] = [ + { + value: RGB.R, + handlerMock: handlerMockR, + result: "Red!" + }, + { + value: RGB.G, + handlerMock: handlerMockG, + result: "Green!" + }, + { + value: RGB.B, + handlerMock: handlerMockB, + result: "Blue!" + }, + { + value: null, + handlerMock: handlerMockNull, + result: "Null!" + }, + { + isUnexpected: true, + value: (undefined as any) as RGB, + handlerMock: handlerMockUnexpected, + result: "Unexpected! (undefined)" + }, + { + isUnexpected: true, + value: ("unexpected!" as any) as RGB, + handlerMock: handlerMockUnexpected, + result: "Unexpected! (unexpected!)" + }, + { + isUnexpected: true, + // matches a standard property name on Object.prototype + value: ("toString" as any) as RGB, + handlerMock: handlerMockUnexpected, + result: "Unexpected! (toString)" + } + ]; + + const visitors: EnumValueVisitorWithNull[] = [ + { + [RGB.R]: handlerMockR, + [RGB.G]: handlerMockG, + [RGB.B]: handlerMockB, + [$enum.handleNull]: handlerMockNull + }, + { + [RGB.R]: handlerMockR, + [RGB.G]: handlerMockG, + [RGB.B]: handlerMockB, + [$enum.handleNull]: handlerMockNull, + [$enum.handleUnexpected]: handlerMockUnexpected + }, + { + [RGB.R]: $enum.unhandledEntry, + [RGB.G]: $enum.unhandledEntry, + [RGB.B]: $enum.unhandledEntry, + [$enum.handleNull]: $enum.unhandledEntry, + [$enum.handleUnexpected]: $enum.unhandledEntry + } + ]; + + for (const visitor of visitors) { + for (const testEntry of TEST_ENTRIES) { + if (visitor[RGB.R] === $enum.unhandledEntry) { + test(`Unhandled entry throws error (${testEntry.value}`, () => { + expect(() => { + $enum.visitValue(testEntry.value).with(visitor); + }).toThrowError(`Unhandled value: ${testEntry.value}`); + }); + } else if ( + visitor[$enum.handleUnexpected] || + !testEntry.isUnexpected + ) { + test(`Correct visitor method is called (${testEntry.value})`, () => { + $enum.visitValue(testEntry.value).with(visitor); + + for (const handlerMock of ALL_HANDLER_MOCKS) { + if (handlerMock === testEntry.handlerMock) { + expect(handlerMock.mock.calls.length).toBe(1); + } else { + expect(handlerMock.mock.calls.length).toBe(0); + } + } + }); + + test(`Value is passed to handler (${testEntry.value})`, () => { + $enum.visitValue(testEntry.value).with(visitor); + expect(testEntry.handlerMock.mock.calls.length).toBe(1); + const args = testEntry.handlerMock.mock.calls[0]; + expect(args.length).toBe(1); + expect(args[0]).toBe(testEntry.value); + }); + + test(`Handler result is returned (${testEntry.value})`, () => { + const result = $enum + .visitValue(testEntry.value) + .with(visitor); + expect(result).toBe(testEntry.result); + }); + } else { + test(`unhandled unexpected value throws error (${testEntry.value})`, () => { + expect(() => { + $enum.visitValue(testEntry.value).with(visitor); + }).toThrowError(`Unexpected value: ${testEntry.value}`); + }); + + test(`No visitor method is called for unhandled unexpected value(${testEntry.value})`, () => { + try { + $enum.visitValue(testEntry.value).with(visitor); + } catch (error) { + // ignore error + } + + for (const handlerMock of ALL_HANDLER_MOCKS) { + expect(handlerMock.mock.calls.length).toBe(0); + } + }); + } + } + } + }); + + describe("With undefined", () => { + interface TestEntry { + isUnexpected?: boolean; + value: RGB | undefined; + handlerMock: jest.Mock; + result: string; + } + + const TEST_ENTRIES: TestEntry[] = [ + { + value: RGB.R, + handlerMock: handlerMockR, + result: "Red!" + }, + { + value: RGB.G, + handlerMock: handlerMockG, + result: "Green!" + }, + { + value: RGB.B, + handlerMock: handlerMockB, + result: "Blue!" + }, + { + value: undefined, + handlerMock: handlerMockUndefined, + result: "Undefined!" + }, + { + isUnexpected: true, + value: (null as any) as RGB, + handlerMock: handlerMockUnexpected, + result: "Unexpected! (null)" + }, + { + isUnexpected: true, + value: ("unexpected!" as any) as RGB, + handlerMock: handlerMockUnexpected, + result: "Unexpected! (unexpected!)" + }, + { + isUnexpected: true, + // matches a standard property name on Object.prototype + value: ("toString" as any) as RGB, + handlerMock: handlerMockUnexpected, + result: "Unexpected! (toString)" + } + ]; + + const visitors: EnumValueVisitorWithUndefined[] = [ + { + [RGB.R]: handlerMockR, + [RGB.G]: handlerMockG, + [RGB.B]: handlerMockB, + [$enum.handleUndefined]: handlerMockUndefined + }, + { + [RGB.R]: handlerMockR, + [RGB.G]: handlerMockG, + [RGB.B]: handlerMockB, + [$enum.handleUndefined]: handlerMockUndefined, + [$enum.handleUnexpected]: handlerMockUnexpected + }, + { + [RGB.R]: $enum.unhandledEntry, + [RGB.G]: $enum.unhandledEntry, + [RGB.B]: $enum.unhandledEntry, + [$enum.handleUndefined]: $enum.unhandledEntry, + [$enum.handleUnexpected]: $enum.unhandledEntry + } + ]; + + for (const visitor of visitors) { + for (const testEntry of TEST_ENTRIES) { + if (visitor[RGB.R] === $enum.unhandledEntry) { + test(`Unhandled entry throws error (${testEntry.value}`, () => { + expect(() => { + $enum.visitValue(testEntry.value).with(visitor); + }).toThrowError(`Unhandled value: ${testEntry.value}`); + }); + } else if ( + visitor[$enum.handleUnexpected] || + !testEntry.isUnexpected + ) { + test(`Correct visitor method is called (${testEntry.value})`, () => { + $enum.visitValue(testEntry.value).with(visitor); + + for (const handlerMock of ALL_HANDLER_MOCKS) { + if (handlerMock === testEntry.handlerMock) { + expect(handlerMock.mock.calls.length).toBe(1); + } else { + expect(handlerMock.mock.calls.length).toBe(0); + } + } + }); + + test(`Value is passed to handler (${testEntry.value})`, () => { + $enum.visitValue(testEntry.value).with(visitor); + expect(testEntry.handlerMock.mock.calls.length).toBe(1); + const args = testEntry.handlerMock.mock.calls[0]; + expect(args.length).toBe(1); + expect(args[0]).toBe(testEntry.value); + }); + + test(`Handler result is returned (${testEntry.value})`, () => { + const result = $enum + .visitValue(testEntry.value) + .with(visitor); + expect(result).toBe(testEntry.result); + }); + } else { + test(`Unhandled unexpected value throws error (${testEntry.value})`, () => { + expect(() => { + $enum.visitValue(testEntry.value).with(visitor); + }).toThrowError(`Unexpected value: ${testEntry.value}`); + }); + + test(`No visitor method is called for unhandled unexpected value(${testEntry.value})`, () => { + try { + $enum.visitValue(testEntry.value).with(visitor); + } catch (error) { + // ignore error + } + + for (const handlerMock of ALL_HANDLER_MOCKS) { + expect(handlerMock.mock.calls.length).toBe(0); + } + }); + } + } + } + }); + + describe("With null and undefined", () => { + interface TestEntry { + isUnexpected?: boolean; + value: RGB | null | undefined; + handlerMock: jest.Mock; + result: string; + } + + const TEST_ENTRIES: TestEntry[] = [ + { + value: RGB.R, + handlerMock: handlerMockR, + result: "Red!" + }, + { + value: RGB.G, + handlerMock: handlerMockG, + result: "Green!" + }, + { + value: RGB.B, + handlerMock: handlerMockB, + result: "Blue!" + }, + { + value: null, + handlerMock: handlerMockNull, + result: "Null!" + }, + { + value: undefined, + handlerMock: handlerMockUndefined, + result: "Undefined!" + }, + { + isUnexpected: true, + value: ("unexpected!" as any) as RGB, + handlerMock: handlerMockUnexpected, + result: "Unexpected! (unexpected!)" + }, + { + isUnexpected: true, + // matches a standard property name on Object.prototype + value: ("toString" as any) as RGB, + handlerMock: handlerMockUnexpected, + result: "Unexpected! (toString)" + } + ]; + + const visitors: EnumValueVisitorWithNullAndUndefined[] = [ + { + [RGB.R]: handlerMockR, + [RGB.G]: handlerMockG, + [RGB.B]: handlerMockB, + [$enum.handleNull]: handlerMockNull, + [$enum.handleUndefined]: handlerMockUndefined + }, + { + [RGB.R]: handlerMockR, + [RGB.G]: handlerMockG, + [RGB.B]: handlerMockB, + [$enum.handleNull]: handlerMockNull, + [$enum.handleUndefined]: handlerMockUndefined, + [$enum.handleUnexpected]: handlerMockUnexpected + }, + { + [RGB.R]: $enum.unhandledEntry, + [RGB.G]: $enum.unhandledEntry, + [RGB.B]: $enum.unhandledEntry, + [$enum.handleNull]: $enum.unhandledEntry, + [$enum.handleUndefined]: $enum.unhandledEntry, + [$enum.handleUnexpected]: $enum.unhandledEntry + } + ]; + + for (const visitor of visitors) { + for (const testEntry of TEST_ENTRIES) { + if (visitor[RGB.R] === $enum.unhandledEntry) { + test(`Unhandled entry throws error (${testEntry.value}`, () => { + expect(() => { + $enum.visitValue(testEntry.value).with(visitor); + }).toThrowError(`Unhandled value: ${testEntry.value}`); + }); + } else if ( + visitor[$enum.handleUnexpected] || + !testEntry.isUnexpected + ) { + test(`Correct visitor method is called (${testEntry.value})`, () => { + $enum.visitValue(testEntry.value).with(visitor); + + for (const handlerMock of ALL_HANDLER_MOCKS) { + if (handlerMock === testEntry.handlerMock) { + expect(handlerMock.mock.calls.length).toBe(1); + } else { + expect(handlerMock.mock.calls.length).toBe(0); + } + } + }); + + test(`Value is passed to handler (${testEntry.value})`, () => { + $enum.visitValue(testEntry.value).with(visitor); + expect(testEntry.handlerMock.mock.calls.length).toBe(1); + const args = testEntry.handlerMock.mock.calls[0]; + expect(args.length).toBe(1); + expect(args[0]).toBe(testEntry.value); + }); + + test(`Handler result is returned (${testEntry.value})`, () => { + const result = $enum + .visitValue(testEntry.value) + .with(visitor); + expect(result).toBe(testEntry.result); + }); + } else { + test(`Unhandled unexpected value throws error (${testEntry.value})`, () => { + expect(() => { + $enum.visitValue(testEntry.value).with(visitor); + }).toThrowError(`Unexpected value: ${testEntry.value}`); + }); + + test(`No visitor method is called for unhandled unexpected value(${testEntry.value})`, () => { + try { + $enum.visitValue(testEntry.value).with(visitor); + } catch (error) { + // ignore error + } + + for (const handlerMock of ALL_HANDLER_MOCKS) { + expect(handlerMock.mock.calls.length).toBe(0); + } + }); + } + } + } + }); +}); diff --git a/tests/visitValue-string.test.ts b/tests/visitValue-string.test.ts new file mode 100644 index 0000000..1b51208 --- /dev/null +++ b/tests/visitValue-string.test.ts @@ -0,0 +1,593 @@ +import { + $enum, + EnumValueVisitor, + EnumValueVisitorWithNull, + EnumValueVisitorWithUndefined, + EnumValueVisitorWithNullAndUndefined +} from "../src"; + +enum RGB { + R = "r", + G = "g", + B = "b" +} + +describe("visitValue (string)", () => { + const handlerMockR = jest.fn((value: RGB.R) => { + return "Red!"; + }); + + const handlerMockG = jest.fn((value: RGB.G) => { + return "Green!"; + }); + + const handlerMockB = jest.fn((value: RGB.B) => { + return "Blue!"; + }); + + const handlerMockNull = jest.fn((value: null) => { + return "Null!"; + }); + + const handlerMockUndefined = jest.fn((value: undefined) => { + return "Undefined!"; + }); + + const handlerMockUnexpected = jest.fn( + (value: string | null | undefined) => { + return `Unexpected! (${value})`; + } + ); + + const ALL_HANDLER_MOCKS = [ + handlerMockR, + handlerMockG, + handlerMockB, + handlerMockNull, + handlerMockUndefined, + handlerMockUnexpected + ]; + + beforeEach(() => { + // Clear all handler mocks for a fresh start before each test + for (const handlerMock of ALL_HANDLER_MOCKS) { + handlerMock.mockClear(); + } + }); + + describe("Without null/undefined", () => { + interface TestEntry { + isUnexpected?: boolean; + value: RGB; + handlerMock: jest.Mock; + result: string; + } + + const TEST_ENTRIES: TestEntry[] = [ + { + value: RGB.R, + handlerMock: handlerMockR, + result: "Red!" + }, + { + value: RGB.G, + handlerMock: handlerMockG, + result: "Green!" + }, + { + value: RGB.B, + handlerMock: handlerMockB, + result: "Blue!" + }, + { + isUnexpected: true, + value: (null as any) as RGB, + handlerMock: handlerMockUnexpected, + result: "Unexpected! (null)" + }, + { + isUnexpected: true, + value: (undefined as any) as RGB, + handlerMock: handlerMockUnexpected, + result: "Unexpected! (undefined)" + }, + { + isUnexpected: true, + value: ("unexpected!" as any) as RGB, + handlerMock: handlerMockUnexpected, + result: "Unexpected! (unexpected!)" + }, + { + isUnexpected: true, + // matches a standard property name on Object.prototype + value: ("toString" as any) as RGB, + handlerMock: handlerMockUnexpected, + result: "Unexpected! (toString)" + } + ]; + + const visitors: EnumValueVisitor[] = [ + { + [RGB.R]: handlerMockR, + [RGB.G]: handlerMockG, + [RGB.B]: handlerMockB + }, + { + [RGB.R]: handlerMockR, + [RGB.G]: handlerMockG, + [RGB.B]: handlerMockB, + [$enum.handleUnexpected]: handlerMockUnexpected + }, + { + [RGB.R]: $enum.unhandledEntry, + [RGB.G]: $enum.unhandledEntry, + [RGB.B]: $enum.unhandledEntry, + [$enum.handleUnexpected]: $enum.unhandledEntry + } + ]; + + for (const visitor of visitors) { + for (const testEntry of TEST_ENTRIES) { + if (visitor[RGB.R] === $enum.unhandledEntry) { + test(`Unhandled entry throws error (${testEntry.value}`, () => { + expect(() => { + $enum.visitValue(testEntry.value).with(visitor); + }).toThrowError(`Unhandled value: ${testEntry.value}`); + }); + } else if ( + visitor[$enum.handleUnexpected] || + !testEntry.isUnexpected + ) { + test(`Correct visitor method is called (${testEntry.value})`, () => { + $enum.visitValue(testEntry.value).with(visitor); + + for (const handlerMock of ALL_HANDLER_MOCKS) { + if (handlerMock === testEntry.handlerMock) { + expect(handlerMock.mock.calls.length).toBe(1); + } else { + expect(handlerMock.mock.calls.length).toBe(0); + } + } + }); + + test(`Value is passed to handler (${testEntry.value})`, () => { + $enum.visitValue(testEntry.value).with(visitor); + expect(testEntry.handlerMock.mock.calls.length).toBe(1); + const args = testEntry.handlerMock.mock.calls[0]; + expect(args.length).toBe(1); + expect(args[0]).toBe(testEntry.value); + }); + + test(`Handler result is returned (${testEntry.value})`, () => { + const result = $enum + .visitValue(testEntry.value) + .with(visitor); + expect(result).toBe(testEntry.result); + }); + } else { + test(`Unhandled unexpected value throws error (${testEntry.value})`, () => { + expect(() => { + $enum.visitValue(testEntry.value).with(visitor); + }).toThrowError(`Unexpected value: ${testEntry.value}`); + }); + + test(`No visitor method is called for unhandled unexpected value(${testEntry.value})`, () => { + try { + $enum.visitValue(testEntry.value).with(visitor); + } catch (error) { + // ignore error + } + + for (const handlerMock of ALL_HANDLER_MOCKS) { + expect(handlerMock.mock.calls.length).toBe(0); + } + }); + } + } + } + }); + + describe("With null", () => { + interface TestEntry { + isUnexpected?: boolean; + value: RGB | null; + handlerMock: jest.Mock; + result: string; + } + + const TEST_ENTRIES: TestEntry[] = [ + { + value: RGB.R, + handlerMock: handlerMockR, + result: "Red!" + }, + { + value: RGB.G, + handlerMock: handlerMockG, + result: "Green!" + }, + { + value: RGB.B, + handlerMock: handlerMockB, + result: "Blue!" + }, + { + value: null, + handlerMock: handlerMockNull, + result: "Null!" + }, + { + isUnexpected: true, + value: (undefined as any) as RGB, + handlerMock: handlerMockUnexpected, + result: "Unexpected! (undefined)" + }, + { + isUnexpected: true, + value: ("unexpected!" as any) as RGB, + handlerMock: handlerMockUnexpected, + result: "Unexpected! (unexpected!)" + }, + { + isUnexpected: true, + // matches a standard property name on Object.prototype + value: ("toString" as any) as RGB, + handlerMock: handlerMockUnexpected, + result: "Unexpected! (toString)" + } + ]; + + const visitors: EnumValueVisitorWithNull[] = [ + { + [RGB.R]: handlerMockR, + [RGB.G]: handlerMockG, + [RGB.B]: handlerMockB, + [$enum.handleNull]: handlerMockNull + }, + { + [RGB.R]: handlerMockR, + [RGB.G]: handlerMockG, + [RGB.B]: handlerMockB, + [$enum.handleNull]: handlerMockNull, + [$enum.handleUnexpected]: handlerMockUnexpected + }, + { + [RGB.R]: $enum.unhandledEntry, + [RGB.G]: $enum.unhandledEntry, + [RGB.B]: $enum.unhandledEntry, + [$enum.handleNull]: $enum.unhandledEntry, + [$enum.handleUnexpected]: $enum.unhandledEntry + } + ]; + + for (const visitor of visitors) { + for (const testEntry of TEST_ENTRIES) { + if (visitor[RGB.R] === $enum.unhandledEntry) { + test(`Unhandled entry throws error (${testEntry.value}`, () => { + expect(() => { + $enum.visitValue(testEntry.value).with(visitor); + }).toThrowError(`Unhandled value: ${testEntry.value}`); + }); + } else if ( + visitor[$enum.handleUnexpected] || + !testEntry.isUnexpected + ) { + test(`Correct visitor method is called (${testEntry.value})`, () => { + $enum.visitValue(testEntry.value).with(visitor); + + for (const handlerMock of ALL_HANDLER_MOCKS) { + if (handlerMock === testEntry.handlerMock) { + expect(handlerMock.mock.calls.length).toBe(1); + } else { + expect(handlerMock.mock.calls.length).toBe(0); + } + } + }); + + test(`Value is passed to handler (${testEntry.value})`, () => { + $enum.visitValue(testEntry.value).with(visitor); + expect(testEntry.handlerMock.mock.calls.length).toBe(1); + const args = testEntry.handlerMock.mock.calls[0]; + expect(args.length).toBe(1); + expect(args[0]).toBe(testEntry.value); + }); + + test(`Handler result is returned (${testEntry.value})`, () => { + const result = $enum + .visitValue(testEntry.value) + .with(visitor); + expect(result).toBe(testEntry.result); + }); + } else { + test(`unhandled unexpected value throws error (${testEntry.value})`, () => { + expect(() => { + $enum.visitValue(testEntry.value).with(visitor); + }).toThrowError(`Unexpected value: ${testEntry.value}`); + }); + + test(`No visitor method is called for unhandled unexpected value(${testEntry.value})`, () => { + try { + $enum.visitValue(testEntry.value).with(visitor); + } catch (error) { + // ignore error + } + + for (const handlerMock of ALL_HANDLER_MOCKS) { + expect(handlerMock.mock.calls.length).toBe(0); + } + }); + } + } + } + }); + + describe("With undefined", () => { + interface TestEntry { + isUnexpected?: boolean; + value: RGB | undefined; + handlerMock: jest.Mock; + result: string; + } + + const TEST_ENTRIES: TestEntry[] = [ + { + value: RGB.R, + handlerMock: handlerMockR, + result: "Red!" + }, + { + value: RGB.G, + handlerMock: handlerMockG, + result: "Green!" + }, + { + value: RGB.B, + handlerMock: handlerMockB, + result: "Blue!" + }, + { + value: undefined, + handlerMock: handlerMockUndefined, + result: "Undefined!" + }, + { + isUnexpected: true, + value: (null as any) as RGB, + handlerMock: handlerMockUnexpected, + result: "Unexpected! (null)" + }, + { + isUnexpected: true, + value: ("unexpected!" as any) as RGB, + handlerMock: handlerMockUnexpected, + result: "Unexpected! (unexpected!)" + }, + { + isUnexpected: true, + // matches a standard property name on Object.prototype + value: ("toString" as any) as RGB, + handlerMock: handlerMockUnexpected, + result: "Unexpected! (toString)" + } + ]; + + const visitors: EnumValueVisitorWithUndefined[] = [ + { + [RGB.R]: handlerMockR, + [RGB.G]: handlerMockG, + [RGB.B]: handlerMockB, + [$enum.handleUndefined]: handlerMockUndefined + }, + { + [RGB.R]: handlerMockR, + [RGB.G]: handlerMockG, + [RGB.B]: handlerMockB, + [$enum.handleUndefined]: handlerMockUndefined, + [$enum.handleUnexpected]: handlerMockUnexpected + }, + { + [RGB.R]: $enum.unhandledEntry, + [RGB.G]: $enum.unhandledEntry, + [RGB.B]: $enum.unhandledEntry, + [$enum.handleUndefined]: $enum.unhandledEntry, + [$enum.handleUnexpected]: $enum.unhandledEntry + } + ]; + + for (const visitor of visitors) { + for (const testEntry of TEST_ENTRIES) { + if (visitor[RGB.R] === $enum.unhandledEntry) { + test(`Unhandled entry throws error (${testEntry.value}`, () => { + expect(() => { + $enum.visitValue(testEntry.value).with(visitor); + }).toThrowError(`Unhandled value: ${testEntry.value}`); + }); + } else if ( + visitor[$enum.handleUnexpected] || + !testEntry.isUnexpected + ) { + test(`Correct visitor method is called (${testEntry.value})`, () => { + $enum.visitValue(testEntry.value).with(visitor); + + for (const handlerMock of ALL_HANDLER_MOCKS) { + if (handlerMock === testEntry.handlerMock) { + expect(handlerMock.mock.calls.length).toBe(1); + } else { + expect(handlerMock.mock.calls.length).toBe(0); + } + } + }); + + test(`Value is passed to handler (${testEntry.value})`, () => { + $enum.visitValue(testEntry.value).with(visitor); + expect(testEntry.handlerMock.mock.calls.length).toBe(1); + const args = testEntry.handlerMock.mock.calls[0]; + expect(args.length).toBe(1); + expect(args[0]).toBe(testEntry.value); + }); + + test(`Handler result is returned (${testEntry.value})`, () => { + const result = $enum + .visitValue(testEntry.value) + .with(visitor); + expect(result).toBe(testEntry.result); + }); + } else { + test(`Unhandled unexpected value throws error (${testEntry.value})`, () => { + expect(() => { + $enum.visitValue(testEntry.value).with(visitor); + }).toThrowError(`Unexpected value: ${testEntry.value}`); + }); + + test(`No visitor method is called for unhandled unexpected value(${testEntry.value})`, () => { + try { + $enum.visitValue(testEntry.value).with(visitor); + } catch (error) { + // ignore error + } + + for (const handlerMock of ALL_HANDLER_MOCKS) { + expect(handlerMock.mock.calls.length).toBe(0); + } + }); + } + } + } + }); + + describe("With null and undefined", () => { + interface TestEntry { + isUnexpected?: boolean; + value: RGB | null | undefined; + handlerMock: jest.Mock; + result: string; + } + + const TEST_ENTRIES: TestEntry[] = [ + { + value: RGB.R, + handlerMock: handlerMockR, + result: "Red!" + }, + { + value: RGB.G, + handlerMock: handlerMockG, + result: "Green!" + }, + { + value: RGB.B, + handlerMock: handlerMockB, + result: "Blue!" + }, + { + value: null, + handlerMock: handlerMockNull, + result: "Null!" + }, + { + value: undefined, + handlerMock: handlerMockUndefined, + result: "Undefined!" + }, + { + isUnexpected: true, + value: ("unexpected!" as any) as RGB, + handlerMock: handlerMockUnexpected, + result: "Unexpected! (unexpected!)" + }, + { + isUnexpected: true, + // matches a standard property name on Object.prototype + value: ("toString" as any) as RGB, + handlerMock: handlerMockUnexpected, + result: "Unexpected! (toString)" + } + ]; + + const visitors: EnumValueVisitorWithNullAndUndefined[] = [ + { + [RGB.R]: handlerMockR, + [RGB.G]: handlerMockG, + [RGB.B]: handlerMockB, + [$enum.handleNull]: handlerMockNull, + [$enum.handleUndefined]: handlerMockUndefined + }, + { + [RGB.R]: handlerMockR, + [RGB.G]: handlerMockG, + [RGB.B]: handlerMockB, + [$enum.handleNull]: handlerMockNull, + [$enum.handleUndefined]: handlerMockUndefined, + [$enum.handleUnexpected]: handlerMockUnexpected + }, + { + [RGB.R]: $enum.unhandledEntry, + [RGB.G]: $enum.unhandledEntry, + [RGB.B]: $enum.unhandledEntry, + [$enum.handleNull]: $enum.unhandledEntry, + [$enum.handleUndefined]: $enum.unhandledEntry, + [$enum.handleUnexpected]: $enum.unhandledEntry + } + ]; + + for (const visitor of visitors) { + for (const testEntry of TEST_ENTRIES) { + if (visitor[RGB.R] === $enum.unhandledEntry) { + test(`Unhandled entry throws error (${testEntry.value}`, () => { + expect(() => { + $enum.visitValue(testEntry.value).with(visitor); + }).toThrowError(`Unhandled value: ${testEntry.value}`); + }); + } else if ( + visitor[$enum.handleUnexpected] || + !testEntry.isUnexpected + ) { + test(`Correct visitor method is called (${testEntry.value})`, () => { + $enum.visitValue(testEntry.value).with(visitor); + + for (const handlerMock of ALL_HANDLER_MOCKS) { + if (handlerMock === testEntry.handlerMock) { + expect(handlerMock.mock.calls.length).toBe(1); + } else { + expect(handlerMock.mock.calls.length).toBe(0); + } + } + }); + + test(`Value is passed to handler (${testEntry.value})`, () => { + $enum.visitValue(testEntry.value).with(visitor); + expect(testEntry.handlerMock.mock.calls.length).toBe(1); + const args = testEntry.handlerMock.mock.calls[0]; + expect(args.length).toBe(1); + expect(args[0]).toBe(testEntry.value); + }); + + test(`Handler result is returned (${testEntry.value})`, () => { + const result = $enum + .visitValue(testEntry.value) + .with(visitor); + expect(result).toBe(testEntry.result); + }); + } else { + test(`Unhandled unexpected value throws error (${testEntry.value})`, () => { + expect(() => { + $enum.visitValue(testEntry.value).with(visitor); + }).toThrowError(`Unexpected value: ${testEntry.value}`); + }); + + test(`No visitor method is called for unhandled unexpected value(${testEntry.value})`, () => { + try { + $enum.visitValue(testEntry.value).with(visitor); + } catch (error) { + // ignore error + } + + for (const handlerMock of ALL_HANDLER_MOCKS) { + expect(handlerMock.mock.calls.length).toBe(0); + } + }); + } + } + } + }); +}); diff --git a/tsconfig.json b/tsconfig.json index a5bfea5..556c24e 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -11,11 +11,10 @@ /* Strict Type-Checking Options */ "strict": true, "alwaysStrict": true, - "noImplicitAny": true, /* Module Resolution Options */ "moduleResolution": "node", "baseUrl": "./" }, - "exclude": ["node_modules", "type_tests"] + "include": ["src", "tests"] } diff --git a/tslint.json b/tslint.json index 6b0bddd..e53b72c 100644 --- a/tslint.json +++ b/tslint.json @@ -1,8 +1,5 @@ { - "extends": [ - "tslint:recommended", - "tslint-config-prettier" - ], + "extends": ["tslint:recommended", "tslint-config-prettier"], "rules": { "typedef": [ true, @@ -30,6 +27,7 @@ "no-namespace": false, "no-default-export": true, "no-unused-variable": true, + "object-literal-sort-keys": false, "object-literal-shorthand": false, "object-literal-key-quotes": false, "max-classes-per-file": [false], @@ -42,4 +40,4 @@ "no-for-in-array": true, "no-invalid-template-strings": true } -} \ No newline at end of file +} diff --git a/type_tests/v2_3_plus/README.md b/type_tests/v2_3_plus/README.md deleted file mode 100644 index 67e6a28..0000000 --- a/type_tests/v2_3_plus/README.md +++ /dev/null @@ -1,2 +0,0 @@ -### Compile-Time Tests: TypeScript 2.3+ -Compile-time type assertion tests for everything except for `enum` with `string` values. String enums were added in TypeScript 2.4. \ No newline at end of file diff --git a/type_tests/v2_3_plus/index.d.ts b/type_tests/v2_3_plus/index.d.ts deleted file mode 100644 index 7b03b5c..0000000 --- a/type_tests/v2_3_plus/index.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -// Dummy index.d.ts file for running dtslint. -// We're not actually linting a .d.ts file; only using dtslint to verify compile time types of ts-enum-util. -// TypeScript Version: 2.3 diff --git a/type_tests/v2_3_plus/tslint.json b/type_tests/v2_3_plus/tslint.json deleted file mode 100644 index a660933..0000000 --- a/type_tests/v2_3_plus/tslint.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "extends": "dtslint/dtslint.json", - "rules": { - "no-useless-files": false - } -} diff --git a/type_tests/v2_4_plus/README.md b/type_tests/v2_4_plus/README.md deleted file mode 100644 index 6d5e6bd..0000000 --- a/type_tests/v2_4_plus/README.md +++ /dev/null @@ -1,2 +0,0 @@ -### Compile-Time Tests: TypeScript 2.4+ -Compile-time type assertion tests for `enum` with `string` values. String enums were added in TypeScript 2.4. \ No newline at end of file diff --git a/type_tests/v2_4_plus/tsconfig.json b/type_tests/v2_4_plus/tsconfig.json deleted file mode 100644 index 913b1f9..0000000 --- a/type_tests/v2_4_plus/tsconfig.json +++ /dev/null @@ -1,24 +0,0 @@ -/* Config used for dtslint unit tests. */ -{ - "compilerOptions": { - /* Basic Options */ - "target": "es5", - "module": "commonjs", - - "lib": ["es6"], - - "downlevelIteration": true, - - /* Strict Type-Checking Options */ - "strict": true, - "alwaysStrict": true, - "noImplicitAny": true, - "noImplicitThis": true, - "strictNullChecks": true, - "strictFunctionTypes": true, - - /* Module Resolution Options */ - "moduleResolution": "node", - "baseUrl": "./" - } -} diff --git a/type_tests/v2_4_plus/tslint.json b/type_tests/v2_4_plus/tslint.json deleted file mode 100644 index a660933..0000000 --- a/type_tests/v2_4_plus/tslint.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "extends": "dtslint/dtslint.json", - "rules": { - "no-useless-files": false - } -} diff --git a/type_tests/v2_3_plus/dictionary-both.dtslint.ts b/type_tests/v2_9_plus/EnumWrapper/dictionary-mixed.dtslint.ts similarity index 81% rename from type_tests/v2_3_plus/dictionary-both.dtslint.ts rename to type_tests/v2_9_plus/EnumWrapper/dictionary-mixed.dtslint.ts index 05336dc..bbd2329 100644 --- a/type_tests/v2_3_plus/dictionary-both.dtslint.ts +++ b/type_tests/v2_9_plus/EnumWrapper/dictionary-mixed.dtslint.ts @@ -1,4 +1,4 @@ -import { $enum } from "../../src"; +import { $enum } from "ts-enum-util"; // Dictionary object with a mix of number and string values declare const TestEnum: { [key: string]: string | number }; @@ -30,14 +30,14 @@ enumWrapper.size; // $ExpectError enumWrapper.size = 0; // immutable -// $ExpectType Readonly<[string, string | number]> -enumWrapper[0]; +// NOTE: Must test via assignability rather than ExpectType because of a change +// in how Readonly tuple types work as of TS 3.1. +// Also cannot test for immutability of items within the entry tuple because of +// this change. +// see: https://github.com/Microsoft/TypeScript/issues/26864 +const testEntry: Readonly<[string, string | number]> = enumWrapper[0]; // $ExpectError enumWrapper[0] = ["A", TestEnum.A]; // immutable -// $ExpectError -enumWrapper[0][0] = "A"; // immutable -// $ExpectError -enumWrapper[0][1] = TestEnum.A; // immutable // $ExpectType IterableIterator enumWrapper.keys(); @@ -45,13 +45,16 @@ enumWrapper.keys(); // $ExpectType IterableIterator enumWrapper.values(); -// $ExpectType IterableIterator> -enumWrapper.entries(); +// NOTE: Must test via assignability rather than ExpectType because of a change +// in how Readonly tuple types work as of TS 3.1. +// Also cannot test for immutability of items within the iterated entry tuples +// because of this change. +// see: https://github.com/Microsoft/TypeScript/issues/26864 +const testEntryIterator: IterableIterator> = enumWrapper.entries(); for (const entry of enumWrapper.entries()) { - // $ExpectError - entry[0] = "A"; // immutable - // $ExpectError - entry[1] = TestEnum.A; // immutable + const testIteratedEntry: Readonly<[string, string | number]> = entry; } // $ExpectType void @@ -88,13 +91,14 @@ enumWrapper.getKeys(); // $ExpectType (string | number)[] enumWrapper.getValues(); -// $ExpectType Readonly<[string, string | number]>[] -enumWrapper.getEntries(); -const entry = enumWrapper.getEntries()[0]; -// $ExpectError -entry[0] = "A"; // immutable -// $ExpectError -entry[1] = TestEnum.A; // immutable +// NOTE: Must test via assignability rather than ExpectType because of a change +// in how Readonly tuple types work as of TS 3.1. +// Also cannot test for immutability of items within the entry tuple because of +// this change. +// see: https://github.com/Microsoft/TypeScript/issues/26864 +const testEntries: Readonly< + [string, string | number] +>[] = enumWrapper.getEntries(); // $ExpectType boolean enumWrapper.isKey(str); diff --git a/type_tests/v2_3_plus/dictionary-number.dtslint.ts b/type_tests/v2_9_plus/EnumWrapper/dictionary-number.dtslint.ts similarity index 80% rename from type_tests/v2_3_plus/dictionary-number.dtslint.ts rename to type_tests/v2_9_plus/EnumWrapper/dictionary-number.dtslint.ts index 2b7dab4..b44c9b1 100644 --- a/type_tests/v2_3_plus/dictionary-number.dtslint.ts +++ b/type_tests/v2_9_plus/EnumWrapper/dictionary-number.dtslint.ts @@ -1,4 +1,4 @@ -import { $enum } from "../../src"; +import { $enum } from "ts-enum-util"; // Dictionary object with number values declare const TestEnum: { [key: string]: number }; @@ -26,14 +26,14 @@ enumWrapper.size; // $ExpectError enumWrapper.size = 0; // immutable -// $ExpectType Readonly<[string, number]> -enumWrapper[0]; +// NOTE: Must test via assignability rather than ExpectType because of a change +// in how Readonly tuple types work as of TS 3.1. +// Also cannot test for immutability of items within the entry tuple because of +// this change. +// see: https://github.com/Microsoft/TypeScript/issues/26864 +const testEntry: Readonly<[string, number]> = enumWrapper[0]; // $ExpectError enumWrapper[0] = ["A", TestEnum.A]; // immutable -// $ExpectError -enumWrapper[0][0] = "A"; // immutable -// $ExpectError -enumWrapper[0][1] = TestEnum.A; // immutable // $ExpectType IterableIterator enumWrapper.keys(); @@ -41,13 +41,16 @@ enumWrapper.keys(); // $ExpectType IterableIterator enumWrapper.values(); -// $ExpectType IterableIterator> -enumWrapper.entries(); +// NOTE: Must test via assignability rather than ExpectType because of a change +// in how Readonly tuple types work as of TS 3.1. +// Also cannot test for immutability of items within the iterated entry tuples +// because of this change. +// see: https://github.com/Microsoft/TypeScript/issues/26864 +const testEntryIterator: IterableIterator> = enumWrapper.entries(); for (const entry of enumWrapper.entries()) { - // $ExpectError - entry[0] = "A"; // immutable - // $ExpectError - entry[1] = TestEnum.A; // immutable + const testIteratedEntry: Readonly<[string, number]> = entry; } // $ExpectType void @@ -84,13 +87,12 @@ enumWrapper.getKeys(); // $ExpectType number[] enumWrapper.getValues(); -// $ExpectType Readonly<[string, number]>[] -enumWrapper.getEntries(); -const entry = enumWrapper.getEntries()[0]; -// $ExpectError -entry[0] = "A"; // immutable -// $ExpectError -entry[1] = TestEnum.A; // immutable +// NOTE: Must test via assignability rather than ExpectType because of a change +// in how Readonly tuple types work as of TS 3.1. +// Also cannot test for immutability of items within the entry tuple because of +// this change. +// see: https://github.com/Microsoft/TypeScript/issues/26864 +const testEntries: Readonly<[string, number]>[] = enumWrapper.getEntries(); // $ExpectType boolean enumWrapper.isKey(str); diff --git a/type_tests/v2_3_plus/dictionary-string.dtslint.ts b/type_tests/v2_9_plus/EnumWrapper/dictionary-string.dtslint.ts similarity index 80% rename from type_tests/v2_3_plus/dictionary-string.dtslint.ts rename to type_tests/v2_9_plus/EnumWrapper/dictionary-string.dtslint.ts index 4f1e374..7a24f68 100644 --- a/type_tests/v2_3_plus/dictionary-string.dtslint.ts +++ b/type_tests/v2_9_plus/EnumWrapper/dictionary-string.dtslint.ts @@ -1,4 +1,4 @@ -import { $enum } from "../../src"; +import { $enum } from "ts-enum-util"; // Dictionary object with string values declare const TestEnum: { [key: string]: string }; @@ -26,14 +26,14 @@ enumWrapper.size; // $ExpectError enumWrapper.size = 0; // immutable -// $ExpectType Readonly<[string, string]> -enumWrapper[0]; +// NOTE: Must test via assignability rather than ExpectType because of a change +// in how Readonly tuple types work as of TS 3.1. +// Also cannot test for immutability of items within the entry tuple because of +// this change. +// see: https://github.com/Microsoft/TypeScript/issues/26864 +const testEntry: Readonly<[string, string]> = enumWrapper[0]; // $ExpectError enumWrapper[0] = ["A", TestEnum.A]; // immutable -// $ExpectError -enumWrapper[0][0] = "A"; // immutable -// $ExpectError -enumWrapper[0][1] = TestEnum.A; // immutable // $ExpectType IterableIterator enumWrapper.keys(); @@ -41,13 +41,16 @@ enumWrapper.keys(); // $ExpectType IterableIterator enumWrapper.values(); -// $ExpectType IterableIterator> -enumWrapper.entries(); +// NOTE: Must test via assignability rather than ExpectType because of a change +// in how Readonly tuple types work as of TS 3.1. +// Also cannot test for immutability of items within the iterated entry tuples +// because of this change. +// see: https://github.com/Microsoft/TypeScript/issues/26864 +const testEntryIterator: IterableIterator> = enumWrapper.entries(); for (const entry of enumWrapper.entries()) { - // $ExpectError - entry[0] = "A"; // immutable - // $ExpectError - entry[1] = TestEnum.A; // immutable + const testIteratedEntry: Readonly<[string, string]> = entry; } // $ExpectType void @@ -84,13 +87,12 @@ enumWrapper.getKeys(); // $ExpectType string[] enumWrapper.getValues(); -// $ExpectType Readonly<[string, string]>[] -enumWrapper.getEntries(); -const entry = enumWrapper.getEntries()[0]; -// $ExpectError -entry[0] = "A"; // immutable -// $ExpectError -entry[1] = TestEnum.A; // immutable +// NOTE: Must test via assignability rather than ExpectType because of a change +// in how Readonly tuple types work as of TS 3.1. +// Also cannot test for immutability of items within the entry tuple because of +// this change. +// see: https://github.com/Microsoft/TypeScript/issues/26864 +const testEntries: Readonly<[string, string]>[] = enumWrapper.getEntries(); // $ExpectType boolean enumWrapper.isKey(str); diff --git a/type_tests/v2_4_plus/enum-both.dtslint.ts b/type_tests/v2_9_plus/EnumWrapper/enum-mixed.dtslint.ts similarity index 83% rename from type_tests/v2_4_plus/enum-both.dtslint.ts rename to type_tests/v2_9_plus/EnumWrapper/enum-mixed.dtslint.ts index 6a4c871..1ba9ac6 100644 --- a/type_tests/v2_4_plus/enum-both.dtslint.ts +++ b/type_tests/v2_9_plus/EnumWrapper/enum-mixed.dtslint.ts @@ -1,4 +1,4 @@ -import { $enum } from "../../src"; +import { $enum } from "ts-enum-util"; // Enum with mix of number and string values enum TestEnum { @@ -42,14 +42,14 @@ enumWrapper.size; // $ExpectError enumWrapper.size = 0; // immutable -// $ExpectType Readonly<["A" | "B" | "C", TestEnum]> -enumWrapper[0]; +// NOTE: Must test via assignability rather than ExpectType because of a change +// in how Readonly tuple types work as of TS 3.1. +// Also cannot test for immutability of items within the entry tuple because of +// this change. +// see: https://github.com/Microsoft/TypeScript/issues/26864 +const testEntry: Readonly<["A" | "B" | "C", TestEnum]> = enumWrapper[0]; // $ExpectError enumWrapper[0] = ["A", TestEnum.A]; // immutable -// $ExpectError -enumWrapper[0][0] = "A"; // immutable -// $ExpectError -enumWrapper[0][1] = TestEnum.A; // immutable // $ExpectType IterableIterator<"A" | "B" | "C"> enumWrapper.keys(); @@ -57,13 +57,16 @@ enumWrapper.keys(); // $ExpectType IterableIterator enumWrapper.values(); -// $ExpectType IterableIterator> -enumWrapper.entries(); +// NOTE: Must test via assignability rather than ExpectType because of a change +// in how Readonly tuple types work as of TS 3.1. +// Also cannot test for immutability of items within the iterated entry tuples +// because of this change. +// see: https://github.com/Microsoft/TypeScript/issues/26864 +const testEntryIterator: IterableIterator> = enumWrapper.entries(); for (const entry of enumWrapper.entries()) { - // $ExpectError - entry[0] = "A"; // immutable - // $ExpectError - entry[1] = TestEnum.A; // immutable + const testIteratedEntry: Readonly<["A" | "B" | "C", TestEnum]> = entry; } // $ExpectType void @@ -100,13 +103,14 @@ enumWrapper.getKeys(); // $ExpectType TestEnum[] enumWrapper.getValues(); -// $ExpectType Readonly<["A" | "B" | "C", TestEnum]>[] -enumWrapper.getEntries(); -const entry = enumWrapper.getEntries()[0]; -// $ExpectError -entry[0] = "A"; // immutable -// $ExpectError -entry[1] = TestEnum.A; // immutable +// NOTE: Must test via assignability rather than ExpectType because of a change +// in how Readonly tuple types work as of TS 3.1. +// Also cannot test for immutability of items within the entry tuple because of +// this change. +// see: https://github.com/Microsoft/TypeScript/issues/26864 +const testEntries: Readonly< + ["A" | "B" | "C", TestEnum] +>[] = enumWrapper.getEntries(); // $ExpectType boolean enumWrapper.isKey(str); @@ -262,3 +266,6 @@ enumWrapper.getValueOrDefault(str, str); enumWrapper.getValueOrDefault(str, numstr); // $ExpectType string | number | undefined enumWrapper.getValueOrDefault(str, numstrOrUndefined); + +// $ExpectType Pick +enumWrapper.createEnumSubset("A", "C"); diff --git a/type_tests/v2_3_plus/enum-number.dtslint.ts b/type_tests/v2_9_plus/EnumWrapper/enum-number.dtslint.ts similarity index 82% rename from type_tests/v2_3_plus/enum-number.dtslint.ts rename to type_tests/v2_9_plus/EnumWrapper/enum-number.dtslint.ts index 51343a9..99937bf 100644 --- a/type_tests/v2_3_plus/enum-number.dtslint.ts +++ b/type_tests/v2_9_plus/EnumWrapper/enum-number.dtslint.ts @@ -1,4 +1,4 @@ -import { $enum } from "../../src"; +import { $enum } from "ts-enum-util"; // Enum with number values enum TestEnum { @@ -38,14 +38,14 @@ enumWrapper.size; // $ExpectError enumWrapper.size = 0; // immutable -// $ExpectType Readonly<["A" | "B" | "C", TestEnum]> -enumWrapper[0]; +// NOTE: Must test via assignability rather than ExpectType because of a change +// in how Readonly tuple types work as of TS 3.1. +// Also cannot test for immutability of items within the entry tuple because of +// this change. +// see: https://github.com/Microsoft/TypeScript/issues/26864 +const testEntry: Readonly<["A" | "B" | "C", TestEnum]> = enumWrapper[0]; // $ExpectError enumWrapper[0] = ["A", TestEnum.A]; // immutable -// $ExpectError -enumWrapper[0][0] = "A"; // immutable -// $ExpectError -enumWrapper[0][1] = TestEnum.A; // immutable // $ExpectType IterableIterator<"A" | "B" | "C"> enumWrapper.keys(); @@ -53,13 +53,16 @@ enumWrapper.keys(); // $ExpectType IterableIterator enumWrapper.values(); -// $ExpectType IterableIterator> -enumWrapper.entries(); +// NOTE: Must test via assignability rather than ExpectType because of a change +// in how Readonly tuple types work as of TS 3.1. +// Also cannot test for immutability of items within the iterated entry tuples +// because of this change. +// see: https://github.com/Microsoft/TypeScript/issues/26864 +const testEntryIterator: IterableIterator> = enumWrapper.entries(); for (const entry of enumWrapper.entries()) { - // $ExpectError - entry[0] = "A"; // immutable - // $ExpectError - entry[1] = TestEnum.A; // immutable + const testIteratedEntry: Readonly<["A" | "B" | "C", TestEnum]> = entry; } // $ExpectType void @@ -96,13 +99,14 @@ enumWrapper.getKeys(); // $ExpectType TestEnum[] enumWrapper.getValues(); -// $ExpectType Readonly<["A" | "B" | "C", TestEnum]>[] -enumWrapper.getEntries(); -const entry = enumWrapper.getEntries()[0]; -// $ExpectError -entry[0] = "A"; // immutable -// $ExpectError -entry[1] = TestEnum.A; // immutable +// NOTE: Must test via assignability rather than ExpectType because of a change +// in how Readonly tuple types work as of TS 3.1. +// Also cannot test for immutability of items within the entry tuple because of +// this change. +// see: https://github.com/Microsoft/TypeScript/issues/26864 +const testEntries: Readonly< + ["A" | "B" | "C", TestEnum] +>[] = enumWrapper.getEntries(); // $ExpectType boolean enumWrapper.isKey(str); @@ -264,3 +268,6 @@ enumWrapper.getValueOrDefault(str, num); enumWrapper.getValueOrDefault(str, numOrUndefined); // $ExpectError enumWrapper.getValueOrDefault(str, str); + +// $ExpectType Pick +enumWrapper.createEnumSubset("A", "C"); diff --git a/type_tests/v2_4_plus/enum-string.dtslint.ts b/type_tests/v2_9_plus/EnumWrapper/enum-string.dtslint.ts similarity index 82% rename from type_tests/v2_4_plus/enum-string.dtslint.ts rename to type_tests/v2_9_plus/EnumWrapper/enum-string.dtslint.ts index 1349de2..aab04ef 100644 --- a/type_tests/v2_4_plus/enum-string.dtslint.ts +++ b/type_tests/v2_9_plus/EnumWrapper/enum-string.dtslint.ts @@ -1,4 +1,4 @@ -import { $enum } from "../../src"; +import { $enum } from "ts-enum-util"; // Enum with string values enum TestEnum { @@ -38,14 +38,14 @@ enumWrapper.size; // $ExpectError enumWrapper.size = 0; // immutable -// $ExpectType Readonly<["A" | "B" | "C", TestEnum]> -enumWrapper[0]; +// NOTE: Must test via assignability rather than ExpectType because of a change +// in how Readonly tuple types work as of TS 3.1. +// Also cannot test for immutability of items within the entry tuple because of +// this change. +// see: https://github.com/Microsoft/TypeScript/issues/26864 +const testEntry: Readonly<["A" | "B" | "C", TestEnum]> = enumWrapper[0]; // $ExpectError enumWrapper[0] = ["A", TestEnum.A]; // immutable -// $ExpectError -enumWrapper[0][0] = "A"; // immutable -// $ExpectError -enumWrapper[0][1] = TestEnum.A; // immutable // $ExpectType IterableIterator<"A" | "B" | "C"> enumWrapper.keys(); @@ -53,13 +53,16 @@ enumWrapper.keys(); // $ExpectType IterableIterator enumWrapper.values(); -// $ExpectType IterableIterator> -enumWrapper.entries(); +// NOTE: Must test via assignability rather than ExpectType because of a change +// in how Readonly tuple types work as of TS 3.1. +// Also cannot test for immutability of items within the iterated entry tuples +// because of this change. +// see: https://github.com/Microsoft/TypeScript/issues/26864 +const testEntryIterator: IterableIterator> = enumWrapper.entries(); for (const entry of enumWrapper.entries()) { - // $ExpectError - entry[0] = "A"; // immutable - // $ExpectError - entry[1] = TestEnum.A; // immutable + const testIteratedEntry: Readonly<["A" | "B" | "C", TestEnum]> = entry; } // $ExpectType void @@ -96,13 +99,14 @@ enumWrapper.getKeys(); // $ExpectType TestEnum[] enumWrapper.getValues(); -// $ExpectType Readonly<["A" | "B" | "C", TestEnum]>[] -enumWrapper.getEntries(); -const entry = enumWrapper.getEntries()[0]; -// $ExpectError -entry[0] = "A"; // immutable -// $ExpectError -entry[1] = TestEnum.A; // immutable +// NOTE: Must test via assignability rather than ExpectType because of a change +// in how Readonly tuple types work as of TS 3.1. +// Also cannot test for immutability of items within the entry tuple because of +// this change. +// see: https://github.com/Microsoft/TypeScript/issues/26864 +const testEntries: Readonly< + ["A" | "B" | "C", TestEnum] +>[] = enumWrapper.getEntries(); // $ExpectType boolean enumWrapper.isKey(str); @@ -264,3 +268,6 @@ enumWrapper.getValueOrDefault(str, str); enumWrapper.getValueOrDefault(str, strOrUndefined); // $ExpectError enumWrapper.getValueOrDefault(str, num); + +// $ExpectType Pick +enumWrapper.createEnumSubset("A", "C"); diff --git a/type_tests/v2_3_plus/object-both.dtslint.ts b/type_tests/v2_9_plus/EnumWrapper/object-mixed.dtslint.ts similarity index 83% rename from type_tests/v2_3_plus/object-both.dtslint.ts rename to type_tests/v2_9_plus/EnumWrapper/object-mixed.dtslint.ts index abe1762..0b402b0 100644 --- a/type_tests/v2_3_plus/object-both.dtslint.ts +++ b/type_tests/v2_9_plus/EnumWrapper/object-mixed.dtslint.ts @@ -1,4 +1,4 @@ -import { $enum } from "../../src"; +import { $enum } from "ts-enum-util"; // Enum-like object with mix of number and string values const TestEnum = { @@ -38,14 +38,14 @@ enumWrapper.size; // $ExpectError enumWrapper.size = 0; // immutable -// $ExpectType Readonly<["A" | "B" | "C", string | number]> -enumWrapper[0]; +// NOTE: Must test via assignability rather than ExpectType because of a change +// in how Readonly tuple types work as of TS 3.1. +// Also cannot test for immutability of items within the entry tuple because of +// this change. +// see: https://github.com/Microsoft/TypeScript/issues/26864 +const testEntry: Readonly<["A" | "B" | "C", string | number]> = enumWrapper[0]; // $ExpectError enumWrapper[0] = ["A", TestEnum.A]; // immutable -// $ExpectError -enumWrapper[0][0] = "A"; // immutable -// $ExpectError -enumWrapper[0][1] = TestEnum.A; // immutable // $ExpectType IterableIterator<"A" | "B" | "C"> enumWrapper.keys(); @@ -53,13 +53,19 @@ enumWrapper.keys(); // $ExpectType IterableIterator enumWrapper.values(); -// $ExpectType IterableIterator> -enumWrapper.entries(); +// NOTE: Must test via assignability rather than ExpectType because of a change +// in how Readonly tuple types work as of TS 3.1. +// Also cannot test for immutability of items within the iterated entry tuples +// because of this change. +// see: https://github.com/Microsoft/TypeScript/issues/26864 +const testEntryIterator: IterableIterator> = enumWrapper.entries(); for (const entry of enumWrapper.entries()) { - // $ExpectError - entry[0] = "A"; // immutable - // $ExpectError - entry[1] = TestEnum.A; // immutable + const testIteratedEntry: Readonly<[ + "A" | "B" | "C", + string | number + ]> = entry; } // $ExpectType void @@ -96,13 +102,14 @@ enumWrapper.getKeys(); // $ExpectType (string | number)[] enumWrapper.getValues(); -// $ExpectType Readonly<["A" | "B" | "C", string | number]>[] -enumWrapper.getEntries(); -const entry = enumWrapper.getEntries()[0]; -// $ExpectError -entry[0] = "A"; // immutable -// $ExpectError -entry[1] = TestEnum.A; // immutable +// NOTE: Must test via assignability rather than ExpectType because of a change +// in how Readonly tuple types work as of TS 3.1. +// Also cannot test for immutability of items within the entry tuple because of +// this change. +// see: https://github.com/Microsoft/TypeScript/issues/26864 +const testEntries: Readonly< + ["A" | "B" | "C", string | number] +>[] = enumWrapper.getEntries(); // $ExpectType boolean enumWrapper.isKey(str); diff --git a/type_tests/v2_3_plus/object-number.dtslint.ts b/type_tests/v2_9_plus/EnumWrapper/object-number.dtslint.ts similarity index 82% rename from type_tests/v2_3_plus/object-number.dtslint.ts rename to type_tests/v2_9_plus/EnumWrapper/object-number.dtslint.ts index 0a828bb..245865c 100644 --- a/type_tests/v2_3_plus/object-number.dtslint.ts +++ b/type_tests/v2_9_plus/EnumWrapper/object-number.dtslint.ts @@ -1,4 +1,4 @@ -import { $enum } from "../../src"; +import { $enum } from "ts-enum-util"; // Enum-like object with number values const TestEnum = { @@ -34,14 +34,14 @@ enumWrapper.size; // $ExpectError enumWrapper.size = 0; // immutable -// $ExpectType Readonly<["A" | "B" | "C", number]> -enumWrapper[0]; +// NOTE: Must test via assignability rather than ExpectType because of a change +// in how Readonly tuple types work as of TS 3.1. +// Also cannot test for immutability of items within the entry tuple because of +// this change. +// see: https://github.com/Microsoft/TypeScript/issues/26864 +const testEntry: Readonly<["A" | "B" | "C", number]> = enumWrapper[0]; // $ExpectError enumWrapper[0] = ["A", TestEnum.A]; // immutable -// $ExpectError -enumWrapper[0][0] = "A"; // immutable -// $ExpectError -enumWrapper[0][1] = TestEnum.A; // immutable // $ExpectType IterableIterator<"A" | "B" | "C"> enumWrapper.keys(); @@ -49,13 +49,16 @@ enumWrapper.keys(); // $ExpectType IterableIterator enumWrapper.values(); -// $ExpectType IterableIterator> -enumWrapper.entries(); +// NOTE: Must test via assignability rather than ExpectType because of a change +// in how Readonly tuple types work as of TS 3.1. +// Also cannot test for immutability of items within the iterated entry tuples +// because of this change. +// see: https://github.com/Microsoft/TypeScript/issues/26864 +const testEntryIterator: IterableIterator> = enumWrapper.entries(); for (const entry of enumWrapper.entries()) { - // $ExpectError - entry[0] = "A"; // immutable - // $ExpectError - entry[1] = TestEnum.A; // immutable + const testIteratedEntry: Readonly<["A" | "B" | "C", number]> = entry; } // $ExpectType void @@ -92,13 +95,14 @@ enumWrapper.getKeys(); // $ExpectType number[] enumWrapper.getValues(); -// $ExpectType Readonly<["A" | "B" | "C", number]>[] -enumWrapper.getEntries(); -const entry = enumWrapper.getEntries()[0]; -// $ExpectError -entry[0] = "A"; // immutable -// $ExpectError -entry[1] = TestEnum.A; // immutable +// NOTE: Must test via assignability rather than ExpectType because of a change +// in how Readonly tuple types work as of TS 3.1. +// Also cannot test for immutability of items within the entry tuple because of +// this change. +// see: https://github.com/Microsoft/TypeScript/issues/26864 +const testEntries: Readonly< + ["A" | "B" | "C", number] +>[] = enumWrapper.getEntries(); // $ExpectType boolean enumWrapper.isKey(str); diff --git a/type_tests/v2_3_plus/object-string.dtslint.ts b/type_tests/v2_9_plus/EnumWrapper/object-string.dtslint.ts similarity index 82% rename from type_tests/v2_3_plus/object-string.dtslint.ts rename to type_tests/v2_9_plus/EnumWrapper/object-string.dtslint.ts index 09dafe6..a26b34d 100644 --- a/type_tests/v2_3_plus/object-string.dtslint.ts +++ b/type_tests/v2_9_plus/EnumWrapper/object-string.dtslint.ts @@ -1,4 +1,4 @@ -import { $enum } from "../../src"; +import { $enum } from "ts-enum-util"; // Enum-like object with string values const TestEnum = { @@ -34,14 +34,14 @@ enumWrapper.size; // $ExpectError enumWrapper.size = 0; // immutable -// $ExpectType Readonly<["A" | "B" | "C", string]> -enumWrapper[0]; +// NOTE: Must test via assignability rather than ExpectType because of a change +// in how Readonly tuple types work as of TS 3.1. +// Also cannot test for immutability of items within the entry tuple because of +// this change. +// see: https://github.com/Microsoft/TypeScript/issues/26864 +const testEntry: Readonly<["A" | "B" | "C", string]> = enumWrapper[0]; // $ExpectError enumWrapper[0] = ["A", TestEnum.A]; // immutable -// $ExpectError -enumWrapper[0][0] = "A"; // immutable -// $ExpectError -enumWrapper[0][1] = TestEnum.A; // immutable // $ExpectType IterableIterator<"A" | "B" | "C"> enumWrapper.keys(); @@ -49,13 +49,16 @@ enumWrapper.keys(); // $ExpectType IterableIterator enumWrapper.values(); -// $ExpectType IterableIterator> -enumWrapper.entries(); +// NOTE: Must test via assignability rather than ExpectType because of a change +// in how Readonly tuple types work as of TS 3.1. +// Also cannot test for immutability of items within the iterated entry tuples +// because of this change. +// see: https://github.com/Microsoft/TypeScript/issues/26864 +const testEntryIterator: IterableIterator> = enumWrapper.entries(); for (const entry of enumWrapper.entries()) { - // $ExpectError - entry[0] = "A"; // immutable - // $ExpectError - entry[1] = TestEnum.A; // immutable + const testIteratedEntry: Readonly<["A" | "B" | "C", string]> = entry; } // $ExpectType void @@ -92,13 +95,14 @@ enumWrapper.getKeys(); // $ExpectType string[] enumWrapper.getValues(); -// $ExpectType Readonly<["A" | "B" | "C", string]>[] -enumWrapper.getEntries(); -const entry = enumWrapper.getEntries()[0]; -// $ExpectError -entry[0] = "A"; // immutable -// $ExpectError -entry[1] = TestEnum.A; // immutable +// NOTE: Must test via assignability rather than ExpectType because of a change +// in how Readonly tuple types work as of TS 3.1. +// Also cannot test for immutability of items within the entry tuple because of +// this change. +// see: https://github.com/Microsoft/TypeScript/issues/26864 +const testEntries: Readonly< + ["A" | "B" | "C", string] +>[] = enumWrapper.getEntries(); // $ExpectType boolean enumWrapper.isKey(str); diff --git a/type_tests/v2_9_plus/README.md b/type_tests/v2_9_plus/README.md new file mode 100644 index 0000000..b1abe9a --- /dev/null +++ b/type_tests/v2_9_plus/README.md @@ -0,0 +1,4 @@ +### Compile-Time Tests: TypeScript 2.9+ + +Proper support for defining types with numeric literal key types is only +supported in TypeScript 2.9+ diff --git a/type_tests/v2_4_plus/index.d.ts b/type_tests/v2_9_plus/index.d.ts similarity index 85% rename from type_tests/v2_4_plus/index.d.ts rename to type_tests/v2_9_plus/index.d.ts index dbc0721..382fbd0 100644 --- a/type_tests/v2_4_plus/index.d.ts +++ b/type_tests/v2_9_plus/index.d.ts @@ -1,3 +1,3 @@ // Dummy index.d.ts file for running dtslint. // We're not actually linting a .d.ts file; only using dtslint to verify compile time types of ts-enum-util. -// TypeScript Version: 2.4 +// TypeScript Version: 2.9 diff --git a/type_tests/v2_9_plus/mapValue/mixed-enum-both.dtslint.ts b/type_tests/v2_9_plus/mapValue/mixed-enum-both.dtslint.ts new file mode 100644 index 0000000..1461102 --- /dev/null +++ b/type_tests/v2_9_plus/mapValue/mixed-enum-both.dtslint.ts @@ -0,0 +1,97 @@ +import { $enum } from "ts-enum-util"; + +enum RGB { + R = 1, + G = "G", + B = 3 +} + +declare const rgb: RGB | null | undefined; + +// Return type is inferred +// $ExpectType number +$enum.mapValue(rgb).with({ + [RGB.R]: 10, + [RGB.G]: 20, + [RGB.B]: 30, + [$enum.handleNull]: -1, + [$enum.handleUndefined]: -1 +}); +// $ExpectType string +$enum.mapValue(rgb).with({ + [RGB.R]: "10", + [RGB.G]: "20", + [RGB.B]: "30", + [$enum.handleNull]: "-1", + [$enum.handleUndefined]: "-1" +}); + +// Return type is inferred when "unhandled" entries exist +// $ExpectType number +$enum.mapValue(rgb).with({ + [RGB.R]: 10, + [RGB.G]: $enum.unhandledEntry, + [RGB.B]: 30, + [$enum.handleNull]: -1, + [$enum.handleUndefined]: -1 +}); + +// handleUnexpected is allowed +// $ExpectType number +$enum.mapValue(rgb).with({ + [RGB.R]: 10, + [RGB.G]: 20, + [RGB.B]: 30, + [$enum.handleNull]: -1, + [$enum.handleUndefined]: -1, + [$enum.handleUnexpected]: -1 +}); + +// special handlers can be unhandled +// $ExpectType number +$enum.mapValue(rgb).with({ + [RGB.R]: 10, + [RGB.G]: 20, + [RGB.B]: 30, + [$enum.handleNull]: $enum.unhandledEntry, + [$enum.handleUndefined]: $enum.unhandledEntry, + [$enum.handleUnexpected]: $enum.unhandledEntry +}); + +// Missing value handler causes error +// $ExpectError +$enum.mapValue(rgb).with({ + [RGB.R]: 10, + [RGB.B]: 30, + [$enum.handleNull]: -1, + [$enum.handleUndefined]: -1 +}); + +// Unexpected value handler causes error +$enum.mapValue(rgb).with({ + [RGB.R]: 10, + // $ExpectError + oops: 42, + [RGB.G]: 20, + [RGB.B]: 30, + [$enum.handleNull]: -1, + [$enum.handleUndefined]: -1 +}); + +// missing null handler causes error +// $ExpectError +$enum.mapValue(rgb).with({ + [RGB.R]: 10, + [RGB.G]: 20, + [RGB.B]: 30, + [$enum.handleUndefined]: -1 +}); + +// missing undefined handler causes error +// $ExpectError +$enum.mapValue(rgb).with({ + [RGB.R]: 10, + [RGB.G]: 20, + [RGB.B]: 30, + [$enum.handleNull]: -1 +}); diff --git a/type_tests/v2_9_plus/mapValue/mixed-literal-both.dtslint.ts b/type_tests/v2_9_plus/mapValue/mixed-literal-both.dtslint.ts new file mode 100644 index 0000000..8a365ca --- /dev/null +++ b/type_tests/v2_9_plus/mapValue/mixed-literal-both.dtslint.ts @@ -0,0 +1,93 @@ +import { $enum } from "ts-enum-util"; + +type RGB = 1 | "g" | 3; + +declare const rgb: RGB | null | undefined; + +// Return type is inferred +// $ExpectType number +$enum.mapValue(rgb).with({ + 1: 10, + g: 20, + 3: 30, + [$enum.handleNull]: -1, + [$enum.handleUndefined]: -1 +}); +// $ExpectType string +$enum.mapValue(rgb).with({ + 1: "10", + g: "20", + 3: "30", + [$enum.handleNull]: "-1", + [$enum.handleUndefined]: "-1" +}); + +// Return type is inferred when "unhandled" entries exist +// $ExpectType number +$enum.mapValue(rgb).with({ + 1: 10, + g: $enum.unhandledEntry, + 3: 30, + [$enum.handleNull]: -1, + [$enum.handleUndefined]: -1 +}); + +// handleUnexpected is allowed +// $ExpectType number +$enum.mapValue(rgb).with({ + 1: 10, + g: 20, + 3: 30, + [$enum.handleNull]: -1, + [$enum.handleUndefined]: -1, + [$enum.handleUnexpected]: -1 +}); + +// special handlers can be unhandled +// $ExpectType number +$enum.mapValue(rgb).with({ + 1: 10, + g: 20, + 3: 30, + [$enum.handleNull]: $enum.unhandledEntry, + [$enum.handleUndefined]: $enum.unhandledEntry, + [$enum.handleUnexpected]: $enum.unhandledEntry +}); + +// Missing value handler causes error +// $ExpectError +$enum.mapValue(rgb).with({ + 1: 10, + 3: 30, + [$enum.handleNull]: -1, + [$enum.handleUndefined]: -1 +}); + +// Unexpected value handler causes error +$enum.mapValue(rgb).with({ + 1: 10, + // $ExpectError + oops: 42, + g: 20, + 3: 30, + [$enum.handleNull]: -1, + [$enum.handleUndefined]: -1 +}); + +// missing null handler causes error +// $ExpectError +$enum.mapValue(rgb).with({ + 1: 10, + g: 20, + 3: 30, + [$enum.handleUndefined]: -1 +}); + +// missing undefined handler causes error +// $ExpectError +$enum.mapValue(rgb).with({ + 1: 10, + g: 20, + 3: 30, + [$enum.handleNull]: -1 +}); diff --git a/type_tests/v2_9_plus/mapValue/number-enum-both.dtslint.ts b/type_tests/v2_9_plus/mapValue/number-enum-both.dtslint.ts new file mode 100644 index 0000000..c4d6d79 --- /dev/null +++ b/type_tests/v2_9_plus/mapValue/number-enum-both.dtslint.ts @@ -0,0 +1,97 @@ +import { $enum } from "ts-enum-util"; + +enum RGB { + R, + G, + B +} + +declare const rgb: RGB | null | undefined; + +// Return type is inferred +// $ExpectType number +$enum.mapValue(rgb).with({ + [RGB.R]: 10, + [RGB.G]: 20, + [RGB.B]: 30, + [$enum.handleNull]: -1, + [$enum.handleUndefined]: -1 +}); +// $ExpectType string +$enum.mapValue(rgb).with({ + [RGB.R]: "10", + [RGB.G]: "20", + [RGB.B]: "30", + [$enum.handleNull]: "-1", + [$enum.handleUndefined]: "-1" +}); + +// Return type is inferred when "unhandled" entries exist +// $ExpectType number +$enum.mapValue(rgb).with({ + [RGB.R]: 10, + [RGB.G]: $enum.unhandledEntry, + [RGB.B]: 30, + [$enum.handleNull]: -1, + [$enum.handleUndefined]: -1 +}); + +// handleUnexpected is allowed +// $ExpectType number +$enum.mapValue(rgb).with({ + [RGB.R]: 10, + [RGB.G]: 20, + [RGB.B]: 30, + [$enum.handleNull]: -1, + [$enum.handleUndefined]: -1, + [$enum.handleUnexpected]: -1 +}); + +// special handlers can be unhandled +// $ExpectType number +$enum.mapValue(rgb).with({ + [RGB.R]: 10, + [RGB.G]: 20, + [RGB.B]: 30, + [$enum.handleNull]: $enum.unhandledEntry, + [$enum.handleUndefined]: $enum.unhandledEntry, + [$enum.handleUnexpected]: $enum.unhandledEntry +}); + +// Missing value handler causes error +// $ExpectError +$enum.mapValue(rgb).with({ + [RGB.R]: 10, + [RGB.B]: 30, + [$enum.handleNull]: -1, + [$enum.handleUndefined]: -1 +}); + +// Unexpected value handler causes error +$enum.mapValue(rgb).with({ + [RGB.R]: 10, + // $ExpectError + oops: 42, + [RGB.G]: 20, + [RGB.B]: 30, + [$enum.handleNull]: -1, + [$enum.handleUndefined]: -1 +}); + +// missing null handler causes error +// $ExpectError +$enum.mapValue(rgb).with({ + [RGB.R]: 10, + [RGB.G]: 20, + [RGB.B]: 30, + [$enum.handleUndefined]: -1 +}); + +// missing undefined handler causes error +// $ExpectError +$enum.mapValue(rgb).with({ + [RGB.R]: 10, + [RGB.G]: 20, + [RGB.B]: 30, + [$enum.handleNull]: -1 +}); diff --git a/type_tests/v2_9_plus/mapValue/number-literal-both.dtslint.ts b/type_tests/v2_9_plus/mapValue/number-literal-both.dtslint.ts new file mode 100644 index 0000000..d06c19e --- /dev/null +++ b/type_tests/v2_9_plus/mapValue/number-literal-both.dtslint.ts @@ -0,0 +1,94 @@ +import { $enum } from "ts-enum-util"; + +type RGB = 1 | 2 | 3; + +declare const rgb: RGB | null | undefined; + +// Return type is inferred +// $ExpectType number +$enum.mapValue(rgb).with({ + 1: 10, + 2: 20, + 3: 30, + [$enum.handleNull]: -1, + [$enum.handleUndefined]: -1 +}); +// $ExpectType string +$enum.mapValue(rgb).with({ + 1: "10", + 2: "20", + 3: "30", + [$enum.handleNull]: "-1", + [$enum.handleUndefined]: "-1" +}); + +// Return type is inferred when "unhandled" entries exist +// TODO: report error in @next to TypeScript. Re-enable test if it is fixed. +// ExpectType number +// $enum.mapValue(rgb).with({ +// 1: 10, +// 2: $enum.unhandledEntry, +// 3: 30, +// [$enum.handleNull]: -1, +// [$enum.handleUndefined]: -1 +// }); + +// handleUnexpected is allowed +// $ExpectType number +$enum.mapValue(rgb).with({ + 1: 10, + 2: 20, + 3: 30, + [$enum.handleNull]: -1, + [$enum.handleUndefined]: -1, + [$enum.handleUnexpected]: -1 +}); + +// special handlers can be unhandled +// $ExpectType number +$enum.mapValue(rgb).with({ + 1: 10, + 2: 20, + 3: 30, + [$enum.handleNull]: $enum.unhandledEntry, + [$enum.handleUndefined]: $enum.unhandledEntry, + [$enum.handleUnexpected]: $enum.unhandledEntry +}); + +// Missing value handler causes error +// $ExpectError +$enum.mapValue(rgb).with({ + 1: 10, + 3: 30, + [$enum.handleNull]: -1, + [$enum.handleUndefined]: -1 +}); + +// Unexpected value handler causes error +$enum.mapValue(rgb).with({ + 1: 10, + // $ExpectError + oops: 42, + 2: 20, + 3: 30, + [$enum.handleNull]: -1, + [$enum.handleUndefined]: -1 +}); + +// missing null handler causes error +// $ExpectError +$enum.mapValue(rgb).with({ + 1: 10, + 2: 20, + 3: 30, + [$enum.handleUndefined]: -1 +}); + +// missing undefined handler causes error +// $ExpectError +$enum.mapValue(rgb).with({ + 1: 10, + 2: 20, + 3: 30, + [$enum.handleNull]: -1 +}); diff --git a/type_tests/v2_9_plus/mapValue/string-enum-both.dtslint.ts b/type_tests/v2_9_plus/mapValue/string-enum-both.dtslint.ts new file mode 100644 index 0000000..3aaa56f --- /dev/null +++ b/type_tests/v2_9_plus/mapValue/string-enum-both.dtslint.ts @@ -0,0 +1,97 @@ +import { $enum } from "ts-enum-util"; + +enum RGB { + R = "r", + G = "g", + B = "b" +} + +declare const rgb: RGB | null | undefined; + +// Return type is inferred +// $ExpectType number +$enum.mapValue(rgb).with({ + [RGB.R]: 10, + [RGB.G]: 20, + [RGB.B]: 30, + [$enum.handleNull]: -1, + [$enum.handleUndefined]: -1 +}); +// $ExpectType string +$enum.mapValue(rgb).with({ + [RGB.R]: "10", + [RGB.G]: "20", + [RGB.B]: "30", + [$enum.handleNull]: "-1", + [$enum.handleUndefined]: "-1" +}); + +// Return type is inferred when "unhandled" entries exist +// $ExpectType number +$enum.mapValue(rgb).with({ + [RGB.R]: 10, + [RGB.G]: $enum.unhandledEntry, + [RGB.B]: 30, + [$enum.handleNull]: -1, + [$enum.handleUndefined]: -1 +}); + +// handleUnexpected is allowed +// $ExpectType number +$enum.mapValue(rgb).with({ + [RGB.R]: 10, + [RGB.G]: 20, + [RGB.B]: 30, + [$enum.handleNull]: -1, + [$enum.handleUndefined]: -1, + [$enum.handleUnexpected]: -1 +}); + +// special handlers can be unhandled +// $ExpectType number +$enum.mapValue(rgb).with({ + [RGB.R]: 10, + [RGB.G]: 20, + [RGB.B]: 30, + [$enum.handleNull]: $enum.unhandledEntry, + [$enum.handleUndefined]: $enum.unhandledEntry, + [$enum.handleUnexpected]: $enum.unhandledEntry +}); + +// Missing value handler causes error +// $ExpectError +$enum.mapValue(rgb).with({ + [RGB.R]: 10, + [RGB.B]: 30, + [$enum.handleNull]: -1, + [$enum.handleUndefined]: -1 +}); + +// Unexpected value handler causes error +$enum.mapValue(rgb).with({ + [RGB.R]: 10, + // $ExpectError + oops: 42, + [RGB.G]: 20, + [RGB.B]: 30, + [$enum.handleNull]: -1, + [$enum.handleUndefined]: -1 +}); + +// missing null handler causes error +// $ExpectError +$enum.mapValue(rgb).with({ + [RGB.R]: 10, + [RGB.G]: 20, + [RGB.B]: 30, + [$enum.handleUndefined]: -1 +}); + +// missing undefined handler causes error +// $ExpectError +$enum.mapValue(rgb).with({ + [RGB.R]: 10, + [RGB.G]: 20, + [RGB.B]: 30, + [$enum.handleNull]: -1 +}); diff --git a/type_tests/v2_9_plus/mapValue/string-enum-null.dtslint.ts b/type_tests/v2_9_plus/mapValue/string-enum-null.dtslint.ts new file mode 100644 index 0000000..d94a8ed --- /dev/null +++ b/type_tests/v2_9_plus/mapValue/string-enum-null.dtslint.ts @@ -0,0 +1,90 @@ +import { $enum } from "ts-enum-util"; + +enum RGB { + R = "r", + G = "g", + B = "b" +} + +declare const rgb: RGB | null; + +// Return type is inferred +// $ExpectType number +$enum.mapValue(rgb).with({ + [RGB.R]: 10, + [RGB.G]: 20, + [RGB.B]: 30, + [$enum.handleNull]: -1 +}); +// $ExpectType string +$enum.mapValue(rgb).with({ + [RGB.R]: "10", + [RGB.G]: "20", + [RGB.B]: "30", + [$enum.handleNull]: "-1" +}); + +// Return type is inferred when "unhandled" entries exist +// $ExpectType number +$enum.mapValue(rgb).with({ + [RGB.R]: 10, + [RGB.G]: $enum.unhandledEntry, + [RGB.B]: 30, + [$enum.handleNull]: -1 +}); + +// handleUnexpected is allowed +// $ExpectType number +$enum.mapValue(rgb).with({ + [RGB.R]: 10, + [RGB.G]: 20, + [RGB.B]: 30, + [$enum.handleNull]: -1, + [$enum.handleUnexpected]: -1 +}); + +// special handlers can be unhandled +// $ExpectType number +$enum.mapValue(rgb).with({ + [RGB.R]: 10, + [RGB.G]: 20, + [RGB.B]: 30, + [$enum.handleNull]: $enum.unhandledEntry, + [$enum.handleUnexpected]: $enum.unhandledEntry +}); + +// Missing value handler causes error +// $ExpectError +$enum.mapValue(rgb).with({ + [RGB.R]: 10, + [RGB.B]: 30, + [$enum.handleNull]: -1 +}); + +// Unexpected value handler causes error +$enum.mapValue(rgb).with({ + [RGB.R]: 10, + // $ExpectError + oops: 42, + [RGB.G]: 20, + [RGB.B]: 30, + [$enum.handleNull]: -1 +}); + +// missing null handler causes error +// $ExpectError +$enum.mapValue(rgb).with({ + [RGB.R]: 10, + [RGB.G]: 20, + [RGB.B]: 30 +}); + +// Unnecessary undefined handler causes error +$enum.mapValue(rgb).with({ + [RGB.R]: 10, + [RGB.G]: 20, + [RGB.B]: 30, + [$enum.handleNull]: -1, + // $ExpectError + [$enum.handleUndefined]: -1 +}); diff --git a/type_tests/v2_9_plus/mapValue/string-enum-undefined.dtslint.ts b/type_tests/v2_9_plus/mapValue/string-enum-undefined.dtslint.ts new file mode 100644 index 0000000..e65a498 --- /dev/null +++ b/type_tests/v2_9_plus/mapValue/string-enum-undefined.dtslint.ts @@ -0,0 +1,90 @@ +import { $enum } from "ts-enum-util"; + +enum RGB { + R = "r", + G = "g", + B = "b" +} + +declare const rgb: RGB | undefined; + +// Return type is inferred +// $ExpectType number +$enum.mapValue(rgb).with({ + [RGB.R]: 10, + [RGB.G]: 20, + [RGB.B]: 30, + [$enum.handleUndefined]: -1 +}); +// $ExpectType string +$enum.mapValue(rgb).with({ + [RGB.R]: "10", + [RGB.G]: "20", + [RGB.B]: "30", + [$enum.handleUndefined]: "-1" +}); + +// Return type is inferred when "unhandled" entries exist +// $ExpectType number +$enum.mapValue(rgb).with({ + [RGB.R]: 10, + [RGB.G]: $enum.unhandledEntry, + [RGB.B]: 30, + [$enum.handleUndefined]: -1 +}); + +// handleUnexpected is allowed +// $ExpectType number +$enum.mapValue(rgb).with({ + [RGB.R]: 10, + [RGB.G]: 20, + [RGB.B]: 30, + [$enum.handleUndefined]: -1, + [$enum.handleUnexpected]: -1 +}); + +// special handlers can be unhandled +// $ExpectType number +$enum.mapValue(rgb).with({ + [RGB.R]: 10, + [RGB.G]: 20, + [RGB.B]: 30, + [$enum.handleUndefined]: $enum.unhandledEntry, + [$enum.handleUnexpected]: $enum.unhandledEntry +}); + +// Missing value handler causes error +// $ExpectError +$enum.mapValue(rgb).with({ + [RGB.R]: 10, + [RGB.B]: 30, + [$enum.handleUndefined]: -1 +}); + +// Unexpected value handler causes error +$enum.mapValue(rgb).with({ + [RGB.R]: 10, + // $ExpectError + oops: 42, + [RGB.G]: 20, + [RGB.B]: 30, + [$enum.handleUndefined]: -1 +}); + +// missing undefined handler causes error +// $ExpectError +$enum.mapValue(rgb).with({ + [RGB.R]: 10, + [RGB.G]: 20, + [RGB.B]: 30 +}); + +// Unnecessary null handler causes error +$enum.mapValue(rgb).with({ + [RGB.R]: 10, + [RGB.G]: 20, + [RGB.B]: 30, + // $ExpectError + [$enum.handleNull]: -1, + [$enum.handleUndefined]: -1 +}); diff --git a/type_tests/v2_9_plus/mapValue/string-enum.dtslint.ts b/type_tests/v2_9_plus/mapValue/string-enum.dtslint.ts new file mode 100644 index 0000000..1bd9067 --- /dev/null +++ b/type_tests/v2_9_plus/mapValue/string-enum.dtslint.ts @@ -0,0 +1,91 @@ +import { $enum } from "ts-enum-util"; + +enum RGB { + R = "r", + G = "g", + B = "b" +} + +declare const rgb: RGB; + +// Return type is inferred +// $ExpectType number +$enum.mapValue(rgb).with({ + [RGB.R]: 10, + [RGB.G]: 20, + [RGB.B]: 30 +}); +// $ExpectType string +$enum.mapValue(rgb).with({ + [RGB.R]: "10", + [RGB.G]: "20", + [RGB.B]: "30" +}); + +// Return type is inferred when "unhandled" entries exist +// $ExpectType number +$enum.mapValue(rgb).with({ + [RGB.R]: 10, + [RGB.G]: $enum.unhandledEntry, + [RGB.B]: 30 +}); + +// handleUnexpected is allowed +// $ExpectType number +$enum.mapValue(rgb).with({ + [RGB.R]: 10, + [RGB.G]: 20, + [RGB.B]: 30, + [$enum.handleUnexpected]: -1 +}); + +// special handlers can be unhandled +// $ExpectType number +$enum.mapValue(rgb).with({ + [RGB.R]: 10, + [RGB.G]: 20, + [RGB.B]: 30, + [$enum.handleUnexpected]: $enum.unhandledEntry +}); + +// Missing value handler causes error +// $ExpectError +$enum.mapValue(rgb).with({ + [RGB.R]: 10, + [RGB.B]: 30 +}); + +// Unexpected value handler causes error +$enum.mapValue(rgb).with({ + [RGB.R]: 10, + // $ExpectError + oops: 42, + [RGB.G]: 20, + [RGB.B]: 30 +}); + +// Unnecessary null handler causes error +$enum.mapValue(rgb).with({ + [RGB.R]: 10, + [RGB.G]: 20, + [RGB.B]: 30, + // $ExpectError + [$enum.handleNull]: -1 +}); + +// Unnecessary undefined handler causes error +$enum.mapValue(rgb).with({ + [RGB.R]: 10, + [RGB.G]: 20, + [RGB.B]: 30, + // $ExpectError + [$enum.handleUndefined]: -1 +}); + +// Test enum value computed property names (no compiler error). +// (only supported as of TS 2.6.1) +$enum.mapValue(rgb).with({ + [RGB.R]: 10, + [RGB.G]: 20, + [RGB.B]: 30 +}); diff --git a/type_tests/v2_9_plus/mapValue/string-literal-both.dtslint.ts b/type_tests/v2_9_plus/mapValue/string-literal-both.dtslint.ts new file mode 100644 index 0000000..a4893eb --- /dev/null +++ b/type_tests/v2_9_plus/mapValue/string-literal-both.dtslint.ts @@ -0,0 +1,93 @@ +import { $enum } from "ts-enum-util"; + +type RGB = "r" | "g" | "b"; + +declare const rgb: RGB | null | undefined; + +// Return type is inferred +// $ExpectType number +$enum.mapValue(rgb).with({ + r: 10, + g: 20, + b: 30, + [$enum.handleNull]: -1, + [$enum.handleUndefined]: -1 +}); +// $ExpectType string +$enum.mapValue(rgb).with({ + r: "10", + g: "20", + b: "30", + [$enum.handleNull]: "-1", + [$enum.handleUndefined]: "-1" +}); + +// Return type is inferred when "unhandled" entries exist +// $ExpectType number +$enum.mapValue(rgb).with({ + r: 10, + g: $enum.unhandledEntry, + b: 30, + [$enum.handleNull]: -1, + [$enum.handleUndefined]: -1 +}); + +// handleUnexpected is allowed +// $ExpectType number +$enum.mapValue(rgb).with({ + r: 10, + g: 20, + b: 30, + [$enum.handleNull]: -1, + [$enum.handleUndefined]: -1, + [$enum.handleUnexpected]: -1 +}); + +// special handlers can be unhandled +// $ExpectType number +$enum.mapValue(rgb).with({ + r: 10, + g: 20, + b: 30, + [$enum.handleNull]: $enum.unhandledEntry, + [$enum.handleUndefined]: $enum.unhandledEntry, + [$enum.handleUnexpected]: $enum.unhandledEntry +}); + +// Missing value handler causes error +// $ExpectError +$enum.mapValue(rgb).with({ + r: 10, + b: 30, + [$enum.handleNull]: -1, + [$enum.handleUndefined]: -1 +}); + +// Unexpected value handler causes error +$enum.mapValue(rgb).with({ + r: 10, + // $ExpectError + oops: 42, + g: 20, + b: 30, + [$enum.handleNull]: -1, + [$enum.handleUndefined]: -1 +}); + +// missing null handler causes error +// $ExpectError +$enum.mapValue(rgb).with({ + r: 10, + g: 20, + b: 30, + [$enum.handleUndefined]: -1 +}); + +// missing undefined handler causes error +// $ExpectError +$enum.mapValue(rgb).with({ + r: 10, + g: 20, + b: 30, + [$enum.handleNull]: -1 +}); diff --git a/type_tests/v2_9_plus/mapValue/string-literal-null.dtslint.ts b/type_tests/v2_9_plus/mapValue/string-literal-null.dtslint.ts new file mode 100644 index 0000000..579d78e --- /dev/null +++ b/type_tests/v2_9_plus/mapValue/string-literal-null.dtslint.ts @@ -0,0 +1,86 @@ +import { $enum } from "ts-enum-util"; + +type RGB = "r" | "g" | "b"; + +declare const rgb: RGB | null; + +// Return type is inferred +// $ExpectType number +$enum.mapValue(rgb).with({ + r: 10, + g: 20, + b: 30, + [$enum.handleNull]: -1 +}); +// $ExpectType string +$enum.mapValue(rgb).with({ + r: "10", + g: "20", + b: "30", + [$enum.handleNull]: "-1" +}); + +// Return type is inferred when "unhandled" entries exist +// $ExpectType number +$enum.mapValue(rgb).with({ + r: 10, + g: $enum.unhandledEntry, + b: 30, + [$enum.handleNull]: -1 +}); + +// handleUnexpected is allowed +// $ExpectType number +$enum.mapValue(rgb).with({ + r: 10, + g: 20, + b: 30, + [$enum.handleNull]: -1, + [$enum.handleUnexpected]: -1 +}); + +// special handlers can be unhandled +// $ExpectType number +$enum.mapValue(rgb).with({ + r: 10, + g: 20, + b: 30, + [$enum.handleNull]: $enum.unhandledEntry, + [$enum.handleUnexpected]: $enum.unhandledEntry +}); + +// Missing value handler causes error +// $ExpectError +$enum.mapValue(rgb).with({ + r: 10, + b: 30, + [$enum.handleNull]: -1 +}); + +// Unexpected value handler causes error +$enum.mapValue(rgb).with({ + r: 10, + // $ExpectError + oops: 42, + g: 20, + b: 30, + [$enum.handleNull]: -1 +}); + +// missing null handler causes error +// $ExpectError +$enum.mapValue(rgb).with({ + r: 10, + g: 20, + b: 30 +}); + +// Unnecessary undefined handler causes error +$enum.mapValue(rgb).with({ + r: 10, + g: 20, + b: 30, + [$enum.handleNull]: -1, + // $ExpectError + [$enum.handleUndefined]: -1 +}); diff --git a/type_tests/v2_9_plus/mapValue/string-literal-undefined.dtslint.ts b/type_tests/v2_9_plus/mapValue/string-literal-undefined.dtslint.ts new file mode 100644 index 0000000..21eec87 --- /dev/null +++ b/type_tests/v2_9_plus/mapValue/string-literal-undefined.dtslint.ts @@ -0,0 +1,86 @@ +import { $enum } from "ts-enum-util"; + +type RGB = "r" | "g" | "b"; + +declare const rgb: RGB | undefined; + +// Return type is inferred +// $ExpectType number +$enum.mapValue(rgb).with({ + r: 10, + g: 20, + b: 30, + [$enum.handleUndefined]: -1 +}); +// $ExpectType string +$enum.mapValue(rgb).with({ + r: "10", + g: "20", + b: "30", + [$enum.handleUndefined]: "-1" +}); + +// Return type is inferred when "unhandled" entries exist +// $ExpectType number +$enum.mapValue(rgb).with({ + r: 10, + g: $enum.unhandledEntry, + b: 30, + [$enum.handleUndefined]: -1 +}); + +// handleUnexpected is allowed +// $ExpectType number +$enum.mapValue(rgb).with({ + r: 10, + g: 20, + b: 30, + [$enum.handleUndefined]: -1, + [$enum.handleUnexpected]: -1 +}); + +// special handlers can be unhandled +// $ExpectType number +$enum.mapValue(rgb).with({ + r: 10, + g: 20, + b: 30, + [$enum.handleUndefined]: $enum.unhandledEntry, + [$enum.handleUnexpected]: $enum.unhandledEntry +}); + +// Missing value handler causes error +// $ExpectError +$enum.mapValue(rgb).with({ + r: 10, + b: 30, + [$enum.handleUndefined]: -1 +}); + +// Unexpected value handler causes error +$enum.mapValue(rgb).with({ + r: 10, + // $ExpectError + oops: 42, + g: 20, + b: 30, + [$enum.handleUndefined]: -1 +}); + +// missing undefined handler causes error +// $ExpectError +$enum.mapValue(rgb).with({ + r: 10, + g: 20, + b: 30 +}); + +// Unnecessary null handler causes error +$enum.mapValue(rgb).with({ + r: 10, + g: 20, + b: 30, + // $ExpectError + [$enum.handleNull]: -1, + [$enum.handleUndefined]: -1 +}); diff --git a/type_tests/v2_9_plus/mapValue/string-literal.dtslint.ts b/type_tests/v2_9_plus/mapValue/string-literal.dtslint.ts new file mode 100644 index 0000000..ba9567b --- /dev/null +++ b/type_tests/v2_9_plus/mapValue/string-literal.dtslint.ts @@ -0,0 +1,79 @@ +import { $enum } from "ts-enum-util"; + +type RGB = "r" | "g" | "b"; + +declare const rgb: RGB; + +// Return type is inferred +// $ExpectType number +$enum.mapValue(rgb).with({ + r: 10, + g: 20, + b: 30 +}); +// $ExpectType string +$enum.mapValue(rgb).with({ + r: "10", + g: "20", + b: "30" +}); + +// Return type is inferred when "unhandled" entries exist +// $ExpectType number +$enum.mapValue(rgb).with({ + r: 10, + g: $enum.unhandledEntry, + b: 30 +}); + +// handleUnexpected is allowed +// $ExpectType number +$enum.mapValue(rgb).with({ + r: 10, + g: 20, + b: 30, + [$enum.handleUnexpected]: -1 +}); + +// special handlers can be unhandled +// $ExpectType number +$enum.mapValue(rgb).with({ + r: 10, + g: 20, + b: 30, + [$enum.handleUnexpected]: $enum.unhandledEntry +}); + +// Missing value handler causes error +// $ExpectError +$enum.mapValue(rgb).with({ + r: 10, + b: 30 +}); + +// Unexpected value handler causes error +$enum.mapValue(rgb).with({ + r: 10, + // $ExpectError + oops: 42, + g: 20, + b: 30 +}); + +// Unnecessary null handler causes error +$enum.mapValue(rgb).with({ + r: 10, + g: 20, + b: 30, + // $ExpectError + [$enum.handleNull]: -1 +}); + +// Unnecessary undefined handler causes error +$enum.mapValue(rgb).with({ + r: 10, + g: 20, + b: 30, + // $ExpectError + [$enum.handleUndefined]: -1 +}); diff --git a/type_tests/v2_3_plus/tsconfig.json b/type_tests/v2_9_plus/tsconfig.json similarity index 71% rename from type_tests/v2_3_plus/tsconfig.json rename to type_tests/v2_9_plus/tsconfig.json index 913b1f9..5d7ffb6 100644 --- a/type_tests/v2_3_plus/tsconfig.json +++ b/type_tests/v2_9_plus/tsconfig.json @@ -12,13 +12,13 @@ /* Strict Type-Checking Options */ "strict": true, "alwaysStrict": true, - "noImplicitAny": true, - "noImplicitThis": true, - "strictNullChecks": true, - "strictFunctionTypes": true, /* Module Resolution Options */ "moduleResolution": "node", - "baseUrl": "./" + "baseUrl": "./", + "paths": { + "ts-enum-util": ["../../dist/types"] + }, + "types": [] } } diff --git a/type_tests/v2_9_plus/visitValue/mixed-enum-both.dtslint.ts b/type_tests/v2_9_plus/visitValue/mixed-enum-both.dtslint.ts new file mode 100644 index 0000000..80bb63b --- /dev/null +++ b/type_tests/v2_9_plus/visitValue/mixed-enum-both.dtslint.ts @@ -0,0 +1,123 @@ +import { $enum } from "ts-enum-util"; + +enum RGB { + R = 1, + G = "g", + B = 3 +} + +declare const rgb: RGB | null | undefined; + +// Test param types +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => { + // $ExpectType RGB.R + value; + }, + [RGB.G]: (value) => { + // $ExpectType RGB.G + value; + }, + [RGB.B]: (value) => { + // $ExpectType RGB.B + value; + }, + [$enum.handleNull]: (value) => { + // $ExpectType null + value; + }, + [$enum.handleUndefined]: (value) => { + // $ExpectType undefined + value; + }, + [$enum.handleUnexpected]: (value) => { + // $ExpectType string | number + value; + } +}); + +// handleUnexpected is optional +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => {}, + [RGB.G]: (value) => {}, + [RGB.B]: (value) => {}, + [$enum.handleNull]: (value) => {}, + [$enum.handleUndefined]: (value) => {} +}); + +// Return type is inferred +// $ExpectType number +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => 10, + [RGB.G]: (value) => 20, + [RGB.B]: (value) => 30, + [$enum.handleNull]: (value) => -1, + [$enum.handleUndefined]: (value) => -1 +}); +// $ExpectType string +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => "10", + [RGB.G]: (value) => "20", + [RGB.B]: (value) => "30", + [$enum.handleNull]: (value) => "-1", + [$enum.handleUndefined]: (value) => "-1" +}); + +// Return type is inferred when "unhandled" entries exist +// $ExpectType number +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => 10, + [RGB.G]: $enum.unhandledEntry, + [RGB.B]: (value) => 30, + [$enum.handleNull]: (value) => -1, + [$enum.handleUndefined]: (value) => -1 +}); + +// special handlers can be unhandled +// $ExpectType number +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => 10, + [RGB.G]: (value) => 20, + [RGB.B]: (value) => 30, + [$enum.handleNull]: $enum.unhandledEntry, + [$enum.handleUndefined]: $enum.unhandledEntry, + [$enum.handleUnexpected]: $enum.unhandledEntry +}); + +// Missing value handler causes error +// $ExpectError +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => {}, + [RGB.B]: (value) => {}, + [$enum.handleNull]: (value) => {}, + [$enum.handleUndefined]: (value) => {} +}); + +// Missing null handler causes error +// $ExpectError +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => {}, + [RGB.G]: (value) => {}, + [RGB.B]: (value) => {}, + [$enum.handleUndefined]: (value) => {} +}); + +// Missing undefined handler causes error +// $ExpectError +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => {}, + [RGB.G]: (value) => {}, + [RGB.B]: (value) => {}, + [$enum.handleNull]: (value) => {} +}); + +// Unexpected value handler causes error +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => {}, + // $ExpectError + oops: (value) => {}, + [RGB.G]: (value) => {}, + [RGB.B]: (value) => {}, + [$enum.handleNull]: (value) => {}, + [$enum.handleUndefined]: (value) => {} +}); diff --git a/type_tests/v2_9_plus/visitValue/mixed-literal-both.dtslint.ts b/type_tests/v2_9_plus/visitValue/mixed-literal-both.dtslint.ts new file mode 100644 index 0000000..fb1b2c5 --- /dev/null +++ b/type_tests/v2_9_plus/visitValue/mixed-literal-both.dtslint.ts @@ -0,0 +1,119 @@ +import { $enum } from "ts-enum-util"; + +type RGB = 1 | "g" | 3; + +declare const rgb: RGB | null | undefined; + +// Test param types +$enum.visitValue(rgb).with({ + 1: (value) => { + // $ExpectType 1 + value; + }, + g: (value) => { + // $ExpectType "g" + value; + }, + 3: (value) => { + // $ExpectType 3 + value; + }, + [$enum.handleNull]: (value) => { + // $ExpectType null + value; + }, + [$enum.handleUndefined]: (value) => { + // $ExpectType undefined + value; + }, + [$enum.handleUnexpected]: (value) => { + // $ExpectType string | number + value; + } +}); + +// handleUnexpected is optional +$enum.visitValue(rgb).with({ + 1: (value) => {}, + g: (value) => {}, + 3: (value) => {}, + [$enum.handleNull]: (value) => {}, + [$enum.handleUndefined]: (value) => {} +}); + +// Return type is inferred +// $ExpectType number +$enum.visitValue(rgb).with({ + 1: (value) => 10, + g: (value) => 20, + 3: (value) => 30, + [$enum.handleNull]: (value) => -1, + [$enum.handleUndefined]: (value) => -1 +}); +// $ExpectType string +$enum.visitValue(rgb).with({ + 1: (value) => "10", + g: (value) => "20", + 3: (value) => "30", + [$enum.handleNull]: (value) => "-1", + [$enum.handleUndefined]: (value) => "-1" +}); + +// Return type is inferred when "unhandled" entries exist +// $ExpectType number +$enum.visitValue(rgb).with({ + 1: (value) => 10, + g: $enum.unhandledEntry, + 3: (value) => 30, + [$enum.handleNull]: (value) => -1, + [$enum.handleUndefined]: (value) => -1 +}); + +// special handlers can be unhandled +// $ExpectType number +$enum.visitValue(rgb).with({ + 1: (value) => 10, + g: (value) => 20, + 3: (value) => 30, + [$enum.handleNull]: $enum.unhandledEntry, + [$enum.handleUndefined]: $enum.unhandledEntry, + [$enum.handleUnexpected]: $enum.unhandledEntry +}); + +// Missing value handler causes error +// $ExpectError +$enum.visitValue(rgb).with({ + 1: (value) => {}, + 3: (value) => {}, + [$enum.handleNull]: (value) => {}, + [$enum.handleUndefined]: (value) => {} +}); + +// Missing null handler causes error +// $ExpectError +$enum.visitValue(rgb).with({ + 1: (value) => {}, + g: (value) => {}, + 3: (value) => {}, + [$enum.handleUndefined]: (value) => {} +}); + +// Missing undefined handler causes error +// $ExpectError +$enum.visitValue(rgb).with({ + 1: (value) => {}, + g: (value) => {}, + 3: (value) => {}, + [$enum.handleNull]: (value) => {} +}); + +// Unexpected value handler causes error +$enum.visitValue(rgb).with({ + 1: (value) => {}, + // $ExpectError + oops: (value) => {}, + g: (value) => {}, + 3: (value) => {}, + [$enum.handleNull]: (value) => {}, + [$enum.handleUndefined]: (value) => {} +}); diff --git a/type_tests/v2_9_plus/visitValue/number-enum-both.dtslint.ts b/type_tests/v2_9_plus/visitValue/number-enum-both.dtslint.ts new file mode 100644 index 0000000..9e68a09 --- /dev/null +++ b/type_tests/v2_9_plus/visitValue/number-enum-both.dtslint.ts @@ -0,0 +1,123 @@ +import { $enum } from "ts-enum-util"; + +enum RGB { + R, + G, + B +} + +declare const rgb: RGB | null | undefined; + +// Test param types +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => { + // $ExpectType RGB.R + value; + }, + [RGB.G]: (value) => { + // $ExpectType RGB.G + value; + }, + [RGB.B]: (value) => { + // $ExpectType RGB.B + value; + }, + [$enum.handleNull]: (value) => { + // $ExpectType null + value; + }, + [$enum.handleUndefined]: (value) => { + // $ExpectType undefined + value; + }, + [$enum.handleUnexpected]: (value) => { + // $ExpectType number + value; + } +}); + +// handleUnexpected is optional +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => {}, + [RGB.G]: (value) => {}, + [RGB.B]: (value) => {}, + [$enum.handleNull]: (value) => {}, + [$enum.handleUndefined]: (value) => {} +}); + +// Return type is inferred +// $ExpectType number +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => 10, + [RGB.G]: (value) => 20, + [RGB.B]: (value) => 30, + [$enum.handleNull]: (value) => -1, + [$enum.handleUndefined]: (value) => -1 +}); +// $ExpectType string +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => "10", + [RGB.G]: (value) => "20", + [RGB.B]: (value) => "30", + [$enum.handleNull]: (value) => "-1", + [$enum.handleUndefined]: (value) => "-1" +}); + +// Return type is inferred when "unhandled" entries exist +// $ExpectType number +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => 10, + [RGB.G]: $enum.unhandledEntry, + [RGB.B]: (value) => 30, + [$enum.handleNull]: (value) => -1, + [$enum.handleUndefined]: (value) => -1 +}); + +// special handlers can be unhandled +// $ExpectType number +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => 10, + [RGB.G]: (value) => 20, + [RGB.B]: (value) => 30, + [$enum.handleNull]: $enum.unhandledEntry, + [$enum.handleUndefined]: $enum.unhandledEntry, + [$enum.handleUnexpected]: $enum.unhandledEntry +}); + +// Missing value handler causes error +// $ExpectError +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => {}, + [RGB.B]: (value) => {}, + [$enum.handleNull]: (value) => {}, + [$enum.handleUndefined]: (value) => {} +}); + +// Missing null handler causes error +// $ExpectError +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => {}, + [RGB.G]: (value) => {}, + [RGB.B]: (value) => {}, + [$enum.handleUndefined]: (value) => {} +}); + +// Missing undefined handler causes error +// $ExpectError +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => {}, + [RGB.G]: (value) => {}, + [RGB.B]: (value) => {}, + [$enum.handleNull]: (value) => {} +}); + +// Unexpected value handler causes error +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => {}, + // $ExpectError + oops: (value) => {}, + [RGB.G]: (value) => {}, + [RGB.B]: (value) => {}, + [$enum.handleNull]: (value) => {}, + [$enum.handleUndefined]: (value) => {} +}); diff --git a/type_tests/v2_9_plus/visitValue/number-literal-both.dtslint.ts b/type_tests/v2_9_plus/visitValue/number-literal-both.dtslint.ts new file mode 100644 index 0000000..1d6f466 --- /dev/null +++ b/type_tests/v2_9_plus/visitValue/number-literal-both.dtslint.ts @@ -0,0 +1,119 @@ +import { $enum } from "ts-enum-util"; + +type RGB = 1 | 2 | 3; + +declare const rgb: RGB | null | undefined; + +// Test param types +$enum.visitValue(rgb).with({ + 1: (value) => { + // $ExpectType 1 + value; + }, + 2: (value) => { + // $ExpectType 2 + value; + }, + 3: (value) => { + // $ExpectType 3 + value; + }, + [$enum.handleNull]: (value) => { + // $ExpectType null + value; + }, + [$enum.handleUndefined]: (value) => { + // $ExpectType undefined + value; + }, + [$enum.handleUnexpected]: (value) => { + // $ExpectType number + value; + } +}); + +// handleUnexpected is optional +$enum.visitValue(rgb).with({ + 1: (value) => {}, + 2: (value) => {}, + 3: (value) => {}, + [$enum.handleNull]: (value) => {}, + [$enum.handleUndefined]: (value) => {} +}); + +// Return type is inferred +// $ExpectType number +$enum.visitValue(rgb).with({ + 1: (value) => 10, + 2: (value) => 20, + 3: (value) => 30, + [$enum.handleNull]: (value) => -1, + [$enum.handleUndefined]: (value) => -1 +}); +// $ExpectType string +$enum.visitValue(rgb).with({ + 1: (value) => "10", + 2: (value) => "20", + 3: (value) => "30", + [$enum.handleNull]: (value) => "-1", + [$enum.handleUndefined]: (value) => "-1" +}); + +// Return type is inferred when "unhandled" entries exist +// $ExpectType number +$enum.visitValue(rgb).with({ + 1: (value) => 10, + 2: $enum.unhandledEntry, + 3: (value) => 30, + [$enum.handleNull]: (value) => -1, + [$enum.handleUndefined]: (value) => -1 +}); + +// special handlers can be unhandled +// $ExpectType number +$enum.visitValue(rgb).with({ + 1: (value) => 10, + 2: (value) => 20, + 3: (value) => 30, + [$enum.handleNull]: $enum.unhandledEntry, + [$enum.handleUndefined]: $enum.unhandledEntry, + [$enum.handleUnexpected]: $enum.unhandledEntry +}); + +// Missing value handler causes error +// $ExpectError +$enum.visitValue(rgb).with({ + 1: (value) => {}, + 3: (value) => {}, + [$enum.handleNull]: (value) => {}, + [$enum.handleUndefined]: (value) => {} +}); + +// Missing null handler causes error +// $ExpectError +$enum.visitValue(rgb).with({ + 1: (value) => {}, + 2: (value) => {}, + 3: (value) => {}, + [$enum.handleUndefined]: (value) => {} +}); + +// Missing undefined handler causes error +// $ExpectError +$enum.visitValue(rgb).with({ + 1: (value) => {}, + 2: (value) => {}, + 3: (value) => {}, + [$enum.handleNull]: (value) => {} +}); + +// Unexpected value handler causes error +$enum.visitValue(rgb).with({ + 1: (value) => {}, + // $ExpectError + oops: (value) => {}, + 2: (value) => {}, + 3: (value) => {}, + [$enum.handleNull]: (value) => {}, + [$enum.handleUndefined]: (value) => {} +}); diff --git a/type_tests/v2_9_plus/visitValue/string-enum-both.dtslint.ts b/type_tests/v2_9_plus/visitValue/string-enum-both.dtslint.ts new file mode 100644 index 0000000..815ed90 --- /dev/null +++ b/type_tests/v2_9_plus/visitValue/string-enum-both.dtslint.ts @@ -0,0 +1,123 @@ +import { $enum } from "ts-enum-util"; + +enum RGB { + R = "r", + G = "g", + B = "b" +} + +declare const rgb: RGB | null | undefined; + +// Test param types +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => { + // $ExpectType RGB.R + value; + }, + [RGB.G]: (value) => { + // $ExpectType RGB.G + value; + }, + [RGB.B]: (value) => { + // $ExpectType RGB.B + value; + }, + [$enum.handleNull]: (value) => { + // $ExpectType null + value; + }, + [$enum.handleUndefined]: (value) => { + // $ExpectType undefined + value; + }, + [$enum.handleUnexpected]: (value) => { + // $ExpectType string + value; + } +}); + +// handleUnexpected is optional +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => {}, + [RGB.G]: (value) => {}, + [RGB.B]: (value) => {}, + [$enum.handleNull]: (value) => {}, + [$enum.handleUndefined]: (value) => {} +}); + +// Return type is inferred +// $ExpectType number +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => 10, + [RGB.G]: (value) => 20, + [RGB.B]: (value) => 30, + [$enum.handleNull]: (value) => -1, + [$enum.handleUndefined]: (value) => -1 +}); +// $ExpectType string +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => "10", + [RGB.G]: (value) => "20", + [RGB.B]: (value) => "30", + [$enum.handleNull]: (value) => "-1", + [$enum.handleUndefined]: (value) => "-1" +}); + +// Return type is inferred when "unhandled" entries exist +// $ExpectType number +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => 10, + [RGB.G]: $enum.unhandledEntry, + [RGB.B]: (value) => 30, + [$enum.handleNull]: (value) => -1, + [$enum.handleUndefined]: (value) => -1 +}); + +// special handlers can be unhandled +// $ExpectType number +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => 10, + [RGB.G]: (value) => 20, + [RGB.B]: (value) => 30, + [$enum.handleNull]: $enum.unhandledEntry, + [$enum.handleUndefined]: $enum.unhandledEntry, + [$enum.handleUnexpected]: $enum.unhandledEntry +}); + +// Missing value handler causes error +// $ExpectError +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => {}, + [RGB.B]: (value) => {}, + [$enum.handleNull]: (value) => {}, + [$enum.handleUndefined]: (value) => {} +}); + +// Missing null handler causes error +// $ExpectError +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => {}, + [RGB.G]: (value) => {}, + [RGB.B]: (value) => {}, + [$enum.handleUndefined]: (value) => {} +}); + +// Missing undefined handler causes error +// $ExpectError +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => {}, + [RGB.G]: (value) => {}, + [RGB.B]: (value) => {}, + [$enum.handleNull]: (value) => {} +}); + +// Unexpected value handler causes error +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => {}, + // $ExpectError + oops: (value) => {}, + [RGB.G]: (value) => {}, + [RGB.B]: (value) => {}, + [$enum.handleNull]: (value) => {}, + [$enum.handleUndefined]: (value) => {} +}); diff --git a/type_tests/v2_9_plus/visitValue/string-enum-null.dtslint.ts b/type_tests/v2_9_plus/visitValue/string-enum-null.dtslint.ts new file mode 100644 index 0000000..0d15056 --- /dev/null +++ b/type_tests/v2_9_plus/visitValue/string-enum-null.dtslint.ts @@ -0,0 +1,112 @@ +import { $enum } from "ts-enum-util"; + +enum RGB { + R = "r", + G = "g", + B = "b" +} + +declare const rgb: RGB | null; + +// Test param types +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => { + // $ExpectType RGB.R + value; + }, + [RGB.G]: (value) => { + // $ExpectType RGB.G + value; + }, + [RGB.B]: (value) => { + // $ExpectType RGB.B + value; + }, + [$enum.handleNull]: (value) => { + // $ExpectType null + value; + }, + [$enum.handleUnexpected]: (value) => { + // $ExpectType string | undefined + value; + } +}); + +// handleUnexpected is optional +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => {}, + [RGB.G]: (value) => {}, + [RGB.B]: (value) => {}, + [$enum.handleNull]: (value) => {} +}); + +// Return type is inferred +// $ExpectType number +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => 10, + [RGB.G]: (value) => 20, + [RGB.B]: (value) => 30, + [$enum.handleNull]: (value) => -1 +}); +// $ExpectType string +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => "10", + [RGB.G]: (value) => "20", + [RGB.B]: (value) => "30", + [$enum.handleNull]: (value) => "-1" +}); + +// Return type is inferred when "unhandled" entries exist +// $ExpectType number +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => 10, + [RGB.G]: $enum.unhandledEntry, + [RGB.B]: (value) => 30, + [$enum.handleNull]: (value) => -1 +}); + +// special handlers can be unhandled +// $ExpectType number +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => 10, + [RGB.G]: (value) => 20, + [RGB.B]: (value) => 30, + [$enum.handleNull]: $enum.unhandledEntry, + [$enum.handleUnexpected]: $enum.unhandledEntry +}); + +// Missing value handler causes error +// $ExpectError +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => {}, + [RGB.B]: (value) => {}, + [$enum.handleNull]: (value) => {} +}); + +// Missing null handler causes error +// $ExpectError +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => {}, + [RGB.G]: (value) => {}, + [RGB.B]: (value) => {} +}); + +// Unexpected value handler causes error +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => {}, + // $ExpectError + oops: (value) => {}, + [RGB.G]: (value) => {}, + [RGB.B]: (value) => {}, + [$enum.handleNull]: (value) => {} +}); + +// Unnecessary undefined handler causes error +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => {}, + [RGB.G]: (value) => {}, + [RGB.B]: (value) => {}, + [$enum.handleNull]: (value) => {}, + // $ExpectError + [$enum.handleUndefined]: (value) => {} +}); diff --git a/type_tests/v2_9_plus/visitValue/string-enum-undefined.dtslint.ts b/type_tests/v2_9_plus/visitValue/string-enum-undefined.dtslint.ts new file mode 100644 index 0000000..eb47e08 --- /dev/null +++ b/type_tests/v2_9_plus/visitValue/string-enum-undefined.dtslint.ts @@ -0,0 +1,112 @@ +import { $enum } from "ts-enum-util"; + +enum RGB { + R = "r", + G = "g", + B = "b" +} + +declare const rgb: RGB | undefined; + +// Test param types +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => { + // $ExpectType RGB.R + value; + }, + [RGB.G]: (value) => { + // $ExpectType RGB.G + value; + }, + [RGB.B]: (value) => { + // $ExpectType RGB.B + value; + }, + [$enum.handleUndefined]: (value) => { + // $ExpectType undefined + value; + }, + [$enum.handleUnexpected]: (value) => { + // $ExpectType string | null + value; + } +}); + +// handleUnexpected is optional +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => {}, + [RGB.G]: (value) => {}, + [RGB.B]: (value) => {}, + [$enum.handleUndefined]: (value) => {} +}); + +// Return type is inferred +// $ExpectType number +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => 10, + [RGB.G]: (value) => 20, + [RGB.B]: (value) => 30, + [$enum.handleUndefined]: (value) => -1 +}); +// $ExpectType string +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => "10", + [RGB.G]: (value) => "20", + [RGB.B]: (value) => "30", + [$enum.handleUndefined]: (value) => "-1" +}); + +// Return type is inferred when "unhandled" entries exist +// $ExpectType number +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => 10, + [RGB.G]: $enum.unhandledEntry, + [RGB.B]: (value) => 30, + [$enum.handleUndefined]: (value) => -1 +}); + +// special handlers can be unhandled +// $ExpectType number +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => 10, + [RGB.G]: (value) => 20, + [RGB.B]: (value) => 30, + [$enum.handleUndefined]: $enum.unhandledEntry, + [$enum.handleUnexpected]: $enum.unhandledEntry +}); + +// Missing value handler causes error +// $ExpectError +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => {}, + [RGB.B]: (value) => {}, + [$enum.handleUndefined]: (value) => {} +}); + +// Missing undefined handler causes error +// $ExpectError +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => {}, + [RGB.G]: (value) => {}, + [RGB.B]: (value) => {} +}); + +// Unexpected value handler causes error +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => {}, + // $ExpectError + oops: (value) => {}, + [RGB.G]: (value) => {}, + [RGB.B]: (value) => {}, + [$enum.handleUndefined]: (value) => {} +}); + +// Unnecessary null handler causes error +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => {}, + [RGB.G]: (value) => {}, + [RGB.B]: (value) => {}, + // $ExpectError + [$enum.handleNull]: (value) => {}, + [$enum.handleUndefined]: (value) => {} +}); diff --git a/type_tests/v2_9_plus/visitValue/string-enum.dtslint.ts b/type_tests/v2_9_plus/visitValue/string-enum.dtslint.ts new file mode 100644 index 0000000..870664a --- /dev/null +++ b/type_tests/v2_9_plus/visitValue/string-enum.dtslint.ts @@ -0,0 +1,101 @@ +import { $enum } from "ts-enum-util"; + +enum RGB { + R = "r", + G = "g", + B = "b" +} + +declare const rgb: RGB; + +// Test param types +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => { + // $ExpectType RGB.R + value; + }, + [RGB.G]: (value) => { + // $ExpectType RGB.G + value; + }, + [RGB.B]: (value) => { + // $ExpectType RGB.B + value; + }, + [$enum.handleUnexpected]: (value) => { + // $ExpectType string | null | undefined + value; + } +}); + +// handleUnexpected is optional +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => {}, + [RGB.G]: (value) => {}, + [RGB.B]: (value) => {} +}); + +// Return type is inferred +// $ExpectType number +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => 10, + [RGB.G]: (value) => 20, + [RGB.B]: (value) => 30 +}); +// $ExpectType string +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => "10", + [RGB.G]: (value) => "20", + [RGB.B]: (value) => "30" +}); + +// Return type is inferred when "unhandled" entries exist +// $ExpectType number +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => 10, + [RGB.G]: $enum.unhandledEntry, + [RGB.B]: (value) => 30 +}); + +// special handlers can be unhandled +// $ExpectType number +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => 10, + [RGB.G]: (value) => 20, + [RGB.B]: (value) => 30, + [$enum.handleUnexpected]: $enum.unhandledEntry +}); + +// Missing value handler causes error +// $ExpectError +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => {}, + [RGB.B]: (value) => {} +}); + +// Unexpected value handler causes error +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => {}, + // $ExpectError + oops: (value) => {}, + [RGB.G]: (value) => {}, + [RGB.B]: (value) => {} +}); + +// Unnecessary null handler causes error +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => {}, + [RGB.G]: (value) => {}, + [RGB.B]: (value) => {}, + // $ExpectError + [$enum.handleNull]: (value) => {} +}); + +// Unnecessary undefined handler causes error +$enum.visitValue(rgb).with({ + [RGB.R]: (value) => {}, + [RGB.G]: (value) => {}, + [RGB.B]: (value) => {}, + // $ExpectError + [$enum.handleUndefined]: (value) => {} +}); diff --git a/type_tests/v2_9_plus/visitValue/string-literal-both.dtslint.ts b/type_tests/v2_9_plus/visitValue/string-literal-both.dtslint.ts new file mode 100644 index 0000000..9494836 --- /dev/null +++ b/type_tests/v2_9_plus/visitValue/string-literal-both.dtslint.ts @@ -0,0 +1,119 @@ +import { $enum } from "ts-enum-util"; + +type RGB = "r" | "g" | "b"; + +declare const rgb: RGB | null | undefined; + +// Test param types +$enum.visitValue(rgb).with({ + r: (value) => { + // $ExpectType "r" + value; + }, + g: (value) => { + // $ExpectType "g" + value; + }, + b: (value) => { + // $ExpectType "b" + value; + }, + [$enum.handleNull]: (value) => { + // $ExpectType null + value; + }, + [$enum.handleUndefined]: (value) => { + // $ExpectType undefined + value; + }, + [$enum.handleUnexpected]: (value) => { + // $ExpectType string + value; + } +}); + +// handleUnexpected is optional +$enum.visitValue(rgb).with({ + r: (value) => {}, + g: (value) => {}, + b: (value) => {}, + [$enum.handleNull]: (value) => {}, + [$enum.handleUndefined]: (value) => {} +}); + +// Return type is inferred +// $ExpectType number +$enum.visitValue(rgb).with({ + r: (value) => 10, + g: (value) => 20, + b: (value) => 30, + [$enum.handleNull]: (value) => -1, + [$enum.handleUndefined]: (value) => -1 +}); +// $ExpectType string +$enum.visitValue(rgb).with({ + r: (value) => "10", + g: (value) => "20", + b: (value) => "30", + [$enum.handleNull]: (value) => "-1", + [$enum.handleUndefined]: (value) => "-1" +}); + +// Return type is inferred when "unhandled" entries exist +// $ExpectType number +$enum.visitValue(rgb).with({ + r: (value) => 10, + g: $enum.unhandledEntry, + b: (value) => 30, + [$enum.handleNull]: (value) => -1, + [$enum.handleUndefined]: (value) => -1 +}); + +// special handlers can be unhandled +// $ExpectType number +$enum.visitValue(rgb).with({ + r: (value) => 10, + g: (value) => 20, + b: (value) => 30, + [$enum.handleNull]: $enum.unhandledEntry, + [$enum.handleUndefined]: $enum.unhandledEntry, + [$enum.handleUnexpected]: $enum.unhandledEntry +}); + +// Missing value handler causes error +// $ExpectError +$enum.visitValue(rgb).with({ + r: (value) => {}, + b: (value) => {}, + [$enum.handleNull]: (value) => {}, + [$enum.handleUndefined]: (value) => {} +}); + +// Missing null handler causes error +// $ExpectError +$enum.visitValue(rgb).with({ + r: (value) => {}, + g: (value) => {}, + b: (value) => {}, + [$enum.handleUndefined]: (value) => {} +}); + +// Missing undefined handler causes error +// $ExpectError +$enum.visitValue(rgb).with({ + r: (value) => {}, + g: (value) => {}, + b: (value) => {}, + [$enum.handleNull]: (value) => {} +}); + +// Unexpected value handler causes error +$enum.visitValue(rgb).with({ + r: (value) => {}, + // $ExpectError + oops: (value) => {}, + g: (value) => {}, + b: (value) => {}, + [$enum.handleNull]: (value) => {}, + [$enum.handleUndefined]: (value) => {} +}); diff --git a/type_tests/v2_9_plus/visitValue/string-literal-null.dtslint.ts b/type_tests/v2_9_plus/visitValue/string-literal-null.dtslint.ts new file mode 100644 index 0000000..d949671 --- /dev/null +++ b/type_tests/v2_9_plus/visitValue/string-literal-null.dtslint.ts @@ -0,0 +1,108 @@ +import { $enum } from "ts-enum-util"; + +type RGB = "r" | "g" | "b"; + +declare const rgb: RGB | null; + +// Test param types +$enum.visitValue(rgb).with({ + r: (value) => { + // $ExpectType "r" + value; + }, + g: (value) => { + // $ExpectType "g" + value; + }, + b: (value) => { + // $ExpectType "b" + value; + }, + [$enum.handleNull]: (value) => { + // $ExpectType null + value; + }, + [$enum.handleUnexpected]: (value) => { + // $ExpectType string | undefined + value; + } +}); + +// handleUnexpected is optional +$enum.visitValue(rgb).with({ + r: (value) => {}, + g: (value) => {}, + b: (value) => {}, + [$enum.handleNull]: (value) => {} +}); + +// Return type is inferred +// $ExpectType number +$enum.visitValue(rgb).with({ + r: (value) => 10, + g: (value) => 20, + b: (value) => 30, + [$enum.handleNull]: (value) => -1 +}); +// $ExpectType string +$enum.visitValue(rgb).with({ + r: (value) => "10", + g: (value) => "20", + b: (value) => "30", + [$enum.handleNull]: (value) => "-1" +}); + +// Return type is inferred when "unhandled" entries exist +// $ExpectType number +$enum.visitValue(rgb).with({ + r: (value) => 10, + g: $enum.unhandledEntry, + b: (value) => 30, + [$enum.handleNull]: (value) => -1 +}); + +// special handlers can be unhandled +// $ExpectType number +$enum.visitValue(rgb).with({ + r: (value) => 10, + g: (value) => 20, + b: (value) => 30, + [$enum.handleNull]: $enum.unhandledEntry, + [$enum.handleUnexpected]: $enum.unhandledEntry +}); + +// Missing value handler causes error +// $ExpectError +$enum.visitValue(rgb).with({ + r: (value) => {}, + b: (value) => {}, + [$enum.handleNull]: (value) => {} +}); + +// Missing null handler causes error +// $ExpectError +$enum.visitValue(rgb).with({ + r: (value) => {}, + g: (value) => {}, + b: (value) => {} +}); + +// Unexpected value handler causes error +$enum.visitValue(rgb).with({ + r: (value) => {}, + // $ExpectError + oops: (value) => {}, + g: (value) => {}, + b: (value) => {}, + [$enum.handleNull]: (value) => {} +}); + +// Unnecessary undefined handler causes error +$enum.visitValue(rgb).with({ + r: (value) => {}, + g: (value) => {}, + b: (value) => {}, + [$enum.handleNull]: (value) => {}, + // $ExpectError + [$enum.handleUndefined]: (value) => {} +}); diff --git a/type_tests/v2_9_plus/visitValue/string-literal-undefined.dtslint.ts b/type_tests/v2_9_plus/visitValue/string-literal-undefined.dtslint.ts new file mode 100644 index 0000000..0dbee3e --- /dev/null +++ b/type_tests/v2_9_plus/visitValue/string-literal-undefined.dtslint.ts @@ -0,0 +1,108 @@ +import { $enum } from "ts-enum-util"; + +type RGB = "r" | "g" | "b"; + +declare const rgb: RGB | undefined; + +// Test param types +$enum.visitValue(rgb).with({ + r: (value) => { + // $ExpectType "r" + value; + }, + g: (value) => { + // $ExpectType "g" + value; + }, + b: (value) => { + // $ExpectType "b" + value; + }, + [$enum.handleUndefined]: (value) => { + // $ExpectType undefined + value; + }, + [$enum.handleUnexpected]: (value) => { + // $ExpectType string | null + value; + } +}); + +// handleUnexpected is optional +$enum.visitValue(rgb).with({ + r: (value) => {}, + g: (value) => {}, + b: (value) => {}, + [$enum.handleUndefined]: (value) => {} +}); + +// Return type is inferred +// $ExpectType number +$enum.visitValue(rgb).with({ + r: (value) => 10, + g: (value) => 20, + b: (value) => 30, + [$enum.handleUndefined]: (value) => -1 +}); +// $ExpectType string +$enum.visitValue(rgb).with({ + r: (value) => "10", + g: (value) => "20", + b: (value) => "30", + [$enum.handleUndefined]: (value) => "-1" +}); + +// Return type is inferred when "unhandled" entries exist +// $ExpectType number +$enum.visitValue(rgb).with({ + r: (value) => 10, + g: $enum.unhandledEntry, + b: (value) => 30, + [$enum.handleUndefined]: (value) => -1 +}); + +// special handlers can be unhandled +// $ExpectType number +$enum.visitValue(rgb).with({ + r: (value) => 10, + g: (value) => 20, + b: (value) => 30, + [$enum.handleUndefined]: $enum.unhandledEntry, + [$enum.handleUnexpected]: $enum.unhandledEntry +}); + +// Missing value handler causes error +// $ExpectError +$enum.visitValue(rgb).with({ + r: (value) => {}, + b: (value) => {}, + [$enum.handleUndefined]: (value) => {} +}); + +// Missing undefined handler causes error +// $ExpectError +$enum.visitValue(rgb).with({ + r: (value) => {}, + g: (value) => {}, + b: (value) => {} +}); + +// Unexpected value handler causes error +$enum.visitValue(rgb).with({ + r: (value) => {}, + // $ExpectError + oops: (value) => {}, + g: (value) => {}, + b: (value) => {}, + [$enum.handleUndefined]: (value) => {} +}); + +// Unnecessary null handler causes error +$enum.visitValue(rgb).with({ + r: (value) => {}, + g: (value) => {}, + b: (value) => {}, + // $ExpectError + [$enum.handleNull]: (value) => {}, + [$enum.handleUndefined]: (value) => {} +}); diff --git a/type_tests/v2_9_plus/visitValue/string-literal.dtslint.ts b/type_tests/v2_9_plus/visitValue/string-literal.dtslint.ts new file mode 100644 index 0000000..8a7da31 --- /dev/null +++ b/type_tests/v2_9_plus/visitValue/string-literal.dtslint.ts @@ -0,0 +1,97 @@ +import { $enum } from "ts-enum-util"; + +type RGB = "r" | "g" | "b"; + +declare const rgb: RGB; + +// Test param types +$enum.visitValue(rgb).with({ + r: (value) => { + // $ExpectType "r" + value; + }, + g: (value) => { + // $ExpectType "g" + value; + }, + b: (value) => { + // $ExpectType "b" + value; + }, + [$enum.handleUnexpected]: (value) => { + // $ExpectType string | null | undefined + value; + } +}); + +// handleUnexpected is optional +$enum.visitValue(rgb).with({ + r: (value) => {}, + g: (value) => {}, + b: (value) => {} +}); + +// Return type is inferred +// $ExpectType number +$enum.visitValue(rgb).with({ + r: (value) => 10, + g: (value) => 20, + b: (value) => 30 +}); +// $ExpectType string +$enum.visitValue(rgb).with({ + r: (value) => "10", + g: (value) => "20", + b: (value) => "30" +}); + +// Return type is inferred when "unhandled" entries exist +// $ExpectType number +$enum.visitValue(rgb).with({ + r: (value) => 10, + g: $enum.unhandledEntry, + b: (value) => 30 +}); + +// special handlers can be unhandled +// $ExpectType number +$enum.visitValue(rgb).with({ + r: (value) => 10, + g: (value) => 20, + b: (value) => 30, + [$enum.handleUnexpected]: $enum.unhandledEntry +}); + +// Missing value handler causes error +// $ExpectError +$enum.visitValue(rgb).with({ + r: (value) => {}, + b: (value) => {} +}); + +// Unexpected value handler causes error +$enum.visitValue(rgb).with({ + r: (value) => {}, + // $ExpectError + oops: (value) => {}, + g: (value) => {}, + b: (value) => {} +}); + +// Unnecessary null handler causes error +$enum.visitValue(rgb).with({ + r: (value) => {}, + g: (value) => {}, + b: (value) => {}, + // $ExpectError + [$enum.handleNull]: (value) => {} +}); + +// Unnecessary undefined handler causes error +$enum.visitValue(rgb).with({ + r: (value) => {}, + g: (value) => {}, + b: (value) => {}, + // $ExpectError + [$enum.handleUndefined]: (value) => {} +});