From bf7fb33b1d98952f7a7cdb906945e6bd1f617644 Mon Sep 17 00:00:00 2001 From: danocmx Date: Sat, 29 Jan 2022 20:43:20 +0100 Subject: [PATCH] fix: Unusual Haunted Metal Scrap not being parsed properly --- .github/dependabot.yml | 104 +- .github/workflows/codeql-analysis.yml | 134 +- .github/workflows/pullrequest.yml | 34 +- .gitignore | 16 +- .npmignore | 8 +- .prettierrc.json | 36 +- LICENSE.txt | 42 +- README.md | 286 +- package-lock.json | 14844 ++++++++-------- package.json | 112 +- src/createBPListing.ts | 3 +- src/parseEconItem/ParsedEcon/ItemName.ts | 11 +- src/parseString.ts | 13 +- .../Attributes/getQuality/isHaunted.ts | 4 +- src/shared/decomposeName.ts | 7 +- src/shared/getConvertedIntAttributes.ts | 4 +- src/shared/getDefindexes.ts | 6 +- src/shared/guards.ts | 8 +- src/stringify.ts | 22 +- src/toSKU.ts | 7 +- src/toSKU/guards.ts | 34 +- test/createBPListing.js | 689 +- test/econItem.js | 8764 ++++----- test/fixName.js | 70 +- test/interchange.js | 3210 ++-- test/parseString.js | 4028 ++--- test/sku.js | 820 +- test/stringify.js | 1181 +- tsconfig.json | 140 +- 29 files changed, 17361 insertions(+), 17276 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 4acd51d..2e9c05d 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,52 +1,52 @@ -version: 2 -updates: -- package-ecosystem: npm - directory: "/" - schedule: - interval: daily - open-pull-requests-limit: 10 - target-branch: master - reviewers: - - danocmx - assignees: - - danocmx - ignore: - - dependency-name: tf2-static-schema - versions: - - 1.11.1 - - dependency-name: eslint - versions: - - 7.25.0 - - dependency-name: release-it - versions: - - 14.3.0 - - 14.4.0 - - 14.4.1 - - 14.5.0 - - 14.5.1 - - 14.6.0 - - 14.6.1 - - dependency-name: chai - versions: - - 4.3.0 - - 4.3.1 - - 4.3.2 - - 4.3.3 - - 4.3.4 - - dependency-name: mocha - versions: - - 8.3.0 - - 8.3.1 - - 8.3.2 - - dependency-name: typescript - versions: - - 4.1.4 - - 4.1.5 - - 4.2.2 - - 4.2.3 - - dependency-name: lodash - versions: - - 4.17.20 - - dependency-name: eslint-plugin-import - versions: - - 2.22.1 +version: 2 +updates: +- package-ecosystem: npm + directory: "/" + schedule: + interval: daily + open-pull-requests-limit: 10 + target-branch: master + reviewers: + - danocmx + assignees: + - danocmx + ignore: + - dependency-name: tf2-static-schema + versions: + - 1.11.1 + - dependency-name: eslint + versions: + - 7.25.0 + - dependency-name: release-it + versions: + - 14.3.0 + - 14.4.0 + - 14.4.1 + - 14.5.0 + - 14.5.1 + - 14.6.0 + - 14.6.1 + - dependency-name: chai + versions: + - 4.3.0 + - 4.3.1 + - 4.3.2 + - 4.3.3 + - 4.3.4 + - dependency-name: mocha + versions: + - 8.3.0 + - 8.3.1 + - 8.3.2 + - dependency-name: typescript + versions: + - 4.1.4 + - 4.1.5 + - 4.2.2 + - 4.2.3 + - dependency-name: lodash + versions: + - 4.17.20 + - dependency-name: eslint-plugin-import + versions: + - 2.22.1 diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index e8403fa..87151d9 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -1,67 +1,67 @@ -# For most projects, this workflow file will not need changing; you simply need -# to commit it to your repository. -# -# You may wish to alter this file to override the set of languages analyzed, -# or to provide custom queries or build logic. -# -# ******** NOTE ******** -# We have attempted to detect the languages in your repository. Please check -# the `language` matrix defined below to confirm you have the correct set of -# supported CodeQL languages. -# -name: "CodeQL" - -on: - push: - branches: [ master, v4, v5 ] - pull_request: - # The branches below must be a subset of the branches above - branches: [ master, v4, v5 ] - schedule: - - cron: '37 0 * * 4' - -jobs: - analyze: - name: Analyze - runs-on: ubuntu-latest - - strategy: - fail-fast: false - matrix: - language: [ 'javascript' ] - # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ] - # Learn more: - # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed - - steps: - - name: Checkout repository - uses: actions/checkout@v2 - - # Initializes the CodeQL tools for scanning. - - name: Initialize CodeQL - uses: github/codeql-action/init@v1 - with: - languages: ${{ matrix.language }} - # If you wish to specify custom queries, you can do so here or in a config file. - # By default, queries listed here will override any specified in a config file. - # Prefix the list here with "+" to use these queries and those in the config file. - # queries: ./path/to/local/query, your-org/your-repo/queries@main - - # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). - # If this step fails, then you should remove it and run the build manually (see below) - - name: Autobuild - uses: github/codeql-action/autobuild@v1 - - # ℹī¸ Command-line programs to run using the OS shell. - # 📚 https://git.io/JvXDl - - # ✏ī¸ If the Autobuild fails above, remove it and uncomment the following three lines - # and modify them (or add more) to build your code if your project - # uses a compiled language - - #- run: | - # make bootstrap - # make release - - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v1 +# For most projects, this workflow file will not need changing; you simply need +# to commit it to your repository. +# +# You may wish to alter this file to override the set of languages analyzed, +# or to provide custom queries or build logic. +# +# ******** NOTE ******** +# We have attempted to detect the languages in your repository. Please check +# the `language` matrix defined below to confirm you have the correct set of +# supported CodeQL languages. +# +name: "CodeQL" + +on: + push: + branches: [ master, v4, v5 ] + pull_request: + # The branches below must be a subset of the branches above + branches: [ master, v4, v5 ] + schedule: + - cron: '37 0 * * 4' + +jobs: + analyze: + name: Analyze + runs-on: ubuntu-latest + + strategy: + fail-fast: false + matrix: + language: [ 'javascript' ] + # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ] + # Learn more: + # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v1 + with: + languages: ${{ matrix.language }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + # queries: ./path/to/local/query, your-org/your-repo/queries@main + + # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). + # If this step fails, then you should remove it and run the build manually (see below) + - name: Autobuild + uses: github/codeql-action/autobuild@v1 + + # ℹī¸ Command-line programs to run using the OS shell. + # 📚 https://git.io/JvXDl + + # ✏ī¸ If the Autobuild fails above, remove it and uncomment the following three lines + # and modify them (or add more) to build your code if your project + # uses a compiled language + + #- run: | + # make bootstrap + # make release + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v1 diff --git a/.github/workflows/pullrequest.yml b/.github/workflows/pullrequest.yml index e65f90a..9a8a85c 100644 --- a/.github/workflows/pullrequest.yml +++ b/.github/workflows/pullrequest.yml @@ -1,17 +1,17 @@ -name: Github pull request - -on: - pull_request: - branches: [ master ] - -jobs: - test_pull_request: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - uses: actions/setup-node@v1 - with: - node-version: 12 - - run: npm ci - - run: npm run build - - run: npm run test +name: Github pull request + +on: + pull_request: + branches: [ master ] + +jobs: + test_pull_request: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v1 + with: + node-version: 12 + - run: npm ci + - run: npm run build + - run: npm run test diff --git a/.gitignore b/.gitignore index 36bac4b..2f8e272 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,9 @@ -node_modules/ -/d.json -/tests -/package-lock.json -/test/test.js -/.vscode -/src/test.ts -/dist +node_modules/ +/d.json +/tests +/package-lock.json +/test/test.js +/.vscode +/src/test.ts +/dist /.nyc_output \ No newline at end of file diff --git a/.npmignore b/.npmignore index eeaee88..79a9b4f 100644 --- a/.npmignore +++ b/.npmignore @@ -1,5 +1,5 @@ -# Make packages smaller -/.github -/src -/test +# Make packages smaller +/.github +/src +/test /.nyc_output \ No newline at end of file diff --git a/.prettierrc.json b/.prettierrc.json index bb7d7b4..fc71c8a 100644 --- a/.prettierrc.json +++ b/.prettierrc.json @@ -1,19 +1,19 @@ -{ - "arrowParens": "always", - "bracketSpacing": true, - "htmlWhitespaceSensitivity": "css", - "insertPragma": false, - "jsxBracketSameLine": false, - "jsxSingleQuote": false, - "printWidth": 80, - "proseWrap": "preserve", - "quoteProps": "as-needed", - "requirePragma": false, - "semi": true, - "singleQuote": true, - "tabWidth": 4, - "trailingComma": "es5", - "useTabs": true, - "vueIndentScriptAndStyle": false - } +{ + "arrowParens": "always", + "bracketSpacing": true, + "htmlWhitespaceSensitivity": "css", + "insertPragma": false, + "jsxBracketSameLine": false, + "jsxSingleQuote": false, + "printWidth": 80, + "proseWrap": "preserve", + "quoteProps": "as-needed", + "requirePragma": false, + "semi": true, + "singleQuote": true, + "tabWidth": 4, + "trailingComma": "es5", + "useTabs": true, + "vueIndentScriptAndStyle": false + } \ No newline at end of file diff --git a/LICENSE.txt b/LICENSE.txt index 6c2cdcb..1add434 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,21 +1,21 @@ -MIT License - -Copyright (c) 2020 GlenCoco - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +MIT License + +Copyright (c) 2020 GlenCoco + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index 4b2d043..3992d73 100644 --- a/README.md +++ b/README.md @@ -1,143 +1,143 @@ -# TF2 Item Format -Formatting for TF2 items. - -Use `v5` branch for current version. -Install it via `npm install tf2-item-format` - -## Features -- Parses item name into attribute object -- Stringifies attribute object into item name same as backpack.tf -- Parses ECON item into attributes -- Parses SKU into attributes -- Makes SKU out of attributes -- Creates backpack.tf compatible format for listing creation - -## Support the project -tf2-item-format is now used in number of production grade projects for handling item data, -help support the project by donating items [here](https://steamcommunity.com/tradeoffer/new/?partner=162338347&token=Od7J3LIh). - -## Migrating from v4 to v5 -To keep your application working like before with version 5 you have to: -```ts -import { parseString } from 'tf2-item-format/static' // -> from 'tf2-item-format' - -const { parseString } = require('tf2-item-format/static') // -> from 'tf2-item-format' -``` - -### New - -To inject your own schema use this interface: -```ts -export type ISchema = { - getDefindex(search: number | string): number|null; - getName(search: number | string): string; - getEffectName(effect: number | string): string; - getWearName(wear: number | string): string; - getKillstreakName(killstreak: number | string): string; - getTextureName(texture: number | string): string; - getQualityName(quality: number | string): string; - getEffectEnum(effect: number | string): number; - getWearEnum(wear: number | string): number; - getKillstreakEnum(killstreak: number | string): number; - getTextureEnum(texture: number | string): number; - getQualityEnum(quality: number | string): number; - getTextures(): SchemaEnum; - getEffects(): SchemaEnum; - isUniqueHat(defindexOrName: string | number): boolean; -} - -// Extra types you might need: -export type NameToDefindex = { [name: string]: number }; -export type DefindexToName = { [defindex: number]: string }; -export type SchemaEnum = NameToDefindex & DefindexToName; - -// Import these like: -// import { ISchema, NameToDefindex, DefindexToName, SchemaEnum } from 'tf2-item-format' -``` -Then you just have to: -```ts -import { createFormat } from 'tf2-item-format'; - -const format = createFormat(schema); -``` -Every method is then export same as before. - -You can use `parseSKU` and `toSKU` without schema: -```ts -import { parseSKU, toSKU } from 'tf2-item-format'; -``` - -Please note that static schema has implemented a lot of overwrites for defindexes that simply cannot be obtained by the limited data we have, so when you are implementing it yourself you should use the current `Schema` as your guide. - -## Instalation -Via NPM: `npm install tf2-item-format` -Or Yarn: `yarn add tf2-item-format` - -## Documentation -Currently there is no full documentation. - -We export these methods: -- `parseString` -- `stringify` -- `parseEconItem` -- `toSKU` -- `parseSKU` -- `createBPListing` -- `fixName` - -And static schema: -- under property `schema` - -Everything is fully typed so you should be able to get this working on your own, until I make a documentation. -Some of the types are a bit confusing which will get fixed in next major version. - -### parseEconItem -```ts -parseEconItem(econ: EconItem, inNumbers: boolean, useDefindexes: boolean, options?: { useTrueDefindex: boolean }): ParsedEconItem; -``` - -- `econ` is raw item you receive from the api -- `inNumbers` - changes return type of certain attributes to numbers instead of pure strings, eg. quality, texture, wear, ... -- `useDefindexes` - appends item defindex to the object, adds target & output aswell -- `options` - - `useTrueDefindex` - returns true defindex item has on this econ, doesn't ask schema. -- Returns `ParsedEconItem` which is an object of all attributes the econ gives us - -### createBPListing -```ts -createBPListing(attributes: ItemAttributes | StringifySKUAttributes, options?: CreateBPListingOptions): BackpackTFListing -``` - -- `attributes` - these you get from `parseString`, `parseSKU` or `parseEconItem`, all are compatible -- `options` - - `unuSkinsToDecorated` - defaults unusual skins to decorated weapon quality, default value is `true` -- Returns `BackpackTFListing` object compatible with `item` object in backpack.tf listing creation api - -### stringify -```ts -stringify(attributes: StrigifySKUAttributes | ItemAttributes, options?: StringifyOptions): string -``` - -- `attributes` - these you get from `parseString`, `parseSKU` or `parseEconItem`, all are compatible -- `options` - - `determineUniqueHat` - if set it checks in schema if given item should use `The` in name, defaults to `false` -- Returns the item name - -#### Note for stringify -If you are using sku format to store your items and want to use `The` in your names, you have to turn `determineUniqueHat` to `true`. - -## Compability usage -```ts -// Have a name, want a sku -const attributes = parseString(name, true, true); // To get defindexes and enums -const sku = toSKU(attributes); - -// Have a sku, want a name -const attributes = parseSKU(sku); -const name = stringify(attributes); - -// Have a sku, want a bp listing -const attributes = parseSKU(sku); -const listing = createBPListing(attributes); -``` -Every method should be interchangable in similar ways. +# TF2 Item Format +Formatting for TF2 items. + +Use `v5` branch for current version. +Install it via `npm install tf2-item-format` + +## Features +- Parses item name into attribute object +- Stringifies attribute object into item name same as backpack.tf +- Parses ECON item into attributes +- Parses SKU into attributes +- Makes SKU out of attributes +- Creates backpack.tf compatible format for listing creation + +## Support the project +tf2-item-format is now used in number of production grade projects for handling item data, +help support the project by donating items [here](https://steamcommunity.com/tradeoffer/new/?partner=162338347&token=Od7J3LIh). + +## Migrating from v4 to v5 +To keep your application working like before with version 5 you have to: +```ts +import { parseString } from 'tf2-item-format/static' // -> from 'tf2-item-format' + +const { parseString } = require('tf2-item-format/static') // -> from 'tf2-item-format' +``` + +### New + +To inject your own schema use this interface: +```ts +export type ISchema = { + getDefindex(search: number | string): number|null; + getName(search: number | string): string; + getEffectName(effect: number | string): string; + getWearName(wear: number | string): string; + getKillstreakName(killstreak: number | string): string; + getTextureName(texture: number | string): string; + getQualityName(quality: number | string): string; + getEffectEnum(effect: number | string): number; + getWearEnum(wear: number | string): number; + getKillstreakEnum(killstreak: number | string): number; + getTextureEnum(texture: number | string): number; + getQualityEnum(quality: number | string): number; + getTextures(): SchemaEnum; + getEffects(): SchemaEnum; + isUniqueHat(defindexOrName: string | number): boolean; +} + +// Extra types you might need: +export type NameToDefindex = { [name: string]: number }; +export type DefindexToName = { [defindex: number]: string }; +export type SchemaEnum = NameToDefindex & DefindexToName; + +// Import these like: +// import { ISchema, NameToDefindex, DefindexToName, SchemaEnum } from 'tf2-item-format' +``` +Then you just have to: +```ts +import { createFormat } from 'tf2-item-format'; + +const format = createFormat(schema); +``` +Every method is then export same as before. + +You can use `parseSKU` and `toSKU` without schema: +```ts +import { parseSKU, toSKU } from 'tf2-item-format'; +``` + +Please note that static schema has implemented a lot of overwrites for defindexes that simply cannot be obtained by the limited data we have, so when you are implementing it yourself you should use the current `Schema` as your guide. + +## Instalation +Via NPM: `npm install tf2-item-format` +Or Yarn: `yarn add tf2-item-format` + +## Documentation +Currently there is no full documentation. + +We export these methods: +- `parseString` +- `stringify` +- `parseEconItem` +- `toSKU` +- `parseSKU` +- `createBPListing` +- `fixName` + +And static schema: +- under property `schema` + +Everything is fully typed so you should be able to get this working on your own, until I make a documentation. +Some of the types are a bit confusing which will get fixed in next major version. + +### parseEconItem +```ts +parseEconItem(econ: EconItem, inNumbers: boolean, useDefindexes: boolean, options?: { useTrueDefindex: boolean }): ParsedEconItem; +``` + +- `econ` is raw item you receive from the api +- `inNumbers` - changes return type of certain attributes to numbers instead of pure strings, eg. quality, texture, wear, ... +- `useDefindexes` - appends item defindex to the object, adds target & output aswell +- `options` + - `useTrueDefindex` - returns true defindex item has on this econ, doesn't ask schema. +- Returns `ParsedEconItem` which is an object of all attributes the econ gives us + +### createBPListing +```ts +createBPListing(attributes: ItemAttributes | StringifySKUAttributes, options?: CreateBPListingOptions): BackpackTFListing +``` + +- `attributes` - these you get from `parseString`, `parseSKU` or `parseEconItem`, all are compatible +- `options` + - `unuSkinsToDecorated` - defaults unusual skins to decorated weapon quality, default value is `true` +- Returns `BackpackTFListing` object compatible with `item` object in backpack.tf listing creation api + +### stringify +```ts +stringify(attributes: StrigifySKUAttributes | ItemAttributes, options?: StringifyOptions): string +``` + +- `attributes` - these you get from `parseString`, `parseSKU` or `parseEconItem`, all are compatible +- `options` + - `determineUniqueHat` - if set it checks in schema if given item should use `The` in name, defaults to `false` +- Returns the item name + +#### Note for stringify +If you are using sku format to store your items and want to use `The` in your names, you have to turn `determineUniqueHat` to `true`. + +## Compability usage +```ts +// Have a name, want a sku +const attributes = parseString(name, true, true); // To get defindexes and enums +const sku = toSKU(attributes); + +// Have a sku, want a name +const attributes = parseSKU(sku); +const name = stringify(attributes); + +// Have a sku, want a bp listing +const attributes = parseSKU(sku); +const listing = createBPListing(attributes); +``` +Every method should be interchangable in similar ways. diff --git a/package-lock.json b/package-lock.json index 9cf1dbf..1a24a6e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,7422 +1,7422 @@ -{ - "name": "tf2-item-format", - "version": "5.6.8", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "tf2-item-format", - "version": "5.6.8", - "license": "MIT", - "dependencies": { - "tf2-static-schema": "^1.24.0" - }, - "devDependencies": { - "chai": "^4.2.0", - "eslint": "^8.0.0", - "eslint-config-airbnb-base": "^14.2.1", - "eslint-plugin-import": "^2.22.1", - "mocha": "^9.0.2", - "nyc": "^15.1.0", - "typescript": "^4.1.3" - }, - "engines": { - "node": ">=12.7.0" - }, - "optionalDependencies": { - "tf2-static-schema": "^1.24.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.12.13" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.13.15", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.15.tgz", - "integrity": "sha512-ltnibHKR1VnrU4ymHyQ/CXtNXI6yZC0oJThyW78Hft8XndANwi+9H+UIklBDraIjFEJzw8wmcM427oDd9KS5wA==", - "dev": true - }, - "node_modules/@babel/core": { - "version": "7.13.16", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.13.16.tgz", - "integrity": "sha512-sXHpixBiWWFti0AV2Zq7avpTasr6sIAu7Y396c608541qAU2ui4a193m0KSQmfPSKFZLnQ3cvlKDOm3XkuXm3Q==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.13.16", - "@babel/helper-compilation-targets": "^7.13.16", - "@babel/helper-module-transforms": "^7.13.14", - "@babel/helpers": "^7.13.16", - "@babel/parser": "^7.13.16", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.15", - "@babel/types": "^7.13.16", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.13.16", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.16.tgz", - "integrity": "sha512-grBBR75UnKOcUWMp8WoDxNsWCFl//XCK6HWTrBQKTr5SV9f5g0pNOjdyzi/DTBv12S9GnYPInIXQBTky7OXEMg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.13.16", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.13.16", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.16.tgz", - "integrity": "sha512-3gmkYIrpqsLlieFwjkGgLaSHmhnvlAYzZLlYVjlW+QwI+1zE17kGxuJGmIqDQdYp56XdmGeD+Bswx0UTyG18xA==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.13.15", - "@babel/helper-validator-option": "^7.12.17", - "browserslist": "^4.14.5", - "semver": "^6.3.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", - "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", - "dev": true, - "dependencies": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.12.13" - } - }, - "node_modules/@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.12.13" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", - "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.13.12" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", - "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.13.12" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.13.14", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.14.tgz", - "integrity": "sha512-QuU/OJ0iAOSIatyVZmfqB0lbkVP0kDRiKj34xy+QNsnVZi/PA6BoSoreeqnxxa9EHFAIL0R9XOaAR/G9WlIy5g==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.13.12", - "@babel/helper-replace-supers": "^7.13.12", - "@babel/helper-simple-access": "^7.13.12", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/helper-validator-identifier": "^7.12.11", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.13", - "@babel/types": "^7.13.14" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", - "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.12.13" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", - "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", - "dev": true, - "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.13.12", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.12" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", - "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.13.12" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.12.13" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", - "dev": true - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", - "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==", - "dev": true - }, - "node_modules/@babel/helpers": { - "version": "7.13.17", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.13.17.tgz", - "integrity": "sha512-Eal4Gce4kGijo1/TGJdqp3WuhllaMLSrW6XcL0ulyUAQOuxHcCafZE8KHg9857gcTehsm/v7RcOx2+jp0Ryjsg==", - "dev": true, - "dependencies": { - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.17", - "@babel/types": "^7.13.17" - } - }, - "node_modules/@babel/highlight": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", - "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.12.11", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.13.16", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.16.tgz", - "integrity": "sha512-6bAg36mCwuqLO0hbR+z7PHuqWiCeP7Dzg73OpQwsAB1Eb8HnGEz5xYBzCfbu+YjoaJsJs+qheDxVAuqbt3ILEw==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" - } - }, - "node_modules/@babel/traverse": { - "version": "7.13.17", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.17.tgz", - "integrity": "sha512-BMnZn0R+X6ayqm3C3To7o1j7Q020gWdqdyP50KEoVqaCO2c/Im7sYZSmVgvefp8TTMQ+9CtwuBp0Z1CZ8V3Pvg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.13.16", - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.13.16", - "@babel/types": "^7.13.17", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "node_modules/@babel/traverse/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/@babel/types": { - "version": "7.13.17", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.17.tgz", - "integrity": "sha512-RawydLgxbOPDlTLJNtoIypwdmAy//uQIzlKt2+iBiJaRlVuI6QLUxVAyWGNfOzp8Yu4L4lLIacoCyTNtpb4wiA==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.12.11", - "to-fast-properties": "^2.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", - "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.2.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz", - "integrity": "sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "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": { - "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" - } - }, - "node_modules/@istanbuljs/load-nyc-config/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/@istanbuljs/load-nyc-config/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/@istanbuljs/load-nyc-config/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/@istanbuljs/load-nyc-config/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/@istanbuljs/load-nyc-config/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/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", - "dev": true - }, - "node_modules/@ungap/promise-all-settled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", - "dev": true - }, - "node_modules/acorn": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.6.0.tgz", - "integrity": "sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "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/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/append-transform": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", - "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", - "dev": true, - "dependencies": { - "default-require-extensions": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, - "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, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/array-filter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-1.0.0.tgz", - "integrity": "sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=", - "optional": true - }, - "node_modules/array-includes": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", - "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", - "get-intrinsic": "^1.1.1", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", - "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "optional": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.2.tgz", - "integrity": "sha512-XWX3OX8Onv97LMk/ftVyBibpGwY5a8SmuxZPzeOxqmuEqUCOM9ZE+uIaD1VNJ5QnvU2UQusvmKbuM1FR8QWGfQ==", - "optional": true, - "dependencies": { - "array-filter": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axios": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", - "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", - "optional": true, - "dependencies": { - "follow-redirects": "^1.10.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "node_modules/browserslist": { - "version": "4.16.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.5.tgz", - "integrity": "sha512-C2HAjrM1AI/djrpAUU/tr4pml1DqLIzJKSLDBXBrNErl9ZCCTXdhwxdJjYc16953+mBWf7Lw+uUJgpgb8cN71A==", - "dev": true, - "dependencies": { - "caniuse-lite": "^1.0.30001214", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.719", - "escalade": "^3.1.1", - "node-releases": "^1.1.71" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } - }, - "node_modules/caching-transform": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", - "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", - "dev": true, - "dependencies": { - "hasha": "^5.0.0", - "make-dir": "^3.0.0", - "package-hash": "^4.0.0", - "write-file-atomic": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "devOptional": true, - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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, - "engines": { - "node": ">=6" - } - }, - "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, - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001214", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001214.tgz", - "integrity": "sha512-O2/SCpuaU3eASWVaesQirZv1MSjUNOvmugaD8zNSJqw6Vv5SGwoOpA9LJs3pNPfM745nxqPvfZY3MQKY4AKHYg==", - "dev": true - }, - "node_modules/chai": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz", - "integrity": "sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==", - "dev": true, - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^3.0.1", - "get-func-name": "^2.0.0", - "pathval": "^1.1.1", - "type-detect": "^4.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/chokidar": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", - "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", - "dev": true, - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/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/colorette": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", - "dev": true - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "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/confusing-browser-globals": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz", - "integrity": "sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA==", - "dev": 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/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/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "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/deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", - "dev": true, - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/default-require-extensions": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", - "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", - "dev": true, - "dependencies": { - "strip-bom": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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==", - "devOptional": true, - "dependencies": { - "object-keys": "^1.0.12" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.3.720", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.720.tgz", - "integrity": "sha512-B6zLTxxaOFP4WZm6DrvgRk8kLFYWNhQ5TrHMC0l5WtkMXhU5UbnvWoTfeEwqOruUSlNMhVLfYak7REX6oC5Yfw==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "dependencies": { - "ansi-colors": "^4.1.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/es-abstract": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", - "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", - "devOptional": true, - "dependencies": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-symbols": "^1.0.2", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.1", - "is-string": "^1.0.7", - "is-weakref": "^1.0.1", - "object-inspect": "^1.11.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "devOptional": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-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/eslint": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.5.0.tgz", - "integrity": "sha512-tVGSkgNbOfiHyVte8bCM8OmX+xG9PzVG/B4UCF60zx7j61WIVY/AqJECDgpLD4DbbESD0e174gOg3ZlrX15GDg==", - "dev": true, - "dependencies": { - "@eslint/eslintrc": "^1.0.5", - "@humanwhocodes/config-array": "^0.9.2", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.0", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.1.0", - "espree": "^9.2.0", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.2.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-airbnb-base": { - "version": "14.2.1", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.1.tgz", - "integrity": "sha512-GOrQyDtVEc1Xy20U7vsB2yAoB4nBlfH5HZJeatRXHleO+OS5Ot+MWij4Dpltw4/DyIkqUfqz1epfhVR5XWWQPA==", - "dev": true, - "dependencies": { - "confusing-browser-globals": "^1.0.10", - "object.assign": "^4.1.2", - "object.entries": "^1.1.2" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "eslint": "^5.16.0 || ^6.8.0 || ^7.2.0", - "eslint-plugin-import": "^2.22.1" - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", - "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", - "dev": true, - "dependencies": { - "debug": "^3.2.7", - "resolve": "^1.20.0" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.1.tgz", - "integrity": "sha512-fjoetBXQZq2tSTWZ9yWVl2KuFrTZZH3V+9iD1V1RfpDgxzJR+mPd/KZmMiA8gbPqdBzpNiEHOuT7IYEWxrH0zQ==", - "dev": true, - "dependencies": { - "debug": "^3.2.7", - "find-up": "^2.1.0", - "pkg-dir": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-module-utils/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-module-utils/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-module-utils/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-module-utils/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-module-utils/node_modules/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, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.25.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.3.tgz", - "integrity": "sha512-RzAVbby+72IB3iOEL8clzPLzL3wpDrlwjsTBAQXgyp5SeTqqY+0bFubwuo+y/HLhNZcXV4XqTBO4LGsfyHIDXg==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.4", - "array.prototype.flat": "^1.2.5", - "debug": "^2.6.9", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.1", - "has": "^1.0.3", - "is-core-module": "^2.8.0", - "is-glob": "^4.0.3", - "minimatch": "^3.0.4", - "object.values": "^1.1.5", - "resolve": "^1.20.0", - "tsconfig-paths": "^3.11.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "node_modules/eslint-plugin-import/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/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/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/eslint-scope": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", - "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz", - "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/eslint/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/eslint/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/eslint/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/eslint/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint/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/espree": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.2.0.tgz", - "integrity": "sha512-oP3utRkynpZWF/F2x/HZJ+AGtnIclaR7z1pYPxy7NYM2fSO6LgK/Rkny8anRSPK/VwEA1eqm2squui0T7ZMOBg==", - "dev": true, - "dependencies": { - "acorn": "^8.6.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^3.1.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.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/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "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/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "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/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "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-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", - "dev": true, - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, - "node_modules/find-cache-dir/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/find-cache-dir/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/find-cache-dir/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/find-cache-dir/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/find-cache-dir/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/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-up/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/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, - "bin": { - "flat": "cli.js" - } - }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", - "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", - "dev": true - }, - "node_modules/follow-redirects": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.3.tgz", - "integrity": "sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "optional": true, - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", - "optional": true - }, - "node_modules/foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/fromentries": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", - "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "optional": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "devOptional": true - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "devOptional": true, - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-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-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "devOptional": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globals": { - "version": "13.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", - "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globals/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", - "devOptional": true - }, - "node_modules/growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true, - "engines": { - "node": ">=4.x" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "devOptional": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", - "devOptional": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "devOptional": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "devOptional": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasha": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", - "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", - "dev": true, - "dependencies": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "bin": { - "he": "bin/he" - } - }, - "node_modules/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/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "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==", - "devOptional": true - }, - "node_modules/internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "devOptional": true, - "dependencies": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-arguments": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", - "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", - "optional": true, - "dependencies": { - "call-bind": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.1.tgz", - "integrity": "sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg==", - "devOptional": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz", - "integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==", - "devOptional": true, - "dependencies": { - "call-bind": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", - "devOptional": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", - "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", - "devOptional": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-function": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.8.tgz", - "integrity": "sha512-2Omr/twNtufVZFr1GhxjOMFPAj2sjc/dKaIqBhvo4qciXfJmITGH6ZGd8eZYNHza8t1y0e01AuqRhJwfWp26WQ==", - "optional": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", - "devOptional": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", - "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==", - "devOptional": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "devOptional": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", - "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", - "devOptional": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "devOptional": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", - "devOptional": true, - "dependencies": { - "has-symbols": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.5.tgz", - "integrity": "sha512-S+GRDgJlR3PyEbsX/Fobd9cqpZBuvUS+8asRqYDMLCb2qMzt1oz5m5oxQCxOgUDxiWsOVNi4yaF+/uvdlHlYug==", - "optional": true, - "dependencies": { - "available-typed-arrays": "^1.0.2", - "call-bind": "^1.0.2", - "es-abstract": "^1.18.0-next.2", - "foreach": "^2.0.5", - "has-symbols": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-weakref": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", - "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", - "devOptional": true, - "dependencies": { - "call-bind": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.0.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-hook": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", - "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", - "dev": true, - "dependencies": { - "append-transform": "^2.0.0" - }, - "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-processinfo": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", - "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", - "dev": true, - "dependencies": { - "archy": "^1.0.0", - "cross-spawn": "^7.0.0", - "istanbul-lib-coverage": "^3.0.0-alpha.1", - "make-dir": "^3.0.0", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "uuid": "^3.3.3" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report/node_modules/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-lib-source-maps/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/istanbul-reports": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", - "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-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-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "optional": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", - "dev": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/log-symbols/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/log-symbols/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/log-symbols/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/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" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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/mocha": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.1.3.tgz", - "integrity": "sha512-Xcpl9FqXOAYqI3j79pEtHBBnQgVXIhpULjGQa7DVb0Po+VzmSIK9kanAiWLHoRR/dbZ2qpdPshuXr8l1VaHCzw==", - "dev": true, - "dependencies": { - "@ungap/promise-all-settled": "1.1.2", - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.2", - "debug": "4.3.2", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.1.7", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "3.0.4", - "ms": "2.1.3", - "nanoid": "3.1.25", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "which": "2.0.2", - "workerpool": "6.1.5", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" - } - }, - "node_modules/mocha/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/mocha/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/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/mocha/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/mocha/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/mocha/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/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/nanoid": { - "version": "3.1.25", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz", - "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==", - "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "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/node-preload": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", - "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", - "dev": true, - "dependencies": { - "process-on-spawn": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/node-releases": { - "version": "1.1.71", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", - "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", - "dev": true - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nyc": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", - "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", - "dev": true, - "dependencies": { - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "caching-transform": "^4.0.0", - "convert-source-map": "^1.7.0", - "decamelize": "^1.2.0", - "find-cache-dir": "^3.2.0", - "find-up": "^4.1.0", - "foreground-child": "^2.0.0", - "get-package-type": "^0.1.0", - "glob": "^7.1.6", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-hook": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", - "istanbul-lib-processinfo": "^2.0.2", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "make-dir": "^3.0.0", - "node-preload": "^0.2.1", - "p-map": "^3.0.0", - "process-on-spawn": "^1.0.0", - "resolve-from": "^5.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "spawn-wrap": "^2.0.0", - "test-exclude": "^6.0.0", - "yargs": "^15.0.2" - }, - "bin": { - "nyc": "bin/nyc.js" - }, - "engines": { - "node": ">=8.9" - } - }, - "node_modules/nyc/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/nyc/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/nyc/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/nyc/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/nyc/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/nyc/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/nyc/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/nyc/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/nyc/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/nyc/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/nyc/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/nyc/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/object-inspect": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", - "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", - "devOptional": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "devOptional": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "devOptional": true, - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.3.tgz", - "integrity": "sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1", - "has": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.values": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", - "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.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/package-hash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", - "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.15", - "hasha": "^5.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "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": "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/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/picomatch": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", - "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "dependencies": { - "find-up": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-dir/node_modules/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, - "engines": { - "node": ">=4" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/process-on-spawn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", - "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", - "dev": true, - "dependencies": { - "fromentries": "^1.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "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/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", - "dev": true, - "dependencies": { - "es6-error": "^4.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "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.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, - "dependencies": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/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==", - "devOptional": true - }, - "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/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/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/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/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/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "devOptional": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "dev": true - }, - "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/spawn-wrap": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", - "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", - "dev": true, - "dependencies": { - "foreground-child": "^2.0.0", - "is-windows": "^1.0.2", - "make-dir": "^3.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "which": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "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/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", - "devOptional": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", - "devOptional": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-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-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/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/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "node_modules/tf2-static-schema": { - "version": "1.24.0", - "resolved": "https://registry.npmjs.org/tf2-static-schema/-/tf2-static-schema-1.24.0.tgz", - "integrity": "sha512-iNsBJMY/qcDvyFaiikEAG1fjLLYLMA9FWvjJm/wWJAYkh1NL04ZE/SiOk3JxM6ZZ242jfORze2D0z2B+O7AC6A==", - "optional": true, - "optionalDependencies": { - "axios": "^0.21.1", - "fs-extra": "^9.0.1", - "vdf": "0.0.2" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tsconfig-paths": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.11.0.tgz", - "integrity": "sha512-7ecdYDnIdmv639mmDwslG6KQg1Z9STTz1j7Gcz0xa+nshh/gKDAHcPxRbWOsA3SPp0tXP2leTcY9Kw+NAkfZzA==", - "dev": true, - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.0", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/tsconfig-paths/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/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "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.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/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.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz", - "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", - "devOptional": true, - "dependencies": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "optional": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util": { - "version": "0.12.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.3.tgz", - "integrity": "sha512-I8XkoQwE+fPQEhy9v012V+TSdH2kp9ts29i20TaaDUXsg7x/onePbhFJUExBfv/2ay1ZOp/Vsm3nDlmnFGSAog==", - "optional": true, - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "safe-buffer": "^5.1.2", - "which-typed-array": "^1.1.2" - } - }, - "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true, - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "node_modules/vdf": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/vdf/-/vdf-0.0.2.tgz", - "integrity": "sha1-ve6nvN3sf6/IzcWMMq6ExyXCfhQ=", - "optional": true, - "dependencies": { - "util": "*" - } - }, - "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/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "devOptional": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-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/which-typed-array": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.4.tgz", - "integrity": "sha512-49E0SpUe90cjpoc7BOJwyPHRqSAd12c10Qm2amdEZrJPCY2NDxaW01zHITrem+rnETY3dwrbH3UUrUwagfCYDA==", - "optional": true, - "dependencies": { - "available-typed-arrays": "^1.0.2", - "call-bind": "^1.0.0", - "es-abstract": "^1.18.0-next.1", - "foreach": "^2.0.5", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.1", - "is-typed-array": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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/workerpool": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.5.tgz", - "integrity": "sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw==", - "dev": true - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/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/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "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": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, - "dependencies": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-unparser/node_modules/camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yargs-unparser/node_modules/decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yargs/node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.12.13" - } - }, - "@babel/compat-data": { - "version": "7.13.15", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.15.tgz", - "integrity": "sha512-ltnibHKR1VnrU4ymHyQ/CXtNXI6yZC0oJThyW78Hft8XndANwi+9H+UIklBDraIjFEJzw8wmcM427oDd9KS5wA==", - "dev": true - }, - "@babel/core": { - "version": "7.13.16", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.13.16.tgz", - "integrity": "sha512-sXHpixBiWWFti0AV2Zq7avpTasr6sIAu7Y396c608541qAU2ui4a193m0KSQmfPSKFZLnQ3cvlKDOm3XkuXm3Q==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.13.16", - "@babel/helper-compilation-targets": "^7.13.16", - "@babel/helper-module-transforms": "^7.13.14", - "@babel/helpers": "^7.13.16", - "@babel/parser": "^7.13.16", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.15", - "@babel/types": "^7.13.16", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" - } - }, - "@babel/generator": { - "version": "7.13.16", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.16.tgz", - "integrity": "sha512-grBBR75UnKOcUWMp8WoDxNsWCFl//XCK6HWTrBQKTr5SV9f5g0pNOjdyzi/DTBv12S9GnYPInIXQBTky7OXEMg==", - "dev": true, - "requires": { - "@babel/types": "^7.13.16", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.13.16", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.16.tgz", - "integrity": "sha512-3gmkYIrpqsLlieFwjkGgLaSHmhnvlAYzZLlYVjlW+QwI+1zE17kGxuJGmIqDQdYp56XdmGeD+Bswx0UTyG18xA==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.13.15", - "@babel/helper-validator-option": "^7.12.17", - "browserslist": "^4.14.5", - "semver": "^6.3.0" - } - }, - "@babel/helper-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", - "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", - "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", - "dev": true, - "requires": { - "@babel/types": "^7.13.12" - } - }, - "@babel/helper-module-imports": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", - "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", - "dev": true, - "requires": { - "@babel/types": "^7.13.12" - } - }, - "@babel/helper-module-transforms": { - "version": "7.13.14", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.14.tgz", - "integrity": "sha512-QuU/OJ0iAOSIatyVZmfqB0lbkVP0kDRiKj34xy+QNsnVZi/PA6BoSoreeqnxxa9EHFAIL0R9XOaAR/G9WlIy5g==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.13.12", - "@babel/helper-replace-supers": "^7.13.12", - "@babel/helper-simple-access": "^7.13.12", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/helper-validator-identifier": "^7.12.11", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.13", - "@babel/types": "^7.13.14" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", - "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-replace-supers": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", - "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.13.12", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.12" - } - }, - "@babel/helper-simple-access": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", - "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", - "dev": true, - "requires": { - "@babel/types": "^7.13.12" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", - "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==", - "dev": true - }, - "@babel/helpers": { - "version": "7.13.17", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.13.17.tgz", - "integrity": "sha512-Eal4Gce4kGijo1/TGJdqp3WuhllaMLSrW6XcL0ulyUAQOuxHcCafZE8KHg9857gcTehsm/v7RcOx2+jp0Ryjsg==", - "dev": true, - "requires": { - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.17", - "@babel/types": "^7.13.17" - } - }, - "@babel/highlight": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", - "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.13.16", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.16.tgz", - "integrity": "sha512-6bAg36mCwuqLO0hbR+z7PHuqWiCeP7Dzg73OpQwsAB1Eb8HnGEz5xYBzCfbu+YjoaJsJs+qheDxVAuqbt3ILEw==", - "dev": true - }, - "@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" - } - }, - "@babel/traverse": { - "version": "7.13.17", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.17.tgz", - "integrity": "sha512-BMnZn0R+X6ayqm3C3To7o1j7Q020gWdqdyP50KEoVqaCO2c/Im7sYZSmVgvefp8TTMQ+9CtwuBp0Z1CZ8V3Pvg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.13.16", - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.13.16", - "@babel/types": "^7.13.17", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "dependencies": { - "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 - } - } - }, - "@babel/types": { - "version": "7.13.17", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.17.tgz", - "integrity": "sha512-RawydLgxbOPDlTLJNtoIypwdmAy//uQIzlKt2+iBiJaRlVuI6QLUxVAyWGNfOzp8Yu4L4lLIacoCyTNtpb4wiA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "to-fast-properties": "^2.0.0" - } - }, - "@eslint/eslintrc": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", - "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.2.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - } - } - }, - "@humanwhocodes/config-array": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz", - "integrity": "sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - } - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "@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" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "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 - }, - "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 - } - } - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true - }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", - "dev": true - }, - "@ungap/promise-all-settled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", - "dev": true - }, - "acorn": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.6.0.tgz", - "integrity": "sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "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" - } - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "append-transform": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", - "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", - "dev": true, - "requires": { - "default-require-extensions": "^3.0.0" - } - }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, - "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" - } - }, - "array-filter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-1.0.0.tgz", - "integrity": "sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=", - "optional": true - }, - "array-includes": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", - "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", - "get-intrinsic": "^1.1.1", - "is-string": "^1.0.7" - } - }, - "array.prototype.flat": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", - "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0" - } - }, - "assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true - }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "optional": true - }, - "available-typed-arrays": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.2.tgz", - "integrity": "sha512-XWX3OX8Onv97LMk/ftVyBibpGwY5a8SmuxZPzeOxqmuEqUCOM9ZE+uIaD1VNJ5QnvU2UQusvmKbuM1FR8QWGfQ==", - "optional": true, - "requires": { - "array-filter": "^1.0.0" - } - }, - "axios": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", - "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", - "optional": true, - "requires": { - "follow-redirects": "^1.10.0" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "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-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "browserslist": { - "version": "4.16.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.5.tgz", - "integrity": "sha512-C2HAjrM1AI/djrpAUU/tr4pml1DqLIzJKSLDBXBrNErl9ZCCTXdhwxdJjYc16953+mBWf7Lw+uUJgpgb8cN71A==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001214", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.719", - "escalade": "^3.1.1", - "node-releases": "^1.1.71" - } - }, - "caching-transform": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", - "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", - "dev": true, - "requires": { - "hasha": "^5.0.0", - "make-dir": "^3.0.0", - "package-hash": "^4.0.0", - "write-file-atomic": "^3.0.0" - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "devOptional": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "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 - }, - "caniuse-lite": { - "version": "1.0.30001214", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001214.tgz", - "integrity": "sha512-O2/SCpuaU3eASWVaesQirZv1MSjUNOvmugaD8zNSJqw6Vv5SGwoOpA9LJs3pNPfM745nxqPvfZY3MQKY4AKHYg==", - "dev": true - }, - "chai": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz", - "integrity": "sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==", - "dev": true, - "requires": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^3.0.1", - "get-func-name": "^2.0.0", - "pathval": "^1.1.1", - "type-detect": "^4.0.5" - } - }, - "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" - } - }, - "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "dev": true - }, - "chokidar": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", - "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.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 - }, - "colorette": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "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 - }, - "confusing-browser-globals": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz", - "integrity": "sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA==", - "dev": true - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "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" - } - }, - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "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 - }, - "deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", - "dev": true, - "requires": { - "type-detect": "^4.0.0" - } - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "default-require-extensions": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", - "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", - "dev": true, - "requires": { - "strip-bom": "^4.0.0" - } - }, - "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==", - "devOptional": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "electron-to-chromium": { - "version": "1.3.720", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.720.tgz", - "integrity": "sha512-B6zLTxxaOFP4WZm6DrvgRk8kLFYWNhQ5TrHMC0l5WtkMXhU5UbnvWoTfeEwqOruUSlNMhVLfYak7REX6oC5Yfw==", - "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 - }, - "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "requires": { - "ansi-colors": "^4.1.1" - } - }, - "es-abstract": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", - "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", - "devOptional": true, - "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-symbols": "^1.0.2", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.1", - "is-string": "^1.0.7", - "is-weakref": "^1.0.1", - "object-inspect": "^1.11.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "devOptional": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "eslint": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.5.0.tgz", - "integrity": "sha512-tVGSkgNbOfiHyVte8bCM8OmX+xG9PzVG/B4UCF60zx7j61WIVY/AqJECDgpLD4DbbESD0e174gOg3ZlrX15GDg==", - "dev": true, - "requires": { - "@eslint/eslintrc": "^1.0.5", - "@humanwhocodes/config-array": "^0.9.2", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.0", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.1.0", - "espree": "^9.2.0", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.2.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "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" - } - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "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 - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "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 - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "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" - } - } - } - }, - "eslint-config-airbnb-base": { - "version": "14.2.1", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.1.tgz", - "integrity": "sha512-GOrQyDtVEc1Xy20U7vsB2yAoB4nBlfH5HZJeatRXHleO+OS5Ot+MWij4Dpltw4/DyIkqUfqz1epfhVR5XWWQPA==", - "dev": true, - "requires": { - "confusing-browser-globals": "^1.0.10", - "object.assign": "^4.1.2", - "object.entries": "^1.1.2" - } - }, - "eslint-import-resolver-node": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", - "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", - "dev": true, - "requires": { - "debug": "^3.2.7", - "resolve": "^1.20.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-module-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.1.tgz", - "integrity": "sha512-fjoetBXQZq2tSTWZ9yWVl2KuFrTZZH3V+9iD1V1RfpDgxzJR+mPd/KZmMiA8gbPqdBzpNiEHOuT7IYEWxrH0zQ==", - "dev": true, - "requires": { - "debug": "^3.2.7", - "find-up": "^2.1.0", - "pkg-dir": "^2.0.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.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 - } - } - }, - "eslint-plugin-import": { - "version": "2.25.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.3.tgz", - "integrity": "sha512-RzAVbby+72IB3iOEL8clzPLzL3wpDrlwjsTBAQXgyp5SeTqqY+0bFubwuo+y/HLhNZcXV4XqTBO4LGsfyHIDXg==", - "dev": true, - "requires": { - "array-includes": "^3.1.4", - "array.prototype.flat": "^1.2.5", - "debug": "^2.6.9", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.1", - "has": "^1.0.3", - "is-core-module": "^2.8.0", - "is-glob": "^4.0.3", - "minimatch": "^3.0.4", - "object.values": "^1.1.5", - "resolve": "^1.20.0", - "tsconfig-paths": "^3.11.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" - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "eslint-scope": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", - "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - } - } - }, - "eslint-visitor-keys": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz", - "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==", - "dev": true - }, - "espree": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.2.0.tgz", - "integrity": "sha512-oP3utRkynpZWF/F2x/HZJ+AGtnIclaR7z1pYPxy7NYM2fSO6LgK/Rkny8anRSPK/VwEA1eqm2squui0T7ZMOBg==", - "dev": true, - "requires": { - "acorn": "^8.6.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^3.1.0" - } - }, - "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 - }, - "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "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 - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "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 - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "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-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "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 - }, - "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, - "requires": { - "find-up": "^4.0.0" - } - } - } - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "dependencies": { - "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 - } - } - }, - "flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", - "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", - "dev": true - }, - "follow-redirects": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.3.tgz", - "integrity": "sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA==", - "optional": true - }, - "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", - "optional": true - }, - "foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - } - }, - "fromentries": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", - "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", - "dev": true - }, - "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "optional": true, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.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.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "devOptional": true - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "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": "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-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", - "dev": true - }, - "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "devOptional": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - } - }, - "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-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "devOptional": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, - "glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "dev": 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" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "13.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", - "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - }, - "dependencies": { - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - } - } - }, - "graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", - "devOptional": true - }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "devOptional": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", - "devOptional": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "devOptional": true - }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "devOptional": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "hasha": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", - "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", - "dev": true, - "requires": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "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 - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "devOptional": true - }, - "internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "devOptional": true, - "requires": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - } - }, - "is-arguments": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", - "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", - "optional": true, - "requires": { - "call-bind": "^1.0.0" - } - }, - "is-bigint": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.1.tgz", - "integrity": "sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg==", - "devOptional": true - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-boolean-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz", - "integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==", - "devOptional": true, - "requires": { - "call-bind": "^1.0.0" - } - }, - "is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", - "devOptional": true - }, - "is-core-module": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", - "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", - "devOptional": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "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 - }, - "is-generator-function": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.8.tgz", - "integrity": "sha512-2Omr/twNtufVZFr1GhxjOMFPAj2sjc/dKaIqBhvo4qciXfJmITGH6ZGd8eZYNHza8t1y0e01AuqRhJwfWp26WQ==", - "optional": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", - "devOptional": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-number-object": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", - "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==", - "devOptional": true - }, - "is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true - }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "devOptional": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-shared-array-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", - "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", - "devOptional": true - }, - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "dev": true - }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "devOptional": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", - "devOptional": true, - "requires": { - "has-symbols": "^1.0.1" - } - }, - "is-typed-array": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.5.tgz", - "integrity": "sha512-S+GRDgJlR3PyEbsX/Fobd9cqpZBuvUS+8asRqYDMLCb2qMzt1oz5m5oxQCxOgUDxiWsOVNi4yaF+/uvdlHlYug==", - "optional": true, - "requires": { - "available-typed-arrays": "^1.0.2", - "call-bind": "^1.0.2", - "es-abstract": "^1.18.0-next.2", - "foreach": "^2.0.5", - "has-symbols": "^1.0.1" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true - }, - "is-weakref": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", - "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", - "devOptional": true, - "requires": { - "call-bind": "^1.0.0" - } - }, - "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 - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", - "dev": true - }, - "istanbul-lib-hook": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", - "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", - "dev": true, - "requires": { - "append-transform": "^2.0.0" - } - }, - "istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "requires": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - } - }, - "istanbul-lib-processinfo": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", - "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", - "dev": true, - "requires": { - "archy": "^1.0.0", - "cross-spawn": "^7.0.0", - "istanbul-lib-coverage": "^3.0.0-alpha.1", - "make-dir": "^3.0.0", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "uuid": "^3.3.3" - } - }, - "istanbul-lib-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, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.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" - } - } - } - }, - "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, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "istanbul-reports": { - "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": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "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 - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "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 - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "optional": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", - "dev": true - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "dependencies": { - "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" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "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 - }, - "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" - } - } - } - }, - "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": { - "yallist": "^4.0.0" - } - }, - "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": { - "semver": "^6.0.0" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "mocha": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.1.3.tgz", - "integrity": "sha512-Xcpl9FqXOAYqI3j79pEtHBBnQgVXIhpULjGQa7DVb0Po+VzmSIK9kanAiWLHoRR/dbZ2qpdPshuXr8l1VaHCzw==", - "dev": true, - "requires": { - "@ungap/promise-all-settled": "1.1.2", - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.2", - "debug": "4.3.2", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.1.7", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "3.0.4", - "ms": "2.1.3", - "nanoid": "3.1.25", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "which": "2.0.2", - "workerpool": "6.1.5", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "dependencies": { - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "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 - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "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 - }, - "nanoid": { - "version": "3.1.25", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz", - "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==", - "dev": true - }, - "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-preload": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", - "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", - "dev": true, - "requires": { - "process-on-spawn": "^1.0.0" - } - }, - "node-releases": { - "version": "1.1.71", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", - "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", - "dev": true - }, - "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 - }, - "nyc": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", - "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", - "dev": true, - "requires": { - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "caching-transform": "^4.0.0", - "convert-source-map": "^1.7.0", - "decamelize": "^1.2.0", - "find-cache-dir": "^3.2.0", - "find-up": "^4.1.0", - "foreground-child": "^2.0.0", - "get-package-type": "^0.1.0", - "glob": "^7.1.6", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-hook": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", - "istanbul-lib-processinfo": "^2.0.2", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "make-dir": "^3.0.0", - "node-preload": "^0.2.1", - "p-map": "^3.0.0", - "process-on-spawn": "^1.0.0", - "resolve-from": "^5.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "spawn-wrap": "^2.0.0", - "test-exclude": "^6.0.0", - "yargs": "^15.0.2" - }, - "dependencies": { - "ansi-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" - } - }, - "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" - } - }, - "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 - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "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 - }, - "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 - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "object-inspect": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", - "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", - "devOptional": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "devOptional": true - }, - "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "devOptional": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - } - }, - "object.entries": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.3.tgz", - "integrity": "sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1", - "has": "^1.0.3" - } - }, - "object.values": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", - "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - }, - "dependencies": { - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - } - } - }, - "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.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 - }, - "package-hash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", - "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.15", - "hasha": "^5.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "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 - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true - }, - "picomatch": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", - "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", - "dev": true - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.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 - } - } - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "process-on-spawn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", - "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", - "dev": true, - "requires": { - "fromentries": "^1.2.0" - } - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "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 - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, - "release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", - "dev": true, - "requires": { - "es6-error": "^4.0.1" - } - }, - "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 - }, - "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 - }, - "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, - "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "rimraf": { - "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.1.3" - } - }, - "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==", - "devOptional": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "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 - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "devOptional": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "spawn-wrap": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", - "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", - "dev": true, - "requires": { - "foreground-child": "^2.0.0", - "is-windows": "^1.0.2", - "make-dir": "^3.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "which": "^2.0.1" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", - "devOptional": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", - "devOptional": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-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 - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "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" - } - }, - "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": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "tf2-static-schema": { - "version": "1.24.0", - "resolved": "https://registry.npmjs.org/tf2-static-schema/-/tf2-static-schema-1.24.0.tgz", - "integrity": "sha512-iNsBJMY/qcDvyFaiikEAG1fjLLYLMA9FWvjJm/wWJAYkh1NL04ZE/SiOk3JxM6ZZ242jfORze2D0z2B+O7AC6A==", - "optional": true, - "requires": { - "axios": "^0.21.1", - "fs-extra": "^9.0.1", - "vdf": "0.0.2" - } - }, - "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 - }, - "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": "^7.0.0" - } - }, - "tsconfig-paths": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.11.0.tgz", - "integrity": "sha512-7ecdYDnIdmv639mmDwslG6KQg1Z9STTz1j7Gcz0xa+nshh/gKDAHcPxRbWOsA3SPp0tXP2leTcY9Kw+NAkfZzA==", - "dev": true, - "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.0", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - } - } - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "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.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "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, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typescript": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz", - "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==", - "dev": true - }, - "unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", - "devOptional": true, - "requires": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", - "which-boxed-primitive": "^1.0.2" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "optional": true - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "util": { - "version": "0.12.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.3.tgz", - "integrity": "sha512-I8XkoQwE+fPQEhy9v012V+TSdH2kp9ts29i20TaaDUXsg7x/onePbhFJUExBfv/2ay1ZOp/Vsm3nDlmnFGSAog==", - "optional": true, - "requires": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "safe-buffer": "^5.1.2", - "which-typed-array": "^1.1.2" - } - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "vdf": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/vdf/-/vdf-0.0.2.tgz", - "integrity": "sha1-ve6nvN3sf6/IzcWMMq6ExyXCfhQ=", - "optional": true, - "requires": { - "util": "*" - } - }, - "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" - } - }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "devOptional": true, - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "which-typed-array": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.4.tgz", - "integrity": "sha512-49E0SpUe90cjpoc7BOJwyPHRqSAd12c10Qm2amdEZrJPCY2NDxaW01zHITrem+rnETY3dwrbH3UUrUwagfCYDA==", - "optional": true, - "requires": { - "available-typed-arrays": "^1.0.2", - "call-bind": "^1.0.0", - "es-abstract": "^1.18.0-next.1", - "foreach": "^2.0.5", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.1", - "is-typed-array": "^1.1.3" - } - }, - "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 - }, - "workerpool": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.5.tgz", - "integrity": "sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw==", - "dev": true - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "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" - } - }, - "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 - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "dependencies": { - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - } - } - }, - "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 - }, - "yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, - "requires": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "dependencies": { - "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "dev": true - }, - "decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true - } - } - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - } - } -} +{ + "name": "tf2-item-format", + "version": "5.6.8", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "tf2-item-format", + "version": "5.6.8", + "license": "MIT", + "dependencies": { + "tf2-static-schema": "^1.24.0" + }, + "devDependencies": { + "chai": "^4.2.0", + "eslint": "^8.0.0", + "eslint-config-airbnb-base": "^14.2.1", + "eslint-plugin-import": "^2.22.1", + "mocha": "^9.0.2", + "nyc": "^15.1.0", + "typescript": "^4.1.3" + }, + "engines": { + "node": ">=12.7.0" + }, + "optionalDependencies": { + "tf2-static-schema": "^1.24.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.12.13" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.13.15", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.15.tgz", + "integrity": "sha512-ltnibHKR1VnrU4ymHyQ/CXtNXI6yZC0oJThyW78Hft8XndANwi+9H+UIklBDraIjFEJzw8wmcM427oDd9KS5wA==", + "dev": true + }, + "node_modules/@babel/core": { + "version": "7.13.16", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.13.16.tgz", + "integrity": "sha512-sXHpixBiWWFti0AV2Zq7avpTasr6sIAu7Y396c608541qAU2ui4a193m0KSQmfPSKFZLnQ3cvlKDOm3XkuXm3Q==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.13.16", + "@babel/helper-compilation-targets": "^7.13.16", + "@babel/helper-module-transforms": "^7.13.14", + "@babel/helpers": "^7.13.16", + "@babel/parser": "^7.13.16", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.15", + "@babel/types": "^7.13.16", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.13.16", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.16.tgz", + "integrity": "sha512-grBBR75UnKOcUWMp8WoDxNsWCFl//XCK6HWTrBQKTr5SV9f5g0pNOjdyzi/DTBv12S9GnYPInIXQBTky7OXEMg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.13.16", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.13.16", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.16.tgz", + "integrity": "sha512-3gmkYIrpqsLlieFwjkGgLaSHmhnvlAYzZLlYVjlW+QwI+1zE17kGxuJGmIqDQdYp56XdmGeD+Bswx0UTyG18xA==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.13.15", + "@babel/helper-validator-option": "^7.12.17", + "browserslist": "^4.14.5", + "semver": "^6.3.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "dev": true, + "dependencies": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", + "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.13.12" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", + "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.13.12" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.13.14", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.14.tgz", + "integrity": "sha512-QuU/OJ0iAOSIatyVZmfqB0lbkVP0kDRiKj34xy+QNsnVZi/PA6BoSoreeqnxxa9EHFAIL0R9XOaAR/G9WlIy5g==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.13.12", + "@babel/helper-replace-supers": "^7.13.12", + "@babel/helper-simple-access": "^7.13.12", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/helper-validator-identifier": "^7.12.11", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.13", + "@babel/types": "^7.13.14" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", + "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", + "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", + "dev": true, + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.13.12", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.12" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", + "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.13.12" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.12.17", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", + "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==", + "dev": true + }, + "node_modules/@babel/helpers": { + "version": "7.13.17", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.13.17.tgz", + "integrity": "sha512-Eal4Gce4kGijo1/TGJdqp3WuhllaMLSrW6XcL0ulyUAQOuxHcCafZE8KHg9857gcTehsm/v7RcOx2+jp0Ryjsg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.17", + "@babel/types": "^7.13.17" + } + }, + "node_modules/@babel/highlight": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", + "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.13.16", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.16.tgz", + "integrity": "sha512-6bAg36mCwuqLO0hbR+z7PHuqWiCeP7Dzg73OpQwsAB1Eb8HnGEz5xYBzCfbu+YjoaJsJs+qheDxVAuqbt3ILEw==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/traverse": { + "version": "7.13.17", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.17.tgz", + "integrity": "sha512-BMnZn0R+X6ayqm3C3To7o1j7Q020gWdqdyP50KEoVqaCO2c/Im7sYZSmVgvefp8TTMQ+9CtwuBp0Z1CZ8V3Pvg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.13.16", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.13.16", + "@babel/types": "^7.13.17", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "node_modules/@babel/traverse/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/@babel/types": { + "version": "7.13.17", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.17.tgz", + "integrity": "sha512-RawydLgxbOPDlTLJNtoIypwdmAy//uQIzlKt2+iBiJaRlVuI6QLUxVAyWGNfOzp8Yu4L4lLIacoCyTNtpb4wiA==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", + "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.2.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz", + "integrity": "sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "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": { + "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" + } + }, + "node_modules/@istanbuljs/load-nyc-config/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/@istanbuljs/load-nyc-config/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/@istanbuljs/load-nyc-config/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/@istanbuljs/load-nyc-config/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/@istanbuljs/load-nyc-config/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/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, + "node_modules/@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.6.0.tgz", + "integrity": "sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "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/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/append-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "dev": true, + "dependencies": { + "default-require-extensions": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "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, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-filter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-1.0.0.tgz", + "integrity": "sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=", + "optional": true + }, + "node_modules/array-includes": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", + "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", + "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "optional": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.2.tgz", + "integrity": "sha512-XWX3OX8Onv97LMk/ftVyBibpGwY5a8SmuxZPzeOxqmuEqUCOM9ZE+uIaD1VNJ5QnvU2UQusvmKbuM1FR8QWGfQ==", + "optional": true, + "dependencies": { + "array-filter": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axios": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", + "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", + "optional": true, + "dependencies": { + "follow-redirects": "^1.10.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "node_modules/browserslist": { + "version": "4.16.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.5.tgz", + "integrity": "sha512-C2HAjrM1AI/djrpAUU/tr4pml1DqLIzJKSLDBXBrNErl9ZCCTXdhwxdJjYc16953+mBWf7Lw+uUJgpgb8cN71A==", + "dev": true, + "dependencies": { + "caniuse-lite": "^1.0.30001214", + "colorette": "^1.2.2", + "electron-to-chromium": "^1.3.719", + "escalade": "^3.1.1", + "node-releases": "^1.1.71" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/caching-transform": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "dev": true, + "dependencies": { + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "devOptional": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "engines": { + "node": ">=6" + } + }, + "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, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001214", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001214.tgz", + "integrity": "sha512-O2/SCpuaU3eASWVaesQirZv1MSjUNOvmugaD8zNSJqw6Vv5SGwoOpA9LJs3pNPfM745nxqPvfZY3MQKY4AKHYg==", + "dev": true + }, + "node_modules/chai": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz", + "integrity": "sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==", + "dev": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/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/colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", + "dev": true + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "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/confusing-browser-globals": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz", + "integrity": "sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA==", + "dev": 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/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/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "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/deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/default-require-extensions": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", + "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", + "dev": true, + "dependencies": { + "strip-bom": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "devOptional": true, + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.3.720", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.720.tgz", + "integrity": "sha512-B6zLTxxaOFP4WZm6DrvgRk8kLFYWNhQ5TrHMC0l5WtkMXhU5UbnvWoTfeEwqOruUSlNMhVLfYak7REX6oC5Yfw==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/es-abstract": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", + "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "devOptional": true, + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.1", + "is-string": "^1.0.7", + "is-weakref": "^1.0.1", + "object-inspect": "^1.11.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "devOptional": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-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/eslint": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.5.0.tgz", + "integrity": "sha512-tVGSkgNbOfiHyVte8bCM8OmX+xG9PzVG/B4UCF60zx7j61WIVY/AqJECDgpLD4DbbESD0e174gOg3ZlrX15GDg==", + "dev": true, + "dependencies": { + "@eslint/eslintrc": "^1.0.5", + "@humanwhocodes/config-array": "^0.9.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.0", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.1.0", + "espree": "^9.2.0", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.2.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-airbnb-base": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.1.tgz", + "integrity": "sha512-GOrQyDtVEc1Xy20U7vsB2yAoB4nBlfH5HZJeatRXHleO+OS5Ot+MWij4Dpltw4/DyIkqUfqz1epfhVR5XWWQPA==", + "dev": true, + "dependencies": { + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.2" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "eslint": "^5.16.0 || ^6.8.0 || ^7.2.0", + "eslint-plugin-import": "^2.22.1" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", + "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "resolve": "^1.20.0" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.1.tgz", + "integrity": "sha512-fjoetBXQZq2tSTWZ9yWVl2KuFrTZZH3V+9iD1V1RfpDgxzJR+mPd/KZmMiA8gbPqdBzpNiEHOuT7IYEWxrH0zQ==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "find-up": "^2.1.0", + "pkg-dir": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/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, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.25.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.3.tgz", + "integrity": "sha512-RzAVbby+72IB3iOEL8clzPLzL3wpDrlwjsTBAQXgyp5SeTqqY+0bFubwuo+y/HLhNZcXV4XqTBO4LGsfyHIDXg==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.4", + "array.prototype.flat": "^1.2.5", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-module-utils": "^2.7.1", + "has": "^1.0.3", + "is-core-module": "^2.8.0", + "is-glob": "^4.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.5", + "resolve": "^1.20.0", + "tsconfig-paths": "^3.11.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/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/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/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/eslint-scope": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", + "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz", + "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/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/eslint/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/eslint/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/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/espree": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.2.0.tgz", + "integrity": "sha512-oP3utRkynpZWF/F2x/HZJ+AGtnIclaR7z1pYPxy7NYM2fSO6LgK/Rkny8anRSPK/VwEA1eqm2squui0T7ZMOBg==", + "dev": true, + "dependencies": { + "acorn": "^8.6.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^3.1.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.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/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "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/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "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/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "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-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-cache-dir/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/find-cache-dir/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/find-cache-dir/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/find-cache-dir/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/find-cache-dir/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/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-up/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/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", + "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.3.tgz", + "integrity": "sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "optional": true, + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "optional": true + }, + "node_modules/foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/fromentries": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "optional": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "devOptional": true + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "devOptional": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-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-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "devOptional": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", + "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globals/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "devOptional": true + }, + "node_modules/growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true, + "engines": { + "node": ">=4.x" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "devOptional": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "devOptional": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "devOptional": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "devOptional": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasha": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "dev": true, + "dependencies": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/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/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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==", + "devOptional": true + }, + "node_modules/internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "devOptional": true, + "dependencies": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-arguments": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", + "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "optional": true, + "dependencies": { + "call-bind": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.1.tgz", + "integrity": "sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg==", + "devOptional": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz", + "integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==", + "devOptional": true, + "dependencies": { + "call-bind": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "devOptional": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", + "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "devOptional": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.8.tgz", + "integrity": "sha512-2Omr/twNtufVZFr1GhxjOMFPAj2sjc/dKaIqBhvo4qciXfJmITGH6ZGd8eZYNHza8t1y0e01AuqRhJwfWp26WQ==", + "optional": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "devOptional": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", + "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==", + "devOptional": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "devOptional": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", + "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", + "devOptional": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "devOptional": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "devOptional": true, + "dependencies": { + "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.5.tgz", + "integrity": "sha512-S+GRDgJlR3PyEbsX/Fobd9cqpZBuvUS+8asRqYDMLCb2qMzt1oz5m5oxQCxOgUDxiWsOVNi4yaF+/uvdlHlYug==", + "optional": true, + "dependencies": { + "available-typed-arrays": "^1.0.2", + "call-bind": "^1.0.2", + "es-abstract": "^1.18.0-next.2", + "foreach": "^2.0.5", + "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-weakref": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", + "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", + "devOptional": true, + "dependencies": { + "call-bind": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.0.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-hook": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", + "dev": true, + "dependencies": { + "append-transform": "^2.0.0" + }, + "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-processinfo": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", + "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", + "dev": true, + "dependencies": { + "archy": "^1.0.0", + "cross-spawn": "^7.0.0", + "istanbul-lib-coverage": "^3.0.0-alpha.1", + "make-dir": "^3.0.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^3.3.3" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/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-lib-source-maps/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/istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-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-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "optional": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/log-symbols/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/log-symbols/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/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" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/mocha": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.1.3.tgz", + "integrity": "sha512-Xcpl9FqXOAYqI3j79pEtHBBnQgVXIhpULjGQa7DVb0Po+VzmSIK9kanAiWLHoRR/dbZ2qpdPshuXr8l1VaHCzw==", + "dev": true, + "dependencies": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.2", + "debug": "4.3.2", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.1.7", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "3.0.4", + "ms": "2.1.3", + "nanoid": "3.1.25", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "workerpool": "6.1.5", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/mocha/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/mocha/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/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/mocha/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/mocha/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/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/nanoid": { + "version": "3.1.25", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz", + "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "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/node-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "dev": true, + "dependencies": { + "process-on-spawn": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-releases": { + "version": "1.1.71", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", + "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nyc": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", + "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", + "dev": true, + "dependencies": { + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^2.0.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" + }, + "bin": { + "nyc": "bin/nyc.js" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/nyc/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/nyc/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/nyc/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/nyc/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/nyc/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/nyc/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/nyc/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/nyc/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/nyc/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/nyc/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/nyc/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/nyc/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/object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "devOptional": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "devOptional": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "devOptional": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.3.tgz", + "integrity": "sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1", + "has": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", + "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.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/package-hash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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": "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/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/picomatch": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", + "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "dependencies": { + "find-up": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-dir/node_modules/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, + "engines": { + "node": ">=4" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/process-on-spawn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", + "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", + "dev": true, + "dependencies": { + "fromentries": "^1.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "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/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", + "dev": true, + "dependencies": { + "es6-error": "^4.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "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.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/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==", + "devOptional": true + }, + "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/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/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/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/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/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "devOptional": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "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/spawn-wrap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "dev": true, + "dependencies": { + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "devOptional": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "devOptional": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-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-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/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/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "node_modules/tf2-static-schema": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/tf2-static-schema/-/tf2-static-schema-1.24.0.tgz", + "integrity": "sha512-iNsBJMY/qcDvyFaiikEAG1fjLLYLMA9FWvjJm/wWJAYkh1NL04ZE/SiOk3JxM6ZZ242jfORze2D0z2B+O7AC6A==", + "optional": true, + "optionalDependencies": { + "axios": "^0.21.1", + "fs-extra": "^9.0.1", + "vdf": "0.0.2" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.11.0.tgz", + "integrity": "sha512-7ecdYDnIdmv639mmDwslG6KQg1Z9STTz1j7Gcz0xa+nshh/gKDAHcPxRbWOsA3SPp0tXP2leTcY9Kw+NAkfZzA==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/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/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "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.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/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.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz", + "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "devOptional": true, + "dependencies": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "optional": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.3.tgz", + "integrity": "sha512-I8XkoQwE+fPQEhy9v012V+TSdH2kp9ts29i20TaaDUXsg7x/onePbhFJUExBfv/2ay1ZOp/Vsm3nDlmnFGSAog==", + "optional": true, + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "safe-buffer": "^5.1.2", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "node_modules/vdf": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/vdf/-/vdf-0.0.2.tgz", + "integrity": "sha1-ve6nvN3sf6/IzcWMMq6ExyXCfhQ=", + "optional": true, + "dependencies": { + "util": "*" + } + }, + "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/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "devOptional": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-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/which-typed-array": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.4.tgz", + "integrity": "sha512-49E0SpUe90cjpoc7BOJwyPHRqSAd12c10Qm2amdEZrJPCY2NDxaW01zHITrem+rnETY3dwrbH3UUrUwagfCYDA==", + "optional": true, + "dependencies": { + "available-typed-arrays": "^1.0.2", + "call-bind": "^1.0.0", + "es-abstract": "^1.18.0-next.1", + "foreach": "^2.0.5", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.1", + "is-typed-array": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/workerpool": { + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.5.tgz", + "integrity": "sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/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/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "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": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser/node_modules/camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs-unparser/node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/compat-data": { + "version": "7.13.15", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.15.tgz", + "integrity": "sha512-ltnibHKR1VnrU4ymHyQ/CXtNXI6yZC0oJThyW78Hft8XndANwi+9H+UIklBDraIjFEJzw8wmcM427oDd9KS5wA==", + "dev": true + }, + "@babel/core": { + "version": "7.13.16", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.13.16.tgz", + "integrity": "sha512-sXHpixBiWWFti0AV2Zq7avpTasr6sIAu7Y396c608541qAU2ui4a193m0KSQmfPSKFZLnQ3cvlKDOm3XkuXm3Q==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.13.16", + "@babel/helper-compilation-targets": "^7.13.16", + "@babel/helper-module-transforms": "^7.13.14", + "@babel/helpers": "^7.13.16", + "@babel/parser": "^7.13.16", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.15", + "@babel/types": "^7.13.16", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + } + }, + "@babel/generator": { + "version": "7.13.16", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.16.tgz", + "integrity": "sha512-grBBR75UnKOcUWMp8WoDxNsWCFl//XCK6HWTrBQKTr5SV9f5g0pNOjdyzi/DTBv12S9GnYPInIXQBTky7OXEMg==", + "dev": true, + "requires": { + "@babel/types": "^7.13.16", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.13.16", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.16.tgz", + "integrity": "sha512-3gmkYIrpqsLlieFwjkGgLaSHmhnvlAYzZLlYVjlW+QwI+1zE17kGxuJGmIqDQdYp56XdmGeD+Bswx0UTyG18xA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.13.15", + "@babel/helper-validator-option": "^7.12.17", + "browserslist": "^4.14.5", + "semver": "^6.3.0" + } + }, + "@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", + "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", + "dev": true, + "requires": { + "@babel/types": "^7.13.12" + } + }, + "@babel/helper-module-imports": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", + "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", + "dev": true, + "requires": { + "@babel/types": "^7.13.12" + } + }, + "@babel/helper-module-transforms": { + "version": "7.13.14", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.14.tgz", + "integrity": "sha512-QuU/OJ0iAOSIatyVZmfqB0lbkVP0kDRiKj34xy+QNsnVZi/PA6BoSoreeqnxxa9EHFAIL0R9XOaAR/G9WlIy5g==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.13.12", + "@babel/helper-replace-supers": "^7.13.12", + "@babel/helper-simple-access": "^7.13.12", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/helper-validator-identifier": "^7.12.11", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.13", + "@babel/types": "^7.13.14" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", + "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-replace-supers": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", + "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.13.12", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.12" + } + }, + "@babel/helper-simple-access": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", + "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", + "dev": true, + "requires": { + "@babel/types": "^7.13.12" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.12.17", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", + "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==", + "dev": true + }, + "@babel/helpers": { + "version": "7.13.17", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.13.17.tgz", + "integrity": "sha512-Eal4Gce4kGijo1/TGJdqp3WuhllaMLSrW6XcL0ulyUAQOuxHcCafZE8KHg9857gcTehsm/v7RcOx2+jp0Ryjsg==", + "dev": true, + "requires": { + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.17", + "@babel/types": "^7.13.17" + } + }, + "@babel/highlight": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", + "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.13.16", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.16.tgz", + "integrity": "sha512-6bAg36mCwuqLO0hbR+z7PHuqWiCeP7Dzg73OpQwsAB1Eb8HnGEz5xYBzCfbu+YjoaJsJs+qheDxVAuqbt3ILEw==", + "dev": true + }, + "@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/traverse": { + "version": "7.13.17", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.17.tgz", + "integrity": "sha512-BMnZn0R+X6ayqm3C3To7o1j7Q020gWdqdyP50KEoVqaCO2c/Im7sYZSmVgvefp8TTMQ+9CtwuBp0Z1CZ8V3Pvg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.13.16", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.13.16", + "@babel/types": "^7.13.17", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "dependencies": { + "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 + } + } + }, + "@babel/types": { + "version": "7.13.17", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.17.tgz", + "integrity": "sha512-RawydLgxbOPDlTLJNtoIypwdmAy//uQIzlKt2+iBiJaRlVuI6QLUxVAyWGNfOzp8Yu4L4lLIacoCyTNtpb4wiA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "to-fast-properties": "^2.0.0" + } + }, + "@eslint/eslintrc": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", + "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.2.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + } + } + }, + "@humanwhocodes/config-array": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz", + "integrity": "sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "@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" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "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 + }, + "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 + } + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, + "@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "dev": true + }, + "acorn": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.6.0.tgz", + "integrity": "sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "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" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "append-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "dev": true, + "requires": { + "default-require-extensions": "^3.0.0" + } + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "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" + } + }, + "array-filter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-1.0.0.tgz", + "integrity": "sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=", + "optional": true + }, + "array-includes": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", + "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.7" + } + }, + "array.prototype.flat": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", + "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0" + } + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true + }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "optional": true + }, + "available-typed-arrays": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.2.tgz", + "integrity": "sha512-XWX3OX8Onv97LMk/ftVyBibpGwY5a8SmuxZPzeOxqmuEqUCOM9ZE+uIaD1VNJ5QnvU2UQusvmKbuM1FR8QWGfQ==", + "optional": true, + "requires": { + "array-filter": "^1.0.0" + } + }, + "axios": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", + "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", + "optional": true, + "requires": { + "follow-redirects": "^1.10.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "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-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "browserslist": { + "version": "4.16.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.5.tgz", + "integrity": "sha512-C2HAjrM1AI/djrpAUU/tr4pml1DqLIzJKSLDBXBrNErl9ZCCTXdhwxdJjYc16953+mBWf7Lw+uUJgpgb8cN71A==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001214", + "colorette": "^1.2.2", + "electron-to-chromium": "^1.3.719", + "escalade": "^3.1.1", + "node-releases": "^1.1.71" + } + }, + "caching-transform": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "dev": true, + "requires": { + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "devOptional": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "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 + }, + "caniuse-lite": { + "version": "1.0.30001214", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001214.tgz", + "integrity": "sha512-O2/SCpuaU3eASWVaesQirZv1MSjUNOvmugaD8zNSJqw6Vv5SGwoOpA9LJs3pNPfM745nxqPvfZY3MQKY4AKHYg==", + "dev": true + }, + "chai": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz", + "integrity": "sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==", + "dev": true, + "requires": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + } + }, + "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" + } + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true + }, + "chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.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 + }, + "colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "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 + }, + "confusing-browser-globals": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz", + "integrity": "sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA==", + "dev": true + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "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" + } + }, + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "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 + }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "requires": { + "type-detect": "^4.0.0" + } + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "default-require-extensions": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", + "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", + "dev": true, + "requires": { + "strip-bom": "^4.0.0" + } + }, + "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==", + "devOptional": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "electron-to-chromium": { + "version": "1.3.720", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.720.tgz", + "integrity": "sha512-B6zLTxxaOFP4WZm6DrvgRk8kLFYWNhQ5TrHMC0l5WtkMXhU5UbnvWoTfeEwqOruUSlNMhVLfYak7REX6oC5Yfw==", + "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 + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "es-abstract": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", + "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "devOptional": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.1", + "is-string": "^1.0.7", + "is-weakref": "^1.0.1", + "object-inspect": "^1.11.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "devOptional": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.5.0.tgz", + "integrity": "sha512-tVGSkgNbOfiHyVte8bCM8OmX+xG9PzVG/B4UCF60zx7j61WIVY/AqJECDgpLD4DbbESD0e174gOg3ZlrX15GDg==", + "dev": true, + "requires": { + "@eslint/eslintrc": "^1.0.5", + "@humanwhocodes/config-array": "^0.9.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.0", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.1.0", + "espree": "^9.2.0", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.2.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "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" + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "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 + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "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 + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "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" + } + } + } + }, + "eslint-config-airbnb-base": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.1.tgz", + "integrity": "sha512-GOrQyDtVEc1Xy20U7vsB2yAoB4nBlfH5HZJeatRXHleO+OS5Ot+MWij4Dpltw4/DyIkqUfqz1epfhVR5XWWQPA==", + "dev": true, + "requires": { + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.2" + } + }, + "eslint-import-resolver-node": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", + "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "dev": true, + "requires": { + "debug": "^3.2.7", + "resolve": "^1.20.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-module-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.1.tgz", + "integrity": "sha512-fjoetBXQZq2tSTWZ9yWVl2KuFrTZZH3V+9iD1V1RfpDgxzJR+mPd/KZmMiA8gbPqdBzpNiEHOuT7IYEWxrH0zQ==", + "dev": true, + "requires": { + "debug": "^3.2.7", + "find-up": "^2.1.0", + "pkg-dir": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.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 + } + } + }, + "eslint-plugin-import": { + "version": "2.25.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.3.tgz", + "integrity": "sha512-RzAVbby+72IB3iOEL8clzPLzL3wpDrlwjsTBAQXgyp5SeTqqY+0bFubwuo+y/HLhNZcXV4XqTBO4LGsfyHIDXg==", + "dev": true, + "requires": { + "array-includes": "^3.1.4", + "array.prototype.flat": "^1.2.5", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-module-utils": "^2.7.1", + "has": "^1.0.3", + "is-core-module": "^2.8.0", + "is-glob": "^4.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.5", + "resolve": "^1.20.0", + "tsconfig-paths": "^3.11.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" + } + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-scope": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", + "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^2.0.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz", + "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==", + "dev": true + }, + "espree": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.2.0.tgz", + "integrity": "sha512-oP3utRkynpZWF/F2x/HZJ+AGtnIclaR7z1pYPxy7NYM2fSO6LgK/Rkny8anRSPK/VwEA1eqm2squui0T7ZMOBg==", + "dev": true, + "requires": { + "acorn": "^8.6.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^3.1.0" + } + }, + "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 + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "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 + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "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 + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "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-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "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 + }, + "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, + "requires": { + "find-up": "^4.0.0" + } + } + } + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "dependencies": { + "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 + } + } + }, + "flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", + "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", + "dev": true + }, + "follow-redirects": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.3.tgz", + "integrity": "sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA==", + "optional": true + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "optional": true + }, + "foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + } + }, + "fromentries": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", + "dev": true + }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "optional": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.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.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "devOptional": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "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": "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-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "devOptional": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "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-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "devOptional": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": 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" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", + "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + }, + "dependencies": { + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + } + } + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "devOptional": true + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "devOptional": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "devOptional": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "devOptional": true + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "devOptional": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "hasha": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "dev": true, + "requires": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "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 + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "devOptional": true + }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "devOptional": true, + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "is-arguments": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", + "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "optional": true, + "requires": { + "call-bind": "^1.0.0" + } + }, + "is-bigint": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.1.tgz", + "integrity": "sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg==", + "devOptional": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-boolean-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz", + "integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==", + "devOptional": true, + "requires": { + "call-bind": "^1.0.0" + } + }, + "is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "devOptional": true + }, + "is-core-module": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", + "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "devOptional": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "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 + }, + "is-generator-function": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.8.tgz", + "integrity": "sha512-2Omr/twNtufVZFr1GhxjOMFPAj2sjc/dKaIqBhvo4qciXfJmITGH6ZGd8eZYNHza8t1y0e01AuqRhJwfWp26WQ==", + "optional": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "devOptional": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-number-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", + "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==", + "devOptional": true + }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "devOptional": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-shared-array-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", + "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", + "devOptional": true + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "devOptional": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "devOptional": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-typed-array": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.5.tgz", + "integrity": "sha512-S+GRDgJlR3PyEbsX/Fobd9cqpZBuvUS+8asRqYDMLCb2qMzt1oz5m5oxQCxOgUDxiWsOVNi4yaF+/uvdlHlYug==", + "optional": true, + "requires": { + "available-typed-arrays": "^1.0.2", + "call-bind": "^1.0.2", + "es-abstract": "^1.18.0-next.2", + "foreach": "^2.0.5", + "has-symbols": "^1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true + }, + "is-weakref": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", + "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", + "devOptional": true, + "requires": { + "call-bind": "^1.0.0" + } + }, + "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 + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", + "dev": true, + "requires": { + "append-transform": "^2.0.0" + } + }, + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + } + }, + "istanbul-lib-processinfo": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", + "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", + "dev": true, + "requires": { + "archy": "^1.0.0", + "cross-spawn": "^7.0.0", + "istanbul-lib-coverage": "^3.0.0-alpha.1", + "make-dir": "^3.0.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^3.3.3" + } + }, + "istanbul-lib-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, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.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" + } + } + } + }, + "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, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "istanbul-reports": { + "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": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "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 + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "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 + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "optional": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "dependencies": { + "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" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "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 + }, + "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" + } + } + } + }, + "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": { + "yallist": "^4.0.0" + } + }, + "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": { + "semver": "^6.0.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mocha": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.1.3.tgz", + "integrity": "sha512-Xcpl9FqXOAYqI3j79pEtHBBnQgVXIhpULjGQa7DVb0Po+VzmSIK9kanAiWLHoRR/dbZ2qpdPshuXr8l1VaHCzw==", + "dev": true, + "requires": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.2", + "debug": "4.3.2", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.1.7", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "3.0.4", + "ms": "2.1.3", + "nanoid": "3.1.25", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "workerpool": "6.1.5", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "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 + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "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 + }, + "nanoid": { + "version": "3.1.25", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz", + "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==", + "dev": true + }, + "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-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "dev": true, + "requires": { + "process-on-spawn": "^1.0.0" + } + }, + "node-releases": { + "version": "1.1.71", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", + "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", + "dev": true + }, + "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 + }, + "nyc": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", + "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", + "dev": true, + "requires": { + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^2.0.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" + }, + "dependencies": { + "ansi-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" + } + }, + "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" + } + }, + "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 + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "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 + }, + "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 + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "devOptional": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "devOptional": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "devOptional": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "object.entries": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.3.tgz", + "integrity": "sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1", + "has": "^1.0.3" + } + }, + "object.values": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", + "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + }, + "dependencies": { + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + } + } + }, + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.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 + }, + "package-hash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "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 + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true + }, + "picomatch": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", + "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", + "dev": true + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.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 + } + } + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "process-on-spawn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", + "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", + "dev": true, + "requires": { + "fromentries": "^1.2.0" + } + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "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 + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true + }, + "release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", + "dev": true, + "requires": { + "es6-error": "^4.0.1" + } + }, + "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 + }, + "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 + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "rimraf": { + "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.1.3" + } + }, + "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==", + "devOptional": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "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 + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "devOptional": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "spawn-wrap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "dev": true, + "requires": { + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "devOptional": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "devOptional": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-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 + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "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" + } + }, + "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": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "tf2-static-schema": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/tf2-static-schema/-/tf2-static-schema-1.24.0.tgz", + "integrity": "sha512-iNsBJMY/qcDvyFaiikEAG1fjLLYLMA9FWvjJm/wWJAYkh1NL04ZE/SiOk3JxM6ZZ242jfORze2D0z2B+O7AC6A==", + "optional": true, + "requires": { + "axios": "^0.21.1", + "fs-extra": "^9.0.1", + "vdf": "0.0.2" + } + }, + "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 + }, + "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": "^7.0.0" + } + }, + "tsconfig-paths": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.11.0.tgz", + "integrity": "sha512-7ecdYDnIdmv639mmDwslG6KQg1Z9STTz1j7Gcz0xa+nshh/gKDAHcPxRbWOsA3SPp0tXP2leTcY9Kw+NAkfZzA==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "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.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "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, + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "typescript": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz", + "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==", + "dev": true + }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "devOptional": true, + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "optional": true + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "util": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.3.tgz", + "integrity": "sha512-I8XkoQwE+fPQEhy9v012V+TSdH2kp9ts29i20TaaDUXsg7x/onePbhFJUExBfv/2ay1ZOp/Vsm3nDlmnFGSAog==", + "optional": true, + "requires": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "safe-buffer": "^5.1.2", + "which-typed-array": "^1.1.2" + } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "vdf": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/vdf/-/vdf-0.0.2.tgz", + "integrity": "sha1-ve6nvN3sf6/IzcWMMq6ExyXCfhQ=", + "optional": true, + "requires": { + "util": "*" + } + }, + "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" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "devOptional": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "which-typed-array": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.4.tgz", + "integrity": "sha512-49E0SpUe90cjpoc7BOJwyPHRqSAd12c10Qm2amdEZrJPCY2NDxaW01zHITrem+rnETY3dwrbH3UUrUwagfCYDA==", + "optional": true, + "requires": { + "available-typed-arrays": "^1.0.2", + "call-bind": "^1.0.0", + "es-abstract": "^1.18.0-next.1", + "foreach": "^2.0.5", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.1", + "is-typed-array": "^1.1.3" + } + }, + "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 + }, + "workerpool": { + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.5.tgz", + "integrity": "sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw==", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "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" + } + }, + "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 + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "dependencies": { + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + } + } + }, + "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 + }, + "yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "requires": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "dependencies": { + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true + }, + "decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true + } + } + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + } + } +} diff --git a/package.json b/package.json index 029be60..a83b20f 100644 --- a/package.json +++ b/package.json @@ -1,56 +1,56 @@ -{ - "name": "tf2-item-format", - "version": "5.6.8", - "description": "Format's TF2 items like backpack.tf does", - "main": "./dist/index.js", - "types": "./dist/index.d.ts", - "exports": { - ".": "./dist/index.js", - "./static": "./dist/static.js" - }, - "typesVersions": { - "*": { - ".": [ - "./dist/index.d.ts" - ], - "static": [ - "./dist/static.d.ts" - ] - } - }, - "scripts": { - "test": "mocha ./test", - "test:coverage": "nyc npm run test", - "build": "npx tsc", - "format": "npx prettier --write \"src/**/*.ts\"" - }, - "repository": { - "type": "git", - "url": "https://github.com/danocmx/node-tf2-item-format.git" - }, - "keywords": [ - "tf2", - "backpacktf" - ], - "author": "danocmx", - "license": "MIT", - "bugs": { - "url": "https://github.com/danocmx/node-tf2-item-format/issues" - }, - "homepage": "https://github.com/danocmx/node-tf2-item-format#readme", - "optionalDependencies": { - "tf2-static-schema": "^1.24.0" - }, - "devDependencies": { - "chai": "^4.2.0", - "eslint": "^8.0.0", - "eslint-config-airbnb-base": "^14.2.1", - "eslint-plugin-import": "^2.22.1", - "mocha": "^9.0.2", - "nyc": "^15.1.0", - "typescript": "^4.1.3" - }, - "engines": { - "node": ">=12.7.0" - } -} +{ + "name": "tf2-item-format", + "version": "5.6.8", + "description": "Format's TF2 items like backpack.tf does", + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "exports": { + ".": "./dist/index.js", + "./static": "./dist/static.js" + }, + "typesVersions": { + "*": { + ".": [ + "./dist/index.d.ts" + ], + "static": [ + "./dist/static.d.ts" + ] + } + }, + "scripts": { + "test": "mocha ./test", + "test:coverage": "nyc npm run test", + "build": "npx tsc", + "format": "npx prettier --write \"src/**/*.ts\"" + }, + "repository": { + "type": "git", + "url": "https://github.com/danocmx/node-tf2-item-format.git" + }, + "keywords": [ + "tf2", + "backpacktf" + ], + "author": "danocmx", + "license": "MIT", + "bugs": { + "url": "https://github.com/danocmx/node-tf2-item-format/issues" + }, + "homepage": "https://github.com/danocmx/node-tf2-item-format#readme", + "optionalDependencies": { + "tf2-static-schema": "^1.24.0" + }, + "devDependencies": { + "chai": "^4.2.0", + "eslint": "^8.0.0", + "eslint-config-airbnb-base": "^14.2.1", + "eslint-plugin-import": "^2.22.1", + "mocha": "^9.0.2", + "nyc": "^15.1.0", + "typescript": "^4.1.3" + }, + "engines": { + "node": ">=12.7.0" + } +} diff --git a/src/createBPListing.ts b/src/createBPListing.ts index 37359d1..3307048 100644 --- a/src/createBPListing.ts +++ b/src/createBPListing.ts @@ -106,7 +106,8 @@ function getRightName( ): string { // We keep kit in the name but backpack.tf does not accept it. if (isFabricator(name)) return name.replace('Kit ', ''); - if (hasDefindex(item.texture)) return `${schema.getTextureName(item.texture)} | ${name}`; + if (hasDefindex(item.texture)) + return `${schema.getTextureName(item.texture)} | ${name}`; return name; } diff --git a/src/parseEconItem/ParsedEcon/ItemName.ts b/src/parseEconItem/ParsedEcon/ItemName.ts index b850b57..c174d56 100644 --- a/src/parseEconItem/ParsedEcon/ItemName.ts +++ b/src/parseEconItem/ParsedEcon/ItemName.ts @@ -50,7 +50,7 @@ export default class ItemName { isUniqueHat, // We know it's a string here: killstreak: killstreak as string, - wear: (wear as unknown) as string, + wear: wear as unknown as string, texture: texture as string, craftable: true, itemNumber, @@ -74,13 +74,8 @@ export default class ItemName { getFull() { let name = this.origin; - const { - craftable, - tradable, - texture, - quality, - effect, - } = this.econ.getNameAttributes('', false, false); + const { craftable, tradable, texture, quality, effect } = + this.econ.getNameAttributes('', false, false); if (effect) { if (isUnusual(quality as string)) diff --git a/src/parseString.ts b/src/parseString.ts index 503da94..d5f7d82 100644 --- a/src/parseString.ts +++ b/src/parseString.ts @@ -75,7 +75,8 @@ function parseString( delete convertedAttributes.killstreak; if (!convertedAttributes.wear) delete convertedAttributes.wear; if (!convertedAttributes.effect) delete convertedAttributes.effect; - if (!hasDefindex(convertedAttributes.texture)) delete convertedAttributes.texture; + if (!hasDefindex(convertedAttributes.texture)) + delete convertedAttributes.texture; if (!hasDefindex(convertedAttributes.outputQuality)) delete convertedAttributes.outputQuality; @@ -85,7 +86,8 @@ function parseString( const defindexes = useDefindexes ? getDefindexes(schema, itemName, attributes.usableItem || undefined) : {}; - if (hasDefindex(defindexes.defindex)) parsedAttributes.defindex = defindexes.defindex; + if (hasDefindex(defindexes.defindex)) + parsedAttributes.defindex = defindexes.defindex; if (attributes.quality.elevated) parsedAttributes.elevated = attributes.quality.elevated; @@ -99,12 +101,15 @@ function parseString( parsedAttributes.killstreak = attributes.killstreak; if (attributes.wear && !parsedAttributes.wear) parsedAttributes.wear = attributes.wear; - if (hasDefindex(attributes.texture) && !hasDefindex(parsedAttributes.texture)) + if ( + hasDefindex(attributes.texture) && + !hasDefindex(parsedAttributes.texture) + ) parsedAttributes.texture = attributes.texture; if (attributes.effect && !parsedAttributes.effect) parsedAttributes.effect = attributes.effect; - if (attributes.usableItem && !isEmpty(attributes.usableItem)) { + if (attributes.usableItem && !isEmpty(attributes.usableItem)) { if (attributes.usableItem.target) parsedAttributes.target = attributes.usableItem.target; if (attributes.usableItem.output) diff --git a/src/parseString/Attributes/getQuality/isHaunted.ts b/src/parseString/Attributes/getQuality/isHaunted.ts index a5f7c88..2eb6206 100644 --- a/src/parseString/Attributes/getQuality/isHaunted.ts +++ b/src/parseString/Attributes/getQuality/isHaunted.ts @@ -7,5 +7,7 @@ export default function (name: string): boolean { } function isHauntedException(name: string): boolean { - return /(Haunted Hat)|(Haunted Ghosts)|(Haunted Phantasm)/.test(name); + return /(Haunted Hat)|(Haunted Ghosts)|(Haunted Phantasm)|(Haunted Metal Scrap)/.test( + name + ); } diff --git a/src/shared/decomposeName.ts b/src/shared/decomposeName.ts index cfce33d..3a15f55 100644 --- a/src/shared/decomposeName.ts +++ b/src/shared/decomposeName.ts @@ -76,11 +76,8 @@ export default function ( * @return {string} */ function getUsableItemToRemove(attributes: DecomposeAttributes) { - const { - target, - output, - outputQuality, - } = attributes.usableItem as Partial; + const { target, output, outputQuality } = + attributes.usableItem as Partial; return target || getOutput(output as string, outputQuality as string); } diff --git a/src/shared/getConvertedIntAttributes.ts b/src/shared/getConvertedIntAttributes.ts index cc3f83e..0b91e69 100644 --- a/src/shared/getConvertedIntAttributes.ts +++ b/src/shared/getConvertedIntAttributes.ts @@ -24,6 +24,8 @@ export default function ( outputQuality: item.outputQuality ? schema.getQualityEnum(item.outputQuality) : undefined, - texture: hasDefindex(item.texture) ? schema.getTextureEnum(item.texture) : undefined, + texture: hasDefindex(item.texture) + ? schema.getTextureEnum(item.texture) + : undefined, }; } diff --git a/src/shared/getDefindexes.ts b/src/shared/getDefindexes.ts index d144d8b..4003421 100644 --- a/src/shared/getDefindexes.ts +++ b/src/shared/getDefindexes.ts @@ -12,12 +12,14 @@ export default function getDefindexes( if (usableItem) { if (usableItem.target) { const targetDefindex = schema.getDefindex(usableItem.target); - if (hasDefindex(targetDefindex)) defindexes.targetDefindex = targetDefindex; + if (hasDefindex(targetDefindex)) + defindexes.targetDefindex = targetDefindex; } if (usableItem.output) { const outputDefindex = schema.getDefindex(usableItem.output); - if (hasDefindex(outputDefindex)) defindexes.outputDefindex = outputDefindex; + if (hasDefindex(outputDefindex)) + defindexes.outputDefindex = outputDefindex; } } diff --git a/src/shared/guards.ts b/src/shared/guards.ts index a1fc52e..0955a9a 100644 --- a/src/shared/guards.ts +++ b/src/shared/guards.ts @@ -1,9 +1,11 @@ /** * Checks if value is defindex, * can be used for textures or item defindexes or quality. - * @param defindex - * @returns + * @param defindex + * @returns */ -export function hasDefindex(defindex: number | string | undefined | void | null): defindex is number | string { +export function hasDefindex( + defindex: number | string | undefined | void | null +): defindex is number | string { return !!defindex || defindex === 0; } diff --git a/src/stringify.ts b/src/stringify.ts index fda71d2..cde01f3 100644 --- a/src/stringify.ts +++ b/src/stringify.ts @@ -59,7 +59,7 @@ export default function ( : ''; output = hasOutputDefindex(attributes) ? schema.getName(attributes.outputDefindex) - : ''; + : ''; } else { throw new Error('Defindex or Name is missing.'); } @@ -211,15 +211,19 @@ function isUniqueHat( } function getTarget(schema: ISchema, attributes: ItemAttributes): string { - return attributes.target - || (hasTargetDefindex(attributes as StrigifySKUAttributes) - ? schema.getName(attributes.targetDefindex as number) - : '') + return ( + attributes.target || + (hasTargetDefindex(attributes as StrigifySKUAttributes) + ? schema.getName(attributes.targetDefindex as number) + : '') + ); } function getOutputItem(schema: ISchema, attributes: ItemAttributes): string { - return attributes.output - || (hasOutputDefindex(attributes as StrigifySKUAttributes) - ? schema.getName(attributes.outputDefindex as number) - : '') + return ( + attributes.output || + (hasOutputDefindex(attributes as StrigifySKUAttributes) + ? schema.getName(attributes.outputDefindex as number) + : '') + ); } diff --git a/src/toSKU.ts b/src/toSKU.ts index e7a4102..ed066fc 100644 --- a/src/toSKU.ts +++ b/src/toSKU.ts @@ -1,4 +1,9 @@ -import { hasOutputDefindex, hasOutputQuality, hasTargetDefindex, hasTexture } from './toSKU/guards'; +import { + hasOutputDefindex, + hasOutputQuality, + hasTargetDefindex, + hasTexture, +} from './toSKU/guards'; import { SKUAttributes } from './types'; export default function (item: SKUAttributes): string { diff --git a/src/toSKU/guards.ts b/src/toSKU/guards.ts index ba0dbe7..c5f5bcd 100644 --- a/src/toSKU/guards.ts +++ b/src/toSKU/guards.ts @@ -1,17 +1,41 @@ -import { SKUAttributes } from "../types"; +import { SKUAttributes } from '../types'; -export function hasTargetDefindex(attributes: SKUAttributes): attributes is { targetDefindex: number; defindex: number; quality: number; craftable: boolean } { +export function hasTargetDefindex( + attributes: SKUAttributes +): attributes is { + targetDefindex: number; + defindex: number; + quality: number; + craftable: boolean; +} { return Object.prototype.hasOwnProperty.call(attributes, 'targetDefindex'); } -export function hasOutputDefindex(attributes: SKUAttributes): attributes is { outputDefindex: number; outputQuality: number; defindex: number; quality: number; craftable: boolean } { +export function hasOutputDefindex( + attributes: SKUAttributes +): attributes is { + outputDefindex: number; + outputQuality: number; + defindex: number; + quality: number; + craftable: boolean; +} { return Object.prototype.hasOwnProperty.call(attributes, 'outputDefindex'); } -export function hasOutputQuality(attributes: SKUAttributes): attributes is { outputQuality: number; defindex: number; quality: number; craftable: boolean } { +export function hasOutputQuality( + attributes: SKUAttributes +): attributes is { + outputQuality: number; + defindex: number; + quality: number; + craftable: boolean; +} { return Object.prototype.hasOwnProperty.call(attributes, 'outputQuality'); } -export function hasTexture(attributes: { texture?: string | number | undefined }): attributes is { texture: number } { +export function hasTexture(attributes: { + texture?: string | number | undefined; +}): attributes is { texture: number } { return Object.prototype.hasOwnProperty.call(attributes, 'texture'); } diff --git a/test/createBPListing.js b/test/createBPListing.js index acb97af..cb54e18 100644 --- a/test/createBPListing.js +++ b/test/createBPListing.js @@ -1,337 +1,352 @@ -const { assert } = require('chai'); - -const { createBPListing } = require('../dist/static'); - -describe('createBPListing', () => { - it('Case #1', () => { - const listing = createBPListing({ - name: 'Flame Thrower', - craftable: true, - quality: 'Strange', - }); - - assert.deepEqual(listing, { - quality: 'Strange', - craftable: 1, - item_name: 'Flame Thrower', - priceindex: 0, - }); - }); - - it('Case #2', () => { - const listing = createBPListing({ - name: "Pyromancer's Mask", - craftable: true, - quality: 'Unusual', - effect: 'Burning Flames', - }); - - assert.deepEqual(listing, { - quality: 'Unusual', - craftable: 1, - item_name: "Pyromancer's Mask", - priceindex: 13, - }); - }); - - it('Case #3', () => { - const listing = createBPListing({ - name: 'Professional Killstreak Kit Fabricator', - craftable: true, - quality: 'Unique', - killstreak: 'Professional Killstreak', - target: 'Kritzkrieg', - }); - - assert.deepEqual(listing, { - quality: 'Unique', - craftable: 1, - item_name: 'Professional Killstreak Fabricator', - priceindex: '6526-6-35', - }); - }); - - it('Case #4', () => { - const listing = createBPListing({ - name: 'Professional Killstreak Kit', - craftable: false, - quality: 'Unique', - killstreak: 'Professional Killstreak', - target: 'AWPer Hand', - }); - - assert.deepEqual(listing, { - quality: 'Unique', - craftable: 0, - item_name: 'Professional Killstreak Kit', - priceindex: '3-851', - }); - }); - - it('Case #5', () => { - const listing = createBPListing({ - name: 'Diamondback', - craftable: true, - quality: "Collector's", - killstreak: 'Professional Killstreak', - }); - - assert.deepEqual(listing, { - quality: "Collector's", - craftable: 1, - item_name: 'Professional Killstreak Diamondback', - priceindex: 0, - }); - }); - - it('Case #6', () => { - const listing = createBPListing({ - name: 'Chemistry Set', - craftable: true, - quality: 'Unique', - output: "Battalion's Backup", - outputQuality: "Collector's", - }); - - assert.deepEqual(listing, { - quality: 'Unique', - craftable: 1, - item_name: 'Chemistry Set', - priceindex: '226-14', - }); - }); - - it('Case #7', () => { - const listing = createBPListing({ - name: 'Strangifier Chemistry Set', - craftable: true, - quality: 'Unique', - target: 'Archimedes', - output: 'Strangifier', - outputQuality: 'Unique', - }); - - assert.deepEqual(listing, { - quality: 'Unique', - craftable: 1, - item_name: 'Strangifier Chemistry Set', - priceindex: '5661-6-828', - }); - }); - - it('Case #8', () => { - const listing = createBPListing({ - name: 'Festive Grenade Launcher', - craftable: true, - quality: 'Strange', - killstreak: 'Professional Killstreak', - }); - - assert.deepEqual(listing, { - quality: 'Strange', - craftable: 1, - item_name: 'Professional Killstreak Festive Grenade Launcher', - priceindex: 0, - }); - }); - - it('Case #9', () => { - const listing = createBPListing({ - name: 'Sniper Rifle', - craftable: true, - quality: 'Unique', - elevated: true, - }); - - assert.deepEqual(listing, { - quality: 'Strange Unique', - craftable: 1, - item_name: 'Sniper Rifle', - priceindex: 0, - }); - }); - - it('Case #10', () => { - const listing = createBPListing({ - name: 'Scattergun', - craftable: true, - quality: 'Strange', - australium: true, - festivized: true, - killstreak: 'Professional Killstreak', - }); - - assert.deepEqual(listing, { - quality: 'Strange', - craftable: 1, - item_name: 'Festivized Professional Killstreak Australium Scattergun', - priceindex: 0, - }); - }); - - it('Case #11', () => { - const listing = createBPListing({ - name: 'Bazaar Bauble', - craftable: true, - quality: 'Unusual', - elevated: true, - effect: 'Prismatica', - }); - - assert.deepEqual(listing, { - quality: 'Strange Unusual', - craftable: 1, - item_name: 'Bazaar Bauble', - priceindex: 150, - }); - }); - - it('Case #12 - Texture + Wear', () => { - const listing = createBPListing({ - name: 'Degreaser', - craftable: true, - killstreak: 'Professional Killstreak', - quality: 15, - elevated: false, - effect: 702, - wear: 'Minimal-Wear', - texture: 'Alien Tech' - }); - - assert.deepEqual(listing, { - quality: "Decorated Weapon", - craftable: 1, - item_name: 'Professional Killstreak Alien Tech | Degreaser (Minimal-Wear)', - priceindex: 702, - }); - }) - - it('Case #13 - Strangifier Chemistry Set', () => { - const listing = createBPListing({ - defindex: 20005, - quality: 6, - targetDefindex: 30132, - outputDefindex: 6522, - outputQuality: 6, - craftable: true - }); - - assert.deepEqual(listing, { - quality: 6, - craftable: 1, - item_name: 'Chemistry Set', - priceindex: '6522-6-30132' - }); - }); - - it('Case #14 - Skin with unusual quality to decorated', () => { - const listing = createBPListing({ - name: 'Degreaser', - craftable: true, - killstreak: 'Professional Killstreak', - quality: 5, - elevated: false, - effect: 702, - wear: 'Minimal-Wear', - texture: 'Alien Tech' - }); - - assert.deepEqual(listing, { - quality: "Decorated Weapon", - craftable: 1, - item_name: 'Professional Killstreak Alien Tech | Degreaser (Minimal-Wear)', - priceindex: 702, - }); - }); - - it('Case #15 - Skin with unusual quality keeps unusual quality', () => { - const listing = createBPListing({ - name: 'Degreaser', - craftable: true, - killstreak: 'Professional Killstreak', - quality: 5, - elevated: false, - effect: 702, - wear: 'Minimal-Wear', - texture: 'Alien Tech' - }, { unuSkinsToDecorated: false }); - - assert.deepEqual(listing, { - quality: 5, - craftable: 1, - item_name: 'Professional Killstreak Alien Tech | Degreaser (Minimal-Wear)', - priceindex: 702, - }); - }); - - it('Case #16 - Red Rock Roscoe texture', () => { - const listing = createBPListing({ - defindex: 15013, - quality: 15, - wear: 3, - texture: 0, - festivized: true, - killstreak: 2, - craftable: true - }); - - assert.deepEqual(listing, { - quality: 15, - craftable: 1, - item_name: 'Festivized Specialized Killstreak Red Rock Roscoe | Pistol (Field-Tested)', - priceindex: 0, - }); - }); - - it('Case #17 - Bat', () =>{ - const listing = createBPListing({ - defindex: 0, - quality: 6, - craftable: true, - }); - - assert.deepEqual(listing, { - quality: 6, - craftable: 1, - item_name: 'Bat', - priceindex: 0, - }); - }) - - - it('Case #18 - Bat output', () =>{ - const listing = createBPListing({ - defindex: 20006, - quality: 6, - craftable: true, - outputDefindex: 0, - outputQuality: 6, - }); - - assert.deepEqual(listing, { - quality: 6, - craftable: 1, - item_name: 'Chemistry Set', - priceindex: "0-6", - }); - }) - - - it('Case #19 - Bat target', () =>{ - const listing = createBPListing({ - defindex: 20000, - quality: 6, - craftable: true, - targetDefindex: 0, - outputDefindex: 6522, - outputQuality: 6, - }); - - assert.deepEqual(listing, { - quality: 6, - craftable: 1, - item_name: 'Strangifier Chemistry Set', - priceindex: '6522-6-0', - }); - }) -}); +const { assert } = require('chai'); + +const { createBPListing } = require('../dist/static'); + +describe('createBPListing', () => { + it('Case #1', () => { + const listing = createBPListing({ + name: 'Flame Thrower', + craftable: true, + quality: 'Strange', + }); + + assert.deepEqual(listing, { + quality: 'Strange', + craftable: 1, + item_name: 'Flame Thrower', + priceindex: 0, + }); + }); + + it('Case #2', () => { + const listing = createBPListing({ + name: "Pyromancer's Mask", + craftable: true, + quality: 'Unusual', + effect: 'Burning Flames', + }); + + assert.deepEqual(listing, { + quality: 'Unusual', + craftable: 1, + item_name: "Pyromancer's Mask", + priceindex: 13, + }); + }); + + it('Case #3', () => { + const listing = createBPListing({ + name: 'Professional Killstreak Kit Fabricator', + craftable: true, + quality: 'Unique', + killstreak: 'Professional Killstreak', + target: 'Kritzkrieg', + }); + + assert.deepEqual(listing, { + quality: 'Unique', + craftable: 1, + item_name: 'Professional Killstreak Fabricator', + priceindex: '6526-6-35', + }); + }); + + it('Case #4', () => { + const listing = createBPListing({ + name: 'Professional Killstreak Kit', + craftable: false, + quality: 'Unique', + killstreak: 'Professional Killstreak', + target: 'AWPer Hand', + }); + + assert.deepEqual(listing, { + quality: 'Unique', + craftable: 0, + item_name: 'Professional Killstreak Kit', + priceindex: '3-851', + }); + }); + + it('Case #5', () => { + const listing = createBPListing({ + name: 'Diamondback', + craftable: true, + quality: "Collector's", + killstreak: 'Professional Killstreak', + }); + + assert.deepEqual(listing, { + quality: "Collector's", + craftable: 1, + item_name: 'Professional Killstreak Diamondback', + priceindex: 0, + }); + }); + + it('Case #6', () => { + const listing = createBPListing({ + name: 'Chemistry Set', + craftable: true, + quality: 'Unique', + output: "Battalion's Backup", + outputQuality: "Collector's", + }); + + assert.deepEqual(listing, { + quality: 'Unique', + craftable: 1, + item_name: 'Chemistry Set', + priceindex: '226-14', + }); + }); + + it('Case #7', () => { + const listing = createBPListing({ + name: 'Strangifier Chemistry Set', + craftable: true, + quality: 'Unique', + target: 'Archimedes', + output: 'Strangifier', + outputQuality: 'Unique', + }); + + assert.deepEqual(listing, { + quality: 'Unique', + craftable: 1, + item_name: 'Strangifier Chemistry Set', + priceindex: '5661-6-828', + }); + }); + + it('Case #8', () => { + const listing = createBPListing({ + name: 'Festive Grenade Launcher', + craftable: true, + quality: 'Strange', + killstreak: 'Professional Killstreak', + }); + + assert.deepEqual(listing, { + quality: 'Strange', + craftable: 1, + item_name: 'Professional Killstreak Festive Grenade Launcher', + priceindex: 0, + }); + }); + + it('Case #9', () => { + const listing = createBPListing({ + name: 'Sniper Rifle', + craftable: true, + quality: 'Unique', + elevated: true, + }); + + assert.deepEqual(listing, { + quality: 'Strange Unique', + craftable: 1, + item_name: 'Sniper Rifle', + priceindex: 0, + }); + }); + + it('Case #10', () => { + const listing = createBPListing({ + name: 'Scattergun', + craftable: true, + quality: 'Strange', + australium: true, + festivized: true, + killstreak: 'Professional Killstreak', + }); + + assert.deepEqual(listing, { + quality: 'Strange', + craftable: 1, + item_name: 'Festivized Professional Killstreak Australium Scattergun', + priceindex: 0, + }); + }); + + it('Case #11', () => { + const listing = createBPListing({ + name: 'Bazaar Bauble', + craftable: true, + quality: 'Unusual', + elevated: true, + effect: 'Prismatica', + }); + + assert.deepEqual(listing, { + quality: 'Strange Unusual', + craftable: 1, + item_name: 'Bazaar Bauble', + priceindex: 150, + }); + }); + + it('Case #12 - Texture + Wear', () => { + const listing = createBPListing({ + name: 'Degreaser', + craftable: true, + killstreak: 'Professional Killstreak', + quality: 15, + elevated: false, + effect: 702, + wear: 'Minimal-Wear', + texture: 'Alien Tech' + }); + + assert.deepEqual(listing, { + quality: "Decorated Weapon", + craftable: 1, + item_name: 'Professional Killstreak Alien Tech | Degreaser (Minimal-Wear)', + priceindex: 702, + }); + }) + + it('Case #13 - Strangifier Chemistry Set', () => { + const listing = createBPListing({ + defindex: 20005, + quality: 6, + targetDefindex: 30132, + outputDefindex: 6522, + outputQuality: 6, + craftable: true + }); + + assert.deepEqual(listing, { + quality: 6, + craftable: 1, + item_name: 'Chemistry Set', + priceindex: '6522-6-30132' + }); + }); + + it('Case #14 - Skin with unusual quality to decorated', () => { + const listing = createBPListing({ + name: 'Degreaser', + craftable: true, + killstreak: 'Professional Killstreak', + quality: 5, + elevated: false, + effect: 702, + wear: 'Minimal-Wear', + texture: 'Alien Tech' + }); + + assert.deepEqual(listing, { + quality: "Decorated Weapon", + craftable: 1, + item_name: 'Professional Killstreak Alien Tech | Degreaser (Minimal-Wear)', + priceindex: 702, + }); + }); + + it('Case #15 - Skin with unusual quality keeps unusual quality', () => { + const listing = createBPListing({ + name: 'Degreaser', + craftable: true, + killstreak: 'Professional Killstreak', + quality: 5, + elevated: false, + effect: 702, + wear: 'Minimal-Wear', + texture: 'Alien Tech' + }, { unuSkinsToDecorated: false }); + + assert.deepEqual(listing, { + quality: 5, + craftable: 1, + item_name: 'Professional Killstreak Alien Tech | Degreaser (Minimal-Wear)', + priceindex: 702, + }); + }); + + it('Case #16 - Red Rock Roscoe texture', () => { + const listing = createBPListing({ + defindex: 15013, + quality: 15, + wear: 3, + texture: 0, + festivized: true, + killstreak: 2, + craftable: true + }); + + assert.deepEqual(listing, { + quality: 15, + craftable: 1, + item_name: 'Festivized Specialized Killstreak Red Rock Roscoe | Pistol (Field-Tested)', + priceindex: 0, + }); + }); + + it('Case #17 - Bat', () =>{ + const listing = createBPListing({ + defindex: 0, + quality: 6, + craftable: true, + }); + + assert.deepEqual(listing, { + quality: 6, + craftable: 1, + item_name: 'Bat', + priceindex: 0, + }); + }) + + + it('Case #18 - Bat output', () =>{ + const listing = createBPListing({ + defindex: 20006, + quality: 6, + craftable: true, + outputDefindex: 0, + outputQuality: 6, + }); + + assert.deepEqual(listing, { + quality: 6, + craftable: 1, + item_name: 'Chemistry Set', + priceindex: "0-6", + }); + }) + + + it('Case #19 - Bat target', () =>{ + const listing = createBPListing({ + defindex: 20000, + quality: 6, + craftable: true, + targetDefindex: 0, + outputDefindex: 6522, + outputQuality: 6, + }); + + assert.deepEqual(listing, { + quality: 6, + craftable: 1, + item_name: 'Strangifier Chemistry Set', + priceindex: '6522-6-0', + }); + }) + + it('Case #20 - Unusual Haunted Metal Scrap', () => { + const listing = createBPListing({ + defindex: 267, + quality: 5, + craftable: true, + }); + + assert.deepEqual(listing, { + quality: 5, + craftable: 1, + item_name: 'Haunted Metal Scrap', + priceindex: 0, + }); + }); +}); diff --git a/test/econItem.js b/test/econItem.js index 3a0c54a..61894a4 100644 --- a/test/econItem.js +++ b/test/econItem.js @@ -1,4382 +1,4382 @@ -const { assert } = require('chai'); - -const { parseEconItem, Schema } = require('../dist/static'); -const { createFormat } = require('../dist'); - -describe('parseEconItem', () => { - it('Case #1', () => { - const econItem = parseEconItem({ - appid: 440, - contextid: '2', - assetid: '8407830034', - classid: '3662018019', - instanceid: '11040671', - amount: '1', - currency: 0, - background_color: '3C352E', - icon_url: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffsDz5zdwmTVPAOCcot8Qn-Wxg07dR3XcGzub5ffwvmttSXYrAlY9xFTMaCUvbXNQz_6EkwiPRYKJaIon-9jHjrOWoUG0280KDki-w', - icon_url_large: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffsDz5zdwmTVPAOCcot8Qn-Wxg07dR3XcGzub5ffwvmttSXYrAlY9xFTMaCUvbXNQz_6EkwiPRYKJaIon-9jHjrOWoUG0280KDki-w', - descriptions: [ - { - value: 'Mercenary Grade Flame Thrower (Minimal Wear)', - color: '4b69ff', - }, - { value: '★ Unusual Effect: Cool', color: 'ffd700' }, - { value: 'Festivized', color: 'ffd700' }, - { - value: 'Extinguishing teammates restores 20 health', - color: '7ea9d1', - }, - { value: 'Sheen: Agonizing Emerald', color: '7ea9d1' }, - { value: 'Killstreaks Active', color: '7ea9d1' }, - { - value: - 'Afterburn reduces Medi Gun healing and resist shield effects.\nAlt-Fire: Release a blast of air that pushes enemies and projectiles and extinguishes teammates that are on fire.', - }, - { value: ' ' }, - { value: ' ' }, - { value: 'Concealed Killer Collection' }, - { value: ' Sand Cannon Rocket Launcher', color: 'eb4b4b' }, - { value: ' Red Rock Roscoe Pistol', color: 'eb4b4b' }, - { value: ' Psychedelic Slugger Revolver', color: 'd32ce6' }, - { value: ' Purple Range Sniper Rifle', color: 'd32ce6' }, - { - value: ' Sudden Flurry Stickybomb Launcher', - color: 'd32ce6', - }, - { value: ' Night Terror Scattergun', color: '8847ff' }, - { - value: ' Carpet Bomber Stickybomb Launcher', - color: '8847ff', - }, - { - value: ' Woodland Warrior Rocket Launcher', - color: '8847ff', - }, - { value: ' Wrapped Reviver Medi Gun', color: '8847ff' }, - { value: ' Night Owl Sniper Rifle', color: '4b69ff' }, - { value: ' Woodsy Widowmaker SMG', color: '4b69ff' }, - { value: ' Backwoods Boomstick Shotgun', color: '4b69ff' }, - { value: ' King of the Jungle Minigun', color: '4b69ff' }, - { value: ' Masked Mender Medi Gun', color: '4b69ff' }, - { value: '★ Forest Fire Flame Thrower', color: '4b69ff' }, - ], - tradable: 1, - actions: [ - { - link: - 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=15005&lang=en_US', - name: 'Item Wiki Page...', - }, - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D6922402693932635553', - name: 'Inspect in Game...', - }, - ], - name: 'Festivized Forest Fire Flame Thrower', - name_color: '8650AC', - type: '', - market_name: - 'Unusual Festivized Specialized Killstreak Forest Fire Flame Thrower (Minimal Wear)', - market_hash_name: - 'Unusual Festivized Specialized Killstreak Forest Fire Flame Thrower (Minimal Wear)', - market_actions: [ - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D6922402693932635553', - name: 'Inspect in Game...', - }, - ], - commodity: 0, - market_tradable_restriction: 7, - market_marketable_restriction: 0, - marketable: 1, - tags: [ - { - category: 'Quality', - internal_name: 'rarity4', - localized_category_name: 'Quality', - localized_tag_name: 'Unusual', - color: '8650AC', - }, - { - category: 'Type', - internal_name: 'primary', - localized_category_name: 'Type', - localized_tag_name: 'Primary weapon', - }, - { - category: 'Class', - internal_name: 'Pyro', - localized_category_name: 'Class', - localized_tag_name: 'Pyro', - }, - { - category: 'Rarity', - internal_name: 'Rarity_Rare', - localized_category_name: 'Grade', - localized_tag_name: 'Mercenary', - color: '4b69ff', - }, - { - category: 'Collection', - internal_name: 'concealedkiller_collection', - localized_category_name: 'Collection', - localized_tag_name: 'Concealed Killer Collection', - }, - { - category: 'Exterior', - internal_name: 'TFUI_InvTooltip_MinimalWear', - localized_category_name: 'Exterior', - localized_tag_name: 'Minimal Wear', - }, - ], - }, true, false); - - assert.deepEqual(econItem, { - name: 'Flame Thrower', - fullName: - 'Cool Festivized Specialized Killstreak Forest Fire Flame Thrower (Minimal Wear)', - id: '8407830034', - img: - 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffsDz5zdwmTVPAOCcot8Qn-Wxg07dR3XcGzub5ffwvmttSXYrAlY9xFTMaCUvbXNQz_6EkwiPRYKJaIon-9jHjrOWoUG0280KDki-w/', - tradable: true, - craftable: true, - quality: 5, - texture: 9, - wear: 2, - killstreak: 2, - festivized: true, - effect: 703, - classes: ['Pyro'], - type: 'primary', - collection: 'Concealed Killer Collection', - grade: 'Mercenary', - parts: [], - spells: [], - marketable: true, - commodity: false, - sheen: "Agonizing Emerald", - level: -1, - }); - }); - - it('Case #2', () => { - const econItem = parseEconItem({ - appid: 440, - contextid: '2', - assetid: '8555715171', - classid: '3717643208', - instanceid: '344437314', - amount: '1', - currency: 0, - background_color: '3C352E', - icon_url: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEJeQQaWA_dtDlRj82oVPeJUbRTyohkssUGjDBox1IsNrKxaWc1JFWQWPYHDKFsow2_WyVlv4lzWtBtJvRLsg', - icon_url_large: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEJeQQaWA_dtDlRj82oVPeJUbRTyohkssUGjDBox1IsNrKxaWc1JFWQWPYHDKFsow2_WyVlv4lzWtBtJvRLsg', - descriptions: [ - { value: "★ Unusual Effect: Nuts n' Bolts", color: 'ffd700' }, - { value: "''hmm epic''" }, - ], - tradable: 1, - actions: [ - { - link: - 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=434&lang=en_US', - name: 'Item Wiki Page...', - }, - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D16442165943709427870', - name: 'Inspect in Game...', - }, - ], - name: 'Unusual Brain Bucket', - name_color: '8650AC', - type: 'Level 82 Hat', - market_name: 'Unusual Brain Bucket', - market_hash_name: 'Unusual Brain Bucket', - market_actions: [ - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D16442165943709427870', - name: 'Inspect in Game...', - }, - ], - commodity: 0, - market_tradable_restriction: 7, - market_marketable_restriction: 0, - marketable: 1, - tags: [ - { - category: 'Quality', - internal_name: 'rarity4', - localized_category_name: 'Quality', - localized_tag_name: 'Unusual', - color: '8650AC', - }, - { - category: 'Type', - internal_name: 'misc', - localized_category_name: 'Type', - localized_tag_name: 'Cosmetic', - }, - { - category: 'Class', - internal_name: 'Soldier', - localized_category_name: 'Class', - localized_tag_name: 'Soldier', - }, - ], - }, true, false); - - assert.deepEqual(econItem, { - name: 'Brain Bucket', - fullName: "Nuts n' Bolts Brain Bucket", - id: '8555715171', - img: - 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEJeQQaWA_dtDlRj82oVPeJUbRTyohkssUGjDBox1IsNrKxaWc1JFWQWPYHDKFsow2_WyVlv4lzWtBtJvRLsg/', - tradable: true, - craftable: true, - quality: 5, - effect: 31, - classes: ['Soldier'], - type: 'misc', - parts: [], - spells: [], - marketable: true, - commodity: false, - level: 82, - }); - }); - - it('Case #3', () => { - const econItem = parseEconItem({ - appid: 440, - contextid: '2', - assetid: '8574678947', - classid: '3555490789', - instanceid: '856289751', - amount: '1', - currency: 0, - background_color: '3C352E', - icon_url: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEDewlDDUq7hytIncTqD-CJGu8_l9sn4pUbi2Ftw1ApbbXtNmM_cVTEV_lbWaw7pQu0W3Rr6sVlAdPvoOhScFnt4pyGbefmPm6lTg', - icon_url_large: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEDewlDDUq7hytIncTqD-CJGu8_l9sn4pUbi2Ftw1ApbbXtNmM_cVTEV_lbWaw7pQu0W3Rr6sVlAdPvoOhScFnt4pyGbefmPm6lTg', - descriptions: [ - { value: 'Commando Grade Hat', color: '8847ff' }, - { - value: '★ Unusual Effect: Twisted Radiance', - color: 'ffd700', - }, - { value: ' ' }, - { value: ' ' }, - { value: 'Spooky Spoils Collection' }, - { value: ' Mister Bones', color: 'eb4b4b' }, - { value: " Pyr'o Lantern", color: 'eb4b4b' }, - { value: ' Racc Mann', color: 'd32ce6' }, - { value: ' Head of the Dead', color: 'd32ce6' }, - { value: ' Elizabeth the Third', color: 'd32ce6' }, - { value: ' The Trick Stabber', color: 'd32ce6' }, - { value: ' El Zapateador', color: '8847ff' }, - { value: ' The Horrible Horns', color: '8847ff' }, - { value: '★ Skullbrero', color: '8847ff' }, - { value: ' Soviet Strongmann', color: '8847ff' }, - { value: ' Voodoo Vizier', color: '8847ff' }, - { value: " Madmann's Muzzle", color: '8847ff' }, - { value: ' BINOCULUS!', color: '4b69ff' }, - { value: ' Derangement Garment', color: '4b69ff' }, - { value: ' Convict Cap', color: '4b69ff' }, - { value: ' El Mostacho', color: '4b69ff' }, - { value: ' Candy Cranium', color: '4b69ff' }, - { value: ' Bat Hat', color: '4b69ff' }, - { value: ' Pocket Halloween Boss', color: '4b69ff' }, - { value: ' Party Poncho', color: '4b69ff' }, - { value: ' Fuel Injector', color: '4b69ff' }, - { value: ' Bread Biter', color: '4b69ff' }, - ], - tradable: 1, - actions: [ - { - link: - 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=31066&lang=en_US', - name: 'Item Wiki Page...', - }, - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D5006617706189886078', - name: 'Inspect in Game...', - }, - ], - name: 'Unusual Skullbrero', - name_color: '8650AC', - type: 'Level 57 Hat', - market_name: 'Unusual Skullbrero', - market_hash_name: 'Unusual Skullbrero', - market_actions: [ - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D5006617706189886078', - name: 'Inspect in Game...', - }, - ], - commodity: 0, - market_tradable_restriction: 7, - market_marketable_restriction: 0, - marketable: 1, - tags: [ - { - category: 'Quality', - internal_name: 'rarity4', - localized_category_name: 'Quality', - localized_tag_name: 'Unusual', - color: '8650AC', - }, - { - category: 'Type', - internal_name: 'misc', - localized_category_name: 'Type', - localized_tag_name: 'Cosmetic', - }, - { - category: 'Class', - internal_name: 'Pyro', - localized_category_name: 'Class', - localized_tag_name: 'Pyro', - }, - { - category: 'Rarity', - internal_name: 'Rarity_Mythical', - localized_category_name: 'Grade', - localized_tag_name: 'Commando', - color: '8847ff', - }, - { - category: 'Collection', - internal_name: 'halloween2019_collection_name', - localized_category_name: 'Collection', - localized_tag_name: 'Spooky Spoils Collection', - }, - ], - }, true, false); - - assert.deepEqual(econItem, { - name: 'Skullbrero', - fullName: 'Twisted Radiance Skullbrero', - id: '8574678947', - img: - 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEDewlDDUq7hytIncTqD-CJGu8_l9sn4pUbi2Ftw1ApbbXtNmM_cVTEV_lbWaw7pQu0W3Rr6sVlAdPvoOhScFnt4pyGbefmPm6lTg/', - tradable: true, - craftable: true, - quality: 5, - effect: 130, - classes: ['Pyro'], - type: 'misc', - collection: 'Spooky Spoils Collection', - grade: 'Commando', - parts: [], - spells: [], - marketable: true, - commodity: false, - level: 57, - }); - }); - - it('Case #4', () => { - const econItem = parseEconItem({ - appid: 440, - contextid: '2', - assetid: '8610658018', - classid: '171010366', - instanceid: '176498576', - amount: '1', - currency: 0, - background_color: '3C352E', - icon_url: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEbfgYfXh7wqwdTmsHiCM2ACfIHnpRh5MkG3G8zyVMpYebiYm8wdFGTBPILC_BvrQu9X3RqupQ6AYPhp-wHZ0yx43BgcxIX', - icon_url_large: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEbfgYfXh7wqwdTmsHiCM2ACfIHnpRh5MkG3G8zyVMpYebiYm8wdFGTBPILC_BvrQu9X3RqupQ6AYPhp-wHZ0yx43BgcxIX', - descriptions: [ - { value: '★ Unusual Effect: Smoking', color: 'ffd700' }, - ], - tradable: 1, - actions: [ - { - link: - 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=318&lang=en_US', - name: 'Item Wiki Page...', - }, - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D10290164463146604828', - name: 'Inspect in Game...', - }, - ], - name: "Unusual Prancer's Pride", - name_color: '8650AC', - type: 'Level 88 Hat', - market_name: "Unusual Prancer's Pride", - market_hash_name: "Unusual Prancer's Pride", - market_actions: [ - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D10290164463146604828', - name: 'Inspect in Game...', - }, - ], - commodity: 0, - market_tradable_restriction: 7, - market_marketable_restriction: 0, - marketable: 1, - tags: [ - { - category: 'Quality', - internal_name: 'rarity4', - localized_category_name: 'Quality', - localized_tag_name: 'Unusual', - color: '8650AC', - }, - { - category: 'Type', - internal_name: 'misc', - localized_category_name: 'Type', - localized_tag_name: 'Cosmetic', - }, - { - category: 'Class', - internal_name: 'Pyro', - localized_category_name: 'Class', - localized_tag_name: 'Pyro', - }, - ], - }, true, false); - - assert.deepEqual(econItem, { - name: "Prancer's Pride", - fullName: "Smoking Prancer's Pride", - id: '8610658018', - img: - 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEbfgYfXh7wqwdTmsHiCM2ACfIHnpRh5MkG3G8zyVMpYebiYm8wdFGTBPILC_BvrQu9X3RqupQ6AYPhp-wHZ0yx43BgcxIX/', - tradable: true, - craftable: true, - quality: 5, - effect: 35, - classes: ['Pyro'], - type: 'misc', - parts: [], - spells: [], - marketable: true, - commodity: false, - level: 88, - }); - }); - - it('Case #5', () => { - const econItem = parseEconItem({ - appid: 440, - contextid: '2', - assetid: '8656785508', - classid: '3543846179', - instanceid: '3516082756', - amount: '1', - currency: 0, - background_color: '3C352E', - icon_url: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffjDz5zdwmTVPAOCsot8Qn-Whg07dR3XcGzuehWe1q65oHFOuQpN4kZGpOECffQZl39vho_1KdefJbbonvq3SvubmwUG028UzYUYzA', - icon_url_large: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffjDz5zdwmTVPAOCsot8Qn-Whg07dR3XcGzuehWe1q65oHFOuQpN4kZGpOECffQZl39vho_1KdefJbbonvq3SvubmwUG028UzYUYzA', - descriptions: [ - { - value: 'Commando Grade Rocket Launcher (Field-Tested)', - color: '8847ff', - }, - { value: 'Festivized', color: 'ffd700' }, - { - value: - 'Halloween: Pumpkin Bombs (spell only active during event)', - color: '7ea9d1', - }, - { value: 'Sheen: Agonizing Emerald', color: '7ea9d1' }, - { value: 'Killstreaks Active', color: '7ea9d1' }, - { - value: '\nGift from: VLaDOS | S>C.MOON YELLOW BELT', - color: '7ea9d1', - }, - { - value: - 'Date Received: Tuesday, September 10, 2019 (9:36:39) GMT', - }, - { value: ' ' }, - { value: ' ' }, - { value: 'Concealed Killer Collection' }, - { value: ' Sand Cannon Rocket Launcher', color: 'eb4b4b' }, - { value: ' Red Rock Roscoe Pistol', color: 'eb4b4b' }, - { value: ' Psychedelic Slugger Revolver', color: 'd32ce6' }, - { value: ' Purple Range Sniper Rifle', color: 'd32ce6' }, - { - value: ' Sudden Flurry Stickybomb Launcher', - color: 'd32ce6', - }, - { value: ' Night Terror Scattergun', color: '8847ff' }, - { - value: ' Carpet Bomber Stickybomb Launcher', - color: '8847ff', - }, - { - value: '✔ Woodland Warrior Rocket Launcher', - color: '8847ff', - }, - { value: ' Wrapped Reviver Medi Gun', color: '8847ff' }, - { value: ' Night Owl Sniper Rifle', color: '4b69ff' }, - { value: ' Woodsy Widowmaker SMG', color: '4b69ff' }, - { value: ' Backwoods Boomstick Shotgun', color: '4b69ff' }, - { value: ' King of the Jungle Minigun', color: '4b69ff' }, - { value: ' Masked Mender Medi Gun', color: '4b69ff' }, - { value: ' Forest Fire Flame Thrower', color: '4b69ff' }, - ], - tradable: 1, - actions: [ - { - link: - 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=15006&lang=en_US', - name: 'Item Wiki Page...', - }, - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D11534198800805877074', - name: 'Inspect in Game...', - }, - ], - fraudwarnings: [ - 'This item has been renamed.\nOriginal name: "Rocket Launcher"', - ], - name: "''post live spell rocket louncher !!!!!!!''", - name_color: 'FAFAFA', - type: '', - market_name: - 'Festivized Specialized Killstreak Woodland Warrior Rocket Launcher (Field-Tested)', - market_hash_name: - 'Festivized Specialized Killstreak Woodland Warrior Rocket Launcher (Field-Tested)', - market_actions: [ - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D11534198800805877074', - name: 'Inspect in Game...', - }, - ], - commodity: 0, - market_tradable_restriction: 7, - market_marketable_restriction: 0, - marketable: 1, - tags: [ - { - category: 'Quality', - internal_name: 'paintkitweapon', - localized_category_name: 'Quality', - localized_tag_name: 'Decorated Weapon', - color: 'FAFAFA', - }, - { - category: 'Type', - internal_name: 'primary', - localized_category_name: 'Type', - localized_tag_name: 'Primary weapon', - }, - { - category: 'Class', - internal_name: 'Soldier', - localized_category_name: 'Class', - localized_tag_name: 'Soldier', - }, - { - category: 'Rarity', - internal_name: 'Rarity_Mythical', - localized_category_name: 'Grade', - localized_tag_name: 'Commando', - color: '8847ff', - }, - { - category: 'Collection', - internal_name: 'concealedkiller_collection', - localized_category_name: 'Collection', - localized_tag_name: 'Concealed Killer Collection', - }, - { - category: 'Exterior', - internal_name: 'TFUI_InvTooltip_FieldTested', - localized_category_name: 'Exterior', - localized_tag_name: 'Field-Tested', - }, - ], - }, true, false); - - assert.deepEqual(econItem, { - name: 'Rocket Launcher', - fullName: - 'Festivized Specialized Killstreak Woodland Warrior Rocket Launcher (Field-Tested)', - id: '8656785508', - img: - 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffjDz5zdwmTVPAOCsot8Qn-Whg07dR3XcGzuehWe1q65oHFOuQpN4kZGpOECffQZl39vho_1KdefJbbonvq3SvubmwUG028UzYUYzA/', - tradable: true, - craftable: true, - quality: 15, - texture: 6, - wear: 3, - festivized: true, - killstreak: 2, - classes: ['Soldier'], - type: 'primary', - collection: 'Concealed Killer Collection', - grade: 'Commando', - parts: [], - spells: ['Pumpkin Bombs'], - marketable: true, - commodity: false, - sheen: "Agonizing Emerald", - level: -1, - }); - }); - - it('Case #6', () => { - const econItem = parseEconItem({ - appid: 440, - contextid: '2', - assetid: '8733746813', - classid: '221512872', - instanceid: '92637229', - amount: '1', - currency: 0, - background_color: '3C352E', - icon_url: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEDe1VBDEjdqCEX2PfnGOaDBeEUlNQK6ZFH3jMlwwB_Y7vhZ2Q0JFKQAKQJXadrpF6-UXE268I3UNHg8esHfF28tdHHO65sbo88eQy8bA', - icon_url_large: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEDe1VBDEjdqCEX2PfnGOaDBeEUlNQK6ZFH3jMlwwB_Y7vhZ2Q0JFKQAKQJXadrpF6-UXE268I3UNHg8esHfF28tdHHO65sbo88eQy8bA', - descriptions: [ - { - value: 'Holiday Restriction: Halloween / Full Moon', - color: 'd83636', - }, - { - value: - 'Halloween: Spectral Spectrum (spell only active during event)', - color: '7ea9d1', - }, - { value: '' }, - ], - tradable: 1, - actions: [ - { - link: - 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=30290&lang=en_US', - name: 'Item Wiki Page...', - }, - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D16238051287194648628', - name: 'Inspect in Game...', - }, - ], - name: 'Haunted PY-40 Incinibot', - name_color: '38f3ab', - type: 'Level 58 Mask', - market_name: 'Haunted PY-40 Incinibot', - market_hash_name: 'Haunted PY-40 Incinibot', - market_actions: [ - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D16238051287194648628', - name: 'Inspect in Game...', - }, - ], - commodity: 0, - market_tradable_restriction: 7, - market_marketable_restriction: 0, - marketable: 1, - tags: [ - { - category: 'Quality', - internal_name: 'haunted', - localized_category_name: 'Quality', - localized_tag_name: 'Haunted', - color: '38f3ab', - }, - { - category: 'Type', - internal_name: 'misc', - localized_category_name: 'Type', - localized_tag_name: 'Cosmetic', - }, - { - category: 'Class', - internal_name: 'Pyro', - localized_category_name: 'Class', - localized_tag_name: 'Pyro', - }, - ], - }, true, false); - - assert.deepEqual(econItem, { - name: 'PY-40 Incinibot', - fullName: 'Haunted PY-40 Incinibot', - id: '8733746813', - img: - 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEDe1VBDEjdqCEX2PfnGOaDBeEUlNQK6ZFH3jMlwwB_Y7vhZ2Q0JFKQAKQJXadrpF6-UXE268I3UNHg8esHfF28tdHHO65sbo88eQy8bA/', - tradable: true, - craftable: true, - quality: 13, - classes: ['Pyro'], - type: 'misc', - parts: [], - spells: ['Spectral Spectrum'], - marketable: true, - commodity: false, - level: 58, - }); - }); - - it('Case #7', () => { - const econItem = parseEconItem({ - appid: 440, - contextid: '2', - assetid: '8434754722', - classid: '88783771', - instanceid: '92739934', - amount: '1', - currency: 0, - background_color: '3C352E', - icon_url: - 'IzMF03bi9WpSBq-S-ekoE33L-iLqGFHVaU25ZzQNQcXdEH9myp0erksICfTcePMQFc1nqWSMU5OD2NwOx3sIyShXOjLx2Sk5MbUqMcbBnQz4ruyeU2DgVzPLKCnYCGFgGOIYfAeFr3HysPORE2vPELl_RQEMdaFX9GxObM-BOEE_goVdrTXqlBwkHRNxJ5VFcVbihGQdNlNSNRp3', - icon_url_large: - 'IzMF03bi9WpSBq-S-ekoE33L-iLqGFHVaU25ZzQNQcXdEH9myp0erksICfTcePMQFc1nqWSMU5OD2NwOx3sIyShXOjLx2Sk5MbUqMcbBnQz4ruyeU2DgVzPLKCnYCGFgGOIYfAeFr3HysPORE2vPELl_RQEMdaFX9GxObM-BOEE_goVdrTXqlBwkHRNxJ5VFcVbihGQdNlNSNRp3', - descriptions: [ - { - value: "Paint Color: Noble Hatter's Violet", - color: '756b5e', - }, - { - value: - 'Halloween: Spectral Spectrum (spell only active during event)', - color: '7ea9d1', - }, - { - value: - "The K-9 mane is perfect for tricky social situations. People will either only want to talk about the hat, which means they'll be distracted from that rash making its way up your jugular,or they'll avoid you altogether. It's a win/win!", - }, - ], - tradable: 1, - actions: [ - { - link: - 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=876&lang=en_US', - name: 'Item Wiki Page...', - }, - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D7378163898213210976', - name: 'Inspect in Game...', - }, - ], - name: 'Genuine K-9 Mane', - name_color: '4D7455', - type: 'Level 1 Spirit Animal', - market_name: 'Genuine K-9 Mane', - market_hash_name: 'Genuine K-9 Mane', - market_actions: [ - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D7378163898213210976', - name: 'Inspect in Game...', - }, - ], - commodity: 0, - market_tradable_restriction: 7, - market_marketable_restriction: 0, - marketable: 1, - tags: [ - { - category: 'Quality', - internal_name: 'rarity1', - localized_category_name: 'Quality', - localized_tag_name: 'Genuine', - color: '4D7455', - }, - { - category: 'Type', - internal_name: 'misc', - localized_category_name: 'Type', - localized_tag_name: 'Cosmetic', - }, - { - category: 'Class', - internal_name: 'Demoman', - localized_category_name: 'Class', - localized_tag_name: 'Demoman', - }, - { - category: 'Class', - internal_name: 'Heavy', - localized_category_name: 'Class', - localized_tag_name: 'Heavy', - }, - ], - }, true, false); - - assert.deepEqual(econItem, { - name: 'K-9 Mane', - fullName: 'Genuine K-9 Mane', - id: '8434754722', - img: - 'https://steamcommunity-a.akamaihd.net/economy/image/IzMF03bi9WpSBq-S-ekoE33L-iLqGFHVaU25ZzQNQcXdEH9myp0erksICfTcePMQFc1nqWSMU5OD2NwOx3sIyShXOjLx2Sk5MbUqMcbBnQz4ruyeU2DgVzPLKCnYCGFgGOIYfAeFr3HysPORE2vPELl_RQEMdaFX9GxObM-BOEE_goVdrTXqlBwkHRNxJ5VFcVbihGQdNlNSNRp3/', - tradable: true, - craftable: true, - quality: 1, - classes: ['Demoman', 'Heavy'], - type: 'misc', - parts: [], - spells: ['Spectral Spectrum'], - marketable: true, - commodity: false, - paint: "Noble Hatter's Violet", - level: 1, - }); - }); - - it('Case #8', () => { - const econItem = parseEconItem({ - appid: 440, - contextid: '2', - assetid: '8294625611', - classid: '1336074160', - instanceid: '3639098153', - amount: '1', - currency: 0, - background_color: '3C352E', - icon_url: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEfezgSUhr2hzVGjMHlMvyJC-sUkt8K6ZFH3jMllVQrZbvkNG8ydFXAWfEICqFjp160CCNivZI3VY_j9u8DfA6-sYSUN65sbo_U7o3qKw', - icon_url_large: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEfezgSUhr2hzVGjMHlMvyJC-sUkt8K6ZFH3jMllVQrZbvkNG8ydFXAWfEICqFjp160CCNivZI3VY_j9u8DfA6-sYSUN65sbo_U7o3qKw', - descriptions: [ - { value: 'Style: Tie', color: '756b5e' }, - { - value: - 'Halloween: Chromatic Corruption (spell only active during event)', - color: '7ea9d1', - }, - { - value: - 'Halloween: Voices From Below (spell only active during event)', - color: '7ea9d1', - }, - { - value: - "Whether you're trepanning a skull to let out the sickness ghosts or attaching enough leeches to a patient that they'll pass out from blood loss before you cut off any suspicious-lookinglimbs, this dapper ruffed shirt and coat will assure your patients that they came to the right place for their dangerously insane 18th century medicine.", - }, - ], - tradable: 1, - actions: [ - { - link: - 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=878&lang=en_US', - name: 'Item Wiki Page...', - }, - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D434113929687356346', - name: 'Inspect in Game...', - }, - ], - name: 'Strange Genuine Foppish Physician', - name_color: '4D7455', - type: 'Strange Apparel - Points Scored: 1', - market_name: 'Strange Genuine Foppish Physician', - market_hash_name: 'Strange Genuine Foppish Physician', - market_actions: [ - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D434113929687356346', - name: 'Inspect in Game...', - }, - ], - commodity: 0, - market_tradable_restriction: 7, - market_marketable_restriction: 0, - marketable: 1, - tags: [ - { - category: 'Quality', - internal_name: 'rarity1', - localized_category_name: 'Quality', - localized_tag_name: 'Genuine', - color: '4D7455', - }, - { - category: 'Type', - internal_name: 'misc', - localized_category_name: 'Type', - localized_tag_name: 'Cosmetic', - }, - { - category: 'Class', - internal_name: 'Medic', - localized_category_name: 'Class', - localized_tag_name: 'Medic', - }, - ], - }, true, false); - - assert.deepEqual(econItem, { - name: 'Foppish Physician', - fullName: 'Strange Genuine Foppish Physician', - id: '8294625611', - img: - 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEfezgSUhr2hzVGjMHlMvyJC-sUkt8K6ZFH3jMllVQrZbvkNG8ydFXAWfEICqFjp160CCNivZI3VY_j9u8DfA6-sYSUN65sbo_U7o3qKw/', - tradable: true, - craftable: true, - quality: 1, - elevated: true, - classes: ['Medic'], - type: 'misc', - parts: [], - spells: ['Chromatic Corruption', 'Voices From Below'], - marketable: true, - commodity: false, - level: -1, - }); - }); - - it('Case #9', () => { - const econItem = parseEconItem({ - "appid":440,"classid":"4044585817","instanceid":"11040545","currency":0,"background_color":"3C352E","icon_url":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEYYwsVVB7whyJMhcrvCM2ACfIHnpRi4cBQjGc6xAQjNbuwYGMwJlfHWfAMDaRjpQm6CCVhsZJhUIW3r-9TZ0yx4-owIvoI","icon_url_large":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEYYwsVVB7whyJMhcrvCM2ACfIHnpRi4cBQjGc6xAQjNbuwYGMwJlfHWfAMDaRjpQm6CCVhsZJhUIW3r-9TZ0yx4-owIvoI", - "descriptions":[ - {"value":"Holiday Restriction: Halloween / Full Moon","color":"756b5e"}, - {"value":"''Halloween: Chromatic Corruption (spell only active during event)''", "color": "756b5e"}, - {"value":"''Sheen: sheen''", "color": "756b5e"}, - {"value":"''Paint: paint''", "color": "756b5e"}, - {"value":"''Festivized''", "color": "756b5e"}, - {"value":"''( Not Usable in Crafting )''", "color": "756b5e"}, - ],"tradable":1,"actions":[{"link":"http://wiki.teamfortress.com/scripts/itemredirect.php?id=5618&lang=en_US","name":"Item Wiki Page..."},{"link":"steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D12289692045334241370","name":"Inspect in Game..."}],"name":"Haunted Voodoo-Cursed Soldier Soul","name_color":"38f3ab","type":"Level 1 Cursed Soul","market_name":"Haunted Voodoo-Cursed Soldier Soul","market_hash_name":"Haunted Voodoo-Cursed Soldier Soul","market_actions":[{"link":"steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D12289692045334241370","name":"Inspect in Game..."}],"commodity":0,"market_tradable_restriction":7,"market_marketable_restriction":0,"marketable":1,"tags":[{"category":"Quality","internal_name":"haunted","localized_category_name":"Quality","localized_tag_name":"Haunted","color":"38f3ab"},{"category":"Type","internal_name":"misc","localized_category_name":"Type","localized_tag_name":"Cosmetic"},{"category":"Class","internal_name":"Soldier","localized_category_name":"Class","localized_tag_name":"Soldier"}] - }, false, false); - - assert.deepEqual(econItem, { - name: 'Voodoo-Cursed Soldier Soul', - fullName: 'Haunted Voodoo-Cursed Soldier Soul', - id: undefined, - img: 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEYYwsVVB7whyJMhcrvCM2ACfIHnpRi4cBQjGc6xAQjNbuwYGMwJlfHWfAMDaRjpQm6CCVhsZJhUIW3r-9TZ0yx4-owIvoI/', - tradable: true, - craftable: true, - quality: 'Haunted', - classes: [ 'Soldier' ], - type: 'misc', - parts: [], - spells: [], - marketable: true, - commodity: false, - level: 1, - }); - }) - - it('Case #10', () => { - const econItem = parseEconItem({ - "appid":440,"classid":"4044585817","instanceid":"11040545","currency":0,"background_color":"3C352E","icon_url":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEYYwsVVB7whyJMhcrvCM2ACfIHnpRi4cBQjGc6xAQjNbuwYGMwJlfHWfAMDaRjpQm6CCVhsZJhUIW3r-9TZ0yx4-owIvoI","icon_url_large":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEYYwsVVB7whyJMhcrvCM2ACfIHnpRi4cBQjGc6xAQjNbuwYGMwJlfHWfAMDaRjpQm6CCVhsZJhUIW3r-9TZ0yx4-owIvoI", - "descriptions":[ - {"value":"Holiday Restriction: Halloween / Full Moon","color":"756b5e"}, - {"value":"''★ Unusual Effect: Burning Flames''"}, - {"value":"''★ Unusual Effect: Burning Flames''"} - ],"tradable":1,"actions":[{"link":"http://wiki.teamfortress.com/scripts/itemredirect.php?id=5618&lang=en_US","name":"Item Wiki Page..."},{"link":"steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D12289692045334241370","name":"Inspect in Game..."}],"name":"Haunted Voodoo-Cursed Soldier Soul","name_color":"38f3ab","type":"Level 1 Cursed Soul","market_name":"Haunted Voodoo-Cursed Soldier Soul","market_hash_name":"Haunted Voodoo-Cursed Soldier Soul","market_actions":[{"link":"steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D12289692045334241370","name":"Inspect in Game..."}],"commodity":0,"market_tradable_restriction":7,"market_marketable_restriction":0,"marketable":1,"tags":[{"category":"Quality","internal_name":"haunted","localized_category_name":"Quality","localized_tag_name":"Haunted","color":"38f3ab"},{"category":"Type","internal_name":"misc","localized_category_name":"Type","localized_tag_name":"Cosmetic"},{"category":"Class","internal_name":"Soldier","localized_category_name":"Class","localized_tag_name":"Soldier"}] - }); - - assert.deepEqual(econItem, { - name: 'Voodoo-Cursed Soldier Soul', - fullName: 'Haunted Voodoo-Cursed Soldier Soul', - id: undefined, - img: 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEYYwsVVB7whyJMhcrvCM2ACfIHnpRi4cBQjGc6xAQjNbuwYGMwJlfHWfAMDaRjpQm6CCVhsZJhUIW3r-9TZ0yx4-owIvoI/', - tradable: true, - craftable: true, - quality: 'Haunted', - classes: [ 'Soldier' ], - type: 'misc', - parts: [], - spells: [], - marketable: true, - commodity: false, - level: 1, - }); - }) - - it('Case #11', () => { - const econItem = parseEconItem({ - "appid": "440", - "classid": "2871127490", - "instanceid": "3522129930", - "icon_url": "fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIUwsUWBjqvy1Nt8_pAfazBOESnN97vZQFgGVtyQUrbeW2ZjM_IFHGA_JYC_BuoQ7qDyJlusVnUdO1orpQfRKv6tW-OVvZVQ", - "icon_url_large": "fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIUwsUWBjqvy1Nt8_pAfazBOESnN97vZQFgGVtyQUrbeW2ZjM_IFHGA_JYC_BuoQ7qDyJlusVnUdO1orpQfRKv6tW-OVvZVQ", - "icon_drag_url": "", - "name": "Strange Australium Blutsauger", - "market_hash_name": "Strange Australium Blutsauger", - "market_name": "Strange Australium Blutsauger", - "name_color": "CF6A32", - "background_color": "3C352E", - "type": "Strange Syringe Gun - Kills: 20", - "tradable": 1, - "marketable": 1, - "commodity": 0, - "market_tradable_restriction": "7", - "market_marketable_restriction": "0", - "descriptions": [ - { - "value": "(Cloaked Spies Killed: 0)", - "color": "756b5e" - }, - { - "value": "''(Killstreaks Ended: 0)''", - "color": "756b5e" - }, - { - "value": "(Scouts Killed: 0)", - "color": "756b5e" - }, - { - "value": "On Hit: Gain up to +3 health", - "color": "7ea9d1" - }, - { - "value": "-2 health drained per second on wearer", - "color": "d83636" - } - ], - "actions": [ - { - "name": "Item Wiki Page...", - "link": "http://wiki.teamfortress.com/scripts/itemredirect.php?id=36&lang=en_US" - } - ], - "tags": [ - { - "internal_name": "strange", - "name": "Strange", - "category": "Quality", - "color": "CF6A32", - "category_name": "Quality" - }, - { - "internal_name": "primary", - "name": "Primary weapon", - "category": "Type", - "category_name": "Type" - }, - { - "internal_name": "Medic", - "name": "Medic", - "category": "Class", - "category_name": "Class" - } - ], - "app_data": { - "def_index": "36", - "quality": "11" - } - }, false, false); - - assert.deepEqual(econItem, { - name: 'Blutsauger', - fullName: 'Strange Australium Blutsauger', - id: undefined, - img: 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIUwsUWBjqvy1Nt8_pAfazBOESnN97vZQFgGVtyQUrbeW2ZjM_IFHGA_JYC_BuoQ7qDyJlusVnUdO1orpQfRKv6tW-OVvZVQ/', - tradable: true, - craftable: true, - quality: 'Strange', - australium: true, - classes: [ 'Medic' ], - type: 'primary', - parts: [ 'Cloaked Spies Killed', 'Scouts Killed' ], - spells: [], - marketable: true, - commodity: false, - level: -1, - }); - }); - - it('Case #12', () => { - const econItem = parseEconItem({ - "appid":"440", - "classid":"2625497429", - "instanceid":"4048537137", - "icon_url":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffgYghuZgHPUPUOCacF4w3tG3J86sI7V47mp-JTLQu-vNTGYbh_MNgYHMeFXPHVY139uEk9g_VbK52LqTSvg3pcnpTOhA", - "icon_url_large":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffgYghuZgHPUPUOCacF4w3tG3J86sI7V47mp-JTLQu-vNTGYbh_MNgYHMeFXPHVY139uEk9g_VbK52LqTSvg3pcnpTOhA", - "icon_drag_url":"", - "name":"Shell Shocker Rocket Launcher", - "market_hash_name":"Strange Specialized Killstreak Shell Shocker Rocket Launcher (Battle Scarred)", - "market_name":"Strange Specialized Killstreak Shell Shocker Rocket Launcher (Battle Scarred)", - "name_color":"CF6A32", - "background_color":"3C352E", - "type":"", - "tradable":1, - "marketable":1, - "commodity":0, - "market_tradable_restriction":"7", - "market_marketable_restriction":"0", - "descriptions":[ - { - "value":"Assassin Grade Rocket Launcher (Battle Scarred)", - "color":"d32ce6" - }, - { - "value":"Strange Stat Clock Attached", - "color":"CF6A32" - }, - { - "value":" Kills: 5121", - "color":"756b5e" - }, - { - "value":" Pyros Killed: 712", - "color":"756b5e" - }, - { - "value":"Team Colored Decorated Weapon" - }, - { - "value":"Halloween: Pumpkin Bombs (spell only active during event)", - "color":"7ea9d1" - }, - { - "value":"Sheen: Mean Green", - "color":"7ea9d1" - }, - { - "value":"Killstreaks Active", - "color":"7ea9d1" - }, - { - "value":" " - }, - { - "value":" " - }, - { - "value":"Powerhouse Collection" - }, - { - "value":" Liquid Asset Stickybomb Launcher", - "color":"eb4b4b", - "app_data":{ - "def_index":"15045" - } - }, - { - "value":" Thunderbolt Sniper Rifle", - "color":"eb4b4b", - "app_data":{ - "def_index":"15059" - } - }, - { - "value":" Current Event Scattergun", - "color":"d32ce6", - "app_data":{ - "def_index":"15053" - } - }, - { - "value":" Pink Elephant Stickybomb Launcher", - "color":"d32ce6", - "app_data":{ - "def_index":"15048" - } - }, - { - "value":"✔ Shell Shocker Rocket Launcher", - "color":"d32ce6", - "app_data":{ - "def_index":"15052" - } - }, - { - "value":" Flash Fryer Flame Thrower", - "color":"8847ff", - "app_data":{ - "def_index":"15049" - } - }, - { - "value":" Spark of Life Medi Gun", - "color":"8847ff", - "app_data":{ - "def_index":"15050" - } - }, - { - "value":" Dead Reckoner Revolver", - "color":"8847ff", - "app_data":{ - "def_index":"15051" - } - }, - { - "value":" Black Dahlia Pistol", - "color":"8847ff", - "app_data":{ - "def_index":"15046" - } - }, - { - "value":" Sandstone Special Pistol", - "color":"8847ff", - "app_data":{ - "def_index":"15056" - } - }, - { - "value":" Brick House Minigun", - "color":"4b69ff", - "app_data":{ - "def_index":"15055" - } - }, - { - "value":" Aqua Marine Rocket Launcher", - "color":"4b69ff", - "app_data":{ - "def_index":"15057" - } - }, - { - "value":" Low Profile SMG", - "color":"4b69ff", - "app_data":{ - "def_index":"15058" - } - }, - { - "value":" Turbine Torcher Flame Thrower", - "color":"4b69ff", - "app_data":{ - "def_index":"15054" - } - }, - { - "value":" Lightning Rod Shotgun", - "color":"4b69ff", - "app_data":{ - "def_index":"15047" - } - } - ], - "actions":[ - { - "name":"Item Wiki Page...", - "link":"http:\/\/wiki.teamfortress.com\/scripts\/itemredirect.php?id=15052&lang=en_US" - }, - { - "name":"Inspect in Game...", - "link":"steam:\/\/rungame\/440\/76561202255233023\/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D7998211058114246468" - } - ], - "market_actions":[ - { - "name":"Inspect in Game...", - "link":"steam:\/\/rungame\/440\/76561202255233023\/+tf_econ_item_preview%20M%listingid%A%assetid%D7998211058114246468" - } - ], - "tags":[ - { - "internal_name":"strange", - "name":"Strange", - "category":"Quality", - "color":"CF6A32", - "category_name":"Quality" - }, - { - "internal_name":"primary", - "name":"Primary weapon", - "category":"Type", - "category_name":"Type" - }, - { - "internal_name":"Soldier", - "name":"Soldier", - "category":"Class", - "category_name":"Class" - }, - { - "internal_name":"Rarity_Legendary", - "name":"Assassin", - "category":"Rarity", - "color":"d32ce6", - "category_name":"Grade" - }, - { - "internal_name":"Powerhouse_collection", - "name":"Powerhouse Collection", - "category":"Collection", - "category_name":"Collection" - }, - { - "internal_name":"TFUI_InvTooltip_BattleScared", - "name":"Battle Scarred", - "category":"Exterior", - "category_name":"Exterior" - } - ], - "app_data":{ - "def_index":"15052", - "quality":"11" - } - }, false, false); - - assert.deepEqual(econItem, { - name: 'Rocket Launcher', - fullName: 'Strange Specialized Killstreak Shell Shocker Rocket Launcher (Battle Scarred)', - id: undefined, - img: 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffgYghuZgHPUPUOCacF4w3tG3J86sI7V47mp-JTLQu-vNTGYbh_MNgYHMeFXPHVY139uEk9g_VbK52LqTSvg3pcnpTOhA/', - tradable: true, - craftable: true, - quality: "Strange", - texture: "Shell Shocker", - wear: "Battle Scarred", - killstreak: "Specialized Killstreak", - classes: [ 'Soldier' ], - type: 'primary', - collection: 'Powerhouse Collection', - grade: 'Assassin', - parts: [ 'Pyros Killed' ], - spells: [ 'Pumpkin Bombs' ], - marketable: true, - commodity: false, - sheen: "Mean Green", - level: -1, - }); - }) - - it('Case #13', () => { - const econItem = parseEconItem({"appid":"440","classid":"1348131292","instanceid":"93028938","icon_url":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIUwADWBXjvD1Pid3oDvqJGt8Yltsm2pxUyzFu31V9NbPtYTUwdwWbBfkOXfZioFDuWSFku8JnUdLg8ulQLw29tYfCMOQycIYbhNRIXDY","icon_url_large":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIUwADWBXjvD1Pid3oDvqJGt8Yltsm2pxUyzFu31V9NbPtYTUwdwWbBfkOXfZioFDuWSFku8JnUdLg8ulQLw29tYfCMOQycIYbhNRIXDY","icon_drag_url":"","name":"Strange Professional Killstreak Festive Grenade Launcher","market_hash_name":"Strange Professional Killstreak Festive Grenade Launcher","market_name":"Strange Professional Killstreak Festive Grenade Launcher","name_color":"CF6A32","background_color":"3C352E","type":"Limited Strange Grenade Launcher - Kills: 20","tradable":1,"marketable":1,"commodity":0,"market_tradable_restriction":"7","market_marketable_restriction":"0","descriptions":[{"value":"(Airborne Enemy Kills: 4)","color":"756b5e"},{"value":"Halloween: Exorcism (spell only active during event)","color":"7ea9d1"},{"value":"Killstreaker: Hypno-Beam","color":"7ea9d1"},{"value":"Sheen: Manndarin","color":"7ea9d1"},{"value":"Killstreaks Active","color":"7ea9d1"}],"actions":[{"name":"Item Wiki Page...","link":"http:\/\/wiki.teamfortress.com\/scripts\/itemredirect.php?id=1007&lang=en_US"}],"tags":[{"internal_name":"strange","name":"Strange","category":"Quality","color":"CF6A32","category_name":"Quality"},{"internal_name":"primary","name":"Primary weapon","category":"Type","category_name":"Type"},{"internal_name":"Demoman","name":"Demoman","category":"Class","category_name":"Class"}],"app_data":{"def_index":"1007","quality":"11"}}); - - assert.deepEqual(econItem, { - classes: ["Demoman"], - commodity: false, - craftable: true, - fullName: "Strange Professional Killstreak Festive Grenade Launcher", - id: undefined, - img: "https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIUwADWBXjvD1Pid3oDvqJGt8Yltsm2pxUyzFu31V9NbPtYTUwdwWbBfkOXfZioFDuWSFku8JnUdLg8ulQLw29tYfCMOQycIYbhNRIXDY/", - killstreak: "Professional Killstreak", - killstreaker: "Hypno-Beam", - marketable: true, - name: "Festive Grenade Launcher", - parts: [ "Airborne Enemy Kills" ], - quality: "Strange", - sheen: "Manndarin", - spells: [ "Exorcism" ], - tradable: true, - type: "primary", - level: -1, - }); - }) - - it('Case #14', () => { - const econItem = parseEconItem({"appid":"440","classid":"1342604629","instanceid":"98275077","icon_url":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgENYwUuWCT1qj1Ni8DZCv2ADN8Mmsgy4N4Hi2JtxQMtbOftYG9hJgabUaYMCvFroV_uDXBkv8EwVY_koOxWeQq-qsKYZPpiOaow","icon_url_large":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgENYwUuWCT1qj1Ni8DZCv2ADN8Mmsgy4N4Hi2JtxQMtbOftYG9hJgabUaYMCvFroV_uDXBkv8EwVY_koOxWeQq-qsKYZPpiOaow","icon_drag_url":"","name":"Strange Specialized Killstreak Gold Botkiller Wrench Mk.II","market_hash_name":"Strange Specialized Killstreak Gold Botkiller Wrench Mk.II","market_name":"Strange Specialized Killstreak Gold Botkiller Wrench Mk.II","name_color":"CF6A32","background_color":"3C352E","type":"Strange Wrench - Sentry Kills: 12","tradable":1,"marketable":1,"commodity":0,"market_tradable_restriction":"7","market_marketable_restriction":"0","descriptions":[{"value":"(Kills: 1)","color":"756b5e"},{"value":"(Cloaked Spies Killed: 0)","color":"756b5e"},{"value":"Sheen: Deadly Daffodil","color":"7ea9d1"},{"value":"Killstreaks Active","color":"7ea9d1"},{"value":"Upgrades, repairs and speeds up construction of friendly buildings on hit"}],"actions":[{"name":"Item Wiki Page...","link":"http:\/\/wiki.teamfortress.com\/scripts\/itemredirect.php?id=969&lang=en_US"}],"tags":[{"internal_name":"strange","name":"Strange","category":"Quality","color":"CF6A32","category_name":"Quality"},{"internal_name":"melee","name":"Melee weapon","category":"Type","category_name":"Type"},{"internal_name":"Engineer","name":"Engineer","category":"Class","category_name":"Class"}],"app_data":{"def_index":"969","quality":"11"}}); - - assert.deepEqual(econItem, { - parts: [ "Cloaked Spies Killed" ], - "quality": "Strange", - "sheen": "Deadly Daffodil", - "spells": [], - "tradable": true, - "type": "melee", - "classes": [ - "Engineer" - ], - "commodity": false, - "craftable": true, - "fullName": "Strange Specialized Killstreak Gold Botkiller Wrench Mk.II", - "id": undefined, - "img": "https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgENYwUuWCT1qj1Ni8DZCv2ADN8Mmsgy4N4Hi2JtxQMtbOftYG9hJgabUaYMCvFroV_uDXBkv8EwVY_koOxWeQq-qsKYZPpiOaow/", - "killstreak": "Specialized Killstreak", - "marketable": true, - "name": "Gold Botkiller Wrench Mk.II", - level: -1, - }); - }) - - it('Case #15', () => { - const econItem = parseEconItem({"appid":"440","classid":"11042149","instanceid":"19201223","icon_url":"IzMF03bi9WpSBq-S-ekoE33L-iLqGFHVaU25ZzQNQcXdEH9myp0erksICfTdcfMQEpRnqWSMU5OD2NoHwHEIkChXOjLx2Sk5MbUqMcbBnQz4ruyeU3n5awjJLjLaE0pXEvYaYzGdkW_0p7rBXG6aQb0rFl9XK_QM8jdIb82PaURv3dUMrT27kxUqSU5_IZIXcl_smSJdIbMiwRlwHyU","icon_url_large":"IzMF03bi9WpSBq-S-ekoE33L-iLqGFHVaU25ZzQNQcXdEH9myp0erksICfTdcfMQEpRnqWSMU5OD2NoHwHEIkChXOjLx2Sk5MbUqMcbBnQz4ruyeU3n5awjJLjLaE0pXEvYaYzGdkW_0p7rBXG6aQb0rFl9XK_QM8jdIb82PaURv3dUMrT27kxUqSU5_IZIXcl_smSJdIbMiwRlwHyU","icon_drag_url":"","name":"The Essential Accessories","market_hash_name":"The Essential Accessories","market_name":"The Essential Accessories","name_color":"7D6D00","background_color":"3C352E","type":"Limited Level 10 Apparel","tradable":1,"marketable":1,"commodity":0,"market_tradable_restriction":"7","market_marketable_restriction":"0","descriptions":[{"value":"Paint Color: Operator's Overalls","color":"756b5e"},{"value":""}],"actions":[{"name":"Item Wiki Page...","link":"http:\/\/wiki.teamfortress.com\/scripts\/itemredirect.php?id=347&lang=en_US"},{"name":"Inspect in Game...","link":"steam:\/\/rungame\/440\/76561202255233023\/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D2891326522173157497"}],"market_actions":[{"name":"Inspect in Game...","link":"steam:\/\/rungame\/440\/76561202255233023\/+tf_econ_item_preview%20M%listingid%A%assetid%D2891326522173157497"}],"tags":[{"internal_name":"Unique","name":"Unique","category":"Quality","color":"7D6D00","category_name":"Quality"},{"internal_name":"misc","name":"Cosmetic","category":"Type","category_name":"Type"},{"internal_name":"Scout","name":"Scout","category":"Class","category_name":"Class"}],"app_data":{"def_index":"347","quality":"6"}}, false, false); - - assert.deepEqual(econItem, { - "classes": [ - "Scout" - ], - "commodity": false, - "craftable": true, - "fullName": "The Essential Accessories", - "id": undefined, - "img": "https://steamcommunity-a.akamaihd.net/economy/image/IzMF03bi9WpSBq-S-ekoE33L-iLqGFHVaU25ZzQNQcXdEH9myp0erksICfTdcfMQEpRnqWSMU5OD2NoHwHEIkChXOjLx2Sk5MbUqMcbBnQz4ruyeU3n5awjJLjLaE0pXEvYaYzGdkW_0p7rBXG6aQb0rFl9XK_QM8jdIb82PaURv3dUMrT27kxUqSU5_IZIXcl_smSJdIbMiwRlwHyU/", - "marketable": true, - "name": "The Essential Accessories", - "paint": "Operator's Overalls", - "parts": [], - "quality": "Unique", - "spells": [], - "tradable": true, - "type": "misc", - level: -1, - }); - }); -}); - -describe('Econ Item in Numbers', () => { - it('Case #1', () => { - const econItem = parseEconItem( - { - appid: 440, - contextid: '2', - assetid: '8407830034', - classid: '3662018019', - instanceid: '11040671', - amount: '1', - currency: 0, - background_color: '3C352E', - icon_url: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffsDz5zdwmTVPAOCcot8Qn-Wxg07dR3XcGzub5ffwvmttSXYrAlY9xFTMaCUvbXNQz_6EkwiPRYKJaIon-9jHjrOWoUG0280KDki-w', - icon_url_large: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffsDz5zdwmTVPAOCcot8Qn-Wxg07dR3XcGzub5ffwvmttSXYrAlY9xFTMaCUvbXNQz_6EkwiPRYKJaIon-9jHjrOWoUG0280KDki-w', - descriptions: [ - { - value: 'Mercenary Grade Flame Thrower (Minimal Wear)', - color: '4b69ff', - }, - { value: '★ Unusual Effect: Cool', color: 'ffd700' }, - { value: 'Festivized', color: 'ffd700' }, - { - value: 'Extinguishing teammates restores 20 health', - color: '7ea9d1', - }, - { value: 'Sheen: Agonizing Emerald', color: '7ea9d1' }, - { value: 'Killstreaks Active', color: '7ea9d1' }, - { - value: - 'Afterburn reduces Medi Gun healing and resist shield effects.\nAlt-Fire: Release a blast of air that pushes enemies and projectiles and extinguishes teammates that are on fire.', - }, - { value: ' ' }, - { value: ' ' }, - { value: 'Concealed Killer Collection' }, - { - value: ' Sand Cannon Rocket Launcher', - color: 'eb4b4b', - }, - { value: ' Red Rock Roscoe Pistol', color: 'eb4b4b' }, - { - value: ' Psychedelic Slugger Revolver', - color: 'd32ce6', - }, - { value: ' Purple Range Sniper Rifle', color: 'd32ce6' }, - { - value: ' Sudden Flurry Stickybomb Launcher', - color: 'd32ce6', - }, - { value: ' Night Terror Scattergun', color: '8847ff' }, - { - value: ' Carpet Bomber Stickybomb Launcher', - color: '8847ff', - }, - { - value: ' Woodland Warrior Rocket Launcher', - color: '8847ff', - }, - { value: ' Wrapped Reviver Medi Gun', color: '8847ff' }, - { value: ' Night Owl Sniper Rifle', color: '4b69ff' }, - { value: ' Woodsy Widowmaker SMG', color: '4b69ff' }, - { - value: ' Backwoods Boomstick Shotgun', - color: '4b69ff', - }, - { - value: ' King of the Jungle Minigun', - color: '4b69ff', - }, - { value: ' Masked Mender Medi Gun', color: '4b69ff' }, - { value: '★ Forest Fire Flame Thrower', color: '4b69ff' }, - ], - tradable: 1, - actions: [ - { - link: - 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=15005&lang=en_US', - name: 'Item Wiki Page...', - }, - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D6922402693932635553', - name: 'Inspect in Game...', - }, - ], - name: 'Festivized Forest Fire Flame Thrower', - name_color: '8650AC', - type: '', - market_name: - 'Unusual Festivized Specialized Killstreak Forest Fire Flame Thrower (Minimal Wear)', - market_hash_name: - 'Unusual Festivized Specialized Killstreak Forest Fire Flame Thrower (Minimal Wear)', - market_actions: [ - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D6922402693932635553', - name: 'Inspect in Game...', - }, - ], - commodity: 0, - market_tradable_restriction: 7, - market_marketable_restriction: 0, - marketable: 1, - tags: [ - { - category: 'Quality', - internal_name: 'rarity4', - localized_category_name: 'Quality', - localized_tag_name: 'Unusual', - color: '8650AC', - }, - { - category: 'Type', - internal_name: 'primary', - localized_category_name: 'Type', - localized_tag_name: 'Primary weapon', - }, - { - category: 'Class', - internal_name: 'Pyro', - localized_category_name: 'Class', - localized_tag_name: 'Pyro', - }, - { - category: 'Rarity', - internal_name: 'Rarity_Rare', - localized_category_name: 'Grade', - localized_tag_name: 'Mercenary', - color: '4b69ff', - }, - { - category: 'Collection', - internal_name: 'concealedkiller_collection', - localized_category_name: 'Collection', - localized_tag_name: 'Concealed Killer Collection', - }, - { - category: 'Exterior', - internal_name: 'TFUI_InvTooltip_MinimalWear', - localized_category_name: 'Exterior', - localized_tag_name: 'Minimal Wear', - }, - ], - }, - true, false - ); - - assert.deepEqual(econItem, { - name: 'Flame Thrower', - fullName: - 'Cool Festivized Specialized Killstreak Forest Fire Flame Thrower (Minimal Wear)', - id: '8407830034', - img: - 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffsDz5zdwmTVPAOCcot8Qn-Wxg07dR3XcGzub5ffwvmttSXYrAlY9xFTMaCUvbXNQz_6EkwiPRYKJaIon-9jHjrOWoUG0280KDki-w/', - tradable: true, - craftable: true, - quality: 5, - texture: 9, - wear: 2, - killstreak: 2, - festivized: true, - effect: 703, - classes: ['Pyro'], - type: 'primary', - collection: 'Concealed Killer Collection', - grade: 'Mercenary', - parts: [], - spells: [], - marketable: true, - commodity: false, - sheen: "Agonizing Emerald", - level: -1, - }); - }); - - it('Case #2', () => { - const econItem = parseEconItem( - { - appid: 440, - contextid: '2', - assetid: '8555715171', - classid: '3717643208', - instanceid: '344437314', - amount: '1', - currency: 0, - background_color: '3C352E', - icon_url: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEJeQQaWA_dtDlRj82oVPeJUbRTyohkssUGjDBox1IsNrKxaWc1JFWQWPYHDKFsow2_WyVlv4lzWtBtJvRLsg', - icon_url_large: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEJeQQaWA_dtDlRj82oVPeJUbRTyohkssUGjDBox1IsNrKxaWc1JFWQWPYHDKFsow2_WyVlv4lzWtBtJvRLsg', - descriptions: [ - { - value: "★ Unusual Effect: Nuts n' Bolts", - color: 'ffd700', - }, - { value: "''hmm epic''" }, - ], - tradable: 1, - actions: [ - { - link: - 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=434&lang=en_US', - name: 'Item Wiki Page...', - }, - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D16442165943709427870', - name: 'Inspect in Game...', - }, - ], - name: 'Unusual Brain Bucket', - name_color: '8650AC', - type: 'Level 82 Hat', - market_name: 'Unusual Brain Bucket', - market_hash_name: 'Unusual Brain Bucket', - market_actions: [ - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D16442165943709427870', - name: 'Inspect in Game...', - }, - ], - commodity: 0, - market_tradable_restriction: 7, - market_marketable_restriction: 0, - marketable: 1, - tags: [ - { - category: 'Quality', - internal_name: 'rarity4', - localized_category_name: 'Quality', - localized_tag_name: 'Unusual', - color: '8650AC', - }, - { - category: 'Type', - internal_name: 'misc', - localized_category_name: 'Type', - localized_tag_name: 'Cosmetic', - }, - { - category: 'Class', - internal_name: 'Soldier', - localized_category_name: 'Class', - localized_tag_name: 'Soldier', - }, - ], - }, - true, false - ); - - assert.deepEqual( - econItem, - { - name: 'Brain Bucket', - fullName: "Nuts n' Bolts Brain Bucket", - id: '8555715171', - img: - 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEJeQQaWA_dtDlRj82oVPeJUbRTyohkssUGjDBox1IsNrKxaWc1JFWQWPYHDKFsow2_WyVlv4lzWtBtJvRLsg/', - tradable: true, - craftable: true, - quality: 5, - effect: 31, - classes: ['Soldier'], - type: 'misc', - parts: [], - spells: [], - marketable: true, - commodity: false, - level: 82, - }, - false, false - ); - }); - - it('Case #3', () => { - const econItem = parseEconItem( - { - appid: 440, - contextid: '2', - assetid: '8574678947', - classid: '3555490789', - instanceid: '856289751', - amount: '1', - currency: 0, - background_color: '3C352E', - icon_url: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEDewlDDUq7hytIncTqD-CJGu8_l9sn4pUbi2Ftw1ApbbXtNmM_cVTEV_lbWaw7pQu0W3Rr6sVlAdPvoOhScFnt4pyGbefmPm6lTg', - icon_url_large: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEDewlDDUq7hytIncTqD-CJGu8_l9sn4pUbi2Ftw1ApbbXtNmM_cVTEV_lbWaw7pQu0W3Rr6sVlAdPvoOhScFnt4pyGbefmPm6lTg', - descriptions: [ - { value: 'Commando Grade Hat', color: '8847ff' }, - { - value: '★ Unusual Effect: Twisted Radiance', - color: 'ffd700', - }, - { value: ' ' }, - { value: ' ' }, - { value: 'Spooky Spoils Collection' }, - { value: ' Mister Bones', color: 'eb4b4b' }, - { value: " Pyr'o Lantern", color: 'eb4b4b' }, - { value: ' Racc Mann', color: 'd32ce6' }, - { value: ' Head of the Dead', color: 'd32ce6' }, - { value: ' Elizabeth the Third', color: 'd32ce6' }, - { value: ' The Trick Stabber', color: 'd32ce6' }, - { value: ' El Zapateador', color: '8847ff' }, - { value: ' The Horrible Horns', color: '8847ff' }, - { value: '★ Skullbrero', color: '8847ff' }, - { value: ' Soviet Strongmann', color: '8847ff' }, - { value: ' Voodoo Vizier', color: '8847ff' }, - { value: " Madmann's Muzzle", color: '8847ff' }, - { value: ' BINOCULUS!', color: '4b69ff' }, - { value: ' Derangement Garment', color: '4b69ff' }, - { value: ' Convict Cap', color: '4b69ff' }, - { value: ' El Mostacho', color: '4b69ff' }, - { value: ' Candy Cranium', color: '4b69ff' }, - { value: ' Bat Hat', color: '4b69ff' }, - { value: ' Pocket Halloween Boss', color: '4b69ff' }, - { value: ' Party Poncho', color: '4b69ff' }, - { value: ' Fuel Injector', color: '4b69ff' }, - { value: ' Bread Biter', color: '4b69ff' }, - ], - tradable: 1, - actions: [ - { - link: - 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=31066&lang=en_US', - name: 'Item Wiki Page...', - }, - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D5006617706189886078', - name: 'Inspect in Game...', - }, - ], - name: 'Unusual Skullbrero', - name_color: '8650AC', - type: 'Level 57 Hat', - market_name: 'Unusual Skullbrero', - market_hash_name: 'Unusual Skullbrero', - market_actions: [ - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D5006617706189886078', - name: 'Inspect in Game...', - }, - ], - commodity: 0, - market_tradable_restriction: 7, - market_marketable_restriction: 0, - marketable: 1, - tags: [ - { - category: 'Quality', - internal_name: 'rarity4', - localized_category_name: 'Quality', - localized_tag_name: 'Unusual', - color: '8650AC', - }, - { - category: 'Type', - internal_name: 'misc', - localized_category_name: 'Type', - localized_tag_name: 'Cosmetic', - }, - { - category: 'Class', - internal_name: 'Pyro', - localized_category_name: 'Class', - localized_tag_name: 'Pyro', - }, - { - category: 'Rarity', - internal_name: 'Rarity_Mythical', - localized_category_name: 'Grade', - localized_tag_name: 'Commando', - color: '8847ff', - }, - { - category: 'Collection', - internal_name: 'halloween2019_collection_name', - localized_category_name: 'Collection', - localized_tag_name: 'Spooky Spoils Collection', - }, - ], - }, - true, false - ); - - assert.deepEqual(econItem, { - name: 'Skullbrero', - fullName: 'Twisted Radiance Skullbrero', - id: '8574678947', - img: - 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEDewlDDUq7hytIncTqD-CJGu8_l9sn4pUbi2Ftw1ApbbXtNmM_cVTEV_lbWaw7pQu0W3Rr6sVlAdPvoOhScFnt4pyGbefmPm6lTg/', - tradable: true, - craftable: true, - quality: 5, - effect: 130, - classes: ['Pyro'], - type: 'misc', - collection: 'Spooky Spoils Collection', - grade: 'Commando', - parts: [], - spells: [], - marketable: true, - commodity: false, - level: 57, - }); - }); - - it('Case #4', () => { - const econItem = parseEconItem( - { - appid: 440, - contextid: '2', - assetid: '8610658018', - classid: '171010366', - instanceid: '176498576', - amount: '1', - currency: 0, - background_color: '3C352E', - icon_url: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEbfgYfXh7wqwdTmsHiCM2ACfIHnpRh5MkG3G8zyVMpYebiYm8wdFGTBPILC_BvrQu9X3RqupQ6AYPhp-wHZ0yx43BgcxIX', - icon_url_large: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEbfgYfXh7wqwdTmsHiCM2ACfIHnpRh5MkG3G8zyVMpYebiYm8wdFGTBPILC_BvrQu9X3RqupQ6AYPhp-wHZ0yx43BgcxIX', - descriptions: [ - { value: '★ Unusual Effect: Smoking', color: 'ffd700' }, - ], - tradable: 1, - actions: [ - { - link: - 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=318&lang=en_US', - name: 'Item Wiki Page...', - }, - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D10290164463146604828', - name: 'Inspect in Game...', - }, - ], - name: "Unusual Prancer's Pride", - name_color: '8650AC', - type: 'Level 88 Hat', - market_name: "Unusual Prancer's Pride", - market_hash_name: "Unusual Prancer's Pride", - market_actions: [ - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D10290164463146604828', - name: 'Inspect in Game...', - }, - ], - commodity: 0, - market_tradable_restriction: 7, - market_marketable_restriction: 0, - marketable: 1, - tags: [ - { - category: 'Quality', - internal_name: 'rarity4', - localized_category_name: 'Quality', - localized_tag_name: 'Unusual', - color: '8650AC', - }, - { - category: 'Type', - internal_name: 'misc', - localized_category_name: 'Type', - localized_tag_name: 'Cosmetic', - }, - { - category: 'Class', - internal_name: 'Pyro', - localized_category_name: 'Class', - localized_tag_name: 'Pyro', - }, - ], - }, - true, false - ); - - assert.deepEqual(econItem, { - name: "Prancer's Pride", - fullName: "Smoking Prancer's Pride", - id: '8610658018', - img: - 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEbfgYfXh7wqwdTmsHiCM2ACfIHnpRh5MkG3G8zyVMpYebiYm8wdFGTBPILC_BvrQu9X3RqupQ6AYPhp-wHZ0yx43BgcxIX/', - tradable: true, - craftable: true, - quality: 5, - effect: 35, - classes: ['Pyro'], - type: 'misc', - parts: [], - spells: [], - marketable: true, - commodity: false, - level: 88, - }); - }); - - it('Case #5', () => { - const econItem = parseEconItem( - { - appid: 440, - contextid: '2', - assetid: '8656785508', - classid: '3543846179', - instanceid: '3516082756', - amount: '1', - currency: 0, - background_color: '3C352E', - icon_url: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffjDz5zdwmTVPAOCsot8Qn-Whg07dR3XcGzuehWe1q65oHFOuQpN4kZGpOECffQZl39vho_1KdefJbbonvq3SvubmwUG028UzYUYzA', - icon_url_large: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffjDz5zdwmTVPAOCsot8Qn-Whg07dR3XcGzuehWe1q65oHFOuQpN4kZGpOECffQZl39vho_1KdefJbbonvq3SvubmwUG028UzYUYzA', - descriptions: [ - { - value: 'Commando Grade Rocket Launcher (Field-Tested)', - color: '8847ff', - }, - { value: 'Festivized', color: 'ffd700' }, - { - value: - 'Halloween: Pumpkin Bombs (spell only active during event)', - color: '7ea9d1', - }, - { value: 'Sheen: Agonizing Emerald', color: '7ea9d1' }, - { value: 'Killstreaks Active', color: '7ea9d1' }, - { - value: '\nGift from: VLaDOS | S>C.MOON YELLOW BELT', - color: '7ea9d1', - }, - { - value: - 'Date Received: Tuesday, September 10, 2019 (9:36:39) GMT', - }, - { value: ' ' }, - { value: ' ' }, - { value: 'Concealed Killer Collection' }, - { - value: ' Sand Cannon Rocket Launcher', - color: 'eb4b4b', - }, - { value: ' Red Rock Roscoe Pistol', color: 'eb4b4b' }, - { - value: ' Psychedelic Slugger Revolver', - color: 'd32ce6', - }, - { value: ' Purple Range Sniper Rifle', color: 'd32ce6' }, - { - value: ' Sudden Flurry Stickybomb Launcher', - color: 'd32ce6', - }, - { value: ' Night Terror Scattergun', color: '8847ff' }, - { - value: ' Carpet Bomber Stickybomb Launcher', - color: '8847ff', - }, - { - value: '✔ Woodland Warrior Rocket Launcher', - color: '8847ff', - }, - { value: ' Wrapped Reviver Medi Gun', color: '8847ff' }, - { value: ' Night Owl Sniper Rifle', color: '4b69ff' }, - { value: ' Woodsy Widowmaker SMG', color: '4b69ff' }, - { - value: ' Backwoods Boomstick Shotgun', - color: '4b69ff', - }, - { - value: ' King of the Jungle Minigun', - color: '4b69ff', - }, - { value: ' Masked Mender Medi Gun', color: '4b69ff' }, - { value: ' Forest Fire Flame Thrower', color: '4b69ff' }, - ], - tradable: 1, - actions: [ - { - link: - 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=15006&lang=en_US', - name: 'Item Wiki Page...', - }, - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D11534198800805877074', - name: 'Inspect in Game...', - }, - ], - fraudwarnings: [ - 'This item has been renamed.\nOriginal name: "Rocket Launcher"', - ], - name: "''post live spell rocket louncher !!!!!!!''", - name_color: 'FAFAFA', - type: '', - market_name: - 'Festivized Specialized Killstreak Woodland Warrior Rocket Launcher (Field-Tested)', - market_hash_name: - 'Festivized Specialized Killstreak Woodland Warrior Rocket Launcher (Field-Tested)', - market_actions: [ - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D11534198800805877074', - name: 'Inspect in Game...', - }, - ], - commodity: 0, - market_tradable_restriction: 7, - market_marketable_restriction: 0, - marketable: 1, - tags: [ - { - category: 'Quality', - internal_name: 'paintkitweapon', - localized_category_name: 'Quality', - localized_tag_name: 'Decorated Weapon', - color: 'FAFAFA', - }, - { - category: 'Type', - internal_name: 'primary', - localized_category_name: 'Type', - localized_tag_name: 'Primary weapon', - }, - { - category: 'Class', - internal_name: 'Soldier', - localized_category_name: 'Class', - localized_tag_name: 'Soldier', - }, - { - category: 'Rarity', - internal_name: 'Rarity_Mythical', - localized_category_name: 'Grade', - localized_tag_name: 'Commando', - color: '8847ff', - }, - { - category: 'Collection', - internal_name: 'concealedkiller_collection', - localized_category_name: 'Collection', - localized_tag_name: 'Concealed Killer Collection', - }, - { - category: 'Exterior', - internal_name: 'TFUI_InvTooltip_FieldTested', - localized_category_name: 'Exterior', - localized_tag_name: 'Field-Tested', - }, - ], - }, - true, false - ); - - assert.deepEqual(econItem, { - name: 'Rocket Launcher', - fullName: - 'Festivized Specialized Killstreak Woodland Warrior Rocket Launcher (Field-Tested)', - id: '8656785508', - img: - 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffjDz5zdwmTVPAOCsot8Qn-Whg07dR3XcGzuehWe1q65oHFOuQpN4kZGpOECffQZl39vho_1KdefJbbonvq3SvubmwUG028UzYUYzA/', - tradable: true, - craftable: true, - quality: 15, - texture: 6, - wear: 3, - festivized: true, - killstreak: 2, - classes: ['Soldier'], - type: 'primary', - collection: 'Concealed Killer Collection', - grade: 'Commando', - parts: [], - spells: ['Pumpkin Bombs'], - marketable: true, - commodity: false, - sheen: "Agonizing Emerald", - level: -1, - }); - }); - - it('Case #6', () => { - const econItem = parseEconItem({ - "appid":"440", - "classid":"2625497429", - "instanceid":"4048537137", - "icon_url":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffgYghuZgHPUPUOCacF4w3tG3J86sI7V47mp-JTLQu-vNTGYbh_MNgYHMeFXPHVY139uEk9g_VbK52LqTSvg3pcnpTOhA", - "icon_url_large":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffgYghuZgHPUPUOCacF4w3tG3J86sI7V47mp-JTLQu-vNTGYbh_MNgYHMeFXPHVY139uEk9g_VbK52LqTSvg3pcnpTOhA", - "icon_drag_url":"", - "name":"Shell Shocker Rocket Launcher", - "market_hash_name":"Strange Specialized Killstreak Shell Shocker Rocket Launcher (Battle Scarred)", - "market_name":"Strange Specialized Killstreak Shell Shocker Rocket Launcher (Battle Scarred)", - "name_color":"CF6A32", - "background_color":"3C352E", - "type":"", - "tradable":1, - "marketable":1, - "commodity":0, - "market_tradable_restriction":"7", - "market_marketable_restriction":"0", - "descriptions":[ - { - "value":"Assassin Grade Rocket Launcher (Battle Scarred)", - "color":"d32ce6" - }, - { - "value":"Strange Stat Clock Attached", - "color":"CF6A32" - }, - { - "value":" Kills: 5121", - "color":"756b5e" - }, - { - "value":" Pyros Killed: 712", - "color":"756b5e" - }, - { - "value":"Team Colored Decorated Weapon" - }, - { - "value":"Halloween: Pumpkin Bombs (spell only active during event)", - "color":"7ea9d1" - }, - { - "value":"Sheen: Mean Green", - "color":"7ea9d1" - }, - { - "value":"Killstreaks Active", - "color":"7ea9d1" - }, - { - "value":" " - }, - { - "value":" " - }, - { - "value":"Powerhouse Collection" - }, - { - "value":" Liquid Asset Stickybomb Launcher", - "color":"eb4b4b", - "app_data":{ - "def_index":"15045" - } - }, - { - "value":" Thunderbolt Sniper Rifle", - "color":"eb4b4b", - "app_data":{ - "def_index":"15059" - } - }, - { - "value":" Current Event Scattergun", - "color":"d32ce6", - "app_data":{ - "def_index":"15053" - } - }, - { - "value":" Pink Elephant Stickybomb Launcher", - "color":"d32ce6", - "app_data":{ - "def_index":"15048" - } - }, - { - "value":"✔ Shell Shocker Rocket Launcher", - "color":"d32ce6", - "app_data":{ - "def_index":"15052" - } - }, - { - "value":" Flash Fryer Flame Thrower", - "color":"8847ff", - "app_data":{ - "def_index":"15049" - } - }, - { - "value":" Spark of Life Medi Gun", - "color":"8847ff", - "app_data":{ - "def_index":"15050" - } - }, - { - "value":" Dead Reckoner Revolver", - "color":"8847ff", - "app_data":{ - "def_index":"15051" - } - }, - { - "value":" Black Dahlia Pistol", - "color":"8847ff", - "app_data":{ - "def_index":"15046" - } - }, - { - "value":" Sandstone Special Pistol", - "color":"8847ff", - "app_data":{ - "def_index":"15056" - } - }, - { - "value":" Brick House Minigun", - "color":"4b69ff", - "app_data":{ - "def_index":"15055" - } - }, - { - "value":" Aqua Marine Rocket Launcher", - "color":"4b69ff", - "app_data":{ - "def_index":"15057" - } - }, - { - "value":" Low Profile SMG", - "color":"4b69ff", - "app_data":{ - "def_index":"15058" - } - }, - { - "value":" Turbine Torcher Flame Thrower", - "color":"4b69ff", - "app_data":{ - "def_index":"15054" - } - }, - { - "value":" Lightning Rod Shotgun", - "color":"4b69ff", - "app_data":{ - "def_index":"15047" - } - } - ], - "actions":[ - { - "name":"Item Wiki Page...", - "link":"http:\/\/wiki.teamfortress.com\/scripts\/itemredirect.php?id=15052&lang=en_US" - }, - { - "name":"Inspect in Game...", - "link":"steam:\/\/rungame\/440\/76561202255233023\/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D7998211058114246468" - } - ], - "market_actions":[ - { - "name":"Inspect in Game...", - "link":"steam:\/\/rungame\/440\/76561202255233023\/+tf_econ_item_preview%20M%listingid%A%assetid%D7998211058114246468" - } - ], - "tags":[ - { - "internal_name":"strange", - "name":"Strange", - "category":"Quality", - "color":"CF6A32", - "category_name":"Quality" - }, - { - "internal_name":"primary", - "name":"Primary weapon", - "category":"Type", - "category_name":"Type" - }, - { - "internal_name":"Soldier", - "name":"Soldier", - "category":"Class", - "category_name":"Class" - }, - { - "internal_name":"Rarity_Legendary", - "name":"Assassin", - "category":"Rarity", - "color":"d32ce6", - "category_name":"Grade" - }, - { - "internal_name":"Powerhouse_collection", - "name":"Powerhouse Collection", - "category":"Collection", - "category_name":"Collection" - }, - { - "internal_name":"TFUI_InvTooltip_BattleScared", - "name":"Battle Scarred", - "category":"Exterior", - "category_name":"Exterior" - } - ], - "app_data":{ - "def_index":"15052", - "quality":"11" - } - }, true, false); - - assert.deepEqual(econItem, { - name: 'Rocket Launcher', - fullName: 'Strange Specialized Killstreak Shell Shocker Rocket Launcher (Battle Scarred)', - id: undefined, - img: 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffgYghuZgHPUPUOCacF4w3tG3J86sI7V47mp-JTLQu-vNTGYbh_MNgYHMeFXPHVY139uEk9g_VbK52LqTSvg3pcnpTOhA/', - tradable: true, - craftable: true, - quality: 11, - texture: 52, - wear: 5, - killstreak: 2, - classes: [ 'Soldier' ], - type: 'primary', - collection: 'Powerhouse Collection', - grade: 'Assassin', - parts: [ 'Pyros Killed' ], - spells: [ 'Pumpkin Bombs' ], - marketable: true, - commodity: false, - sheen: "Mean Green", - level: -1, - }); - }) - - it('Case #7', () => { - const econItem = parseEconItem( - {"appid":"440","classid":"1348131292","instanceid":"93028938","icon_url":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIUwADWBXjvD1Pid3oDvqJGt8Yltsm2pxUyzFu31V9NbPtYTUwdwWbBfkOXfZioFDuWSFku8JnUdLg8ulQLw29tYfCMOQycIYbhNRIXDY","icon_url_large":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIUwADWBXjvD1Pid3oDvqJGt8Yltsm2pxUyzFu31V9NbPtYTUwdwWbBfkOXfZioFDuWSFku8JnUdLg8ulQLw29tYfCMOQycIYbhNRIXDY","icon_drag_url":"","name":"Strange Professional Killstreak Festive Grenade Launcher","market_hash_name":"Strange Professional Killstreak Festive Grenade Launcher","market_name":"Strange Professional Killstreak Festive Grenade Launcher","name_color":"CF6A32","background_color":"3C352E","type":"Limited Strange Grenade Launcher - Kills: 20","tradable":1,"marketable":1,"commodity":0,"market_tradable_restriction":"7","market_marketable_restriction":"0","descriptions":[{"value":"(Airborne Enemy Kills: 4)","color":"756b5e"},{"value":"Halloween: Exorcism (spell only active during event)","color":"7ea9d1"},{"value":"Killstreaker: Hypno-Beam","color":"7ea9d1"},{"value":"Sheen: Manndarin","color":"7ea9d1"},{"value":"Killstreaks Active","color":"7ea9d1"}],"actions":[{"name":"Item Wiki Page...","link":"http:\/\/wiki.teamfortress.com\/scripts\/itemredirect.php?id=1007&lang=en_US"}],"tags":[{"internal_name":"strange","name":"Strange","category":"Quality","color":"CF6A32","category_name":"Quality"},{"internal_name":"primary","name":"Primary weapon","category":"Type","category_name":"Type"},{"internal_name":"Demoman","name":"Demoman","category":"Class","category_name":"Class"}],"app_data":{"def_index":"1007","quality":"11"}}, - true, false - ); - - assert.deepEqual(econItem, { - classes: ["Demoman"], - commodity: false, - craftable: true, - fullName: "Strange Professional Killstreak Festive Grenade Launcher", - id: undefined, - img: "https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIUwADWBXjvD1Pid3oDvqJGt8Yltsm2pxUyzFu31V9NbPtYTUwdwWbBfkOXfZioFDuWSFku8JnUdLg8ulQLw29tYfCMOQycIYbhNRIXDY/", - killstreak: 3, - killstreaker: "Hypno-Beam", - marketable: true, - name: "Festive Grenade Launcher", - parts: [ "Airborne Enemy Kills" ], - quality: 11, - sheen: "Manndarin", - spells: [ "Exorcism" ], - tradable: true, - type: "primary", - level: -1, - }); - }); - - it('Case #8', () => { - const econItem = parseEconItem({"appid":"440","classid":"11042149","instanceid":"19201223","icon_url":"IzMF03bi9WpSBq-S-ekoE33L-iLqGFHVaU25ZzQNQcXdEH9myp0erksICfTdcfMQEpRnqWSMU5OD2NoHwHEIkChXOjLx2Sk5MbUqMcbBnQz4ruyeU3n5awjJLjLaE0pXEvYaYzGdkW_0p7rBXG6aQb0rFl9XK_QM8jdIb82PaURv3dUMrT27kxUqSU5_IZIXcl_smSJdIbMiwRlwHyU","icon_url_large":"IzMF03bi9WpSBq-S-ekoE33L-iLqGFHVaU25ZzQNQcXdEH9myp0erksICfTdcfMQEpRnqWSMU5OD2NoHwHEIkChXOjLx2Sk5MbUqMcbBnQz4ruyeU3n5awjJLjLaE0pXEvYaYzGdkW_0p7rBXG6aQb0rFl9XK_QM8jdIb82PaURv3dUMrT27kxUqSU5_IZIXcl_smSJdIbMiwRlwHyU","icon_drag_url":"","name":"The Essential Accessories","market_hash_name":"The Essential Accessories","market_name":"The Essential Accessories","name_color":"7D6D00","background_color":"3C352E","type":"Limited Level 10 Apparel","tradable":1,"marketable":1,"commodity":0,"market_tradable_restriction":"7","market_marketable_restriction":"0","descriptions":[{"value":"Paint Color: Operator's Overalls","color":"756b5e"},{"value":""}],"actions":[{"name":"Item Wiki Page...","link":"http:\/\/wiki.teamfortress.com\/scripts\/itemredirect.php?id=347&lang=en_US"},{"name":"Inspect in Game...","link":"steam:\/\/rungame\/440\/76561202255233023\/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D2891326522173157497"}],"market_actions":[{"name":"Inspect in Game...","link":"steam:\/\/rungame\/440\/76561202255233023\/+tf_econ_item_preview%20M%listingid%A%assetid%D2891326522173157497"}],"tags":[{"internal_name":"Unique","name":"Unique","category":"Quality","color":"7D6D00","category_name":"Quality"},{"internal_name":"misc","name":"Cosmetic","category":"Type","category_name":"Type"},{"internal_name":"Scout","name":"Scout","category":"Class","category_name":"Class"}],"app_data":{"def_index":"347","quality":"6"}}, true, false); - - assert.deepEqual(econItem, { - "classes": [ - "Scout" - ], - "commodity": false, - "craftable": true, - "fullName": "The Essential Accessories", - "id": undefined, - "img": "https://steamcommunity-a.akamaihd.net/economy/image/IzMF03bi9WpSBq-S-ekoE33L-iLqGFHVaU25ZzQNQcXdEH9myp0erksICfTdcfMQEpRnqWSMU5OD2NoHwHEIkChXOjLx2Sk5MbUqMcbBnQz4ruyeU3n5awjJLjLaE0pXEvYaYzGdkW_0p7rBXG6aQb0rFl9XK_QM8jdIb82PaURv3dUMrT27kxUqSU5_IZIXcl_smSJdIbMiwRlwHyU/", - "marketable": true, - "name": "The Essential Accessories", - "paint": "Operator's Overalls", - "parts": [], - "quality": 6, - "spells": [], - "tradable": true, - "type": "misc", - level: -1, - }); - }); - - it('Case #9 - Red Rock Roscoe texture', () => { - class MockSchema extends Schema { - getTextureEnum() { - this.loadTextures(); - - return 0; - } - } - - const format = createFormat(new MockSchema()); - const econItem = format.parseEconItem( - {"appid":"440","classid":"4472592872","instanceid":"1365979262","icon_url":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPfflDz5zdwmTVPAPD8ot8Qn-Whg07dR3XcGzuetXKlnpsYuVMbguMYpOGpXZCKTTYAv8uB89iPIIKpDcoyq72Srvaz8UG028HR0ZFYA","icon_url_large":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPfflDz5zdwmTVPAPD8ot8Qn-Whg07dR3XcGzuetXKlnpsYuVMbguMYpOGpXZCKTTYAv8uB89iPIIKpDcoyq72Srvaz8UG028HR0ZFYA","icon_drag_url":"","name":"Festivized Red Rock Roscoe Pistol","market_hash_name":"Festivized Specialized Killstreak Red Rock Roscoe Pistol (Field-Tested)","market_name":"Festivized Specialized Killstreak Red Rock Roscoe Pistol (Field-Tested)","name_color":"FAFAFA","background_color":"3C352E","type":"","tradable":1,"marketable":1,"commodity":0,"market_tradable_restriction":"7","market_marketable_restriction":"0","descriptions":[{"value":"Elite Grade Pistol (Field-Tested)","color":"eb4b4b"},{"value":"Festivized","color":"ffd700"},{"value":"Team Colored Decorated Weapon"},{"value":"Sheen: Hot Rod","color":"7ea9d1"},{"value":"Killstreaks Active","color":"7ea9d1"},{"value":"''Fuzzball's Pocket Pistol''"},{"value":" "},{"value":" "},{"value":"Concealed Killer Collection"},{"value":" Sand Cannon Rocket Launcher","color":"eb4b4b","app_data":{"def_index":"15014"}},{"value":" Red Rock Roscoe Pistol","color":"eb4b4b","app_data":{"def_index":"15013"}},{"value":" Psychedelic Slugger Revolver","color":"d32ce6","app_data":{"def_index":"15011"}},{"value":" Purple Range Sniper Rifle","color":"d32ce6","app_data":{"def_index":"15007"}},{"value":" Sudden Flurry Stickybomb Launcher","color":"d32ce6","app_data":{"def_index":"15009"}},{"value":" Night Terror Scattergun","color":"8847ff","app_data":{"def_index":"15002"}},{"value":" Carpet Bomber Stickybomb Launcher","color":"8847ff","app_data":{"def_index":"15012"}},{"value":" Woodland Warrior Rocket Launcher","color":"8847ff","app_data":{"def_index":"15006"}},{"value":" Wrapped Reviver Medi Gun","color":"8847ff","app_data":{"def_index":"15010"}},{"value":" Night Owl Sniper Rifle","color":"4b69ff","app_data":{"def_index":"15000"}},{"value":" Woodsy Widowmaker SMG","color":"4b69ff","app_data":{"def_index":"15001"}},{"value":" Backwoods Boomstick Shotgun","color":"4b69ff","app_data":{"def_index":"15003"}},{"value":" King of the Jungle Minigun","color":"4b69ff","app_data":{"def_index":"15004"}},{"value":" Masked Mender Medi Gun","color":"4b69ff","app_data":{"def_index":"15008"}},{"value":" Forest Fire Flame Thrower","color":"4b69ff","app_data":{"def_index":"15005"}}],"actions":[{"name":"Item Wiki Page...","link":"http:\/\/wiki.teamfortress.com\/scripts\/itemredirect.php?id=15013&lang=en_US"},{"name":"Inspect in Game...","link":"steam:\/\/rungame\/440\/76561202255233023\/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D10132525329635647851"}],"market_actions":[{"name":"Inspect in Game...","link":"steam:\/\/rungame\/440\/76561202255233023\/+tf_econ_item_preview%20M%listingid%A%assetid%D10132525329635647851"}],"tags":[{"internal_name":"paintkitweapon","name":"Decorated Weapon","category":"Quality","color":"FAFAFA","category_name":"Quality"},{"internal_name":"secondary","name":"Secondary weapon","category":"Type","category_name":"Type"},{"internal_name":"Scout","name":"Scout","category":"Class","category_name":"Class"},{"internal_name":"Engineer","name":"Engineer","category":"Class","category_name":"Class"},{"internal_name":"Rarity_Ancient","name":"Elite","category":"Rarity","color":"eb4b4b","category_name":"Grade"},{"internal_name":"concealedkiller_collection","name":"Concealed Killer Collection","category":"Collection","category_name":"Collection"},{"internal_name":"TFUI_InvTooltip_FieldTested","name":"Field-Tested","category":"Exterior","category_name":"Exterior"}],"app_data":{"def_index":"15013","quality":"15"}}, - true, - false, - ) - - assert.deepEqual(econItem, { - name: 'Pistol', - fullName: 'Festivized Specialized Killstreak Red Rock Roscoe Pistol (Field-Tested)', - id: undefined, - img: 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPfflDz5zdwmTVPAPD8ot8Qn-Whg07dR3XcGzuetXKlnpsYuVMbguMYpOGpXZCKTTYAv8uB89iPIIKpDcoyq72Srvaz8UG028HR0ZFYA/', - tradable: true, - craftable: true, - quality: 15, - wear: 3, - festivized: true, - killstreak: 2, - level: -1, - classes: [ 'Scout', 'Engineer' ], - type: 'secondary', - sheen: 'Hot Rod', - collection: 'Concealed Killer Collection', - grade: 'Elite', - parts: [], - spells: [], - marketable: true, - commodity: false, - texture: 0, - }); - }); -}); - -describe('Econ item with defindexes', () => { - it('Case #1', () => { - const econItem = parseEconItem( - { - appid: 440, - contextid: '2', - assetid: '8574678947', - classid: '3555490789', - instanceid: '856289751', - amount: '1', - currency: 0, - background_color: '3C352E', - icon_url: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEDewlDDUq7hytIncTqD-CJGu8_l9sn4pUbi2Ftw1ApbbXtNmM_cVTEV_lbWaw7pQu0W3Rr6sVlAdPvoOhScFnt4pyGbefmPm6lTg', - icon_url_large: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEDewlDDUq7hytIncTqD-CJGu8_l9sn4pUbi2Ftw1ApbbXtNmM_cVTEV_lbWaw7pQu0W3Rr6sVlAdPvoOhScFnt4pyGbefmPm6lTg', - descriptions: [ - { value: 'Commando Grade Hat', color: '8847ff' }, - { - value: '★ Unusual Effect: Twisted Radiance', - color: 'ffd700', - }, - { value: ' ' }, - { value: ' ' }, - { value: 'Spooky Spoils Collection' }, - { value: ' Mister Bones', color: 'eb4b4b' }, - { value: " Pyr'o Lantern", color: 'eb4b4b' }, - { value: ' Racc Mann', color: 'd32ce6' }, - { value: ' Head of the Dead', color: 'd32ce6' }, - { value: ' Elizabeth the Third', color: 'd32ce6' }, - { value: ' The Trick Stabber', color: 'd32ce6' }, - { value: ' El Zapateador', color: '8847ff' }, - { value: ' The Horrible Horns', color: '8847ff' }, - { value: '★ Skullbrero', color: '8847ff' }, - { value: ' Soviet Strongmann', color: '8847ff' }, - { value: ' Voodoo Vizier', color: '8847ff' }, - { value: " Madmann's Muzzle", color: '8847ff' }, - { value: ' BINOCULUS!', color: '4b69ff' }, - { value: ' Derangement Garment', color: '4b69ff' }, - { value: ' Convict Cap', color: '4b69ff' }, - { value: ' El Mostacho', color: '4b69ff' }, - { value: ' Candy Cranium', color: '4b69ff' }, - { value: ' Bat Hat', color: '4b69ff' }, - { value: ' Pocket Halloween Boss', color: '4b69ff' }, - { value: ' Party Poncho', color: '4b69ff' }, - { value: ' Fuel Injector', color: '4b69ff' }, - { value: ' Bread Biter', color: '4b69ff' }, - ], - tradable: 1, - actions: [ - { - link: - 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=31066&lang=en_US', - name: 'Item Wiki Page...', - }, - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D5006617706189886078', - name: 'Inspect in Game...', - }, - ], - name: 'Unusual Skullbrero', - name_color: '8650AC', - type: 'Level 57 Hat', - market_name: 'Unusual Skullbrero', - market_hash_name: 'Unusual Skullbrero', - market_actions: [ - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D5006617706189886078', - name: 'Inspect in Game...', - }, - ], - commodity: 0, - market_tradable_restriction: 7, - market_marketable_restriction: 0, - marketable: 1, - tags: [ - { - category: 'Quality', - internal_name: 'rarity4', - localized_category_name: 'Quality', - localized_tag_name: 'Unusual', - color: '8650AC', - }, - { - category: 'Type', - internal_name: 'misc', - localized_category_name: 'Type', - localized_tag_name: 'Cosmetic', - }, - { - category: 'Class', - internal_name: 'Pyro', - localized_category_name: 'Class', - localized_tag_name: 'Pyro', - }, - { - category: 'Rarity', - internal_name: 'Rarity_Mythical', - localized_category_name: 'Grade', - localized_tag_name: 'Commando', - color: '8847ff', - }, - { - category: 'Collection', - internal_name: 'halloween2019_collection_name', - localized_category_name: 'Collection', - localized_tag_name: 'Spooky Spoils Collection', - }, - ], - }, - false, true - ); - - assert.deepEqual(econItem, { - name: 'Skullbrero', - fullName: 'Twisted Radiance Skullbrero', - id: '8574678947', - img: - 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEDewlDDUq7hytIncTqD-CJGu8_l9sn4pUbi2Ftw1ApbbXtNmM_cVTEV_lbWaw7pQu0W3Rr6sVlAdPvoOhScFnt4pyGbefmPm6lTg/', - tradable: true, - craftable: true, - quality: 'Unusual', - effect: 'Twisted Radiance', - defindex: 31066, - classes: ['Pyro'], - type: 'misc', - collection: 'Spooky Spoils Collection', - grade: 'Commando', - parts: [], - spells: [], - marketable: true, - commodity: false, - level: 57, - }); - }); - - it('Case #2', () => { - const econItem = parseEconItem( - { - appid: 440, - contextid: '2', - assetid: '8610658018', - classid: '171010366', - instanceid: '176498576', - amount: '1', - currency: 0, - background_color: '3C352E', - icon_url: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEbfgYfXh7wqwdTmsHiCM2ACfIHnpRh5MkG3G8zyVMpYebiYm8wdFGTBPILC_BvrQu9X3RqupQ6AYPhp-wHZ0yx43BgcxIX', - icon_url_large: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEbfgYfXh7wqwdTmsHiCM2ACfIHnpRh5MkG3G8zyVMpYebiYm8wdFGTBPILC_BvrQu9X3RqupQ6AYPhp-wHZ0yx43BgcxIX', - descriptions: [ - { value: '★ Unusual Effect: Smoking', color: 'ffd700' }, - ], - tradable: 1, - actions: [ - { - link: - 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=318&lang=en_US', - name: 'Item Wiki Page...', - }, - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D10290164463146604828', - name: 'Inspect in Game...', - }, - ], - name: "Unusual Prancer's Pride", - name_color: '8650AC', - type: 'Level 88 Hat', - market_name: "Unusual Prancer's Pride", - market_hash_name: "Unusual Prancer's Pride", - market_actions: [ - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D10290164463146604828', - name: 'Inspect in Game...', - }, - ], - commodity: 0, - market_tradable_restriction: 7, - market_marketable_restriction: 0, - marketable: 1, - tags: [ - { - category: 'Quality', - internal_name: 'rarity4', - localized_category_name: 'Quality', - localized_tag_name: 'Unusual', - color: '8650AC', - }, - { - category: 'Type', - internal_name: 'misc', - localized_category_name: 'Type', - localized_tag_name: 'Cosmetic', - }, - { - category: 'Class', - internal_name: 'Pyro', - localized_category_name: 'Class', - localized_tag_name: 'Pyro', - }, - ], - }, - false, true - ); - - assert.deepEqual(econItem, { - name: "Prancer's Pride", - fullName: "Smoking Prancer's Pride", - id: '8610658018', - img: - 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEbfgYfXh7wqwdTmsHiCM2ACfIHnpRh5MkG3G8zyVMpYebiYm8wdFGTBPILC_BvrQu9X3RqupQ6AYPhp-wHZ0yx43BgcxIX/', - tradable: true, - craftable: true, - quality: 'Unusual', - effect: 'Smoking', - defindex: 318, - classes: ['Pyro'], - type: 'misc', - parts: [], - spells: [], - marketable: true, - commodity: false, - level: 88, - }); - }); - - it('Case #3', () => { - const econItem = parseEconItem( - { - appid: 440, - contextid: '2', - assetid: '8656785508', - classid: '3543846179', - instanceid: '3516082756', - amount: '1', - currency: 0, - background_color: '3C352E', - icon_url: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffjDz5zdwmTVPAOCsot8Qn-Whg07dR3XcGzuehWe1q65oHFOuQpN4kZGpOECffQZl39vho_1KdefJbbonvq3SvubmwUG028UzYUYzA', - icon_url_large: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffjDz5zdwmTVPAOCsot8Qn-Whg07dR3XcGzuehWe1q65oHFOuQpN4kZGpOECffQZl39vho_1KdefJbbonvq3SvubmwUG028UzYUYzA', - descriptions: [ - { - value: 'Commando Grade Rocket Launcher (Field-Tested)', - color: '8847ff', - }, - { value: 'Festivized', color: 'ffd700' }, - { - value: - 'Halloween: Pumpkin Bombs (spell only active during event)', - color: '7ea9d1', - }, - { value: 'Sheen: Agonizing Emerald', color: '7ea9d1' }, - { value: 'Killstreaks Active', color: '7ea9d1' }, - { - value: '\nGift from: VLaDOS | S>C.MOON YELLOW BELT', - color: '7ea9d1', - }, - { - value: - 'Date Received: Tuesday, September 10, 2019 (9:36:39) GMT', - }, - { value: ' ' }, - { value: ' ' }, - { value: 'Concealed Killer Collection' }, - { - value: ' Sand Cannon Rocket Launcher', - color: 'eb4b4b', - }, - { value: ' Red Rock Roscoe Pistol', color: 'eb4b4b' }, - { - value: ' Psychedelic Slugger Revolver', - color: 'd32ce6', - }, - { value: ' Purple Range Sniper Rifle', color: 'd32ce6' }, - { - value: ' Sudden Flurry Stickybomb Launcher', - color: 'd32ce6', - }, - { value: ' Night Terror Scattergun', color: '8847ff' }, - { - value: ' Carpet Bomber Stickybomb Launcher', - color: '8847ff', - }, - { - value: '✔ Woodland Warrior Rocket Launcher', - color: '8847ff', - }, - { value: ' Wrapped Reviver Medi Gun', color: '8847ff' }, - { value: ' Night Owl Sniper Rifle', color: '4b69ff' }, - { value: ' Woodsy Widowmaker SMG', color: '4b69ff' }, - { - value: ' Backwoods Boomstick Shotgun', - color: '4b69ff', - }, - { - value: ' King of the Jungle Minigun', - color: '4b69ff', - }, - { value: ' Masked Mender Medi Gun', color: '4b69ff' }, - { value: ' Forest Fire Flame Thrower', color: '4b69ff' }, - ], - tradable: 1, - actions: [ - { - link: - 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=15006&lang=en_US', - name: 'Item Wiki Page...', - }, - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D11534198800805877074', - name: 'Inspect in Game...', - }, - ], - fraudwarnings: [ - 'This item has been renamed.\nOriginal name: "Rocket Launcher"', - ], - name: "''post live spell rocket louncher !!!!!!!''", - name_color: 'FAFAFA', - type: '', - market_name: - 'Festivized Specialized Killstreak Woodland Warrior Rocket Launcher (Field-Tested)', - market_hash_name: - 'Festivized Specialized Killstreak Woodland Warrior Rocket Launcher (Field-Tested)', - market_actions: [ - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D11534198800805877074', - name: 'Inspect in Game...', - }, - ], - commodity: 0, - market_tradable_restriction: 7, - market_marketable_restriction: 0, - marketable: 1, - tags: [ - { - category: 'Quality', - internal_name: 'paintkitweapon', - localized_category_name: 'Quality', - localized_tag_name: 'Decorated Weapon', - color: 'FAFAFA', - }, - { - category: 'Type', - internal_name: 'primary', - localized_category_name: 'Type', - localized_tag_name: 'Primary weapon', - }, - { - category: 'Class', - internal_name: 'Soldier', - localized_category_name: 'Class', - localized_tag_name: 'Soldier', - }, - { - category: 'Rarity', - internal_name: 'Rarity_Mythical', - localized_category_name: 'Grade', - localized_tag_name: 'Commando', - color: '8847ff', - }, - { - category: 'Collection', - internal_name: 'concealedkiller_collection', - localized_category_name: 'Collection', - localized_tag_name: 'Concealed Killer Collection', - }, - { - category: 'Exterior', - internal_name: 'TFUI_InvTooltip_FieldTested', - localized_category_name: 'Exterior', - localized_tag_name: 'Field-Tested', - }, - ], - }, - false, true - ); - - assert.deepEqual(econItem, { - name: 'Rocket Launcher', - fullName: - 'Festivized Specialized Killstreak Woodland Warrior Rocket Launcher (Field-Tested)', - id: '8656785508', - img: - 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffjDz5zdwmTVPAOCsot8Qn-Whg07dR3XcGzuehWe1q65oHFOuQpN4kZGpOECffQZl39vho_1KdefJbbonvq3SvubmwUG028UzYUYzA/', - tradable: true, - craftable: true, - quality: 'Decorated Weapon', - texture: 'Woodland Warrior', - wear: 'Field-Tested', - defindex: 205, - festivized: true, - killstreak: 'Specialized Killstreak', - classes: ['Soldier'], - type: 'primary', - collection: 'Concealed Killer Collection', - grade: 'Commando', - parts: [], - spells: ['Pumpkin Bombs'], - marketable: true, - commodity: false, - sheen: "Agonizing Emerald", - level: -1, - }); - }); - - it('Case #4', () => { - const econItem = parseEconItem( - { - appid: 440, - contextid: '2', - assetid: '8733746813', - classid: '221512872', - instanceid: '92637229', - amount: '1', - currency: 0, - background_color: '3C352E', - icon_url: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEDe1VBDEjdqCEX2PfnGOaDBeEUlNQK6ZFH3jMlwwB_Y7vhZ2Q0JFKQAKQJXadrpF6-UXE268I3UNHg8esHfF28tdHHO65sbo88eQy8bA', - icon_url_large: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEDe1VBDEjdqCEX2PfnGOaDBeEUlNQK6ZFH3jMlwwB_Y7vhZ2Q0JFKQAKQJXadrpF6-UXE268I3UNHg8esHfF28tdHHO65sbo88eQy8bA', - descriptions: [ - { - value: 'Holiday Restriction: Halloween / Full Moon', - color: 'd83636', - }, - { - value: - 'Halloween: Spectral Spectrum (spell only active during event)', - color: '7ea9d1', - }, - { value: '' }, - ], - tradable: 1, - actions: [ - { - link: - 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=30290&lang=en_US', - name: 'Item Wiki Page...', - }, - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D16238051287194648628', - name: 'Inspect in Game...', - }, - ], - name: 'Haunted PY-40 Incinibot', - name_color: '38f3ab', - type: 'Level 58 Mask', - market_name: 'Haunted PY-40 Incinibot', - market_hash_name: 'Haunted PY-40 Incinibot', - market_actions: [ - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D16238051287194648628', - name: 'Inspect in Game...', - }, - ], - commodity: 0, - market_tradable_restriction: 7, - market_marketable_restriction: 0, - marketable: 1, - tags: [ - { - category: 'Quality', - internal_name: 'haunted', - localized_category_name: 'Quality', - localized_tag_name: 'Haunted', - color: '38f3ab', - }, - { - category: 'Type', - internal_name: 'misc', - localized_category_name: 'Type', - localized_tag_name: 'Cosmetic', - }, - { - category: 'Class', - internal_name: 'Pyro', - localized_category_name: 'Class', - localized_tag_name: 'Pyro', - }, - ], - }, - false, true - ); - - assert.deepEqual(econItem, { - name: 'PY-40 Incinibot', - fullName: 'Haunted PY-40 Incinibot', - id: '8733746813', - img: - 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEDe1VBDEjdqCEX2PfnGOaDBeEUlNQK6ZFH3jMlwwB_Y7vhZ2Q0JFKQAKQJXadrpF6-UXE268I3UNHg8esHfF28tdHHO65sbo88eQy8bA/', - tradable: true, - craftable: true, - quality: 'Haunted', - defindex: 30290, - classes: ['Pyro'], - type: 'misc', - parts: [], - spells: ['Spectral Spectrum'], - marketable: true, - commodity: false, - level: 58, - }); - }); - - it('Case #5', () => { - const econItem = parseEconItem( - { - appid: 440, - contextid: '2', - assetid: '8434754722', - classid: '88783771', - instanceid: '92739934', - amount: '1', - currency: 0, - background_color: '3C352E', - icon_url: - 'IzMF03bi9WpSBq-S-ekoE33L-iLqGFHVaU25ZzQNQcXdEH9myp0erksICfTcePMQFc1nqWSMU5OD2NwOx3sIyShXOjLx2Sk5MbUqMcbBnQz4ruyeU2DgVzPLKCnYCGFgGOIYfAeFr3HysPORE2vPELl_RQEMdaFX9GxObM-BOEE_goVdrTXqlBwkHRNxJ5VFcVbihGQdNlNSNRp3', - icon_url_large: - 'IzMF03bi9WpSBq-S-ekoE33L-iLqGFHVaU25ZzQNQcXdEH9myp0erksICfTcePMQFc1nqWSMU5OD2NwOx3sIyShXOjLx2Sk5MbUqMcbBnQz4ruyeU2DgVzPLKCnYCGFgGOIYfAeFr3HysPORE2vPELl_RQEMdaFX9GxObM-BOEE_goVdrTXqlBwkHRNxJ5VFcVbihGQdNlNSNRp3', - descriptions: [ - { - value: "Paint Color: Noble Hatter's Violet", - color: '756b5e', - }, - { - value: - 'Halloween: Spectral Spectrum (spell only active during event)', - color: '7ea9d1', - }, - { - value: - "The K-9 mane is perfect for tricky social situations. People will either only want to talk about the hat, which means they'll be distracted from that rash making its way up your jugular,or they'll avoid you altogether. It's a win/win!", - }, - ], - tradable: 1, - actions: [ - { - link: - 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=876&lang=en_US', - name: 'Item Wiki Page...', - }, - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D7378163898213210976', - name: 'Inspect in Game...', - }, - ], - name: 'Genuine K-9 Mane', - name_color: '4D7455', - type: 'Level 1 Spirit Animal', - market_name: 'Genuine K-9 Mane', - market_hash_name: 'Genuine K-9 Mane', - market_actions: [ - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D7378163898213210976', - name: 'Inspect in Game...', - }, - ], - commodity: 0, - market_tradable_restriction: 7, - market_marketable_restriction: 0, - marketable: 1, - tags: [ - { - category: 'Quality', - internal_name: 'rarity1', - localized_category_name: 'Quality', - localized_tag_name: 'Genuine', - color: '4D7455', - }, - { - category: 'Type', - internal_name: 'misc', - localized_category_name: 'Type', - localized_tag_name: 'Cosmetic', - }, - { - category: 'Class', - internal_name: 'Demoman', - localized_category_name: 'Class', - localized_tag_name: 'Demoman', - }, - { - category: 'Class', - internal_name: 'Heavy', - localized_category_name: 'Class', - localized_tag_name: 'Heavy', - }, - ], - }, - false, true - ); - - assert.deepEqual(econItem, { - name: 'K-9 Mane', - fullName: 'Genuine K-9 Mane', - id: '8434754722', - img: - 'https://steamcommunity-a.akamaihd.net/economy/image/IzMF03bi9WpSBq-S-ekoE33L-iLqGFHVaU25ZzQNQcXdEH9myp0erksICfTcePMQFc1nqWSMU5OD2NwOx3sIyShXOjLx2Sk5MbUqMcbBnQz4ruyeU2DgVzPLKCnYCGFgGOIYfAeFr3HysPORE2vPELl_RQEMdaFX9GxObM-BOEE_goVdrTXqlBwkHRNxJ5VFcVbihGQdNlNSNRp3/', - tradable: true, - craftable: true, - quality: 'Genuine', - defindex: 876, - classes: ['Demoman', 'Heavy'], - type: 'misc', - parts: [], - spells: ['Spectral Spectrum'], - marketable: true, - commodity: false, - paint: "Noble Hatter's Violet", - level: 1, - }); - }); - - it('Case #6', () => { - const econItem = parseEconItem( - { - appid: 440, - contextid: '2', - assetid: '8294625611', - classid: '1336074160', - instanceid: '3639098153', - amount: '1', - currency: 0, - background_color: '3C352E', - icon_url: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEfezgSUhr2hzVGjMHlMvyJC-sUkt8K6ZFH3jMllVQrZbvkNG8ydFXAWfEICqFjp160CCNivZI3VY_j9u8DfA6-sYSUN65sbo_U7o3qKw', - icon_url_large: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEfezgSUhr2hzVGjMHlMvyJC-sUkt8K6ZFH3jMllVQrZbvkNG8ydFXAWfEICqFjp160CCNivZI3VY_j9u8DfA6-sYSUN65sbo_U7o3qKw', - descriptions: [ - { value: 'Style: Tie', color: '756b5e' }, - { - value: - 'Halloween: Chromatic Corruption (spell only active during event)', - color: '7ea9d1', - }, - { - value: - 'Halloween: Voices From Below (spell only active during event)', - color: '7ea9d1', - }, - { - value: - "Whether you're trepanning a skull to let out the sickness ghosts or attaching enough leeches to a patient that they'll pass out from blood loss before you cut off any suspicious-lookinglimbs, this dapper ruffed shirt and coat will assure your patients that they came to the right place for their dangerously insane 18th century medicine.", - }, - ], - tradable: 1, - actions: [ - { - link: - 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=878&lang=en_US', - name: 'Item Wiki Page...', - }, - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D434113929687356346', - name: 'Inspect in Game...', - }, - ], - name: 'Strange Genuine Foppish Physician', - name_color: '4D7455', - type: 'Strange Apparel - Points Scored: 1', - market_name: 'Strange Genuine Foppish Physician', - market_hash_name: 'Strange Genuine Foppish Physician', - market_actions: [ - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D434113929687356346', - name: 'Inspect in Game...', - }, - ], - commodity: 0, - market_tradable_restriction: 7, - market_marketable_restriction: 0, - marketable: 1, - tags: [ - { - category: 'Quality', - internal_name: 'rarity1', - localized_category_name: 'Quality', - localized_tag_name: 'Genuine', - color: '4D7455', - }, - { - category: 'Type', - internal_name: 'misc', - localized_category_name: 'Type', - localized_tag_name: 'Cosmetic', - }, - { - category: 'Class', - internal_name: 'Medic', - localized_category_name: 'Class', - localized_tag_name: 'Medic', - }, - ], - }, - false, true - ); - - assert.deepEqual(econItem, { - name: 'Foppish Physician', - fullName: 'Strange Genuine Foppish Physician', - id: '8294625611', - img: - 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEfezgSUhr2hzVGjMHlMvyJC-sUkt8K6ZFH3jMllVQrZbvkNG8ydFXAWfEICqFjp160CCNivZI3VY_j9u8DfA6-sYSUN65sbo_U7o3qKw/', - tradable: true, - craftable: true, - quality: 'Genuine', - defindex: 878, - elevated: true, - classes: ['Medic'], - type: 'misc', - parts: [], - spells: ['Chromatic Corruption', 'Voices From Below'], - marketable: true, - commodity: false, - level: -1, - }); - }); - - it('Case #7', () => { - const econItem = parseEconItem({ - assetid: "30125", - appid: '440', - classid: '638115890', - instanceid: '0', - icon_url: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIYwkCSQn3uyxKh8bZBvuYN-wBid0wq8hXjW49lVl_NrC2ZjFjJlPHV6FcDPRj8Am1Cn5i6pE3DIfuoOxReV_x9NyRdNFoUKY', - icon_url_large: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIYwkCSQn3uyxKh8bZBvuYN-wBid0wq8hXjW49lVl_NrC2ZjFjJlPHV6FcDPRj8Am1Cn5i6pE3DIfuoOxReV_x9NyRdNFoUKY', - icon_drag_url: '', - name: "Stockbroker's Scarf Strangifier Chemistry Set Series #2", - market_hash_name: - "Stockbroker's Scarf Strangifier Chemistry Set Series #2", - market_name: - "Stockbroker's Scarf Strangifier Chemistry Set Series #2", - name_color: '7D6D00', - background_color: '3C352E', - type: 'Level 5 Recipe', - tradable: 1, - marketable: 1, - commodity: 0, - market_tradable_restriction: '7', - market_marketable_restriction: '0', - descriptions: [ - { - value: - "This item has a set of inputs that, once fulfilled, will\nreward you with what's listed in its outputs.", - }, - { value: ' ' }, - { - value: - 'The following are the inputs that must be fulfilled.', - }, - { value: 'The Vaccinator x 4', color: '8b8989' }, - { value: 'The Blutsauger x 1', color: '8b8989' }, - { value: 'The Disciplinary Action x 1', color: '8b8989' }, - { value: 'The Sandvich x 1', color: '8b8989' }, - { value: 'The Candy Cane x 1', color: '8b8989' }, - { value: 'Strange Scottish Resistance x 1', color: '8b8989' }, - { value: ' ' }, - { - value: - 'You will receive all of the following outputs once all of the inputs are fulfilled.', - }, - { value: "Stockbroker's Scarf Strangifier", color: '8b8989' }, - { value: ' ' }, - { - value: 'This is a limited use item. Uses: 1', - color: '00a000', - app_data: { limited: 1 }, - }, - ], - actions: [ - { - name: 'Item Wiki Page...', - link: - 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=20005&lang=en_US', - }, - ], - tags: [ - { - internal_name: 'Unique', - name: 'Unique', - category: 'Quality', - color: '7D6D00', - category_name: 'Quality', - }, - { - internal_name: 'TF_ItemDynamicRecipeTool', - name: 'Recipe', - category: 'Type', - category_name: 'Type', - }, - ], - app_data: { quantity: '1', def_index: '20005', quality: '6' }, - }, true, true); - - assert.deepEqual(econItem, { - name: 'Chemistry Set', - fullName: "Stockbroker's Scarf Strangifier Chemistry Set Series #2", - id: "30125", - img: 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIYwkCSQn3uyxKh8bZBvuYN-wBid0wq8hXjW49lVl_NrC2ZjFjJlPHV6FcDPRj8Am1Cn5i6pE3DIfuoOxReV_x9NyRdNFoUKY/', - tradable: true, - craftable: true, - quality: 6, - target: "Stockbroker's Scarf", - output: 'Strangifier', - outputQuality: 6, - itemNumber: { type: 'series', value: 2 }, - defindex: 20005, - outputDefindex: 5661, - targetDefindex: 336, - classes: [], - type: 'TF_ItemDynamicRecipeTool', - parts: [], - spells: [], - marketable: true, - commodity: false, - level: 5, - }); - }); - - it('Case #11', () => { - const econItem = parseEconItem({ - "appid":"440", - "classid":"2625497429", - "instanceid":"4048537137", - "icon_url":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffgYghuZgHPUPUOCacF4w3tG3J86sI7V47mp-JTLQu-vNTGYbh_MNgYHMeFXPHVY139uEk9g_VbK52LqTSvg3pcnpTOhA", - "icon_url_large":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffgYghuZgHPUPUOCacF4w3tG3J86sI7V47mp-JTLQu-vNTGYbh_MNgYHMeFXPHVY139uEk9g_VbK52LqTSvg3pcnpTOhA", - "icon_drag_url":"", - "name":"Shell Shocker Rocket Launcher", - "market_hash_name":"Strange Specialized Killstreak Shell Shocker Rocket Launcher (Battle Scarred)", - "market_name":"Strange Specialized Killstreak Shell Shocker Rocket Launcher (Battle Scarred)", - "name_color":"CF6A32", - "background_color":"3C352E", - "type":"", - "tradable":1, - "marketable":1, - "commodity":0, - "market_tradable_restriction":"7", - "market_marketable_restriction":"0", - "descriptions":[ - { - "value":"Assassin Grade Rocket Launcher (Battle Scarred)", - "color":"d32ce6" - }, - { - "value":"Strange Stat Clock Attached", - "color":"CF6A32" - }, - { - "value":" Kills: 5121", - "color":"756b5e" - }, - { - "value":" Pyros Killed: 712", - "color":"756b5e" - }, - { - "value":"Team Colored Decorated Weapon" - }, - { - "value":"Halloween: Pumpkin Bombs (spell only active during event)", - "color":"7ea9d1" - }, - { - "value":"Sheen: Mean Green", - "color":"7ea9d1" - }, - { - "value":"Killstreaks Active", - "color":"7ea9d1" - }, - { - "value":" " - }, - { - "value":" " - }, - { - "value":"Powerhouse Collection" - }, - { - "value":" Liquid Asset Stickybomb Launcher", - "color":"eb4b4b", - "app_data":{ - "def_index":"15045" - } - }, - { - "value":" Thunderbolt Sniper Rifle", - "color":"eb4b4b", - "app_data":{ - "def_index":"15059" - } - }, - { - "value":" Current Event Scattergun", - "color":"d32ce6", - "app_data":{ - "def_index":"15053" - } - }, - { - "value":" Pink Elephant Stickybomb Launcher", - "color":"d32ce6", - "app_data":{ - "def_index":"15048" - } - }, - { - "value":"✔ Shell Shocker Rocket Launcher", - "color":"d32ce6", - "app_data":{ - "def_index":"15052" - } - }, - { - "value":" Flash Fryer Flame Thrower", - "color":"8847ff", - "app_data":{ - "def_index":"15049" - } - }, - { - "value":" Spark of Life Medi Gun", - "color":"8847ff", - "app_data":{ - "def_index":"15050" - } - }, - { - "value":" Dead Reckoner Revolver", - "color":"8847ff", - "app_data":{ - "def_index":"15051" - } - }, - { - "value":" Black Dahlia Pistol", - "color":"8847ff", - "app_data":{ - "def_index":"15046" - } - }, - { - "value":" Sandstone Special Pistol", - "color":"8847ff", - "app_data":{ - "def_index":"15056" - } - }, - { - "value":" Brick House Minigun", - "color":"4b69ff", - "app_data":{ - "def_index":"15055" - } - }, - { - "value":" Aqua Marine Rocket Launcher", - "color":"4b69ff", - "app_data":{ - "def_index":"15057" - } - }, - { - "value":" Low Profile SMG", - "color":"4b69ff", - "app_data":{ - "def_index":"15058" - } - }, - { - "value":" Turbine Torcher Flame Thrower", - "color":"4b69ff", - "app_data":{ - "def_index":"15054" - } - }, - { - "value":" Lightning Rod Shotgun", - "color":"4b69ff", - "app_data":{ - "def_index":"15047" - } - } - ], - "actions":[ - { - "name":"Item Wiki Page...", - "link":"http:\/\/wiki.teamfortress.com\/scripts\/itemredirect.php?id=15052&lang=en_US" - }, - { - "name":"Inspect in Game...", - "link":"steam:\/\/rungame\/440\/76561202255233023\/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D7998211058114246468" - } - ], - "market_actions":[ - { - "name":"Inspect in Game...", - "link":"steam:\/\/rungame\/440\/76561202255233023\/+tf_econ_item_preview%20M%listingid%A%assetid%D7998211058114246468" - } - ], - "tags":[ - { - "internal_name":"strange", - "name":"Strange", - "category":"Quality", - "color":"CF6A32", - "category_name":"Quality" - }, - { - "internal_name":"primary", - "name":"Primary weapon", - "category":"Type", - "category_name":"Type" - }, - { - "internal_name":"Soldier", - "name":"Soldier", - "category":"Class", - "category_name":"Class" - }, - { - "internal_name":"Rarity_Legendary", - "name":"Assassin", - "category":"Rarity", - "color":"d32ce6", - "category_name":"Grade" - }, - { - "internal_name":"Powerhouse_collection", - "name":"Powerhouse Collection", - "category":"Collection", - "category_name":"Collection" - }, - { - "internal_name":"TFUI_InvTooltip_BattleScared", - "name":"Battle Scarred", - "category":"Exterior", - "category_name":"Exterior" - } - ], - "app_data":{ - "def_index":"15052", - "quality":"11" - } - }, false, true); - - assert.deepEqual(econItem, { - name: 'Rocket Launcher', - fullName: 'Strange Specialized Killstreak Shell Shocker Rocket Launcher (Battle Scarred)', - id: undefined, - img: 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffgYghuZgHPUPUOCacF4w3tG3J86sI7V47mp-JTLQu-vNTGYbh_MNgYHMeFXPHVY139uEk9g_VbK52LqTSvg3pcnpTOhA/', - tradable: true, - craftable: true, - quality: "Strange", - texture: "Shell Shocker", - wear: "Battle Scarred", - killstreak: "Specialized Killstreak", - classes: [ 'Soldier' ], - type: 'primary', - collection: 'Powerhouse Collection', - grade: 'Assassin', - parts: [ 'Pyros Killed' ], - spells: [ 'Pumpkin Bombs' ], - marketable: true, - commodity: false, - "defindex": 205, - sheen: "Mean Green", - level: -1, - }); - }); - - it('Case #12', () => { - const econItem = parseEconItem( - {"appid":"440","classid":"1348131292","instanceid":"93028938","icon_url":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIUwADWBXjvD1Pid3oDvqJGt8Yltsm2pxUyzFu31V9NbPtYTUwdwWbBfkOXfZioFDuWSFku8JnUdLg8ulQLw29tYfCMOQycIYbhNRIXDY","icon_url_large":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIUwADWBXjvD1Pid3oDvqJGt8Yltsm2pxUyzFu31V9NbPtYTUwdwWbBfkOXfZioFDuWSFku8JnUdLg8ulQLw29tYfCMOQycIYbhNRIXDY","icon_drag_url":"","name":"Strange Professional Killstreak Festive Grenade Launcher","market_hash_name":"Strange Professional Killstreak Festive Grenade Launcher","market_name":"Strange Professional Killstreak Festive Grenade Launcher","name_color":"CF6A32","background_color":"3C352E","type":"Limited Strange Grenade Launcher - Kills: 20","tradable":1,"marketable":1,"commodity":0,"market_tradable_restriction":"7","market_marketable_restriction":"0","descriptions":[{"value":"(Airborne Enemy Kills: 4)","color":"756b5e"},{"value":"Halloween: Exorcism (spell only active during event)","color":"7ea9d1"},{"value":"Killstreaker: Hypno-Beam","color":"7ea9d1"},{"value":"Sheen: Manndarin","color":"7ea9d1"},{"value":"Killstreaks Active","color":"7ea9d1"}],"actions":[{"name":"Item Wiki Page...","link":"http:\/\/wiki.teamfortress.com\/scripts\/itemredirect.php?id=1007&lang=en_US"}],"tags":[{"internal_name":"strange","name":"Strange","category":"Quality","color":"CF6A32","category_name":"Quality"},{"internal_name":"primary","name":"Primary weapon","category":"Type","category_name":"Type"},{"internal_name":"Demoman","name":"Demoman","category":"Class","category_name":"Class"}],"app_data":{"def_index":"1007","quality":"11"}}, - true, true - ); - - assert.deepEqual(econItem, { - classes: ["Demoman"], - commodity: false, - craftable: true, - fullName: "Strange Professional Killstreak Festive Grenade Launcher", - id: undefined, - img: "https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIUwADWBXjvD1Pid3oDvqJGt8Yltsm2pxUyzFu31V9NbPtYTUwdwWbBfkOXfZioFDuWSFku8JnUdLg8ulQLw29tYfCMOQycIYbhNRIXDY/", - killstreak: 3, - killstreaker: "Hypno-Beam", - marketable: true, - name: "Festive Grenade Launcher", - parts: [ "Airborne Enemy Kills" ], - quality: 11, - sheen: "Manndarin", - spells: [ "Exorcism" ], - tradable: true, - type: "primary", - defindex: 1007, - level: -1, - }); - }); - - - it('Case #13', () => { - const econItem = parseEconItem({"appid":"440","classid":"11042149","instanceid":"19201223","icon_url":"IzMF03bi9WpSBq-S-ekoE33L-iLqGFHVaU25ZzQNQcXdEH9myp0erksICfTdcfMQEpRnqWSMU5OD2NoHwHEIkChXOjLx2Sk5MbUqMcbBnQz4ruyeU3n5awjJLjLaE0pXEvYaYzGdkW_0p7rBXG6aQb0rFl9XK_QM8jdIb82PaURv3dUMrT27kxUqSU5_IZIXcl_smSJdIbMiwRlwHyU","icon_url_large":"IzMF03bi9WpSBq-S-ekoE33L-iLqGFHVaU25ZzQNQcXdEH9myp0erksICfTdcfMQEpRnqWSMU5OD2NoHwHEIkChXOjLx2Sk5MbUqMcbBnQz4ruyeU3n5awjJLjLaE0pXEvYaYzGdkW_0p7rBXG6aQb0rFl9XK_QM8jdIb82PaURv3dUMrT27kxUqSU5_IZIXcl_smSJdIbMiwRlwHyU","icon_drag_url":"","name":"The Essential Accessories","market_hash_name":"The Essential Accessories","market_name":"The Essential Accessories","name_color":"7D6D00","background_color":"3C352E","type":"Limited Level 10 Apparel","tradable":1,"marketable":1,"commodity":0,"market_tradable_restriction":"7","market_marketable_restriction":"0","descriptions":[{"value":"Paint Color: Operator's Overalls","color":"756b5e"},{"value":""}],"actions":[{"name":"Item Wiki Page...","link":"http:\/\/wiki.teamfortress.com\/scripts\/itemredirect.php?id=347&lang=en_US"},{"name":"Inspect in Game...","link":"steam:\/\/rungame\/440\/76561202255233023\/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D2891326522173157497"}],"market_actions":[{"name":"Inspect in Game...","link":"steam:\/\/rungame\/440\/76561202255233023\/+tf_econ_item_preview%20M%listingid%A%assetid%D2891326522173157497"}],"tags":[{"internal_name":"Unique","name":"Unique","category":"Quality","color":"7D6D00","category_name":"Quality"},{"internal_name":"misc","name":"Cosmetic","category":"Type","category_name":"Type"},{"internal_name":"Scout","name":"Scout","category":"Class","category_name":"Class"}],"app_data":{"def_index":"347","quality":"6"}}, true, true); - - assert.deepEqual(econItem, { - "classes": [ - "Scout" - ], - "commodity": false, - "craftable": true, - "fullName": "The Essential Accessories", - "id": undefined, - "img": "https://steamcommunity-a.akamaihd.net/economy/image/IzMF03bi9WpSBq-S-ekoE33L-iLqGFHVaU25ZzQNQcXdEH9myp0erksICfTdcfMQEpRnqWSMU5OD2NoHwHEIkChXOjLx2Sk5MbUqMcbBnQz4ruyeU3n5awjJLjLaE0pXEvYaYzGdkW_0p7rBXG6aQb0rFl9XK_QM8jdIb82PaURv3dUMrT27kxUqSU5_IZIXcl_smSJdIbMiwRlwHyU/", - "marketable": true, - "name": "The Essential Accessories", - "paint": "Operator's Overalls", - "parts": [], - "quality": 6, - "spells": [], - "tradable": true, - "type": "misc", - "defindex": 347, - level: -1, - }); - }); - - it('Case #14 - bat output', () => { - class MockSchema extends Schema { - getDefindex(input) { - if (input === 'Bat') { - return 0; - } - - return super.getDefindex(input); - } - } - - const format = createFormat(new MockSchema()); - const econItem = format.parseEconItem({ - assetid: "30125", - appid: '440', - classid: '638115890', - instanceid: '0', - icon_url: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIYwkCSQn3uyxKh8bZBvuYN-wBid0wq8hXjW49lVl_NrC2ZjFjJlPHV6FcDPRj8Am1Cn5i6pE3DIfuoOxReV_x9NyRdNFoUKY', - icon_url_large: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIYwkCSQn3uyxKh8bZBvuYN-wBid0wq8hXjW49lVl_NrC2ZjFjJlPHV6FcDPRj8Am1Cn5i6pE3DIfuoOxReV_x9NyRdNFoUKY', - icon_drag_url: '', - name: "Bat Strangifier Chemistry Set Series #2", - market_hash_name: - "Bat Strangifier Chemistry Set Series #2", - market_name: - "Bat Strangifier Chemistry Set Series #2", - name_color: '7D6D00', - background_color: '3C352E', - type: 'Level 5 Recipe', - tradable: 1, - marketable: 1, - commodity: 0, - market_tradable_restriction: '7', - market_marketable_restriction: '0', - descriptions: [ - { - value: - "This item has a set of inputs that, once fulfilled, will\nreward you with what's listed in its outputs.", - }, - { value: ' ' }, - { - value: - 'The following are the inputs that must be fulfilled.', - }, - { value: 'The Vaccinator x 4', color: '8b8989' }, - { value: 'The Blutsauger x 1', color: '8b8989' }, - { value: 'The Disciplinary Action x 1', color: '8b8989' }, - { value: 'The Sandvich x 1', color: '8b8989' }, - { value: 'The Candy Cane x 1', color: '8b8989' }, - { value: 'Strange Scottish Resistance x 1', color: '8b8989' }, - { value: ' ' }, - { - value: - 'You will receive all of the following outputs once all of the inputs are fulfilled.', - }, - { value: "Bat Strangifier", color: '8b8989' }, - { value: ' ' }, - { - value: 'This is a limited use item. Uses: 1', - color: '00a000', - app_data: { limited: 1 }, - }, - ], - actions: [ - { - name: 'Item Wiki Page...', - link: - 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=20005&lang=en_US', - }, - ], - tags: [ - { - internal_name: 'Unique', - name: 'Unique', - category: 'Quality', - color: '7D6D00', - category_name: 'Quality', - }, - { - internal_name: 'TF_ItemDynamicRecipeTool', - name: 'Recipe', - category: 'Type', - category_name: 'Type', - }, - ], - app_data: { quantity: '1', def_index: '20005', quality: '6' }, - }, false, true); - - assert.deepEqual(econItem, { - name: 'Chemistry Set', - fullName: "Bat Strangifier Chemistry Set Series #2", - id: "30125", - img: 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIYwkCSQn3uyxKh8bZBvuYN-wBid0wq8hXjW49lVl_NrC2ZjFjJlPHV6FcDPRj8Am1Cn5i6pE3DIfuoOxReV_x9NyRdNFoUKY/', - tradable: true, - craftable: true, - quality: 'Unique', - target: "Bat", - output: 'Strangifier', - outputQuality: 'Unique', - itemNumber: { type: 'series', value: 2 }, - defindex: 20005, - outputDefindex: 5661, - targetDefindex: 0, - classes: [], - type: 'TF_ItemDynamicRecipeTool', - parts: [], - spells: [], - marketable: true, - commodity: false, - level: 5, - }); - }); - - it('Case #15 - bat target', () => { - class MockSchema extends Schema { - getDefindex(input) { - if (input === 'Bat') { - return 0; - } - - return super.getDefindex(input); - } - } - - const format = createFormat(new MockSchema()); - const econItem = format.parseEconItem( - {"appid":"440","classid":"638769830","instanceid":"11040671","icon_url":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIYwkCSQn3uyxKh8bZBvuYN-wBid0wq8hXjW49lVl_NrC2ZjFjJlPHV6FcDPRj8Am1Cn5i6pE3DIfuoOxReV_x9NyRdNFoUKY","icon_url_large":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIYwkCSQn3uyxKh8bZBvuYN-wBid0wq8hXjW49lVl_NrC2ZjFjJlPHV6FcDPRj8Am1Cn5i6pE3DIfuoOxReV_x9NyRdNFoUKY","icon_drag_url":"","name":"Collector's Bat Chemistry Set","market_hash_name":"Collector's Bat Chemistry Set","market_name":"Collector's Bat Chemistry Set","name_color":"7D6D00","background_color":"3C352E","type":"Level 5 Recipe","tradable":1,"marketable":1,"commodity":0,"market_tradable_restriction":"7","market_marketable_restriction":"0","descriptions":[{"value":"This item has a set of inputs that, once fulfilled, will\nreward you with what's listed in its outputs."},{"value":" "},{"value":"The following are the inputs that must be fulfilled."},{"value":"Festive Black Box x 198","color":"8b8989"},{"value":" "},{"value":"You will receive all of the following outputs once all of the inputs are fulfilled."},{"value":"Collector's Festive Black Box","color":"8b8989"},{"value":" "},{"value":"This is a limited use item. Uses: 1","color":"00a000","app_data":{"limited":1}}],"actions":[{"name":"Item Wiki Page...","link":"http:\/\/wiki.teamfortress.com\/scripts\/itemredirect.php?id=20007&lang=en_US"}],"tags":[{"internal_name":"Unique","name":"Unique","category":"Quality","color":"7D6D00","category_name":"Quality"},{"internal_name":"TF_ItemDynamicRecipeTool","name":"Recipe","category":"Type","category_name":"Type"}],"app_data":{"quantity":"1","def_index":"20007","quality":"6"}}, - false, true - ); - - assert.deepEqual(econItem, { - name: 'Chemistry Set', - fullName: "Collector's Bat Chemistry Set", - img: 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIYwkCSQn3uyxKh8bZBvuYN-wBid0wq8hXjW49lVl_NrC2ZjFjJlPHV6FcDPRj8Am1Cn5i6pE3DIfuoOxReV_x9NyRdNFoUKY/', - id: undefined, - tradable: true, - craftable: true, - quality: 'Unique', - output: 'Bat', - outputQuality: 'Collector\'s', - defindex: 20005, - outputDefindex: 0, - classes: [], - type: 'TF_ItemDynamicRecipeTool', - parts: [], - spells: [], - marketable: true, - commodity: false, - level: 5, - }); - }); - - it('Case #16 - bat', () => { - class MockSchema extends Schema { - getDefindex() { - return 0; - } - } - - const format = createFormat(new MockSchema()); - const econItem = format.parseEconItem({"appid":"440","classid":"171635229","instanceid":"0","icon_url":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIUwUQSSTuuSpEjYbiXaHaCuVSyI9l4MQCjjJvk1IrYbTjMmM2cFyRAPYICqI5pFruWX8wptdtU1jiacVz","icon_url_large":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIUwUQSSTuuSpEjYbiXaHaCuVSyI9l4MQCjjJvk1IrYbTjMmM2cFyRAPYICqI5pFruWX8wptdtU1jiacVz","icon_drag_url":"","name":"Bat","market_hash_name":"Bat","market_name":"Bat","name_color":"7D6D00","background_color":"3C352E","type":"Level 1 Bat","tradable":1,"marketable":0,"commodity":0,"market_tradable_restriction":"7","market_marketable_restriction":"0","descriptions":[{"value":"''lol''"}],"actions":[{"name":"Item Wiki Page...","link":"http:\/\/wiki.teamfortress.com\/scripts\/itemredirect.php?id=190&lang=en_US"}],"tags":[{"internal_name":"Unique","name":"Unique","category":"Quality","color":"7D6D00","category_name":"Quality"},{"internal_name":"melee","name":"Melee weapon","category":"Type","category_name":"Type"},{"internal_name":"Scout","name":"Scout","category":"Class","category_name":"Class"}],"app_data":{"def_index":"0","quality":"6"}}, false, true); - - assert.deepEqual(econItem, { - name: 'Bat', - fullName: "Bat", - defindex: 0, - img: 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIUwUQSSTuuSpEjYbiXaHaCuVSyI9l4MQCjjJvk1IrYbTjMmM2cFyRAPYICqI5pFruWX8wptdtU1jiacVz/', - id: undefined, - tradable: true, - craftable: true, - quality: 'Unique', - classes: [], - type: 'melee', - parts: [], - spells: [], - marketable: false, - commodity: false, - level: 1, - classes: ['Scout'] - }); - }) -}); - -describe('Econ item with true defindex', () => { - it('Case #1 - skin', () => { - const econItem = parseEconItem( - { - appid: 440, - contextid: '2', - assetid: '8656785508', - classid: '3543846179', - instanceid: '3516082756', - amount: '1', - currency: 0, - background_color: '3C352E', - icon_url: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffjDz5zdwmTVPAOCsot8Qn-Whg07dR3XcGzuehWe1q65oHFOuQpN4kZGpOECffQZl39vho_1KdefJbbonvq3SvubmwUG028UzYUYzA', - icon_url_large: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffjDz5zdwmTVPAOCsot8Qn-Whg07dR3XcGzuehWe1q65oHFOuQpN4kZGpOECffQZl39vho_1KdefJbbonvq3SvubmwUG028UzYUYzA', - descriptions: [ - { - value: 'Commando Grade Rocket Launcher (Field-Tested)', - color: '8847ff', - }, - { value: 'Festivized', color: 'ffd700' }, - { - value: - 'Halloween: Pumpkin Bombs (spell only active during event)', - color: '7ea9d1', - }, - { value: 'Sheen: Agonizing Emerald', color: '7ea9d1' }, - { value: 'Killstreaks Active', color: '7ea9d1' }, - { - value: '\nGift from: VLaDOS | S>C.MOON YELLOW BELT', - color: '7ea9d1', - }, - { - value: - 'Date Received: Tuesday, September 10, 2019 (9:36:39) GMT', - }, - { value: ' ' }, - { value: ' ' }, - { value: 'Concealed Killer Collection' }, - { - value: ' Sand Cannon Rocket Launcher', - color: 'eb4b4b', - }, - { value: ' Red Rock Roscoe Pistol', color: 'eb4b4b' }, - { - value: ' Psychedelic Slugger Revolver', - color: 'd32ce6', - }, - { value: ' Purple Range Sniper Rifle', color: 'd32ce6' }, - { - value: ' Sudden Flurry Stickybomb Launcher', - color: 'd32ce6', - }, - { value: ' Night Terror Scattergun', color: '8847ff' }, - { - value: ' Carpet Bomber Stickybomb Launcher', - color: '8847ff', - }, - { - value: '✔ Woodland Warrior Rocket Launcher', - color: '8847ff', - }, - { value: ' Wrapped Reviver Medi Gun', color: '8847ff' }, - { value: ' Night Owl Sniper Rifle', color: '4b69ff' }, - { value: ' Woodsy Widowmaker SMG', color: '4b69ff' }, - { - value: ' Backwoods Boomstick Shotgun', - color: '4b69ff', - }, - { - value: ' King of the Jungle Minigun', - color: '4b69ff', - }, - { value: ' Masked Mender Medi Gun', color: '4b69ff' }, - { value: ' Forest Fire Flame Thrower', color: '4b69ff' }, - ], - tradable: 1, - actions: [ - { - link: - 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=15006&lang=en_US', - name: 'Item Wiki Page...', - }, - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D11534198800805877074', - name: 'Inspect in Game...', - }, - ], - fraudwarnings: [ - 'This item has been renamed.\nOriginal name: "Rocket Launcher"', - ], - name: "''post live spell rocket louncher !!!!!!!''", - name_color: 'FAFAFA', - type: '', - market_name: - 'Festivized Specialized Killstreak Woodland Warrior Rocket Launcher (Field-Tested)', - market_hash_name: - 'Festivized Specialized Killstreak Woodland Warrior Rocket Launcher (Field-Tested)', - market_actions: [ - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D11534198800805877074', - name: 'Inspect in Game...', - }, - ], - commodity: 0, - market_tradable_restriction: 7, - market_marketable_restriction: 0, - marketable: 1, - tags: [ - { - category: 'Quality', - internal_name: 'paintkitweapon', - localized_category_name: 'Quality', - localized_tag_name: 'Decorated Weapon', - color: 'FAFAFA', - }, - { - category: 'Type', - internal_name: 'primary', - localized_category_name: 'Type', - localized_tag_name: 'Primary weapon', - }, - { - category: 'Class', - internal_name: 'Soldier', - localized_category_name: 'Class', - localized_tag_name: 'Soldier', - }, - { - category: 'Rarity', - internal_name: 'Rarity_Mythical', - localized_category_name: 'Grade', - localized_tag_name: 'Commando', - color: '8847ff', - }, - { - category: 'Collection', - internal_name: 'concealedkiller_collection', - localized_category_name: 'Collection', - localized_tag_name: 'Concealed Killer Collection', - }, - { - category: 'Exterior', - internal_name: 'TFUI_InvTooltip_FieldTested', - localized_category_name: 'Exterior', - localized_tag_name: 'Field-Tested', - }, - ], - }, - false, true, { useTrueDefindex: true } - ); - - assert.deepEqual(econItem, { - name: 'Rocket Launcher', - fullName: - 'Festivized Specialized Killstreak Woodland Warrior Rocket Launcher (Field-Tested)', - id: '8656785508', - img: - 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffjDz5zdwmTVPAOCsot8Qn-Whg07dR3XcGzuehWe1q65oHFOuQpN4kZGpOECffQZl39vho_1KdefJbbonvq3SvubmwUG028UzYUYzA/', - tradable: true, - craftable: true, - quality: 'Decorated Weapon', - texture: 'Woodland Warrior', - wear: 'Field-Tested', - defindex: 15006, - festivized: true, - killstreak: 'Specialized Killstreak', - classes: ['Soldier'], - type: 'primary', - collection: 'Concealed Killer Collection', - grade: 'Commando', - parts: [], - spells: ['Pumpkin Bombs'], - marketable: true, - commodity: false, - sheen: "Agonizing Emerald", - level: -1, - }); - }); - - it('Case #2 - skin', () => { - const econItem = parseEconItem({ - "appid":"440", - "classid":"2625497429", - "instanceid":"4048537137", - "icon_url":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffgYghuZgHPUPUOCacF4w3tG3J86sI7V47mp-JTLQu-vNTGYbh_MNgYHMeFXPHVY139uEk9g_VbK52LqTSvg3pcnpTOhA", - "icon_url_large":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffgYghuZgHPUPUOCacF4w3tG3J86sI7V47mp-JTLQu-vNTGYbh_MNgYHMeFXPHVY139uEk9g_VbK52LqTSvg3pcnpTOhA", - "icon_drag_url":"", - "name":"Shell Shocker Rocket Launcher", - "market_hash_name":"Strange Specialized Killstreak Shell Shocker Rocket Launcher (Battle Scarred)", - "market_name":"Strange Specialized Killstreak Shell Shocker Rocket Launcher (Battle Scarred)", - "name_color":"CF6A32", - "background_color":"3C352E", - "type":"", - "tradable":1, - "marketable":1, - "commodity":0, - "market_tradable_restriction":"7", - "market_marketable_restriction":"0", - "descriptions":[ - { - "value":"Assassin Grade Rocket Launcher (Battle Scarred)", - "color":"d32ce6" - }, - { - "value":"Strange Stat Clock Attached", - "color":"CF6A32" - }, - { - "value":" Kills: 5121", - "color":"756b5e" - }, - { - "value":" Pyros Killed: 712", - "color":"756b5e" - }, - { - "value":"Team Colored Decorated Weapon" - }, - { - "value":"Halloween: Pumpkin Bombs (spell only active during event)", - "color":"7ea9d1" - }, - { - "value":"Sheen: Mean Green", - "color":"7ea9d1" - }, - { - "value":"Killstreaks Active", - "color":"7ea9d1" - }, - { - "value":" " - }, - { - "value":" " - }, - { - "value":"Powerhouse Collection" - }, - { - "value":" Liquid Asset Stickybomb Launcher", - "color":"eb4b4b", - "app_data":{ - "def_index":"15045" - } - }, - { - "value":" Thunderbolt Sniper Rifle", - "color":"eb4b4b", - "app_data":{ - "def_index":"15059" - } - }, - { - "value":" Current Event Scattergun", - "color":"d32ce6", - "app_data":{ - "def_index":"15053" - } - }, - { - "value":" Pink Elephant Stickybomb Launcher", - "color":"d32ce6", - "app_data":{ - "def_index":"15048" - } - }, - { - "value":"✔ Shell Shocker Rocket Launcher", - "color":"d32ce6", - "app_data":{ - "def_index":"15052" - } - }, - { - "value":" Flash Fryer Flame Thrower", - "color":"8847ff", - "app_data":{ - "def_index":"15049" - } - }, - { - "value":" Spark of Life Medi Gun", - "color":"8847ff", - "app_data":{ - "def_index":"15050" - } - }, - { - "value":" Dead Reckoner Revolver", - "color":"8847ff", - "app_data":{ - "def_index":"15051" - } - }, - { - "value":" Black Dahlia Pistol", - "color":"8847ff", - "app_data":{ - "def_index":"15046" - } - }, - { - "value":" Sandstone Special Pistol", - "color":"8847ff", - "app_data":{ - "def_index":"15056" - } - }, - { - "value":" Brick House Minigun", - "color":"4b69ff", - "app_data":{ - "def_index":"15055" - } - }, - { - "value":" Aqua Marine Rocket Launcher", - "color":"4b69ff", - "app_data":{ - "def_index":"15057" - } - }, - { - "value":" Low Profile SMG", - "color":"4b69ff", - "app_data":{ - "def_index":"15058" - } - }, - { - "value":" Turbine Torcher Flame Thrower", - "color":"4b69ff", - "app_data":{ - "def_index":"15054" - } - }, - { - "value":" Lightning Rod Shotgun", - "color":"4b69ff", - "app_data":{ - "def_index":"15047" - } - } - ], - "actions":[ - { - "name":"Item Wiki Page...", - "link":"http:\/\/wiki.teamfortress.com\/scripts\/itemredirect.php?id=15052&lang=en_US" - }, - { - "name":"Inspect in Game...", - "link":"steam:\/\/rungame\/440\/76561202255233023\/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D7998211058114246468" - } - ], - "market_actions":[ - { - "name":"Inspect in Game...", - "link":"steam:\/\/rungame\/440\/76561202255233023\/+tf_econ_item_preview%20M%listingid%A%assetid%D7998211058114246468" - } - ], - "tags":[ - { - "internal_name":"strange", - "name":"Strange", - "category":"Quality", - "color":"CF6A32", - "category_name":"Quality" - }, - { - "internal_name":"primary", - "name":"Primary weapon", - "category":"Type", - "category_name":"Type" - }, - { - "internal_name":"Soldier", - "name":"Soldier", - "category":"Class", - "category_name":"Class" - }, - { - "internal_name":"Rarity_Legendary", - "name":"Assassin", - "category":"Rarity", - "color":"d32ce6", - "category_name":"Grade" - }, - { - "internal_name":"Powerhouse_collection", - "name":"Powerhouse Collection", - "category":"Collection", - "category_name":"Collection" - }, - { - "internal_name":"TFUI_InvTooltip_BattleScared", - "name":"Battle Scarred", - "category":"Exterior", - "category_name":"Exterior" - } - ], - "app_data":{ - "def_index":"15052", - "quality":"11" - } - }, false, true, { useTrueDefindex: true }); - - assert.deepEqual(econItem, { - name: 'Rocket Launcher', - fullName: 'Strange Specialized Killstreak Shell Shocker Rocket Launcher (Battle Scarred)', - id: undefined, - img: 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffgYghuZgHPUPUOCacF4w3tG3J86sI7V47mp-JTLQu-vNTGYbh_MNgYHMeFXPHVY139uEk9g_VbK52LqTSvg3pcnpTOhA/', - tradable: true, - craftable: true, - quality: "Strange", - texture: "Shell Shocker", - wear: "Battle Scarred", - killstreak: "Specialized Killstreak", - classes: [ 'Soldier' ], - type: 'primary', - collection: 'Powerhouse Collection', - grade: 'Assassin', - parts: [ 'Pyros Killed' ], - spells: [ 'Pumpkin Bombs' ], - marketable: true, - commodity: false, - "defindex": 15052, - sheen: "Mean Green", - level: -1, - }); - }); - - it('Case #3 - bad wiki link', () => { - const econItem = parseEconItem({ - appid: 440, - contextid: '2', - assetid: '8407830034', - classid: '3662018019', - instanceid: '11040671', - amount: '1', - currency: 0, - background_color: '3C352E', - icon_url: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffsDz5zdwmTVPAOCcot8Qn-Wxg07dR3XcGzub5ffwvmttSXYrAlY9xFTMaCUvbXNQz_6EkwiPRYKJaIon-9jHjrOWoUG0280KDki-w', - icon_url_large: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffsDz5zdwmTVPAOCcot8Qn-Wxg07dR3XcGzub5ffwvmttSXYrAlY9xFTMaCUvbXNQz_6EkwiPRYKJaIon-9jHjrOWoUG0280KDki-w', - descriptions: [ - { - value: 'Mercenary Grade Flame Thrower (Minimal Wear)', - color: '4b69ff', - }, - { value: '★ Unusual Effect: Cool', color: 'ffd700' }, - { value: 'Festivized', color: 'ffd700' }, - { - value: 'Extinguishing teammates restores 20 health', - color: '7ea9d1', - }, - { value: 'Sheen: Agonizing Emerald', color: '7ea9d1' }, - { value: 'Killstreaks Active', color: '7ea9d1' }, - { - value: - 'Afterburn reduces Medi Gun healing and resist shield effects.\nAlt-Fire: Release a blast of air that pushes enemies and projectiles and extinguishes teammates that are on fire.', - }, - { value: ' ' }, - { value: ' ' }, - { value: 'Concealed Killer Collection' }, - { value: ' Sand Cannon Rocket Launcher', color: 'eb4b4b' }, - { value: ' Red Rock Roscoe Pistol', color: 'eb4b4b' }, - { value: ' Psychedelic Slugger Revolver', color: 'd32ce6' }, - { value: ' Purple Range Sniper Rifle', color: 'd32ce6' }, - { - value: ' Sudden Flurry Stickybomb Launcher', - color: 'd32ce6', - }, - { value: ' Night Terror Scattergun', color: '8847ff' }, - { - value: ' Carpet Bomber Stickybomb Launcher', - color: '8847ff', - }, - { - value: ' Woodland Warrior Rocket Launcher', - color: '8847ff', - }, - { value: ' Wrapped Reviver Medi Gun', color: '8847ff' }, - { value: ' Night Owl Sniper Rifle', color: '4b69ff' }, - { value: ' Woodsy Widowmaker SMG', color: '4b69ff' }, - { value: ' Backwoods Boomstick Shotgun', color: '4b69ff' }, - { value: ' King of the Jungle Minigun', color: '4b69ff' }, - { value: ' Masked Mender Medi Gun', color: '4b69ff' }, - { value: '★ Forest Fire Flame Thrower', color: '4b69ff' }, - ], - tradable: 1, - actions: [ - { - link: - 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=15005&lang=en_US', - name: 'Item Wiki Page...', - }, - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D6922402693932635553', - name: 'Inspect in Game...', - }, - ], - name: 'Festivized Forest Fire Flame Thrower', - name_color: '8650AC', - type: '', - market_name: - 'Unusual Festivized Specialized Killstreak Forest Fire Flame Thrower (Minimal Wear)', - market_hash_name: - 'Unusual Festivized Specialized Killstreak Forest Fire Flame Thrower (Minimal Wear)', - market_actions: [ - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D6922402693932635553', - name: 'Inspect in Game...', - }, - ], - commodity: 0, - market_tradable_restriction: 7, - market_marketable_restriction: 0, - marketable: 1, - tags: [ - { - category: 'Quality', - internal_name: 'rarity4', - localized_category_name: 'Quality', - localized_tag_name: 'Unusual', - color: '8650AC', - }, - { - category: 'Type', - internal_name: 'primary', - localized_category_name: 'Type', - localized_tag_name: 'Primary weapon', - }, - { - category: 'Class', - internal_name: 'Pyro', - localized_category_name: 'Class', - localized_tag_name: 'Pyro', - }, - { - category: 'Rarity', - internal_name: 'Rarity_Rare', - localized_category_name: 'Grade', - localized_tag_name: 'Mercenary', - color: '4b69ff', - }, - { - category: 'Collection', - internal_name: 'concealedkiller_collection', - localized_category_name: 'Collection', - localized_tag_name: 'Concealed Killer Collection', - }, - { - category: 'Exterior', - internal_name: 'TFUI_InvTooltip_MinimalWear', - localized_category_name: 'Exterior', - localized_tag_name: 'Minimal Wear', - }, - ], - }, true, true, { useTrueDefindex: true }); - - assert.deepEqual(econItem, { - name: 'Flame Thrower', - fullName: - 'Cool Festivized Specialized Killstreak Forest Fire Flame Thrower (Minimal Wear)', - id: '8407830034', - img: - 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffsDz5zdwmTVPAOCcot8Qn-Wxg07dR3XcGzub5ffwvmttSXYrAlY9xFTMaCUvbXNQz_6EkwiPRYKJaIon-9jHjrOWoUG0280KDki-w/', - tradable: true, - craftable: true, - quality: 5, - texture: 9, - wear: 2, - killstreak: 2, - festivized: true, - effect: 703, - classes: ['Pyro'], - type: 'primary', - collection: 'Concealed Killer Collection', - grade: 'Mercenary', - parts: [], - spells: [], - marketable: true, - commodity: false, - sheen: "Agonizing Emerald", - level: -1, - defindex: 15005 - }); - }) -}); +const { assert } = require('chai'); + +const { parseEconItem, Schema } = require('../dist/static'); +const { createFormat } = require('../dist'); + +describe('parseEconItem', () => { + it('Case #1', () => { + const econItem = parseEconItem({ + appid: 440, + contextid: '2', + assetid: '8407830034', + classid: '3662018019', + instanceid: '11040671', + amount: '1', + currency: 0, + background_color: '3C352E', + icon_url: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffsDz5zdwmTVPAOCcot8Qn-Wxg07dR3XcGzub5ffwvmttSXYrAlY9xFTMaCUvbXNQz_6EkwiPRYKJaIon-9jHjrOWoUG0280KDki-w', + icon_url_large: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffsDz5zdwmTVPAOCcot8Qn-Wxg07dR3XcGzub5ffwvmttSXYrAlY9xFTMaCUvbXNQz_6EkwiPRYKJaIon-9jHjrOWoUG0280KDki-w', + descriptions: [ + { + value: 'Mercenary Grade Flame Thrower (Minimal Wear)', + color: '4b69ff', + }, + { value: '★ Unusual Effect: Cool', color: 'ffd700' }, + { value: 'Festivized', color: 'ffd700' }, + { + value: 'Extinguishing teammates restores 20 health', + color: '7ea9d1', + }, + { value: 'Sheen: Agonizing Emerald', color: '7ea9d1' }, + { value: 'Killstreaks Active', color: '7ea9d1' }, + { + value: + 'Afterburn reduces Medi Gun healing and resist shield effects.\nAlt-Fire: Release a blast of air that pushes enemies and projectiles and extinguishes teammates that are on fire.', + }, + { value: ' ' }, + { value: ' ' }, + { value: 'Concealed Killer Collection' }, + { value: ' Sand Cannon Rocket Launcher', color: 'eb4b4b' }, + { value: ' Red Rock Roscoe Pistol', color: 'eb4b4b' }, + { value: ' Psychedelic Slugger Revolver', color: 'd32ce6' }, + { value: ' Purple Range Sniper Rifle', color: 'd32ce6' }, + { + value: ' Sudden Flurry Stickybomb Launcher', + color: 'd32ce6', + }, + { value: ' Night Terror Scattergun', color: '8847ff' }, + { + value: ' Carpet Bomber Stickybomb Launcher', + color: '8847ff', + }, + { + value: ' Woodland Warrior Rocket Launcher', + color: '8847ff', + }, + { value: ' Wrapped Reviver Medi Gun', color: '8847ff' }, + { value: ' Night Owl Sniper Rifle', color: '4b69ff' }, + { value: ' Woodsy Widowmaker SMG', color: '4b69ff' }, + { value: ' Backwoods Boomstick Shotgun', color: '4b69ff' }, + { value: ' King of the Jungle Minigun', color: '4b69ff' }, + { value: ' Masked Mender Medi Gun', color: '4b69ff' }, + { value: '★ Forest Fire Flame Thrower', color: '4b69ff' }, + ], + tradable: 1, + actions: [ + { + link: + 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=15005&lang=en_US', + name: 'Item Wiki Page...', + }, + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D6922402693932635553', + name: 'Inspect in Game...', + }, + ], + name: 'Festivized Forest Fire Flame Thrower', + name_color: '8650AC', + type: '', + market_name: + 'Unusual Festivized Specialized Killstreak Forest Fire Flame Thrower (Minimal Wear)', + market_hash_name: + 'Unusual Festivized Specialized Killstreak Forest Fire Flame Thrower (Minimal Wear)', + market_actions: [ + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D6922402693932635553', + name: 'Inspect in Game...', + }, + ], + commodity: 0, + market_tradable_restriction: 7, + market_marketable_restriction: 0, + marketable: 1, + tags: [ + { + category: 'Quality', + internal_name: 'rarity4', + localized_category_name: 'Quality', + localized_tag_name: 'Unusual', + color: '8650AC', + }, + { + category: 'Type', + internal_name: 'primary', + localized_category_name: 'Type', + localized_tag_name: 'Primary weapon', + }, + { + category: 'Class', + internal_name: 'Pyro', + localized_category_name: 'Class', + localized_tag_name: 'Pyro', + }, + { + category: 'Rarity', + internal_name: 'Rarity_Rare', + localized_category_name: 'Grade', + localized_tag_name: 'Mercenary', + color: '4b69ff', + }, + { + category: 'Collection', + internal_name: 'concealedkiller_collection', + localized_category_name: 'Collection', + localized_tag_name: 'Concealed Killer Collection', + }, + { + category: 'Exterior', + internal_name: 'TFUI_InvTooltip_MinimalWear', + localized_category_name: 'Exterior', + localized_tag_name: 'Minimal Wear', + }, + ], + }, true, false); + + assert.deepEqual(econItem, { + name: 'Flame Thrower', + fullName: + 'Cool Festivized Specialized Killstreak Forest Fire Flame Thrower (Minimal Wear)', + id: '8407830034', + img: + 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffsDz5zdwmTVPAOCcot8Qn-Wxg07dR3XcGzub5ffwvmttSXYrAlY9xFTMaCUvbXNQz_6EkwiPRYKJaIon-9jHjrOWoUG0280KDki-w/', + tradable: true, + craftable: true, + quality: 5, + texture: 9, + wear: 2, + killstreak: 2, + festivized: true, + effect: 703, + classes: ['Pyro'], + type: 'primary', + collection: 'Concealed Killer Collection', + grade: 'Mercenary', + parts: [], + spells: [], + marketable: true, + commodity: false, + sheen: "Agonizing Emerald", + level: -1, + }); + }); + + it('Case #2', () => { + const econItem = parseEconItem({ + appid: 440, + contextid: '2', + assetid: '8555715171', + classid: '3717643208', + instanceid: '344437314', + amount: '1', + currency: 0, + background_color: '3C352E', + icon_url: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEJeQQaWA_dtDlRj82oVPeJUbRTyohkssUGjDBox1IsNrKxaWc1JFWQWPYHDKFsow2_WyVlv4lzWtBtJvRLsg', + icon_url_large: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEJeQQaWA_dtDlRj82oVPeJUbRTyohkssUGjDBox1IsNrKxaWc1JFWQWPYHDKFsow2_WyVlv4lzWtBtJvRLsg', + descriptions: [ + { value: "★ Unusual Effect: Nuts n' Bolts", color: 'ffd700' }, + { value: "''hmm epic''" }, + ], + tradable: 1, + actions: [ + { + link: + 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=434&lang=en_US', + name: 'Item Wiki Page...', + }, + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D16442165943709427870', + name: 'Inspect in Game...', + }, + ], + name: 'Unusual Brain Bucket', + name_color: '8650AC', + type: 'Level 82 Hat', + market_name: 'Unusual Brain Bucket', + market_hash_name: 'Unusual Brain Bucket', + market_actions: [ + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D16442165943709427870', + name: 'Inspect in Game...', + }, + ], + commodity: 0, + market_tradable_restriction: 7, + market_marketable_restriction: 0, + marketable: 1, + tags: [ + { + category: 'Quality', + internal_name: 'rarity4', + localized_category_name: 'Quality', + localized_tag_name: 'Unusual', + color: '8650AC', + }, + { + category: 'Type', + internal_name: 'misc', + localized_category_name: 'Type', + localized_tag_name: 'Cosmetic', + }, + { + category: 'Class', + internal_name: 'Soldier', + localized_category_name: 'Class', + localized_tag_name: 'Soldier', + }, + ], + }, true, false); + + assert.deepEqual(econItem, { + name: 'Brain Bucket', + fullName: "Nuts n' Bolts Brain Bucket", + id: '8555715171', + img: + 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEJeQQaWA_dtDlRj82oVPeJUbRTyohkssUGjDBox1IsNrKxaWc1JFWQWPYHDKFsow2_WyVlv4lzWtBtJvRLsg/', + tradable: true, + craftable: true, + quality: 5, + effect: 31, + classes: ['Soldier'], + type: 'misc', + parts: [], + spells: [], + marketable: true, + commodity: false, + level: 82, + }); + }); + + it('Case #3', () => { + const econItem = parseEconItem({ + appid: 440, + contextid: '2', + assetid: '8574678947', + classid: '3555490789', + instanceid: '856289751', + amount: '1', + currency: 0, + background_color: '3C352E', + icon_url: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEDewlDDUq7hytIncTqD-CJGu8_l9sn4pUbi2Ftw1ApbbXtNmM_cVTEV_lbWaw7pQu0W3Rr6sVlAdPvoOhScFnt4pyGbefmPm6lTg', + icon_url_large: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEDewlDDUq7hytIncTqD-CJGu8_l9sn4pUbi2Ftw1ApbbXtNmM_cVTEV_lbWaw7pQu0W3Rr6sVlAdPvoOhScFnt4pyGbefmPm6lTg', + descriptions: [ + { value: 'Commando Grade Hat', color: '8847ff' }, + { + value: '★ Unusual Effect: Twisted Radiance', + color: 'ffd700', + }, + { value: ' ' }, + { value: ' ' }, + { value: 'Spooky Spoils Collection' }, + { value: ' Mister Bones', color: 'eb4b4b' }, + { value: " Pyr'o Lantern", color: 'eb4b4b' }, + { value: ' Racc Mann', color: 'd32ce6' }, + { value: ' Head of the Dead', color: 'd32ce6' }, + { value: ' Elizabeth the Third', color: 'd32ce6' }, + { value: ' The Trick Stabber', color: 'd32ce6' }, + { value: ' El Zapateador', color: '8847ff' }, + { value: ' The Horrible Horns', color: '8847ff' }, + { value: '★ Skullbrero', color: '8847ff' }, + { value: ' Soviet Strongmann', color: '8847ff' }, + { value: ' Voodoo Vizier', color: '8847ff' }, + { value: " Madmann's Muzzle", color: '8847ff' }, + { value: ' BINOCULUS!', color: '4b69ff' }, + { value: ' Derangement Garment', color: '4b69ff' }, + { value: ' Convict Cap', color: '4b69ff' }, + { value: ' El Mostacho', color: '4b69ff' }, + { value: ' Candy Cranium', color: '4b69ff' }, + { value: ' Bat Hat', color: '4b69ff' }, + { value: ' Pocket Halloween Boss', color: '4b69ff' }, + { value: ' Party Poncho', color: '4b69ff' }, + { value: ' Fuel Injector', color: '4b69ff' }, + { value: ' Bread Biter', color: '4b69ff' }, + ], + tradable: 1, + actions: [ + { + link: + 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=31066&lang=en_US', + name: 'Item Wiki Page...', + }, + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D5006617706189886078', + name: 'Inspect in Game...', + }, + ], + name: 'Unusual Skullbrero', + name_color: '8650AC', + type: 'Level 57 Hat', + market_name: 'Unusual Skullbrero', + market_hash_name: 'Unusual Skullbrero', + market_actions: [ + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D5006617706189886078', + name: 'Inspect in Game...', + }, + ], + commodity: 0, + market_tradable_restriction: 7, + market_marketable_restriction: 0, + marketable: 1, + tags: [ + { + category: 'Quality', + internal_name: 'rarity4', + localized_category_name: 'Quality', + localized_tag_name: 'Unusual', + color: '8650AC', + }, + { + category: 'Type', + internal_name: 'misc', + localized_category_name: 'Type', + localized_tag_name: 'Cosmetic', + }, + { + category: 'Class', + internal_name: 'Pyro', + localized_category_name: 'Class', + localized_tag_name: 'Pyro', + }, + { + category: 'Rarity', + internal_name: 'Rarity_Mythical', + localized_category_name: 'Grade', + localized_tag_name: 'Commando', + color: '8847ff', + }, + { + category: 'Collection', + internal_name: 'halloween2019_collection_name', + localized_category_name: 'Collection', + localized_tag_name: 'Spooky Spoils Collection', + }, + ], + }, true, false); + + assert.deepEqual(econItem, { + name: 'Skullbrero', + fullName: 'Twisted Radiance Skullbrero', + id: '8574678947', + img: + 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEDewlDDUq7hytIncTqD-CJGu8_l9sn4pUbi2Ftw1ApbbXtNmM_cVTEV_lbWaw7pQu0W3Rr6sVlAdPvoOhScFnt4pyGbefmPm6lTg/', + tradable: true, + craftable: true, + quality: 5, + effect: 130, + classes: ['Pyro'], + type: 'misc', + collection: 'Spooky Spoils Collection', + grade: 'Commando', + parts: [], + spells: [], + marketable: true, + commodity: false, + level: 57, + }); + }); + + it('Case #4', () => { + const econItem = parseEconItem({ + appid: 440, + contextid: '2', + assetid: '8610658018', + classid: '171010366', + instanceid: '176498576', + amount: '1', + currency: 0, + background_color: '3C352E', + icon_url: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEbfgYfXh7wqwdTmsHiCM2ACfIHnpRh5MkG3G8zyVMpYebiYm8wdFGTBPILC_BvrQu9X3RqupQ6AYPhp-wHZ0yx43BgcxIX', + icon_url_large: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEbfgYfXh7wqwdTmsHiCM2ACfIHnpRh5MkG3G8zyVMpYebiYm8wdFGTBPILC_BvrQu9X3RqupQ6AYPhp-wHZ0yx43BgcxIX', + descriptions: [ + { value: '★ Unusual Effect: Smoking', color: 'ffd700' }, + ], + tradable: 1, + actions: [ + { + link: + 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=318&lang=en_US', + name: 'Item Wiki Page...', + }, + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D10290164463146604828', + name: 'Inspect in Game...', + }, + ], + name: "Unusual Prancer's Pride", + name_color: '8650AC', + type: 'Level 88 Hat', + market_name: "Unusual Prancer's Pride", + market_hash_name: "Unusual Prancer's Pride", + market_actions: [ + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D10290164463146604828', + name: 'Inspect in Game...', + }, + ], + commodity: 0, + market_tradable_restriction: 7, + market_marketable_restriction: 0, + marketable: 1, + tags: [ + { + category: 'Quality', + internal_name: 'rarity4', + localized_category_name: 'Quality', + localized_tag_name: 'Unusual', + color: '8650AC', + }, + { + category: 'Type', + internal_name: 'misc', + localized_category_name: 'Type', + localized_tag_name: 'Cosmetic', + }, + { + category: 'Class', + internal_name: 'Pyro', + localized_category_name: 'Class', + localized_tag_name: 'Pyro', + }, + ], + }, true, false); + + assert.deepEqual(econItem, { + name: "Prancer's Pride", + fullName: "Smoking Prancer's Pride", + id: '8610658018', + img: + 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEbfgYfXh7wqwdTmsHiCM2ACfIHnpRh5MkG3G8zyVMpYebiYm8wdFGTBPILC_BvrQu9X3RqupQ6AYPhp-wHZ0yx43BgcxIX/', + tradable: true, + craftable: true, + quality: 5, + effect: 35, + classes: ['Pyro'], + type: 'misc', + parts: [], + spells: [], + marketable: true, + commodity: false, + level: 88, + }); + }); + + it('Case #5', () => { + const econItem = parseEconItem({ + appid: 440, + contextid: '2', + assetid: '8656785508', + classid: '3543846179', + instanceid: '3516082756', + amount: '1', + currency: 0, + background_color: '3C352E', + icon_url: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffjDz5zdwmTVPAOCsot8Qn-Whg07dR3XcGzuehWe1q65oHFOuQpN4kZGpOECffQZl39vho_1KdefJbbonvq3SvubmwUG028UzYUYzA', + icon_url_large: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffjDz5zdwmTVPAOCsot8Qn-Whg07dR3XcGzuehWe1q65oHFOuQpN4kZGpOECffQZl39vho_1KdefJbbonvq3SvubmwUG028UzYUYzA', + descriptions: [ + { + value: 'Commando Grade Rocket Launcher (Field-Tested)', + color: '8847ff', + }, + { value: 'Festivized', color: 'ffd700' }, + { + value: + 'Halloween: Pumpkin Bombs (spell only active during event)', + color: '7ea9d1', + }, + { value: 'Sheen: Agonizing Emerald', color: '7ea9d1' }, + { value: 'Killstreaks Active', color: '7ea9d1' }, + { + value: '\nGift from: VLaDOS | S>C.MOON YELLOW BELT', + color: '7ea9d1', + }, + { + value: + 'Date Received: Tuesday, September 10, 2019 (9:36:39) GMT', + }, + { value: ' ' }, + { value: ' ' }, + { value: 'Concealed Killer Collection' }, + { value: ' Sand Cannon Rocket Launcher', color: 'eb4b4b' }, + { value: ' Red Rock Roscoe Pistol', color: 'eb4b4b' }, + { value: ' Psychedelic Slugger Revolver', color: 'd32ce6' }, + { value: ' Purple Range Sniper Rifle', color: 'd32ce6' }, + { + value: ' Sudden Flurry Stickybomb Launcher', + color: 'd32ce6', + }, + { value: ' Night Terror Scattergun', color: '8847ff' }, + { + value: ' Carpet Bomber Stickybomb Launcher', + color: '8847ff', + }, + { + value: '✔ Woodland Warrior Rocket Launcher', + color: '8847ff', + }, + { value: ' Wrapped Reviver Medi Gun', color: '8847ff' }, + { value: ' Night Owl Sniper Rifle', color: '4b69ff' }, + { value: ' Woodsy Widowmaker SMG', color: '4b69ff' }, + { value: ' Backwoods Boomstick Shotgun', color: '4b69ff' }, + { value: ' King of the Jungle Minigun', color: '4b69ff' }, + { value: ' Masked Mender Medi Gun', color: '4b69ff' }, + { value: ' Forest Fire Flame Thrower', color: '4b69ff' }, + ], + tradable: 1, + actions: [ + { + link: + 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=15006&lang=en_US', + name: 'Item Wiki Page...', + }, + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D11534198800805877074', + name: 'Inspect in Game...', + }, + ], + fraudwarnings: [ + 'This item has been renamed.\nOriginal name: "Rocket Launcher"', + ], + name: "''post live spell rocket louncher !!!!!!!''", + name_color: 'FAFAFA', + type: '', + market_name: + 'Festivized Specialized Killstreak Woodland Warrior Rocket Launcher (Field-Tested)', + market_hash_name: + 'Festivized Specialized Killstreak Woodland Warrior Rocket Launcher (Field-Tested)', + market_actions: [ + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D11534198800805877074', + name: 'Inspect in Game...', + }, + ], + commodity: 0, + market_tradable_restriction: 7, + market_marketable_restriction: 0, + marketable: 1, + tags: [ + { + category: 'Quality', + internal_name: 'paintkitweapon', + localized_category_name: 'Quality', + localized_tag_name: 'Decorated Weapon', + color: 'FAFAFA', + }, + { + category: 'Type', + internal_name: 'primary', + localized_category_name: 'Type', + localized_tag_name: 'Primary weapon', + }, + { + category: 'Class', + internal_name: 'Soldier', + localized_category_name: 'Class', + localized_tag_name: 'Soldier', + }, + { + category: 'Rarity', + internal_name: 'Rarity_Mythical', + localized_category_name: 'Grade', + localized_tag_name: 'Commando', + color: '8847ff', + }, + { + category: 'Collection', + internal_name: 'concealedkiller_collection', + localized_category_name: 'Collection', + localized_tag_name: 'Concealed Killer Collection', + }, + { + category: 'Exterior', + internal_name: 'TFUI_InvTooltip_FieldTested', + localized_category_name: 'Exterior', + localized_tag_name: 'Field-Tested', + }, + ], + }, true, false); + + assert.deepEqual(econItem, { + name: 'Rocket Launcher', + fullName: + 'Festivized Specialized Killstreak Woodland Warrior Rocket Launcher (Field-Tested)', + id: '8656785508', + img: + 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffjDz5zdwmTVPAOCsot8Qn-Whg07dR3XcGzuehWe1q65oHFOuQpN4kZGpOECffQZl39vho_1KdefJbbonvq3SvubmwUG028UzYUYzA/', + tradable: true, + craftable: true, + quality: 15, + texture: 6, + wear: 3, + festivized: true, + killstreak: 2, + classes: ['Soldier'], + type: 'primary', + collection: 'Concealed Killer Collection', + grade: 'Commando', + parts: [], + spells: ['Pumpkin Bombs'], + marketable: true, + commodity: false, + sheen: "Agonizing Emerald", + level: -1, + }); + }); + + it('Case #6', () => { + const econItem = parseEconItem({ + appid: 440, + contextid: '2', + assetid: '8733746813', + classid: '221512872', + instanceid: '92637229', + amount: '1', + currency: 0, + background_color: '3C352E', + icon_url: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEDe1VBDEjdqCEX2PfnGOaDBeEUlNQK6ZFH3jMlwwB_Y7vhZ2Q0JFKQAKQJXadrpF6-UXE268I3UNHg8esHfF28tdHHO65sbo88eQy8bA', + icon_url_large: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEDe1VBDEjdqCEX2PfnGOaDBeEUlNQK6ZFH3jMlwwB_Y7vhZ2Q0JFKQAKQJXadrpF6-UXE268I3UNHg8esHfF28tdHHO65sbo88eQy8bA', + descriptions: [ + { + value: 'Holiday Restriction: Halloween / Full Moon', + color: 'd83636', + }, + { + value: + 'Halloween: Spectral Spectrum (spell only active during event)', + color: '7ea9d1', + }, + { value: '' }, + ], + tradable: 1, + actions: [ + { + link: + 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=30290&lang=en_US', + name: 'Item Wiki Page...', + }, + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D16238051287194648628', + name: 'Inspect in Game...', + }, + ], + name: 'Haunted PY-40 Incinibot', + name_color: '38f3ab', + type: 'Level 58 Mask', + market_name: 'Haunted PY-40 Incinibot', + market_hash_name: 'Haunted PY-40 Incinibot', + market_actions: [ + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D16238051287194648628', + name: 'Inspect in Game...', + }, + ], + commodity: 0, + market_tradable_restriction: 7, + market_marketable_restriction: 0, + marketable: 1, + tags: [ + { + category: 'Quality', + internal_name: 'haunted', + localized_category_name: 'Quality', + localized_tag_name: 'Haunted', + color: '38f3ab', + }, + { + category: 'Type', + internal_name: 'misc', + localized_category_name: 'Type', + localized_tag_name: 'Cosmetic', + }, + { + category: 'Class', + internal_name: 'Pyro', + localized_category_name: 'Class', + localized_tag_name: 'Pyro', + }, + ], + }, true, false); + + assert.deepEqual(econItem, { + name: 'PY-40 Incinibot', + fullName: 'Haunted PY-40 Incinibot', + id: '8733746813', + img: + 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEDe1VBDEjdqCEX2PfnGOaDBeEUlNQK6ZFH3jMlwwB_Y7vhZ2Q0JFKQAKQJXadrpF6-UXE268I3UNHg8esHfF28tdHHO65sbo88eQy8bA/', + tradable: true, + craftable: true, + quality: 13, + classes: ['Pyro'], + type: 'misc', + parts: [], + spells: ['Spectral Spectrum'], + marketable: true, + commodity: false, + level: 58, + }); + }); + + it('Case #7', () => { + const econItem = parseEconItem({ + appid: 440, + contextid: '2', + assetid: '8434754722', + classid: '88783771', + instanceid: '92739934', + amount: '1', + currency: 0, + background_color: '3C352E', + icon_url: + 'IzMF03bi9WpSBq-S-ekoE33L-iLqGFHVaU25ZzQNQcXdEH9myp0erksICfTcePMQFc1nqWSMU5OD2NwOx3sIyShXOjLx2Sk5MbUqMcbBnQz4ruyeU2DgVzPLKCnYCGFgGOIYfAeFr3HysPORE2vPELl_RQEMdaFX9GxObM-BOEE_goVdrTXqlBwkHRNxJ5VFcVbihGQdNlNSNRp3', + icon_url_large: + 'IzMF03bi9WpSBq-S-ekoE33L-iLqGFHVaU25ZzQNQcXdEH9myp0erksICfTcePMQFc1nqWSMU5OD2NwOx3sIyShXOjLx2Sk5MbUqMcbBnQz4ruyeU2DgVzPLKCnYCGFgGOIYfAeFr3HysPORE2vPELl_RQEMdaFX9GxObM-BOEE_goVdrTXqlBwkHRNxJ5VFcVbihGQdNlNSNRp3', + descriptions: [ + { + value: "Paint Color: Noble Hatter's Violet", + color: '756b5e', + }, + { + value: + 'Halloween: Spectral Spectrum (spell only active during event)', + color: '7ea9d1', + }, + { + value: + "The K-9 mane is perfect for tricky social situations. People will either only want to talk about the hat, which means they'll be distracted from that rash making its way up your jugular,or they'll avoid you altogether. It's a win/win!", + }, + ], + tradable: 1, + actions: [ + { + link: + 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=876&lang=en_US', + name: 'Item Wiki Page...', + }, + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D7378163898213210976', + name: 'Inspect in Game...', + }, + ], + name: 'Genuine K-9 Mane', + name_color: '4D7455', + type: 'Level 1 Spirit Animal', + market_name: 'Genuine K-9 Mane', + market_hash_name: 'Genuine K-9 Mane', + market_actions: [ + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D7378163898213210976', + name: 'Inspect in Game...', + }, + ], + commodity: 0, + market_tradable_restriction: 7, + market_marketable_restriction: 0, + marketable: 1, + tags: [ + { + category: 'Quality', + internal_name: 'rarity1', + localized_category_name: 'Quality', + localized_tag_name: 'Genuine', + color: '4D7455', + }, + { + category: 'Type', + internal_name: 'misc', + localized_category_name: 'Type', + localized_tag_name: 'Cosmetic', + }, + { + category: 'Class', + internal_name: 'Demoman', + localized_category_name: 'Class', + localized_tag_name: 'Demoman', + }, + { + category: 'Class', + internal_name: 'Heavy', + localized_category_name: 'Class', + localized_tag_name: 'Heavy', + }, + ], + }, true, false); + + assert.deepEqual(econItem, { + name: 'K-9 Mane', + fullName: 'Genuine K-9 Mane', + id: '8434754722', + img: + 'https://steamcommunity-a.akamaihd.net/economy/image/IzMF03bi9WpSBq-S-ekoE33L-iLqGFHVaU25ZzQNQcXdEH9myp0erksICfTcePMQFc1nqWSMU5OD2NwOx3sIyShXOjLx2Sk5MbUqMcbBnQz4ruyeU2DgVzPLKCnYCGFgGOIYfAeFr3HysPORE2vPELl_RQEMdaFX9GxObM-BOEE_goVdrTXqlBwkHRNxJ5VFcVbihGQdNlNSNRp3/', + tradable: true, + craftable: true, + quality: 1, + classes: ['Demoman', 'Heavy'], + type: 'misc', + parts: [], + spells: ['Spectral Spectrum'], + marketable: true, + commodity: false, + paint: "Noble Hatter's Violet", + level: 1, + }); + }); + + it('Case #8', () => { + const econItem = parseEconItem({ + appid: 440, + contextid: '2', + assetid: '8294625611', + classid: '1336074160', + instanceid: '3639098153', + amount: '1', + currency: 0, + background_color: '3C352E', + icon_url: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEfezgSUhr2hzVGjMHlMvyJC-sUkt8K6ZFH3jMllVQrZbvkNG8ydFXAWfEICqFjp160CCNivZI3VY_j9u8DfA6-sYSUN65sbo_U7o3qKw', + icon_url_large: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEfezgSUhr2hzVGjMHlMvyJC-sUkt8K6ZFH3jMllVQrZbvkNG8ydFXAWfEICqFjp160CCNivZI3VY_j9u8DfA6-sYSUN65sbo_U7o3qKw', + descriptions: [ + { value: 'Style: Tie', color: '756b5e' }, + { + value: + 'Halloween: Chromatic Corruption (spell only active during event)', + color: '7ea9d1', + }, + { + value: + 'Halloween: Voices From Below (spell only active during event)', + color: '7ea9d1', + }, + { + value: + "Whether you're trepanning a skull to let out the sickness ghosts or attaching enough leeches to a patient that they'll pass out from blood loss before you cut off any suspicious-lookinglimbs, this dapper ruffed shirt and coat will assure your patients that they came to the right place for their dangerously insane 18th century medicine.", + }, + ], + tradable: 1, + actions: [ + { + link: + 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=878&lang=en_US', + name: 'Item Wiki Page...', + }, + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D434113929687356346', + name: 'Inspect in Game...', + }, + ], + name: 'Strange Genuine Foppish Physician', + name_color: '4D7455', + type: 'Strange Apparel - Points Scored: 1', + market_name: 'Strange Genuine Foppish Physician', + market_hash_name: 'Strange Genuine Foppish Physician', + market_actions: [ + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D434113929687356346', + name: 'Inspect in Game...', + }, + ], + commodity: 0, + market_tradable_restriction: 7, + market_marketable_restriction: 0, + marketable: 1, + tags: [ + { + category: 'Quality', + internal_name: 'rarity1', + localized_category_name: 'Quality', + localized_tag_name: 'Genuine', + color: '4D7455', + }, + { + category: 'Type', + internal_name: 'misc', + localized_category_name: 'Type', + localized_tag_name: 'Cosmetic', + }, + { + category: 'Class', + internal_name: 'Medic', + localized_category_name: 'Class', + localized_tag_name: 'Medic', + }, + ], + }, true, false); + + assert.deepEqual(econItem, { + name: 'Foppish Physician', + fullName: 'Strange Genuine Foppish Physician', + id: '8294625611', + img: + 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEfezgSUhr2hzVGjMHlMvyJC-sUkt8K6ZFH3jMllVQrZbvkNG8ydFXAWfEICqFjp160CCNivZI3VY_j9u8DfA6-sYSUN65sbo_U7o3qKw/', + tradable: true, + craftable: true, + quality: 1, + elevated: true, + classes: ['Medic'], + type: 'misc', + parts: [], + spells: ['Chromatic Corruption', 'Voices From Below'], + marketable: true, + commodity: false, + level: -1, + }); + }); + + it('Case #9', () => { + const econItem = parseEconItem({ + "appid":440,"classid":"4044585817","instanceid":"11040545","currency":0,"background_color":"3C352E","icon_url":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEYYwsVVB7whyJMhcrvCM2ACfIHnpRi4cBQjGc6xAQjNbuwYGMwJlfHWfAMDaRjpQm6CCVhsZJhUIW3r-9TZ0yx4-owIvoI","icon_url_large":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEYYwsVVB7whyJMhcrvCM2ACfIHnpRi4cBQjGc6xAQjNbuwYGMwJlfHWfAMDaRjpQm6CCVhsZJhUIW3r-9TZ0yx4-owIvoI", + "descriptions":[ + {"value":"Holiday Restriction: Halloween / Full Moon","color":"756b5e"}, + {"value":"''Halloween: Chromatic Corruption (spell only active during event)''", "color": "756b5e"}, + {"value":"''Sheen: sheen''", "color": "756b5e"}, + {"value":"''Paint: paint''", "color": "756b5e"}, + {"value":"''Festivized''", "color": "756b5e"}, + {"value":"''( Not Usable in Crafting )''", "color": "756b5e"}, + ],"tradable":1,"actions":[{"link":"http://wiki.teamfortress.com/scripts/itemredirect.php?id=5618&lang=en_US","name":"Item Wiki Page..."},{"link":"steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D12289692045334241370","name":"Inspect in Game..."}],"name":"Haunted Voodoo-Cursed Soldier Soul","name_color":"38f3ab","type":"Level 1 Cursed Soul","market_name":"Haunted Voodoo-Cursed Soldier Soul","market_hash_name":"Haunted Voodoo-Cursed Soldier Soul","market_actions":[{"link":"steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D12289692045334241370","name":"Inspect in Game..."}],"commodity":0,"market_tradable_restriction":7,"market_marketable_restriction":0,"marketable":1,"tags":[{"category":"Quality","internal_name":"haunted","localized_category_name":"Quality","localized_tag_name":"Haunted","color":"38f3ab"},{"category":"Type","internal_name":"misc","localized_category_name":"Type","localized_tag_name":"Cosmetic"},{"category":"Class","internal_name":"Soldier","localized_category_name":"Class","localized_tag_name":"Soldier"}] + }, false, false); + + assert.deepEqual(econItem, { + name: 'Voodoo-Cursed Soldier Soul', + fullName: 'Haunted Voodoo-Cursed Soldier Soul', + id: undefined, + img: 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEYYwsVVB7whyJMhcrvCM2ACfIHnpRi4cBQjGc6xAQjNbuwYGMwJlfHWfAMDaRjpQm6CCVhsZJhUIW3r-9TZ0yx4-owIvoI/', + tradable: true, + craftable: true, + quality: 'Haunted', + classes: [ 'Soldier' ], + type: 'misc', + parts: [], + spells: [], + marketable: true, + commodity: false, + level: 1, + }); + }) + + it('Case #10', () => { + const econItem = parseEconItem({ + "appid":440,"classid":"4044585817","instanceid":"11040545","currency":0,"background_color":"3C352E","icon_url":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEYYwsVVB7whyJMhcrvCM2ACfIHnpRi4cBQjGc6xAQjNbuwYGMwJlfHWfAMDaRjpQm6CCVhsZJhUIW3r-9TZ0yx4-owIvoI","icon_url_large":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEYYwsVVB7whyJMhcrvCM2ACfIHnpRi4cBQjGc6xAQjNbuwYGMwJlfHWfAMDaRjpQm6CCVhsZJhUIW3r-9TZ0yx4-owIvoI", + "descriptions":[ + {"value":"Holiday Restriction: Halloween / Full Moon","color":"756b5e"}, + {"value":"''★ Unusual Effect: Burning Flames''"}, + {"value":"''★ Unusual Effect: Burning Flames''"} + ],"tradable":1,"actions":[{"link":"http://wiki.teamfortress.com/scripts/itemredirect.php?id=5618&lang=en_US","name":"Item Wiki Page..."},{"link":"steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D12289692045334241370","name":"Inspect in Game..."}],"name":"Haunted Voodoo-Cursed Soldier Soul","name_color":"38f3ab","type":"Level 1 Cursed Soul","market_name":"Haunted Voodoo-Cursed Soldier Soul","market_hash_name":"Haunted Voodoo-Cursed Soldier Soul","market_actions":[{"link":"steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D12289692045334241370","name":"Inspect in Game..."}],"commodity":0,"market_tradable_restriction":7,"market_marketable_restriction":0,"marketable":1,"tags":[{"category":"Quality","internal_name":"haunted","localized_category_name":"Quality","localized_tag_name":"Haunted","color":"38f3ab"},{"category":"Type","internal_name":"misc","localized_category_name":"Type","localized_tag_name":"Cosmetic"},{"category":"Class","internal_name":"Soldier","localized_category_name":"Class","localized_tag_name":"Soldier"}] + }); + + assert.deepEqual(econItem, { + name: 'Voodoo-Cursed Soldier Soul', + fullName: 'Haunted Voodoo-Cursed Soldier Soul', + id: undefined, + img: 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEYYwsVVB7whyJMhcrvCM2ACfIHnpRi4cBQjGc6xAQjNbuwYGMwJlfHWfAMDaRjpQm6CCVhsZJhUIW3r-9TZ0yx4-owIvoI/', + tradable: true, + craftable: true, + quality: 'Haunted', + classes: [ 'Soldier' ], + type: 'misc', + parts: [], + spells: [], + marketable: true, + commodity: false, + level: 1, + }); + }) + + it('Case #11', () => { + const econItem = parseEconItem({ + "appid": "440", + "classid": "2871127490", + "instanceid": "3522129930", + "icon_url": "fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIUwsUWBjqvy1Nt8_pAfazBOESnN97vZQFgGVtyQUrbeW2ZjM_IFHGA_JYC_BuoQ7qDyJlusVnUdO1orpQfRKv6tW-OVvZVQ", + "icon_url_large": "fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIUwsUWBjqvy1Nt8_pAfazBOESnN97vZQFgGVtyQUrbeW2ZjM_IFHGA_JYC_BuoQ7qDyJlusVnUdO1orpQfRKv6tW-OVvZVQ", + "icon_drag_url": "", + "name": "Strange Australium Blutsauger", + "market_hash_name": "Strange Australium Blutsauger", + "market_name": "Strange Australium Blutsauger", + "name_color": "CF6A32", + "background_color": "3C352E", + "type": "Strange Syringe Gun - Kills: 20", + "tradable": 1, + "marketable": 1, + "commodity": 0, + "market_tradable_restriction": "7", + "market_marketable_restriction": "0", + "descriptions": [ + { + "value": "(Cloaked Spies Killed: 0)", + "color": "756b5e" + }, + { + "value": "''(Killstreaks Ended: 0)''", + "color": "756b5e" + }, + { + "value": "(Scouts Killed: 0)", + "color": "756b5e" + }, + { + "value": "On Hit: Gain up to +3 health", + "color": "7ea9d1" + }, + { + "value": "-2 health drained per second on wearer", + "color": "d83636" + } + ], + "actions": [ + { + "name": "Item Wiki Page...", + "link": "http://wiki.teamfortress.com/scripts/itemredirect.php?id=36&lang=en_US" + } + ], + "tags": [ + { + "internal_name": "strange", + "name": "Strange", + "category": "Quality", + "color": "CF6A32", + "category_name": "Quality" + }, + { + "internal_name": "primary", + "name": "Primary weapon", + "category": "Type", + "category_name": "Type" + }, + { + "internal_name": "Medic", + "name": "Medic", + "category": "Class", + "category_name": "Class" + } + ], + "app_data": { + "def_index": "36", + "quality": "11" + } + }, false, false); + + assert.deepEqual(econItem, { + name: 'Blutsauger', + fullName: 'Strange Australium Blutsauger', + id: undefined, + img: 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIUwsUWBjqvy1Nt8_pAfazBOESnN97vZQFgGVtyQUrbeW2ZjM_IFHGA_JYC_BuoQ7qDyJlusVnUdO1orpQfRKv6tW-OVvZVQ/', + tradable: true, + craftable: true, + quality: 'Strange', + australium: true, + classes: [ 'Medic' ], + type: 'primary', + parts: [ 'Cloaked Spies Killed', 'Scouts Killed' ], + spells: [], + marketable: true, + commodity: false, + level: -1, + }); + }); + + it('Case #12', () => { + const econItem = parseEconItem({ + "appid":"440", + "classid":"2625497429", + "instanceid":"4048537137", + "icon_url":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffgYghuZgHPUPUOCacF4w3tG3J86sI7V47mp-JTLQu-vNTGYbh_MNgYHMeFXPHVY139uEk9g_VbK52LqTSvg3pcnpTOhA", + "icon_url_large":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffgYghuZgHPUPUOCacF4w3tG3J86sI7V47mp-JTLQu-vNTGYbh_MNgYHMeFXPHVY139uEk9g_VbK52LqTSvg3pcnpTOhA", + "icon_drag_url":"", + "name":"Shell Shocker Rocket Launcher", + "market_hash_name":"Strange Specialized Killstreak Shell Shocker Rocket Launcher (Battle Scarred)", + "market_name":"Strange Specialized Killstreak Shell Shocker Rocket Launcher (Battle Scarred)", + "name_color":"CF6A32", + "background_color":"3C352E", + "type":"", + "tradable":1, + "marketable":1, + "commodity":0, + "market_tradable_restriction":"7", + "market_marketable_restriction":"0", + "descriptions":[ + { + "value":"Assassin Grade Rocket Launcher (Battle Scarred)", + "color":"d32ce6" + }, + { + "value":"Strange Stat Clock Attached", + "color":"CF6A32" + }, + { + "value":" Kills: 5121", + "color":"756b5e" + }, + { + "value":" Pyros Killed: 712", + "color":"756b5e" + }, + { + "value":"Team Colored Decorated Weapon" + }, + { + "value":"Halloween: Pumpkin Bombs (spell only active during event)", + "color":"7ea9d1" + }, + { + "value":"Sheen: Mean Green", + "color":"7ea9d1" + }, + { + "value":"Killstreaks Active", + "color":"7ea9d1" + }, + { + "value":" " + }, + { + "value":" " + }, + { + "value":"Powerhouse Collection" + }, + { + "value":" Liquid Asset Stickybomb Launcher", + "color":"eb4b4b", + "app_data":{ + "def_index":"15045" + } + }, + { + "value":" Thunderbolt Sniper Rifle", + "color":"eb4b4b", + "app_data":{ + "def_index":"15059" + } + }, + { + "value":" Current Event Scattergun", + "color":"d32ce6", + "app_data":{ + "def_index":"15053" + } + }, + { + "value":" Pink Elephant Stickybomb Launcher", + "color":"d32ce6", + "app_data":{ + "def_index":"15048" + } + }, + { + "value":"✔ Shell Shocker Rocket Launcher", + "color":"d32ce6", + "app_data":{ + "def_index":"15052" + } + }, + { + "value":" Flash Fryer Flame Thrower", + "color":"8847ff", + "app_data":{ + "def_index":"15049" + } + }, + { + "value":" Spark of Life Medi Gun", + "color":"8847ff", + "app_data":{ + "def_index":"15050" + } + }, + { + "value":" Dead Reckoner Revolver", + "color":"8847ff", + "app_data":{ + "def_index":"15051" + } + }, + { + "value":" Black Dahlia Pistol", + "color":"8847ff", + "app_data":{ + "def_index":"15046" + } + }, + { + "value":" Sandstone Special Pistol", + "color":"8847ff", + "app_data":{ + "def_index":"15056" + } + }, + { + "value":" Brick House Minigun", + "color":"4b69ff", + "app_data":{ + "def_index":"15055" + } + }, + { + "value":" Aqua Marine Rocket Launcher", + "color":"4b69ff", + "app_data":{ + "def_index":"15057" + } + }, + { + "value":" Low Profile SMG", + "color":"4b69ff", + "app_data":{ + "def_index":"15058" + } + }, + { + "value":" Turbine Torcher Flame Thrower", + "color":"4b69ff", + "app_data":{ + "def_index":"15054" + } + }, + { + "value":" Lightning Rod Shotgun", + "color":"4b69ff", + "app_data":{ + "def_index":"15047" + } + } + ], + "actions":[ + { + "name":"Item Wiki Page...", + "link":"http:\/\/wiki.teamfortress.com\/scripts\/itemredirect.php?id=15052&lang=en_US" + }, + { + "name":"Inspect in Game...", + "link":"steam:\/\/rungame\/440\/76561202255233023\/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D7998211058114246468" + } + ], + "market_actions":[ + { + "name":"Inspect in Game...", + "link":"steam:\/\/rungame\/440\/76561202255233023\/+tf_econ_item_preview%20M%listingid%A%assetid%D7998211058114246468" + } + ], + "tags":[ + { + "internal_name":"strange", + "name":"Strange", + "category":"Quality", + "color":"CF6A32", + "category_name":"Quality" + }, + { + "internal_name":"primary", + "name":"Primary weapon", + "category":"Type", + "category_name":"Type" + }, + { + "internal_name":"Soldier", + "name":"Soldier", + "category":"Class", + "category_name":"Class" + }, + { + "internal_name":"Rarity_Legendary", + "name":"Assassin", + "category":"Rarity", + "color":"d32ce6", + "category_name":"Grade" + }, + { + "internal_name":"Powerhouse_collection", + "name":"Powerhouse Collection", + "category":"Collection", + "category_name":"Collection" + }, + { + "internal_name":"TFUI_InvTooltip_BattleScared", + "name":"Battle Scarred", + "category":"Exterior", + "category_name":"Exterior" + } + ], + "app_data":{ + "def_index":"15052", + "quality":"11" + } + }, false, false); + + assert.deepEqual(econItem, { + name: 'Rocket Launcher', + fullName: 'Strange Specialized Killstreak Shell Shocker Rocket Launcher (Battle Scarred)', + id: undefined, + img: 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffgYghuZgHPUPUOCacF4w3tG3J86sI7V47mp-JTLQu-vNTGYbh_MNgYHMeFXPHVY139uEk9g_VbK52LqTSvg3pcnpTOhA/', + tradable: true, + craftable: true, + quality: "Strange", + texture: "Shell Shocker", + wear: "Battle Scarred", + killstreak: "Specialized Killstreak", + classes: [ 'Soldier' ], + type: 'primary', + collection: 'Powerhouse Collection', + grade: 'Assassin', + parts: [ 'Pyros Killed' ], + spells: [ 'Pumpkin Bombs' ], + marketable: true, + commodity: false, + sheen: "Mean Green", + level: -1, + }); + }) + + it('Case #13', () => { + const econItem = parseEconItem({"appid":"440","classid":"1348131292","instanceid":"93028938","icon_url":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIUwADWBXjvD1Pid3oDvqJGt8Yltsm2pxUyzFu31V9NbPtYTUwdwWbBfkOXfZioFDuWSFku8JnUdLg8ulQLw29tYfCMOQycIYbhNRIXDY","icon_url_large":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIUwADWBXjvD1Pid3oDvqJGt8Yltsm2pxUyzFu31V9NbPtYTUwdwWbBfkOXfZioFDuWSFku8JnUdLg8ulQLw29tYfCMOQycIYbhNRIXDY","icon_drag_url":"","name":"Strange Professional Killstreak Festive Grenade Launcher","market_hash_name":"Strange Professional Killstreak Festive Grenade Launcher","market_name":"Strange Professional Killstreak Festive Grenade Launcher","name_color":"CF6A32","background_color":"3C352E","type":"Limited Strange Grenade Launcher - Kills: 20","tradable":1,"marketable":1,"commodity":0,"market_tradable_restriction":"7","market_marketable_restriction":"0","descriptions":[{"value":"(Airborne Enemy Kills: 4)","color":"756b5e"},{"value":"Halloween: Exorcism (spell only active during event)","color":"7ea9d1"},{"value":"Killstreaker: Hypno-Beam","color":"7ea9d1"},{"value":"Sheen: Manndarin","color":"7ea9d1"},{"value":"Killstreaks Active","color":"7ea9d1"}],"actions":[{"name":"Item Wiki Page...","link":"http:\/\/wiki.teamfortress.com\/scripts\/itemredirect.php?id=1007&lang=en_US"}],"tags":[{"internal_name":"strange","name":"Strange","category":"Quality","color":"CF6A32","category_name":"Quality"},{"internal_name":"primary","name":"Primary weapon","category":"Type","category_name":"Type"},{"internal_name":"Demoman","name":"Demoman","category":"Class","category_name":"Class"}],"app_data":{"def_index":"1007","quality":"11"}}); + + assert.deepEqual(econItem, { + classes: ["Demoman"], + commodity: false, + craftable: true, + fullName: "Strange Professional Killstreak Festive Grenade Launcher", + id: undefined, + img: "https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIUwADWBXjvD1Pid3oDvqJGt8Yltsm2pxUyzFu31V9NbPtYTUwdwWbBfkOXfZioFDuWSFku8JnUdLg8ulQLw29tYfCMOQycIYbhNRIXDY/", + killstreak: "Professional Killstreak", + killstreaker: "Hypno-Beam", + marketable: true, + name: "Festive Grenade Launcher", + parts: [ "Airborne Enemy Kills" ], + quality: "Strange", + sheen: "Manndarin", + spells: [ "Exorcism" ], + tradable: true, + type: "primary", + level: -1, + }); + }) + + it('Case #14', () => { + const econItem = parseEconItem({"appid":"440","classid":"1342604629","instanceid":"98275077","icon_url":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgENYwUuWCT1qj1Ni8DZCv2ADN8Mmsgy4N4Hi2JtxQMtbOftYG9hJgabUaYMCvFroV_uDXBkv8EwVY_koOxWeQq-qsKYZPpiOaow","icon_url_large":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgENYwUuWCT1qj1Ni8DZCv2ADN8Mmsgy4N4Hi2JtxQMtbOftYG9hJgabUaYMCvFroV_uDXBkv8EwVY_koOxWeQq-qsKYZPpiOaow","icon_drag_url":"","name":"Strange Specialized Killstreak Gold Botkiller Wrench Mk.II","market_hash_name":"Strange Specialized Killstreak Gold Botkiller Wrench Mk.II","market_name":"Strange Specialized Killstreak Gold Botkiller Wrench Mk.II","name_color":"CF6A32","background_color":"3C352E","type":"Strange Wrench - Sentry Kills: 12","tradable":1,"marketable":1,"commodity":0,"market_tradable_restriction":"7","market_marketable_restriction":"0","descriptions":[{"value":"(Kills: 1)","color":"756b5e"},{"value":"(Cloaked Spies Killed: 0)","color":"756b5e"},{"value":"Sheen: Deadly Daffodil","color":"7ea9d1"},{"value":"Killstreaks Active","color":"7ea9d1"},{"value":"Upgrades, repairs and speeds up construction of friendly buildings on hit"}],"actions":[{"name":"Item Wiki Page...","link":"http:\/\/wiki.teamfortress.com\/scripts\/itemredirect.php?id=969&lang=en_US"}],"tags":[{"internal_name":"strange","name":"Strange","category":"Quality","color":"CF6A32","category_name":"Quality"},{"internal_name":"melee","name":"Melee weapon","category":"Type","category_name":"Type"},{"internal_name":"Engineer","name":"Engineer","category":"Class","category_name":"Class"}],"app_data":{"def_index":"969","quality":"11"}}); + + assert.deepEqual(econItem, { + parts: [ "Cloaked Spies Killed" ], + "quality": "Strange", + "sheen": "Deadly Daffodil", + "spells": [], + "tradable": true, + "type": "melee", + "classes": [ + "Engineer" + ], + "commodity": false, + "craftable": true, + "fullName": "Strange Specialized Killstreak Gold Botkiller Wrench Mk.II", + "id": undefined, + "img": "https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgENYwUuWCT1qj1Ni8DZCv2ADN8Mmsgy4N4Hi2JtxQMtbOftYG9hJgabUaYMCvFroV_uDXBkv8EwVY_koOxWeQq-qsKYZPpiOaow/", + "killstreak": "Specialized Killstreak", + "marketable": true, + "name": "Gold Botkiller Wrench Mk.II", + level: -1, + }); + }) + + it('Case #15', () => { + const econItem = parseEconItem({"appid":"440","classid":"11042149","instanceid":"19201223","icon_url":"IzMF03bi9WpSBq-S-ekoE33L-iLqGFHVaU25ZzQNQcXdEH9myp0erksICfTdcfMQEpRnqWSMU5OD2NoHwHEIkChXOjLx2Sk5MbUqMcbBnQz4ruyeU3n5awjJLjLaE0pXEvYaYzGdkW_0p7rBXG6aQb0rFl9XK_QM8jdIb82PaURv3dUMrT27kxUqSU5_IZIXcl_smSJdIbMiwRlwHyU","icon_url_large":"IzMF03bi9WpSBq-S-ekoE33L-iLqGFHVaU25ZzQNQcXdEH9myp0erksICfTdcfMQEpRnqWSMU5OD2NoHwHEIkChXOjLx2Sk5MbUqMcbBnQz4ruyeU3n5awjJLjLaE0pXEvYaYzGdkW_0p7rBXG6aQb0rFl9XK_QM8jdIb82PaURv3dUMrT27kxUqSU5_IZIXcl_smSJdIbMiwRlwHyU","icon_drag_url":"","name":"The Essential Accessories","market_hash_name":"The Essential Accessories","market_name":"The Essential Accessories","name_color":"7D6D00","background_color":"3C352E","type":"Limited Level 10 Apparel","tradable":1,"marketable":1,"commodity":0,"market_tradable_restriction":"7","market_marketable_restriction":"0","descriptions":[{"value":"Paint Color: Operator's Overalls","color":"756b5e"},{"value":""}],"actions":[{"name":"Item Wiki Page...","link":"http:\/\/wiki.teamfortress.com\/scripts\/itemredirect.php?id=347&lang=en_US"},{"name":"Inspect in Game...","link":"steam:\/\/rungame\/440\/76561202255233023\/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D2891326522173157497"}],"market_actions":[{"name":"Inspect in Game...","link":"steam:\/\/rungame\/440\/76561202255233023\/+tf_econ_item_preview%20M%listingid%A%assetid%D2891326522173157497"}],"tags":[{"internal_name":"Unique","name":"Unique","category":"Quality","color":"7D6D00","category_name":"Quality"},{"internal_name":"misc","name":"Cosmetic","category":"Type","category_name":"Type"},{"internal_name":"Scout","name":"Scout","category":"Class","category_name":"Class"}],"app_data":{"def_index":"347","quality":"6"}}, false, false); + + assert.deepEqual(econItem, { + "classes": [ + "Scout" + ], + "commodity": false, + "craftable": true, + "fullName": "The Essential Accessories", + "id": undefined, + "img": "https://steamcommunity-a.akamaihd.net/economy/image/IzMF03bi9WpSBq-S-ekoE33L-iLqGFHVaU25ZzQNQcXdEH9myp0erksICfTdcfMQEpRnqWSMU5OD2NoHwHEIkChXOjLx2Sk5MbUqMcbBnQz4ruyeU3n5awjJLjLaE0pXEvYaYzGdkW_0p7rBXG6aQb0rFl9XK_QM8jdIb82PaURv3dUMrT27kxUqSU5_IZIXcl_smSJdIbMiwRlwHyU/", + "marketable": true, + "name": "The Essential Accessories", + "paint": "Operator's Overalls", + "parts": [], + "quality": "Unique", + "spells": [], + "tradable": true, + "type": "misc", + level: -1, + }); + }); +}); + +describe('Econ Item in Numbers', () => { + it('Case #1', () => { + const econItem = parseEconItem( + { + appid: 440, + contextid: '2', + assetid: '8407830034', + classid: '3662018019', + instanceid: '11040671', + amount: '1', + currency: 0, + background_color: '3C352E', + icon_url: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffsDz5zdwmTVPAOCcot8Qn-Wxg07dR3XcGzub5ffwvmttSXYrAlY9xFTMaCUvbXNQz_6EkwiPRYKJaIon-9jHjrOWoUG0280KDki-w', + icon_url_large: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffsDz5zdwmTVPAOCcot8Qn-Wxg07dR3XcGzub5ffwvmttSXYrAlY9xFTMaCUvbXNQz_6EkwiPRYKJaIon-9jHjrOWoUG0280KDki-w', + descriptions: [ + { + value: 'Mercenary Grade Flame Thrower (Minimal Wear)', + color: '4b69ff', + }, + { value: '★ Unusual Effect: Cool', color: 'ffd700' }, + { value: 'Festivized', color: 'ffd700' }, + { + value: 'Extinguishing teammates restores 20 health', + color: '7ea9d1', + }, + { value: 'Sheen: Agonizing Emerald', color: '7ea9d1' }, + { value: 'Killstreaks Active', color: '7ea9d1' }, + { + value: + 'Afterburn reduces Medi Gun healing and resist shield effects.\nAlt-Fire: Release a blast of air that pushes enemies and projectiles and extinguishes teammates that are on fire.', + }, + { value: ' ' }, + { value: ' ' }, + { value: 'Concealed Killer Collection' }, + { + value: ' Sand Cannon Rocket Launcher', + color: 'eb4b4b', + }, + { value: ' Red Rock Roscoe Pistol', color: 'eb4b4b' }, + { + value: ' Psychedelic Slugger Revolver', + color: 'd32ce6', + }, + { value: ' Purple Range Sniper Rifle', color: 'd32ce6' }, + { + value: ' Sudden Flurry Stickybomb Launcher', + color: 'd32ce6', + }, + { value: ' Night Terror Scattergun', color: '8847ff' }, + { + value: ' Carpet Bomber Stickybomb Launcher', + color: '8847ff', + }, + { + value: ' Woodland Warrior Rocket Launcher', + color: '8847ff', + }, + { value: ' Wrapped Reviver Medi Gun', color: '8847ff' }, + { value: ' Night Owl Sniper Rifle', color: '4b69ff' }, + { value: ' Woodsy Widowmaker SMG', color: '4b69ff' }, + { + value: ' Backwoods Boomstick Shotgun', + color: '4b69ff', + }, + { + value: ' King of the Jungle Minigun', + color: '4b69ff', + }, + { value: ' Masked Mender Medi Gun', color: '4b69ff' }, + { value: '★ Forest Fire Flame Thrower', color: '4b69ff' }, + ], + tradable: 1, + actions: [ + { + link: + 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=15005&lang=en_US', + name: 'Item Wiki Page...', + }, + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D6922402693932635553', + name: 'Inspect in Game...', + }, + ], + name: 'Festivized Forest Fire Flame Thrower', + name_color: '8650AC', + type: '', + market_name: + 'Unusual Festivized Specialized Killstreak Forest Fire Flame Thrower (Minimal Wear)', + market_hash_name: + 'Unusual Festivized Specialized Killstreak Forest Fire Flame Thrower (Minimal Wear)', + market_actions: [ + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D6922402693932635553', + name: 'Inspect in Game...', + }, + ], + commodity: 0, + market_tradable_restriction: 7, + market_marketable_restriction: 0, + marketable: 1, + tags: [ + { + category: 'Quality', + internal_name: 'rarity4', + localized_category_name: 'Quality', + localized_tag_name: 'Unusual', + color: '8650AC', + }, + { + category: 'Type', + internal_name: 'primary', + localized_category_name: 'Type', + localized_tag_name: 'Primary weapon', + }, + { + category: 'Class', + internal_name: 'Pyro', + localized_category_name: 'Class', + localized_tag_name: 'Pyro', + }, + { + category: 'Rarity', + internal_name: 'Rarity_Rare', + localized_category_name: 'Grade', + localized_tag_name: 'Mercenary', + color: '4b69ff', + }, + { + category: 'Collection', + internal_name: 'concealedkiller_collection', + localized_category_name: 'Collection', + localized_tag_name: 'Concealed Killer Collection', + }, + { + category: 'Exterior', + internal_name: 'TFUI_InvTooltip_MinimalWear', + localized_category_name: 'Exterior', + localized_tag_name: 'Minimal Wear', + }, + ], + }, + true, false + ); + + assert.deepEqual(econItem, { + name: 'Flame Thrower', + fullName: + 'Cool Festivized Specialized Killstreak Forest Fire Flame Thrower (Minimal Wear)', + id: '8407830034', + img: + 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffsDz5zdwmTVPAOCcot8Qn-Wxg07dR3XcGzub5ffwvmttSXYrAlY9xFTMaCUvbXNQz_6EkwiPRYKJaIon-9jHjrOWoUG0280KDki-w/', + tradable: true, + craftable: true, + quality: 5, + texture: 9, + wear: 2, + killstreak: 2, + festivized: true, + effect: 703, + classes: ['Pyro'], + type: 'primary', + collection: 'Concealed Killer Collection', + grade: 'Mercenary', + parts: [], + spells: [], + marketable: true, + commodity: false, + sheen: "Agonizing Emerald", + level: -1, + }); + }); + + it('Case #2', () => { + const econItem = parseEconItem( + { + appid: 440, + contextid: '2', + assetid: '8555715171', + classid: '3717643208', + instanceid: '344437314', + amount: '1', + currency: 0, + background_color: '3C352E', + icon_url: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEJeQQaWA_dtDlRj82oVPeJUbRTyohkssUGjDBox1IsNrKxaWc1JFWQWPYHDKFsow2_WyVlv4lzWtBtJvRLsg', + icon_url_large: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEJeQQaWA_dtDlRj82oVPeJUbRTyohkssUGjDBox1IsNrKxaWc1JFWQWPYHDKFsow2_WyVlv4lzWtBtJvRLsg', + descriptions: [ + { + value: "★ Unusual Effect: Nuts n' Bolts", + color: 'ffd700', + }, + { value: "''hmm epic''" }, + ], + tradable: 1, + actions: [ + { + link: + 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=434&lang=en_US', + name: 'Item Wiki Page...', + }, + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D16442165943709427870', + name: 'Inspect in Game...', + }, + ], + name: 'Unusual Brain Bucket', + name_color: '8650AC', + type: 'Level 82 Hat', + market_name: 'Unusual Brain Bucket', + market_hash_name: 'Unusual Brain Bucket', + market_actions: [ + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D16442165943709427870', + name: 'Inspect in Game...', + }, + ], + commodity: 0, + market_tradable_restriction: 7, + market_marketable_restriction: 0, + marketable: 1, + tags: [ + { + category: 'Quality', + internal_name: 'rarity4', + localized_category_name: 'Quality', + localized_tag_name: 'Unusual', + color: '8650AC', + }, + { + category: 'Type', + internal_name: 'misc', + localized_category_name: 'Type', + localized_tag_name: 'Cosmetic', + }, + { + category: 'Class', + internal_name: 'Soldier', + localized_category_name: 'Class', + localized_tag_name: 'Soldier', + }, + ], + }, + true, false + ); + + assert.deepEqual( + econItem, + { + name: 'Brain Bucket', + fullName: "Nuts n' Bolts Brain Bucket", + id: '8555715171', + img: + 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEJeQQaWA_dtDlRj82oVPeJUbRTyohkssUGjDBox1IsNrKxaWc1JFWQWPYHDKFsow2_WyVlv4lzWtBtJvRLsg/', + tradable: true, + craftable: true, + quality: 5, + effect: 31, + classes: ['Soldier'], + type: 'misc', + parts: [], + spells: [], + marketable: true, + commodity: false, + level: 82, + }, + false, false + ); + }); + + it('Case #3', () => { + const econItem = parseEconItem( + { + appid: 440, + contextid: '2', + assetid: '8574678947', + classid: '3555490789', + instanceid: '856289751', + amount: '1', + currency: 0, + background_color: '3C352E', + icon_url: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEDewlDDUq7hytIncTqD-CJGu8_l9sn4pUbi2Ftw1ApbbXtNmM_cVTEV_lbWaw7pQu0W3Rr6sVlAdPvoOhScFnt4pyGbefmPm6lTg', + icon_url_large: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEDewlDDUq7hytIncTqD-CJGu8_l9sn4pUbi2Ftw1ApbbXtNmM_cVTEV_lbWaw7pQu0W3Rr6sVlAdPvoOhScFnt4pyGbefmPm6lTg', + descriptions: [ + { value: 'Commando Grade Hat', color: '8847ff' }, + { + value: '★ Unusual Effect: Twisted Radiance', + color: 'ffd700', + }, + { value: ' ' }, + { value: ' ' }, + { value: 'Spooky Spoils Collection' }, + { value: ' Mister Bones', color: 'eb4b4b' }, + { value: " Pyr'o Lantern", color: 'eb4b4b' }, + { value: ' Racc Mann', color: 'd32ce6' }, + { value: ' Head of the Dead', color: 'd32ce6' }, + { value: ' Elizabeth the Third', color: 'd32ce6' }, + { value: ' The Trick Stabber', color: 'd32ce6' }, + { value: ' El Zapateador', color: '8847ff' }, + { value: ' The Horrible Horns', color: '8847ff' }, + { value: '★ Skullbrero', color: '8847ff' }, + { value: ' Soviet Strongmann', color: '8847ff' }, + { value: ' Voodoo Vizier', color: '8847ff' }, + { value: " Madmann's Muzzle", color: '8847ff' }, + { value: ' BINOCULUS!', color: '4b69ff' }, + { value: ' Derangement Garment', color: '4b69ff' }, + { value: ' Convict Cap', color: '4b69ff' }, + { value: ' El Mostacho', color: '4b69ff' }, + { value: ' Candy Cranium', color: '4b69ff' }, + { value: ' Bat Hat', color: '4b69ff' }, + { value: ' Pocket Halloween Boss', color: '4b69ff' }, + { value: ' Party Poncho', color: '4b69ff' }, + { value: ' Fuel Injector', color: '4b69ff' }, + { value: ' Bread Biter', color: '4b69ff' }, + ], + tradable: 1, + actions: [ + { + link: + 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=31066&lang=en_US', + name: 'Item Wiki Page...', + }, + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D5006617706189886078', + name: 'Inspect in Game...', + }, + ], + name: 'Unusual Skullbrero', + name_color: '8650AC', + type: 'Level 57 Hat', + market_name: 'Unusual Skullbrero', + market_hash_name: 'Unusual Skullbrero', + market_actions: [ + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D5006617706189886078', + name: 'Inspect in Game...', + }, + ], + commodity: 0, + market_tradable_restriction: 7, + market_marketable_restriction: 0, + marketable: 1, + tags: [ + { + category: 'Quality', + internal_name: 'rarity4', + localized_category_name: 'Quality', + localized_tag_name: 'Unusual', + color: '8650AC', + }, + { + category: 'Type', + internal_name: 'misc', + localized_category_name: 'Type', + localized_tag_name: 'Cosmetic', + }, + { + category: 'Class', + internal_name: 'Pyro', + localized_category_name: 'Class', + localized_tag_name: 'Pyro', + }, + { + category: 'Rarity', + internal_name: 'Rarity_Mythical', + localized_category_name: 'Grade', + localized_tag_name: 'Commando', + color: '8847ff', + }, + { + category: 'Collection', + internal_name: 'halloween2019_collection_name', + localized_category_name: 'Collection', + localized_tag_name: 'Spooky Spoils Collection', + }, + ], + }, + true, false + ); + + assert.deepEqual(econItem, { + name: 'Skullbrero', + fullName: 'Twisted Radiance Skullbrero', + id: '8574678947', + img: + 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEDewlDDUq7hytIncTqD-CJGu8_l9sn4pUbi2Ftw1ApbbXtNmM_cVTEV_lbWaw7pQu0W3Rr6sVlAdPvoOhScFnt4pyGbefmPm6lTg/', + tradable: true, + craftable: true, + quality: 5, + effect: 130, + classes: ['Pyro'], + type: 'misc', + collection: 'Spooky Spoils Collection', + grade: 'Commando', + parts: [], + spells: [], + marketable: true, + commodity: false, + level: 57, + }); + }); + + it('Case #4', () => { + const econItem = parseEconItem( + { + appid: 440, + contextid: '2', + assetid: '8610658018', + classid: '171010366', + instanceid: '176498576', + amount: '1', + currency: 0, + background_color: '3C352E', + icon_url: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEbfgYfXh7wqwdTmsHiCM2ACfIHnpRh5MkG3G8zyVMpYebiYm8wdFGTBPILC_BvrQu9X3RqupQ6AYPhp-wHZ0yx43BgcxIX', + icon_url_large: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEbfgYfXh7wqwdTmsHiCM2ACfIHnpRh5MkG3G8zyVMpYebiYm8wdFGTBPILC_BvrQu9X3RqupQ6AYPhp-wHZ0yx43BgcxIX', + descriptions: [ + { value: '★ Unusual Effect: Smoking', color: 'ffd700' }, + ], + tradable: 1, + actions: [ + { + link: + 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=318&lang=en_US', + name: 'Item Wiki Page...', + }, + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D10290164463146604828', + name: 'Inspect in Game...', + }, + ], + name: "Unusual Prancer's Pride", + name_color: '8650AC', + type: 'Level 88 Hat', + market_name: "Unusual Prancer's Pride", + market_hash_name: "Unusual Prancer's Pride", + market_actions: [ + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D10290164463146604828', + name: 'Inspect in Game...', + }, + ], + commodity: 0, + market_tradable_restriction: 7, + market_marketable_restriction: 0, + marketable: 1, + tags: [ + { + category: 'Quality', + internal_name: 'rarity4', + localized_category_name: 'Quality', + localized_tag_name: 'Unusual', + color: '8650AC', + }, + { + category: 'Type', + internal_name: 'misc', + localized_category_name: 'Type', + localized_tag_name: 'Cosmetic', + }, + { + category: 'Class', + internal_name: 'Pyro', + localized_category_name: 'Class', + localized_tag_name: 'Pyro', + }, + ], + }, + true, false + ); + + assert.deepEqual(econItem, { + name: "Prancer's Pride", + fullName: "Smoking Prancer's Pride", + id: '8610658018', + img: + 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEbfgYfXh7wqwdTmsHiCM2ACfIHnpRh5MkG3G8zyVMpYebiYm8wdFGTBPILC_BvrQu9X3RqupQ6AYPhp-wHZ0yx43BgcxIX/', + tradable: true, + craftable: true, + quality: 5, + effect: 35, + classes: ['Pyro'], + type: 'misc', + parts: [], + spells: [], + marketable: true, + commodity: false, + level: 88, + }); + }); + + it('Case #5', () => { + const econItem = parseEconItem( + { + appid: 440, + contextid: '2', + assetid: '8656785508', + classid: '3543846179', + instanceid: '3516082756', + amount: '1', + currency: 0, + background_color: '3C352E', + icon_url: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffjDz5zdwmTVPAOCsot8Qn-Whg07dR3XcGzuehWe1q65oHFOuQpN4kZGpOECffQZl39vho_1KdefJbbonvq3SvubmwUG028UzYUYzA', + icon_url_large: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffjDz5zdwmTVPAOCsot8Qn-Whg07dR3XcGzuehWe1q65oHFOuQpN4kZGpOECffQZl39vho_1KdefJbbonvq3SvubmwUG028UzYUYzA', + descriptions: [ + { + value: 'Commando Grade Rocket Launcher (Field-Tested)', + color: '8847ff', + }, + { value: 'Festivized', color: 'ffd700' }, + { + value: + 'Halloween: Pumpkin Bombs (spell only active during event)', + color: '7ea9d1', + }, + { value: 'Sheen: Agonizing Emerald', color: '7ea9d1' }, + { value: 'Killstreaks Active', color: '7ea9d1' }, + { + value: '\nGift from: VLaDOS | S>C.MOON YELLOW BELT', + color: '7ea9d1', + }, + { + value: + 'Date Received: Tuesday, September 10, 2019 (9:36:39) GMT', + }, + { value: ' ' }, + { value: ' ' }, + { value: 'Concealed Killer Collection' }, + { + value: ' Sand Cannon Rocket Launcher', + color: 'eb4b4b', + }, + { value: ' Red Rock Roscoe Pistol', color: 'eb4b4b' }, + { + value: ' Psychedelic Slugger Revolver', + color: 'd32ce6', + }, + { value: ' Purple Range Sniper Rifle', color: 'd32ce6' }, + { + value: ' Sudden Flurry Stickybomb Launcher', + color: 'd32ce6', + }, + { value: ' Night Terror Scattergun', color: '8847ff' }, + { + value: ' Carpet Bomber Stickybomb Launcher', + color: '8847ff', + }, + { + value: '✔ Woodland Warrior Rocket Launcher', + color: '8847ff', + }, + { value: ' Wrapped Reviver Medi Gun', color: '8847ff' }, + { value: ' Night Owl Sniper Rifle', color: '4b69ff' }, + { value: ' Woodsy Widowmaker SMG', color: '4b69ff' }, + { + value: ' Backwoods Boomstick Shotgun', + color: '4b69ff', + }, + { + value: ' King of the Jungle Minigun', + color: '4b69ff', + }, + { value: ' Masked Mender Medi Gun', color: '4b69ff' }, + { value: ' Forest Fire Flame Thrower', color: '4b69ff' }, + ], + tradable: 1, + actions: [ + { + link: + 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=15006&lang=en_US', + name: 'Item Wiki Page...', + }, + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D11534198800805877074', + name: 'Inspect in Game...', + }, + ], + fraudwarnings: [ + 'This item has been renamed.\nOriginal name: "Rocket Launcher"', + ], + name: "''post live spell rocket louncher !!!!!!!''", + name_color: 'FAFAFA', + type: '', + market_name: + 'Festivized Specialized Killstreak Woodland Warrior Rocket Launcher (Field-Tested)', + market_hash_name: + 'Festivized Specialized Killstreak Woodland Warrior Rocket Launcher (Field-Tested)', + market_actions: [ + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D11534198800805877074', + name: 'Inspect in Game...', + }, + ], + commodity: 0, + market_tradable_restriction: 7, + market_marketable_restriction: 0, + marketable: 1, + tags: [ + { + category: 'Quality', + internal_name: 'paintkitweapon', + localized_category_name: 'Quality', + localized_tag_name: 'Decorated Weapon', + color: 'FAFAFA', + }, + { + category: 'Type', + internal_name: 'primary', + localized_category_name: 'Type', + localized_tag_name: 'Primary weapon', + }, + { + category: 'Class', + internal_name: 'Soldier', + localized_category_name: 'Class', + localized_tag_name: 'Soldier', + }, + { + category: 'Rarity', + internal_name: 'Rarity_Mythical', + localized_category_name: 'Grade', + localized_tag_name: 'Commando', + color: '8847ff', + }, + { + category: 'Collection', + internal_name: 'concealedkiller_collection', + localized_category_name: 'Collection', + localized_tag_name: 'Concealed Killer Collection', + }, + { + category: 'Exterior', + internal_name: 'TFUI_InvTooltip_FieldTested', + localized_category_name: 'Exterior', + localized_tag_name: 'Field-Tested', + }, + ], + }, + true, false + ); + + assert.deepEqual(econItem, { + name: 'Rocket Launcher', + fullName: + 'Festivized Specialized Killstreak Woodland Warrior Rocket Launcher (Field-Tested)', + id: '8656785508', + img: + 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffjDz5zdwmTVPAOCsot8Qn-Whg07dR3XcGzuehWe1q65oHFOuQpN4kZGpOECffQZl39vho_1KdefJbbonvq3SvubmwUG028UzYUYzA/', + tradable: true, + craftable: true, + quality: 15, + texture: 6, + wear: 3, + festivized: true, + killstreak: 2, + classes: ['Soldier'], + type: 'primary', + collection: 'Concealed Killer Collection', + grade: 'Commando', + parts: [], + spells: ['Pumpkin Bombs'], + marketable: true, + commodity: false, + sheen: "Agonizing Emerald", + level: -1, + }); + }); + + it('Case #6', () => { + const econItem = parseEconItem({ + "appid":"440", + "classid":"2625497429", + "instanceid":"4048537137", + "icon_url":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffgYghuZgHPUPUOCacF4w3tG3J86sI7V47mp-JTLQu-vNTGYbh_MNgYHMeFXPHVY139uEk9g_VbK52LqTSvg3pcnpTOhA", + "icon_url_large":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffgYghuZgHPUPUOCacF4w3tG3J86sI7V47mp-JTLQu-vNTGYbh_MNgYHMeFXPHVY139uEk9g_VbK52LqTSvg3pcnpTOhA", + "icon_drag_url":"", + "name":"Shell Shocker Rocket Launcher", + "market_hash_name":"Strange Specialized Killstreak Shell Shocker Rocket Launcher (Battle Scarred)", + "market_name":"Strange Specialized Killstreak Shell Shocker Rocket Launcher (Battle Scarred)", + "name_color":"CF6A32", + "background_color":"3C352E", + "type":"", + "tradable":1, + "marketable":1, + "commodity":0, + "market_tradable_restriction":"7", + "market_marketable_restriction":"0", + "descriptions":[ + { + "value":"Assassin Grade Rocket Launcher (Battle Scarred)", + "color":"d32ce6" + }, + { + "value":"Strange Stat Clock Attached", + "color":"CF6A32" + }, + { + "value":" Kills: 5121", + "color":"756b5e" + }, + { + "value":" Pyros Killed: 712", + "color":"756b5e" + }, + { + "value":"Team Colored Decorated Weapon" + }, + { + "value":"Halloween: Pumpkin Bombs (spell only active during event)", + "color":"7ea9d1" + }, + { + "value":"Sheen: Mean Green", + "color":"7ea9d1" + }, + { + "value":"Killstreaks Active", + "color":"7ea9d1" + }, + { + "value":" " + }, + { + "value":" " + }, + { + "value":"Powerhouse Collection" + }, + { + "value":" Liquid Asset Stickybomb Launcher", + "color":"eb4b4b", + "app_data":{ + "def_index":"15045" + } + }, + { + "value":" Thunderbolt Sniper Rifle", + "color":"eb4b4b", + "app_data":{ + "def_index":"15059" + } + }, + { + "value":" Current Event Scattergun", + "color":"d32ce6", + "app_data":{ + "def_index":"15053" + } + }, + { + "value":" Pink Elephant Stickybomb Launcher", + "color":"d32ce6", + "app_data":{ + "def_index":"15048" + } + }, + { + "value":"✔ Shell Shocker Rocket Launcher", + "color":"d32ce6", + "app_data":{ + "def_index":"15052" + } + }, + { + "value":" Flash Fryer Flame Thrower", + "color":"8847ff", + "app_data":{ + "def_index":"15049" + } + }, + { + "value":" Spark of Life Medi Gun", + "color":"8847ff", + "app_data":{ + "def_index":"15050" + } + }, + { + "value":" Dead Reckoner Revolver", + "color":"8847ff", + "app_data":{ + "def_index":"15051" + } + }, + { + "value":" Black Dahlia Pistol", + "color":"8847ff", + "app_data":{ + "def_index":"15046" + } + }, + { + "value":" Sandstone Special Pistol", + "color":"8847ff", + "app_data":{ + "def_index":"15056" + } + }, + { + "value":" Brick House Minigun", + "color":"4b69ff", + "app_data":{ + "def_index":"15055" + } + }, + { + "value":" Aqua Marine Rocket Launcher", + "color":"4b69ff", + "app_data":{ + "def_index":"15057" + } + }, + { + "value":" Low Profile SMG", + "color":"4b69ff", + "app_data":{ + "def_index":"15058" + } + }, + { + "value":" Turbine Torcher Flame Thrower", + "color":"4b69ff", + "app_data":{ + "def_index":"15054" + } + }, + { + "value":" Lightning Rod Shotgun", + "color":"4b69ff", + "app_data":{ + "def_index":"15047" + } + } + ], + "actions":[ + { + "name":"Item Wiki Page...", + "link":"http:\/\/wiki.teamfortress.com\/scripts\/itemredirect.php?id=15052&lang=en_US" + }, + { + "name":"Inspect in Game...", + "link":"steam:\/\/rungame\/440\/76561202255233023\/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D7998211058114246468" + } + ], + "market_actions":[ + { + "name":"Inspect in Game...", + "link":"steam:\/\/rungame\/440\/76561202255233023\/+tf_econ_item_preview%20M%listingid%A%assetid%D7998211058114246468" + } + ], + "tags":[ + { + "internal_name":"strange", + "name":"Strange", + "category":"Quality", + "color":"CF6A32", + "category_name":"Quality" + }, + { + "internal_name":"primary", + "name":"Primary weapon", + "category":"Type", + "category_name":"Type" + }, + { + "internal_name":"Soldier", + "name":"Soldier", + "category":"Class", + "category_name":"Class" + }, + { + "internal_name":"Rarity_Legendary", + "name":"Assassin", + "category":"Rarity", + "color":"d32ce6", + "category_name":"Grade" + }, + { + "internal_name":"Powerhouse_collection", + "name":"Powerhouse Collection", + "category":"Collection", + "category_name":"Collection" + }, + { + "internal_name":"TFUI_InvTooltip_BattleScared", + "name":"Battle Scarred", + "category":"Exterior", + "category_name":"Exterior" + } + ], + "app_data":{ + "def_index":"15052", + "quality":"11" + } + }, true, false); + + assert.deepEqual(econItem, { + name: 'Rocket Launcher', + fullName: 'Strange Specialized Killstreak Shell Shocker Rocket Launcher (Battle Scarred)', + id: undefined, + img: 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffgYghuZgHPUPUOCacF4w3tG3J86sI7V47mp-JTLQu-vNTGYbh_MNgYHMeFXPHVY139uEk9g_VbK52LqTSvg3pcnpTOhA/', + tradable: true, + craftable: true, + quality: 11, + texture: 52, + wear: 5, + killstreak: 2, + classes: [ 'Soldier' ], + type: 'primary', + collection: 'Powerhouse Collection', + grade: 'Assassin', + parts: [ 'Pyros Killed' ], + spells: [ 'Pumpkin Bombs' ], + marketable: true, + commodity: false, + sheen: "Mean Green", + level: -1, + }); + }) + + it('Case #7', () => { + const econItem = parseEconItem( + {"appid":"440","classid":"1348131292","instanceid":"93028938","icon_url":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIUwADWBXjvD1Pid3oDvqJGt8Yltsm2pxUyzFu31V9NbPtYTUwdwWbBfkOXfZioFDuWSFku8JnUdLg8ulQLw29tYfCMOQycIYbhNRIXDY","icon_url_large":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIUwADWBXjvD1Pid3oDvqJGt8Yltsm2pxUyzFu31V9NbPtYTUwdwWbBfkOXfZioFDuWSFku8JnUdLg8ulQLw29tYfCMOQycIYbhNRIXDY","icon_drag_url":"","name":"Strange Professional Killstreak Festive Grenade Launcher","market_hash_name":"Strange Professional Killstreak Festive Grenade Launcher","market_name":"Strange Professional Killstreak Festive Grenade Launcher","name_color":"CF6A32","background_color":"3C352E","type":"Limited Strange Grenade Launcher - Kills: 20","tradable":1,"marketable":1,"commodity":0,"market_tradable_restriction":"7","market_marketable_restriction":"0","descriptions":[{"value":"(Airborne Enemy Kills: 4)","color":"756b5e"},{"value":"Halloween: Exorcism (spell only active during event)","color":"7ea9d1"},{"value":"Killstreaker: Hypno-Beam","color":"7ea9d1"},{"value":"Sheen: Manndarin","color":"7ea9d1"},{"value":"Killstreaks Active","color":"7ea9d1"}],"actions":[{"name":"Item Wiki Page...","link":"http:\/\/wiki.teamfortress.com\/scripts\/itemredirect.php?id=1007&lang=en_US"}],"tags":[{"internal_name":"strange","name":"Strange","category":"Quality","color":"CF6A32","category_name":"Quality"},{"internal_name":"primary","name":"Primary weapon","category":"Type","category_name":"Type"},{"internal_name":"Demoman","name":"Demoman","category":"Class","category_name":"Class"}],"app_data":{"def_index":"1007","quality":"11"}}, + true, false + ); + + assert.deepEqual(econItem, { + classes: ["Demoman"], + commodity: false, + craftable: true, + fullName: "Strange Professional Killstreak Festive Grenade Launcher", + id: undefined, + img: "https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIUwADWBXjvD1Pid3oDvqJGt8Yltsm2pxUyzFu31V9NbPtYTUwdwWbBfkOXfZioFDuWSFku8JnUdLg8ulQLw29tYfCMOQycIYbhNRIXDY/", + killstreak: 3, + killstreaker: "Hypno-Beam", + marketable: true, + name: "Festive Grenade Launcher", + parts: [ "Airborne Enemy Kills" ], + quality: 11, + sheen: "Manndarin", + spells: [ "Exorcism" ], + tradable: true, + type: "primary", + level: -1, + }); + }); + + it('Case #8', () => { + const econItem = parseEconItem({"appid":"440","classid":"11042149","instanceid":"19201223","icon_url":"IzMF03bi9WpSBq-S-ekoE33L-iLqGFHVaU25ZzQNQcXdEH9myp0erksICfTdcfMQEpRnqWSMU5OD2NoHwHEIkChXOjLx2Sk5MbUqMcbBnQz4ruyeU3n5awjJLjLaE0pXEvYaYzGdkW_0p7rBXG6aQb0rFl9XK_QM8jdIb82PaURv3dUMrT27kxUqSU5_IZIXcl_smSJdIbMiwRlwHyU","icon_url_large":"IzMF03bi9WpSBq-S-ekoE33L-iLqGFHVaU25ZzQNQcXdEH9myp0erksICfTdcfMQEpRnqWSMU5OD2NoHwHEIkChXOjLx2Sk5MbUqMcbBnQz4ruyeU3n5awjJLjLaE0pXEvYaYzGdkW_0p7rBXG6aQb0rFl9XK_QM8jdIb82PaURv3dUMrT27kxUqSU5_IZIXcl_smSJdIbMiwRlwHyU","icon_drag_url":"","name":"The Essential Accessories","market_hash_name":"The Essential Accessories","market_name":"The Essential Accessories","name_color":"7D6D00","background_color":"3C352E","type":"Limited Level 10 Apparel","tradable":1,"marketable":1,"commodity":0,"market_tradable_restriction":"7","market_marketable_restriction":"0","descriptions":[{"value":"Paint Color: Operator's Overalls","color":"756b5e"},{"value":""}],"actions":[{"name":"Item Wiki Page...","link":"http:\/\/wiki.teamfortress.com\/scripts\/itemredirect.php?id=347&lang=en_US"},{"name":"Inspect in Game...","link":"steam:\/\/rungame\/440\/76561202255233023\/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D2891326522173157497"}],"market_actions":[{"name":"Inspect in Game...","link":"steam:\/\/rungame\/440\/76561202255233023\/+tf_econ_item_preview%20M%listingid%A%assetid%D2891326522173157497"}],"tags":[{"internal_name":"Unique","name":"Unique","category":"Quality","color":"7D6D00","category_name":"Quality"},{"internal_name":"misc","name":"Cosmetic","category":"Type","category_name":"Type"},{"internal_name":"Scout","name":"Scout","category":"Class","category_name":"Class"}],"app_data":{"def_index":"347","quality":"6"}}, true, false); + + assert.deepEqual(econItem, { + "classes": [ + "Scout" + ], + "commodity": false, + "craftable": true, + "fullName": "The Essential Accessories", + "id": undefined, + "img": "https://steamcommunity-a.akamaihd.net/economy/image/IzMF03bi9WpSBq-S-ekoE33L-iLqGFHVaU25ZzQNQcXdEH9myp0erksICfTdcfMQEpRnqWSMU5OD2NoHwHEIkChXOjLx2Sk5MbUqMcbBnQz4ruyeU3n5awjJLjLaE0pXEvYaYzGdkW_0p7rBXG6aQb0rFl9XK_QM8jdIb82PaURv3dUMrT27kxUqSU5_IZIXcl_smSJdIbMiwRlwHyU/", + "marketable": true, + "name": "The Essential Accessories", + "paint": "Operator's Overalls", + "parts": [], + "quality": 6, + "spells": [], + "tradable": true, + "type": "misc", + level: -1, + }); + }); + + it('Case #9 - Red Rock Roscoe texture', () => { + class MockSchema extends Schema { + getTextureEnum() { + this.loadTextures(); + + return 0; + } + } + + const format = createFormat(new MockSchema()); + const econItem = format.parseEconItem( + {"appid":"440","classid":"4472592872","instanceid":"1365979262","icon_url":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPfflDz5zdwmTVPAPD8ot8Qn-Whg07dR3XcGzuetXKlnpsYuVMbguMYpOGpXZCKTTYAv8uB89iPIIKpDcoyq72Srvaz8UG028HR0ZFYA","icon_url_large":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPfflDz5zdwmTVPAPD8ot8Qn-Whg07dR3XcGzuetXKlnpsYuVMbguMYpOGpXZCKTTYAv8uB89iPIIKpDcoyq72Srvaz8UG028HR0ZFYA","icon_drag_url":"","name":"Festivized Red Rock Roscoe Pistol","market_hash_name":"Festivized Specialized Killstreak Red Rock Roscoe Pistol (Field-Tested)","market_name":"Festivized Specialized Killstreak Red Rock Roscoe Pistol (Field-Tested)","name_color":"FAFAFA","background_color":"3C352E","type":"","tradable":1,"marketable":1,"commodity":0,"market_tradable_restriction":"7","market_marketable_restriction":"0","descriptions":[{"value":"Elite Grade Pistol (Field-Tested)","color":"eb4b4b"},{"value":"Festivized","color":"ffd700"},{"value":"Team Colored Decorated Weapon"},{"value":"Sheen: Hot Rod","color":"7ea9d1"},{"value":"Killstreaks Active","color":"7ea9d1"},{"value":"''Fuzzball's Pocket Pistol''"},{"value":" "},{"value":" "},{"value":"Concealed Killer Collection"},{"value":" Sand Cannon Rocket Launcher","color":"eb4b4b","app_data":{"def_index":"15014"}},{"value":" Red Rock Roscoe Pistol","color":"eb4b4b","app_data":{"def_index":"15013"}},{"value":" Psychedelic Slugger Revolver","color":"d32ce6","app_data":{"def_index":"15011"}},{"value":" Purple Range Sniper Rifle","color":"d32ce6","app_data":{"def_index":"15007"}},{"value":" Sudden Flurry Stickybomb Launcher","color":"d32ce6","app_data":{"def_index":"15009"}},{"value":" Night Terror Scattergun","color":"8847ff","app_data":{"def_index":"15002"}},{"value":" Carpet Bomber Stickybomb Launcher","color":"8847ff","app_data":{"def_index":"15012"}},{"value":" Woodland Warrior Rocket Launcher","color":"8847ff","app_data":{"def_index":"15006"}},{"value":" Wrapped Reviver Medi Gun","color":"8847ff","app_data":{"def_index":"15010"}},{"value":" Night Owl Sniper Rifle","color":"4b69ff","app_data":{"def_index":"15000"}},{"value":" Woodsy Widowmaker SMG","color":"4b69ff","app_data":{"def_index":"15001"}},{"value":" Backwoods Boomstick Shotgun","color":"4b69ff","app_data":{"def_index":"15003"}},{"value":" King of the Jungle Minigun","color":"4b69ff","app_data":{"def_index":"15004"}},{"value":" Masked Mender Medi Gun","color":"4b69ff","app_data":{"def_index":"15008"}},{"value":" Forest Fire Flame Thrower","color":"4b69ff","app_data":{"def_index":"15005"}}],"actions":[{"name":"Item Wiki Page...","link":"http:\/\/wiki.teamfortress.com\/scripts\/itemredirect.php?id=15013&lang=en_US"},{"name":"Inspect in Game...","link":"steam:\/\/rungame\/440\/76561202255233023\/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D10132525329635647851"}],"market_actions":[{"name":"Inspect in Game...","link":"steam:\/\/rungame\/440\/76561202255233023\/+tf_econ_item_preview%20M%listingid%A%assetid%D10132525329635647851"}],"tags":[{"internal_name":"paintkitweapon","name":"Decorated Weapon","category":"Quality","color":"FAFAFA","category_name":"Quality"},{"internal_name":"secondary","name":"Secondary weapon","category":"Type","category_name":"Type"},{"internal_name":"Scout","name":"Scout","category":"Class","category_name":"Class"},{"internal_name":"Engineer","name":"Engineer","category":"Class","category_name":"Class"},{"internal_name":"Rarity_Ancient","name":"Elite","category":"Rarity","color":"eb4b4b","category_name":"Grade"},{"internal_name":"concealedkiller_collection","name":"Concealed Killer Collection","category":"Collection","category_name":"Collection"},{"internal_name":"TFUI_InvTooltip_FieldTested","name":"Field-Tested","category":"Exterior","category_name":"Exterior"}],"app_data":{"def_index":"15013","quality":"15"}}, + true, + false, + ) + + assert.deepEqual(econItem, { + name: 'Pistol', + fullName: 'Festivized Specialized Killstreak Red Rock Roscoe Pistol (Field-Tested)', + id: undefined, + img: 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPfflDz5zdwmTVPAPD8ot8Qn-Whg07dR3XcGzuetXKlnpsYuVMbguMYpOGpXZCKTTYAv8uB89iPIIKpDcoyq72Srvaz8UG028HR0ZFYA/', + tradable: true, + craftable: true, + quality: 15, + wear: 3, + festivized: true, + killstreak: 2, + level: -1, + classes: [ 'Scout', 'Engineer' ], + type: 'secondary', + sheen: 'Hot Rod', + collection: 'Concealed Killer Collection', + grade: 'Elite', + parts: [], + spells: [], + marketable: true, + commodity: false, + texture: 0, + }); + }); +}); + +describe('Econ item with defindexes', () => { + it('Case #1', () => { + const econItem = parseEconItem( + { + appid: 440, + contextid: '2', + assetid: '8574678947', + classid: '3555490789', + instanceid: '856289751', + amount: '1', + currency: 0, + background_color: '3C352E', + icon_url: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEDewlDDUq7hytIncTqD-CJGu8_l9sn4pUbi2Ftw1ApbbXtNmM_cVTEV_lbWaw7pQu0W3Rr6sVlAdPvoOhScFnt4pyGbefmPm6lTg', + icon_url_large: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEDewlDDUq7hytIncTqD-CJGu8_l9sn4pUbi2Ftw1ApbbXtNmM_cVTEV_lbWaw7pQu0W3Rr6sVlAdPvoOhScFnt4pyGbefmPm6lTg', + descriptions: [ + { value: 'Commando Grade Hat', color: '8847ff' }, + { + value: '★ Unusual Effect: Twisted Radiance', + color: 'ffd700', + }, + { value: ' ' }, + { value: ' ' }, + { value: 'Spooky Spoils Collection' }, + { value: ' Mister Bones', color: 'eb4b4b' }, + { value: " Pyr'o Lantern", color: 'eb4b4b' }, + { value: ' Racc Mann', color: 'd32ce6' }, + { value: ' Head of the Dead', color: 'd32ce6' }, + { value: ' Elizabeth the Third', color: 'd32ce6' }, + { value: ' The Trick Stabber', color: 'd32ce6' }, + { value: ' El Zapateador', color: '8847ff' }, + { value: ' The Horrible Horns', color: '8847ff' }, + { value: '★ Skullbrero', color: '8847ff' }, + { value: ' Soviet Strongmann', color: '8847ff' }, + { value: ' Voodoo Vizier', color: '8847ff' }, + { value: " Madmann's Muzzle", color: '8847ff' }, + { value: ' BINOCULUS!', color: '4b69ff' }, + { value: ' Derangement Garment', color: '4b69ff' }, + { value: ' Convict Cap', color: '4b69ff' }, + { value: ' El Mostacho', color: '4b69ff' }, + { value: ' Candy Cranium', color: '4b69ff' }, + { value: ' Bat Hat', color: '4b69ff' }, + { value: ' Pocket Halloween Boss', color: '4b69ff' }, + { value: ' Party Poncho', color: '4b69ff' }, + { value: ' Fuel Injector', color: '4b69ff' }, + { value: ' Bread Biter', color: '4b69ff' }, + ], + tradable: 1, + actions: [ + { + link: + 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=31066&lang=en_US', + name: 'Item Wiki Page...', + }, + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D5006617706189886078', + name: 'Inspect in Game...', + }, + ], + name: 'Unusual Skullbrero', + name_color: '8650AC', + type: 'Level 57 Hat', + market_name: 'Unusual Skullbrero', + market_hash_name: 'Unusual Skullbrero', + market_actions: [ + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D5006617706189886078', + name: 'Inspect in Game...', + }, + ], + commodity: 0, + market_tradable_restriction: 7, + market_marketable_restriction: 0, + marketable: 1, + tags: [ + { + category: 'Quality', + internal_name: 'rarity4', + localized_category_name: 'Quality', + localized_tag_name: 'Unusual', + color: '8650AC', + }, + { + category: 'Type', + internal_name: 'misc', + localized_category_name: 'Type', + localized_tag_name: 'Cosmetic', + }, + { + category: 'Class', + internal_name: 'Pyro', + localized_category_name: 'Class', + localized_tag_name: 'Pyro', + }, + { + category: 'Rarity', + internal_name: 'Rarity_Mythical', + localized_category_name: 'Grade', + localized_tag_name: 'Commando', + color: '8847ff', + }, + { + category: 'Collection', + internal_name: 'halloween2019_collection_name', + localized_category_name: 'Collection', + localized_tag_name: 'Spooky Spoils Collection', + }, + ], + }, + false, true + ); + + assert.deepEqual(econItem, { + name: 'Skullbrero', + fullName: 'Twisted Radiance Skullbrero', + id: '8574678947', + img: + 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEDewlDDUq7hytIncTqD-CJGu8_l9sn4pUbi2Ftw1ApbbXtNmM_cVTEV_lbWaw7pQu0W3Rr6sVlAdPvoOhScFnt4pyGbefmPm6lTg/', + tradable: true, + craftable: true, + quality: 'Unusual', + effect: 'Twisted Radiance', + defindex: 31066, + classes: ['Pyro'], + type: 'misc', + collection: 'Spooky Spoils Collection', + grade: 'Commando', + parts: [], + spells: [], + marketable: true, + commodity: false, + level: 57, + }); + }); + + it('Case #2', () => { + const econItem = parseEconItem( + { + appid: 440, + contextid: '2', + assetid: '8610658018', + classid: '171010366', + instanceid: '176498576', + amount: '1', + currency: 0, + background_color: '3C352E', + icon_url: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEbfgYfXh7wqwdTmsHiCM2ACfIHnpRh5MkG3G8zyVMpYebiYm8wdFGTBPILC_BvrQu9X3RqupQ6AYPhp-wHZ0yx43BgcxIX', + icon_url_large: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEbfgYfXh7wqwdTmsHiCM2ACfIHnpRh5MkG3G8zyVMpYebiYm8wdFGTBPILC_BvrQu9X3RqupQ6AYPhp-wHZ0yx43BgcxIX', + descriptions: [ + { value: '★ Unusual Effect: Smoking', color: 'ffd700' }, + ], + tradable: 1, + actions: [ + { + link: + 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=318&lang=en_US', + name: 'Item Wiki Page...', + }, + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D10290164463146604828', + name: 'Inspect in Game...', + }, + ], + name: "Unusual Prancer's Pride", + name_color: '8650AC', + type: 'Level 88 Hat', + market_name: "Unusual Prancer's Pride", + market_hash_name: "Unusual Prancer's Pride", + market_actions: [ + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D10290164463146604828', + name: 'Inspect in Game...', + }, + ], + commodity: 0, + market_tradable_restriction: 7, + market_marketable_restriction: 0, + marketable: 1, + tags: [ + { + category: 'Quality', + internal_name: 'rarity4', + localized_category_name: 'Quality', + localized_tag_name: 'Unusual', + color: '8650AC', + }, + { + category: 'Type', + internal_name: 'misc', + localized_category_name: 'Type', + localized_tag_name: 'Cosmetic', + }, + { + category: 'Class', + internal_name: 'Pyro', + localized_category_name: 'Class', + localized_tag_name: 'Pyro', + }, + ], + }, + false, true + ); + + assert.deepEqual(econItem, { + name: "Prancer's Pride", + fullName: "Smoking Prancer's Pride", + id: '8610658018', + img: + 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEbfgYfXh7wqwdTmsHiCM2ACfIHnpRh5MkG3G8zyVMpYebiYm8wdFGTBPILC_BvrQu9X3RqupQ6AYPhp-wHZ0yx43BgcxIX/', + tradable: true, + craftable: true, + quality: 'Unusual', + effect: 'Smoking', + defindex: 318, + classes: ['Pyro'], + type: 'misc', + parts: [], + spells: [], + marketable: true, + commodity: false, + level: 88, + }); + }); + + it('Case #3', () => { + const econItem = parseEconItem( + { + appid: 440, + contextid: '2', + assetid: '8656785508', + classid: '3543846179', + instanceid: '3516082756', + amount: '1', + currency: 0, + background_color: '3C352E', + icon_url: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffjDz5zdwmTVPAOCsot8Qn-Whg07dR3XcGzuehWe1q65oHFOuQpN4kZGpOECffQZl39vho_1KdefJbbonvq3SvubmwUG028UzYUYzA', + icon_url_large: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffjDz5zdwmTVPAOCsot8Qn-Whg07dR3XcGzuehWe1q65oHFOuQpN4kZGpOECffQZl39vho_1KdefJbbonvq3SvubmwUG028UzYUYzA', + descriptions: [ + { + value: 'Commando Grade Rocket Launcher (Field-Tested)', + color: '8847ff', + }, + { value: 'Festivized', color: 'ffd700' }, + { + value: + 'Halloween: Pumpkin Bombs (spell only active during event)', + color: '7ea9d1', + }, + { value: 'Sheen: Agonizing Emerald', color: '7ea9d1' }, + { value: 'Killstreaks Active', color: '7ea9d1' }, + { + value: '\nGift from: VLaDOS | S>C.MOON YELLOW BELT', + color: '7ea9d1', + }, + { + value: + 'Date Received: Tuesday, September 10, 2019 (9:36:39) GMT', + }, + { value: ' ' }, + { value: ' ' }, + { value: 'Concealed Killer Collection' }, + { + value: ' Sand Cannon Rocket Launcher', + color: 'eb4b4b', + }, + { value: ' Red Rock Roscoe Pistol', color: 'eb4b4b' }, + { + value: ' Psychedelic Slugger Revolver', + color: 'd32ce6', + }, + { value: ' Purple Range Sniper Rifle', color: 'd32ce6' }, + { + value: ' Sudden Flurry Stickybomb Launcher', + color: 'd32ce6', + }, + { value: ' Night Terror Scattergun', color: '8847ff' }, + { + value: ' Carpet Bomber Stickybomb Launcher', + color: '8847ff', + }, + { + value: '✔ Woodland Warrior Rocket Launcher', + color: '8847ff', + }, + { value: ' Wrapped Reviver Medi Gun', color: '8847ff' }, + { value: ' Night Owl Sniper Rifle', color: '4b69ff' }, + { value: ' Woodsy Widowmaker SMG', color: '4b69ff' }, + { + value: ' Backwoods Boomstick Shotgun', + color: '4b69ff', + }, + { + value: ' King of the Jungle Minigun', + color: '4b69ff', + }, + { value: ' Masked Mender Medi Gun', color: '4b69ff' }, + { value: ' Forest Fire Flame Thrower', color: '4b69ff' }, + ], + tradable: 1, + actions: [ + { + link: + 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=15006&lang=en_US', + name: 'Item Wiki Page...', + }, + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D11534198800805877074', + name: 'Inspect in Game...', + }, + ], + fraudwarnings: [ + 'This item has been renamed.\nOriginal name: "Rocket Launcher"', + ], + name: "''post live spell rocket louncher !!!!!!!''", + name_color: 'FAFAFA', + type: '', + market_name: + 'Festivized Specialized Killstreak Woodland Warrior Rocket Launcher (Field-Tested)', + market_hash_name: + 'Festivized Specialized Killstreak Woodland Warrior Rocket Launcher (Field-Tested)', + market_actions: [ + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D11534198800805877074', + name: 'Inspect in Game...', + }, + ], + commodity: 0, + market_tradable_restriction: 7, + market_marketable_restriction: 0, + marketable: 1, + tags: [ + { + category: 'Quality', + internal_name: 'paintkitweapon', + localized_category_name: 'Quality', + localized_tag_name: 'Decorated Weapon', + color: 'FAFAFA', + }, + { + category: 'Type', + internal_name: 'primary', + localized_category_name: 'Type', + localized_tag_name: 'Primary weapon', + }, + { + category: 'Class', + internal_name: 'Soldier', + localized_category_name: 'Class', + localized_tag_name: 'Soldier', + }, + { + category: 'Rarity', + internal_name: 'Rarity_Mythical', + localized_category_name: 'Grade', + localized_tag_name: 'Commando', + color: '8847ff', + }, + { + category: 'Collection', + internal_name: 'concealedkiller_collection', + localized_category_name: 'Collection', + localized_tag_name: 'Concealed Killer Collection', + }, + { + category: 'Exterior', + internal_name: 'TFUI_InvTooltip_FieldTested', + localized_category_name: 'Exterior', + localized_tag_name: 'Field-Tested', + }, + ], + }, + false, true + ); + + assert.deepEqual(econItem, { + name: 'Rocket Launcher', + fullName: + 'Festivized Specialized Killstreak Woodland Warrior Rocket Launcher (Field-Tested)', + id: '8656785508', + img: + 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffjDz5zdwmTVPAOCsot8Qn-Whg07dR3XcGzuehWe1q65oHFOuQpN4kZGpOECffQZl39vho_1KdefJbbonvq3SvubmwUG028UzYUYzA/', + tradable: true, + craftable: true, + quality: 'Decorated Weapon', + texture: 'Woodland Warrior', + wear: 'Field-Tested', + defindex: 205, + festivized: true, + killstreak: 'Specialized Killstreak', + classes: ['Soldier'], + type: 'primary', + collection: 'Concealed Killer Collection', + grade: 'Commando', + parts: [], + spells: ['Pumpkin Bombs'], + marketable: true, + commodity: false, + sheen: "Agonizing Emerald", + level: -1, + }); + }); + + it('Case #4', () => { + const econItem = parseEconItem( + { + appid: 440, + contextid: '2', + assetid: '8733746813', + classid: '221512872', + instanceid: '92637229', + amount: '1', + currency: 0, + background_color: '3C352E', + icon_url: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEDe1VBDEjdqCEX2PfnGOaDBeEUlNQK6ZFH3jMlwwB_Y7vhZ2Q0JFKQAKQJXadrpF6-UXE268I3UNHg8esHfF28tdHHO65sbo88eQy8bA', + icon_url_large: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEDe1VBDEjdqCEX2PfnGOaDBeEUlNQK6ZFH3jMlwwB_Y7vhZ2Q0JFKQAKQJXadrpF6-UXE268I3UNHg8esHfF28tdHHO65sbo88eQy8bA', + descriptions: [ + { + value: 'Holiday Restriction: Halloween / Full Moon', + color: 'd83636', + }, + { + value: + 'Halloween: Spectral Spectrum (spell only active during event)', + color: '7ea9d1', + }, + { value: '' }, + ], + tradable: 1, + actions: [ + { + link: + 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=30290&lang=en_US', + name: 'Item Wiki Page...', + }, + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D16238051287194648628', + name: 'Inspect in Game...', + }, + ], + name: 'Haunted PY-40 Incinibot', + name_color: '38f3ab', + type: 'Level 58 Mask', + market_name: 'Haunted PY-40 Incinibot', + market_hash_name: 'Haunted PY-40 Incinibot', + market_actions: [ + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D16238051287194648628', + name: 'Inspect in Game...', + }, + ], + commodity: 0, + market_tradable_restriction: 7, + market_marketable_restriction: 0, + marketable: 1, + tags: [ + { + category: 'Quality', + internal_name: 'haunted', + localized_category_name: 'Quality', + localized_tag_name: 'Haunted', + color: '38f3ab', + }, + { + category: 'Type', + internal_name: 'misc', + localized_category_name: 'Type', + localized_tag_name: 'Cosmetic', + }, + { + category: 'Class', + internal_name: 'Pyro', + localized_category_name: 'Class', + localized_tag_name: 'Pyro', + }, + ], + }, + false, true + ); + + assert.deepEqual(econItem, { + name: 'PY-40 Incinibot', + fullName: 'Haunted PY-40 Incinibot', + id: '8733746813', + img: + 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEDe1VBDEjdqCEX2PfnGOaDBeEUlNQK6ZFH3jMlwwB_Y7vhZ2Q0JFKQAKQJXadrpF6-UXE268I3UNHg8esHfF28tdHHO65sbo88eQy8bA/', + tradable: true, + craftable: true, + quality: 'Haunted', + defindex: 30290, + classes: ['Pyro'], + type: 'misc', + parts: [], + spells: ['Spectral Spectrum'], + marketable: true, + commodity: false, + level: 58, + }); + }); + + it('Case #5', () => { + const econItem = parseEconItem( + { + appid: 440, + contextid: '2', + assetid: '8434754722', + classid: '88783771', + instanceid: '92739934', + amount: '1', + currency: 0, + background_color: '3C352E', + icon_url: + 'IzMF03bi9WpSBq-S-ekoE33L-iLqGFHVaU25ZzQNQcXdEH9myp0erksICfTcePMQFc1nqWSMU5OD2NwOx3sIyShXOjLx2Sk5MbUqMcbBnQz4ruyeU2DgVzPLKCnYCGFgGOIYfAeFr3HysPORE2vPELl_RQEMdaFX9GxObM-BOEE_goVdrTXqlBwkHRNxJ5VFcVbihGQdNlNSNRp3', + icon_url_large: + 'IzMF03bi9WpSBq-S-ekoE33L-iLqGFHVaU25ZzQNQcXdEH9myp0erksICfTcePMQFc1nqWSMU5OD2NwOx3sIyShXOjLx2Sk5MbUqMcbBnQz4ruyeU2DgVzPLKCnYCGFgGOIYfAeFr3HysPORE2vPELl_RQEMdaFX9GxObM-BOEE_goVdrTXqlBwkHRNxJ5VFcVbihGQdNlNSNRp3', + descriptions: [ + { + value: "Paint Color: Noble Hatter's Violet", + color: '756b5e', + }, + { + value: + 'Halloween: Spectral Spectrum (spell only active during event)', + color: '7ea9d1', + }, + { + value: + "The K-9 mane is perfect for tricky social situations. People will either only want to talk about the hat, which means they'll be distracted from that rash making its way up your jugular,or they'll avoid you altogether. It's a win/win!", + }, + ], + tradable: 1, + actions: [ + { + link: + 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=876&lang=en_US', + name: 'Item Wiki Page...', + }, + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D7378163898213210976', + name: 'Inspect in Game...', + }, + ], + name: 'Genuine K-9 Mane', + name_color: '4D7455', + type: 'Level 1 Spirit Animal', + market_name: 'Genuine K-9 Mane', + market_hash_name: 'Genuine K-9 Mane', + market_actions: [ + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D7378163898213210976', + name: 'Inspect in Game...', + }, + ], + commodity: 0, + market_tradable_restriction: 7, + market_marketable_restriction: 0, + marketable: 1, + tags: [ + { + category: 'Quality', + internal_name: 'rarity1', + localized_category_name: 'Quality', + localized_tag_name: 'Genuine', + color: '4D7455', + }, + { + category: 'Type', + internal_name: 'misc', + localized_category_name: 'Type', + localized_tag_name: 'Cosmetic', + }, + { + category: 'Class', + internal_name: 'Demoman', + localized_category_name: 'Class', + localized_tag_name: 'Demoman', + }, + { + category: 'Class', + internal_name: 'Heavy', + localized_category_name: 'Class', + localized_tag_name: 'Heavy', + }, + ], + }, + false, true + ); + + assert.deepEqual(econItem, { + name: 'K-9 Mane', + fullName: 'Genuine K-9 Mane', + id: '8434754722', + img: + 'https://steamcommunity-a.akamaihd.net/economy/image/IzMF03bi9WpSBq-S-ekoE33L-iLqGFHVaU25ZzQNQcXdEH9myp0erksICfTcePMQFc1nqWSMU5OD2NwOx3sIyShXOjLx2Sk5MbUqMcbBnQz4ruyeU2DgVzPLKCnYCGFgGOIYfAeFr3HysPORE2vPELl_RQEMdaFX9GxObM-BOEE_goVdrTXqlBwkHRNxJ5VFcVbihGQdNlNSNRp3/', + tradable: true, + craftable: true, + quality: 'Genuine', + defindex: 876, + classes: ['Demoman', 'Heavy'], + type: 'misc', + parts: [], + spells: ['Spectral Spectrum'], + marketable: true, + commodity: false, + paint: "Noble Hatter's Violet", + level: 1, + }); + }); + + it('Case #6', () => { + const econItem = parseEconItem( + { + appid: 440, + contextid: '2', + assetid: '8294625611', + classid: '1336074160', + instanceid: '3639098153', + amount: '1', + currency: 0, + background_color: '3C352E', + icon_url: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEfezgSUhr2hzVGjMHlMvyJC-sUkt8K6ZFH3jMllVQrZbvkNG8ydFXAWfEICqFjp160CCNivZI3VY_j9u8DfA6-sYSUN65sbo_U7o3qKw', + icon_url_large: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEfezgSUhr2hzVGjMHlMvyJC-sUkt8K6ZFH3jMllVQrZbvkNG8ydFXAWfEICqFjp160CCNivZI3VY_j9u8DfA6-sYSUN65sbo_U7o3qKw', + descriptions: [ + { value: 'Style: Tie', color: '756b5e' }, + { + value: + 'Halloween: Chromatic Corruption (spell only active during event)', + color: '7ea9d1', + }, + { + value: + 'Halloween: Voices From Below (spell only active during event)', + color: '7ea9d1', + }, + { + value: + "Whether you're trepanning a skull to let out the sickness ghosts or attaching enough leeches to a patient that they'll pass out from blood loss before you cut off any suspicious-lookinglimbs, this dapper ruffed shirt and coat will assure your patients that they came to the right place for their dangerously insane 18th century medicine.", + }, + ], + tradable: 1, + actions: [ + { + link: + 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=878&lang=en_US', + name: 'Item Wiki Page...', + }, + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D434113929687356346', + name: 'Inspect in Game...', + }, + ], + name: 'Strange Genuine Foppish Physician', + name_color: '4D7455', + type: 'Strange Apparel - Points Scored: 1', + market_name: 'Strange Genuine Foppish Physician', + market_hash_name: 'Strange Genuine Foppish Physician', + market_actions: [ + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D434113929687356346', + name: 'Inspect in Game...', + }, + ], + commodity: 0, + market_tradable_restriction: 7, + market_marketable_restriction: 0, + marketable: 1, + tags: [ + { + category: 'Quality', + internal_name: 'rarity1', + localized_category_name: 'Quality', + localized_tag_name: 'Genuine', + color: '4D7455', + }, + { + category: 'Type', + internal_name: 'misc', + localized_category_name: 'Type', + localized_tag_name: 'Cosmetic', + }, + { + category: 'Class', + internal_name: 'Medic', + localized_category_name: 'Class', + localized_tag_name: 'Medic', + }, + ], + }, + false, true + ); + + assert.deepEqual(econItem, { + name: 'Foppish Physician', + fullName: 'Strange Genuine Foppish Physician', + id: '8294625611', + img: + 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEfezgSUhr2hzVGjMHlMvyJC-sUkt8K6ZFH3jMllVQrZbvkNG8ydFXAWfEICqFjp160CCNivZI3VY_j9u8DfA6-sYSUN65sbo_U7o3qKw/', + tradable: true, + craftable: true, + quality: 'Genuine', + defindex: 878, + elevated: true, + classes: ['Medic'], + type: 'misc', + parts: [], + spells: ['Chromatic Corruption', 'Voices From Below'], + marketable: true, + commodity: false, + level: -1, + }); + }); + + it('Case #7', () => { + const econItem = parseEconItem({ + assetid: "30125", + appid: '440', + classid: '638115890', + instanceid: '0', + icon_url: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIYwkCSQn3uyxKh8bZBvuYN-wBid0wq8hXjW49lVl_NrC2ZjFjJlPHV6FcDPRj8Am1Cn5i6pE3DIfuoOxReV_x9NyRdNFoUKY', + icon_url_large: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIYwkCSQn3uyxKh8bZBvuYN-wBid0wq8hXjW49lVl_NrC2ZjFjJlPHV6FcDPRj8Am1Cn5i6pE3DIfuoOxReV_x9NyRdNFoUKY', + icon_drag_url: '', + name: "Stockbroker's Scarf Strangifier Chemistry Set Series #2", + market_hash_name: + "Stockbroker's Scarf Strangifier Chemistry Set Series #2", + market_name: + "Stockbroker's Scarf Strangifier Chemistry Set Series #2", + name_color: '7D6D00', + background_color: '3C352E', + type: 'Level 5 Recipe', + tradable: 1, + marketable: 1, + commodity: 0, + market_tradable_restriction: '7', + market_marketable_restriction: '0', + descriptions: [ + { + value: + "This item has a set of inputs that, once fulfilled, will\nreward you with what's listed in its outputs.", + }, + { value: ' ' }, + { + value: + 'The following are the inputs that must be fulfilled.', + }, + { value: 'The Vaccinator x 4', color: '8b8989' }, + { value: 'The Blutsauger x 1', color: '8b8989' }, + { value: 'The Disciplinary Action x 1', color: '8b8989' }, + { value: 'The Sandvich x 1', color: '8b8989' }, + { value: 'The Candy Cane x 1', color: '8b8989' }, + { value: 'Strange Scottish Resistance x 1', color: '8b8989' }, + { value: ' ' }, + { + value: + 'You will receive all of the following outputs once all of the inputs are fulfilled.', + }, + { value: "Stockbroker's Scarf Strangifier", color: '8b8989' }, + { value: ' ' }, + { + value: 'This is a limited use item. Uses: 1', + color: '00a000', + app_data: { limited: 1 }, + }, + ], + actions: [ + { + name: 'Item Wiki Page...', + link: + 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=20005&lang=en_US', + }, + ], + tags: [ + { + internal_name: 'Unique', + name: 'Unique', + category: 'Quality', + color: '7D6D00', + category_name: 'Quality', + }, + { + internal_name: 'TF_ItemDynamicRecipeTool', + name: 'Recipe', + category: 'Type', + category_name: 'Type', + }, + ], + app_data: { quantity: '1', def_index: '20005', quality: '6' }, + }, true, true); + + assert.deepEqual(econItem, { + name: 'Chemistry Set', + fullName: "Stockbroker's Scarf Strangifier Chemistry Set Series #2", + id: "30125", + img: 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIYwkCSQn3uyxKh8bZBvuYN-wBid0wq8hXjW49lVl_NrC2ZjFjJlPHV6FcDPRj8Am1Cn5i6pE3DIfuoOxReV_x9NyRdNFoUKY/', + tradable: true, + craftable: true, + quality: 6, + target: "Stockbroker's Scarf", + output: 'Strangifier', + outputQuality: 6, + itemNumber: { type: 'series', value: 2 }, + defindex: 20005, + outputDefindex: 5661, + targetDefindex: 336, + classes: [], + type: 'TF_ItemDynamicRecipeTool', + parts: [], + spells: [], + marketable: true, + commodity: false, + level: 5, + }); + }); + + it('Case #11', () => { + const econItem = parseEconItem({ + "appid":"440", + "classid":"2625497429", + "instanceid":"4048537137", + "icon_url":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffgYghuZgHPUPUOCacF4w3tG3J86sI7V47mp-JTLQu-vNTGYbh_MNgYHMeFXPHVY139uEk9g_VbK52LqTSvg3pcnpTOhA", + "icon_url_large":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffgYghuZgHPUPUOCacF4w3tG3J86sI7V47mp-JTLQu-vNTGYbh_MNgYHMeFXPHVY139uEk9g_VbK52LqTSvg3pcnpTOhA", + "icon_drag_url":"", + "name":"Shell Shocker Rocket Launcher", + "market_hash_name":"Strange Specialized Killstreak Shell Shocker Rocket Launcher (Battle Scarred)", + "market_name":"Strange Specialized Killstreak Shell Shocker Rocket Launcher (Battle Scarred)", + "name_color":"CF6A32", + "background_color":"3C352E", + "type":"", + "tradable":1, + "marketable":1, + "commodity":0, + "market_tradable_restriction":"7", + "market_marketable_restriction":"0", + "descriptions":[ + { + "value":"Assassin Grade Rocket Launcher (Battle Scarred)", + "color":"d32ce6" + }, + { + "value":"Strange Stat Clock Attached", + "color":"CF6A32" + }, + { + "value":" Kills: 5121", + "color":"756b5e" + }, + { + "value":" Pyros Killed: 712", + "color":"756b5e" + }, + { + "value":"Team Colored Decorated Weapon" + }, + { + "value":"Halloween: Pumpkin Bombs (spell only active during event)", + "color":"7ea9d1" + }, + { + "value":"Sheen: Mean Green", + "color":"7ea9d1" + }, + { + "value":"Killstreaks Active", + "color":"7ea9d1" + }, + { + "value":" " + }, + { + "value":" " + }, + { + "value":"Powerhouse Collection" + }, + { + "value":" Liquid Asset Stickybomb Launcher", + "color":"eb4b4b", + "app_data":{ + "def_index":"15045" + } + }, + { + "value":" Thunderbolt Sniper Rifle", + "color":"eb4b4b", + "app_data":{ + "def_index":"15059" + } + }, + { + "value":" Current Event Scattergun", + "color":"d32ce6", + "app_data":{ + "def_index":"15053" + } + }, + { + "value":" Pink Elephant Stickybomb Launcher", + "color":"d32ce6", + "app_data":{ + "def_index":"15048" + } + }, + { + "value":"✔ Shell Shocker Rocket Launcher", + "color":"d32ce6", + "app_data":{ + "def_index":"15052" + } + }, + { + "value":" Flash Fryer Flame Thrower", + "color":"8847ff", + "app_data":{ + "def_index":"15049" + } + }, + { + "value":" Spark of Life Medi Gun", + "color":"8847ff", + "app_data":{ + "def_index":"15050" + } + }, + { + "value":" Dead Reckoner Revolver", + "color":"8847ff", + "app_data":{ + "def_index":"15051" + } + }, + { + "value":" Black Dahlia Pistol", + "color":"8847ff", + "app_data":{ + "def_index":"15046" + } + }, + { + "value":" Sandstone Special Pistol", + "color":"8847ff", + "app_data":{ + "def_index":"15056" + } + }, + { + "value":" Brick House Minigun", + "color":"4b69ff", + "app_data":{ + "def_index":"15055" + } + }, + { + "value":" Aqua Marine Rocket Launcher", + "color":"4b69ff", + "app_data":{ + "def_index":"15057" + } + }, + { + "value":" Low Profile SMG", + "color":"4b69ff", + "app_data":{ + "def_index":"15058" + } + }, + { + "value":" Turbine Torcher Flame Thrower", + "color":"4b69ff", + "app_data":{ + "def_index":"15054" + } + }, + { + "value":" Lightning Rod Shotgun", + "color":"4b69ff", + "app_data":{ + "def_index":"15047" + } + } + ], + "actions":[ + { + "name":"Item Wiki Page...", + "link":"http:\/\/wiki.teamfortress.com\/scripts\/itemredirect.php?id=15052&lang=en_US" + }, + { + "name":"Inspect in Game...", + "link":"steam:\/\/rungame\/440\/76561202255233023\/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D7998211058114246468" + } + ], + "market_actions":[ + { + "name":"Inspect in Game...", + "link":"steam:\/\/rungame\/440\/76561202255233023\/+tf_econ_item_preview%20M%listingid%A%assetid%D7998211058114246468" + } + ], + "tags":[ + { + "internal_name":"strange", + "name":"Strange", + "category":"Quality", + "color":"CF6A32", + "category_name":"Quality" + }, + { + "internal_name":"primary", + "name":"Primary weapon", + "category":"Type", + "category_name":"Type" + }, + { + "internal_name":"Soldier", + "name":"Soldier", + "category":"Class", + "category_name":"Class" + }, + { + "internal_name":"Rarity_Legendary", + "name":"Assassin", + "category":"Rarity", + "color":"d32ce6", + "category_name":"Grade" + }, + { + "internal_name":"Powerhouse_collection", + "name":"Powerhouse Collection", + "category":"Collection", + "category_name":"Collection" + }, + { + "internal_name":"TFUI_InvTooltip_BattleScared", + "name":"Battle Scarred", + "category":"Exterior", + "category_name":"Exterior" + } + ], + "app_data":{ + "def_index":"15052", + "quality":"11" + } + }, false, true); + + assert.deepEqual(econItem, { + name: 'Rocket Launcher', + fullName: 'Strange Specialized Killstreak Shell Shocker Rocket Launcher (Battle Scarred)', + id: undefined, + img: 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffgYghuZgHPUPUOCacF4w3tG3J86sI7V47mp-JTLQu-vNTGYbh_MNgYHMeFXPHVY139uEk9g_VbK52LqTSvg3pcnpTOhA/', + tradable: true, + craftable: true, + quality: "Strange", + texture: "Shell Shocker", + wear: "Battle Scarred", + killstreak: "Specialized Killstreak", + classes: [ 'Soldier' ], + type: 'primary', + collection: 'Powerhouse Collection', + grade: 'Assassin', + parts: [ 'Pyros Killed' ], + spells: [ 'Pumpkin Bombs' ], + marketable: true, + commodity: false, + "defindex": 205, + sheen: "Mean Green", + level: -1, + }); + }); + + it('Case #12', () => { + const econItem = parseEconItem( + {"appid":"440","classid":"1348131292","instanceid":"93028938","icon_url":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIUwADWBXjvD1Pid3oDvqJGt8Yltsm2pxUyzFu31V9NbPtYTUwdwWbBfkOXfZioFDuWSFku8JnUdLg8ulQLw29tYfCMOQycIYbhNRIXDY","icon_url_large":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIUwADWBXjvD1Pid3oDvqJGt8Yltsm2pxUyzFu31V9NbPtYTUwdwWbBfkOXfZioFDuWSFku8JnUdLg8ulQLw29tYfCMOQycIYbhNRIXDY","icon_drag_url":"","name":"Strange Professional Killstreak Festive Grenade Launcher","market_hash_name":"Strange Professional Killstreak Festive Grenade Launcher","market_name":"Strange Professional Killstreak Festive Grenade Launcher","name_color":"CF6A32","background_color":"3C352E","type":"Limited Strange Grenade Launcher - Kills: 20","tradable":1,"marketable":1,"commodity":0,"market_tradable_restriction":"7","market_marketable_restriction":"0","descriptions":[{"value":"(Airborne Enemy Kills: 4)","color":"756b5e"},{"value":"Halloween: Exorcism (spell only active during event)","color":"7ea9d1"},{"value":"Killstreaker: Hypno-Beam","color":"7ea9d1"},{"value":"Sheen: Manndarin","color":"7ea9d1"},{"value":"Killstreaks Active","color":"7ea9d1"}],"actions":[{"name":"Item Wiki Page...","link":"http:\/\/wiki.teamfortress.com\/scripts\/itemredirect.php?id=1007&lang=en_US"}],"tags":[{"internal_name":"strange","name":"Strange","category":"Quality","color":"CF6A32","category_name":"Quality"},{"internal_name":"primary","name":"Primary weapon","category":"Type","category_name":"Type"},{"internal_name":"Demoman","name":"Demoman","category":"Class","category_name":"Class"}],"app_data":{"def_index":"1007","quality":"11"}}, + true, true + ); + + assert.deepEqual(econItem, { + classes: ["Demoman"], + commodity: false, + craftable: true, + fullName: "Strange Professional Killstreak Festive Grenade Launcher", + id: undefined, + img: "https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIUwADWBXjvD1Pid3oDvqJGt8Yltsm2pxUyzFu31V9NbPtYTUwdwWbBfkOXfZioFDuWSFku8JnUdLg8ulQLw29tYfCMOQycIYbhNRIXDY/", + killstreak: 3, + killstreaker: "Hypno-Beam", + marketable: true, + name: "Festive Grenade Launcher", + parts: [ "Airborne Enemy Kills" ], + quality: 11, + sheen: "Manndarin", + spells: [ "Exorcism" ], + tradable: true, + type: "primary", + defindex: 1007, + level: -1, + }); + }); + + + it('Case #13', () => { + const econItem = parseEconItem({"appid":"440","classid":"11042149","instanceid":"19201223","icon_url":"IzMF03bi9WpSBq-S-ekoE33L-iLqGFHVaU25ZzQNQcXdEH9myp0erksICfTdcfMQEpRnqWSMU5OD2NoHwHEIkChXOjLx2Sk5MbUqMcbBnQz4ruyeU3n5awjJLjLaE0pXEvYaYzGdkW_0p7rBXG6aQb0rFl9XK_QM8jdIb82PaURv3dUMrT27kxUqSU5_IZIXcl_smSJdIbMiwRlwHyU","icon_url_large":"IzMF03bi9WpSBq-S-ekoE33L-iLqGFHVaU25ZzQNQcXdEH9myp0erksICfTdcfMQEpRnqWSMU5OD2NoHwHEIkChXOjLx2Sk5MbUqMcbBnQz4ruyeU3n5awjJLjLaE0pXEvYaYzGdkW_0p7rBXG6aQb0rFl9XK_QM8jdIb82PaURv3dUMrT27kxUqSU5_IZIXcl_smSJdIbMiwRlwHyU","icon_drag_url":"","name":"The Essential Accessories","market_hash_name":"The Essential Accessories","market_name":"The Essential Accessories","name_color":"7D6D00","background_color":"3C352E","type":"Limited Level 10 Apparel","tradable":1,"marketable":1,"commodity":0,"market_tradable_restriction":"7","market_marketable_restriction":"0","descriptions":[{"value":"Paint Color: Operator's Overalls","color":"756b5e"},{"value":""}],"actions":[{"name":"Item Wiki Page...","link":"http:\/\/wiki.teamfortress.com\/scripts\/itemredirect.php?id=347&lang=en_US"},{"name":"Inspect in Game...","link":"steam:\/\/rungame\/440\/76561202255233023\/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D2891326522173157497"}],"market_actions":[{"name":"Inspect in Game...","link":"steam:\/\/rungame\/440\/76561202255233023\/+tf_econ_item_preview%20M%listingid%A%assetid%D2891326522173157497"}],"tags":[{"internal_name":"Unique","name":"Unique","category":"Quality","color":"7D6D00","category_name":"Quality"},{"internal_name":"misc","name":"Cosmetic","category":"Type","category_name":"Type"},{"internal_name":"Scout","name":"Scout","category":"Class","category_name":"Class"}],"app_data":{"def_index":"347","quality":"6"}}, true, true); + + assert.deepEqual(econItem, { + "classes": [ + "Scout" + ], + "commodity": false, + "craftable": true, + "fullName": "The Essential Accessories", + "id": undefined, + "img": "https://steamcommunity-a.akamaihd.net/economy/image/IzMF03bi9WpSBq-S-ekoE33L-iLqGFHVaU25ZzQNQcXdEH9myp0erksICfTdcfMQEpRnqWSMU5OD2NoHwHEIkChXOjLx2Sk5MbUqMcbBnQz4ruyeU3n5awjJLjLaE0pXEvYaYzGdkW_0p7rBXG6aQb0rFl9XK_QM8jdIb82PaURv3dUMrT27kxUqSU5_IZIXcl_smSJdIbMiwRlwHyU/", + "marketable": true, + "name": "The Essential Accessories", + "paint": "Operator's Overalls", + "parts": [], + "quality": 6, + "spells": [], + "tradable": true, + "type": "misc", + "defindex": 347, + level: -1, + }); + }); + + it('Case #14 - bat output', () => { + class MockSchema extends Schema { + getDefindex(input) { + if (input === 'Bat') { + return 0; + } + + return super.getDefindex(input); + } + } + + const format = createFormat(new MockSchema()); + const econItem = format.parseEconItem({ + assetid: "30125", + appid: '440', + classid: '638115890', + instanceid: '0', + icon_url: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIYwkCSQn3uyxKh8bZBvuYN-wBid0wq8hXjW49lVl_NrC2ZjFjJlPHV6FcDPRj8Am1Cn5i6pE3DIfuoOxReV_x9NyRdNFoUKY', + icon_url_large: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIYwkCSQn3uyxKh8bZBvuYN-wBid0wq8hXjW49lVl_NrC2ZjFjJlPHV6FcDPRj8Am1Cn5i6pE3DIfuoOxReV_x9NyRdNFoUKY', + icon_drag_url: '', + name: "Bat Strangifier Chemistry Set Series #2", + market_hash_name: + "Bat Strangifier Chemistry Set Series #2", + market_name: + "Bat Strangifier Chemistry Set Series #2", + name_color: '7D6D00', + background_color: '3C352E', + type: 'Level 5 Recipe', + tradable: 1, + marketable: 1, + commodity: 0, + market_tradable_restriction: '7', + market_marketable_restriction: '0', + descriptions: [ + { + value: + "This item has a set of inputs that, once fulfilled, will\nreward you with what's listed in its outputs.", + }, + { value: ' ' }, + { + value: + 'The following are the inputs that must be fulfilled.', + }, + { value: 'The Vaccinator x 4', color: '8b8989' }, + { value: 'The Blutsauger x 1', color: '8b8989' }, + { value: 'The Disciplinary Action x 1', color: '8b8989' }, + { value: 'The Sandvich x 1', color: '8b8989' }, + { value: 'The Candy Cane x 1', color: '8b8989' }, + { value: 'Strange Scottish Resistance x 1', color: '8b8989' }, + { value: ' ' }, + { + value: + 'You will receive all of the following outputs once all of the inputs are fulfilled.', + }, + { value: "Bat Strangifier", color: '8b8989' }, + { value: ' ' }, + { + value: 'This is a limited use item. Uses: 1', + color: '00a000', + app_data: { limited: 1 }, + }, + ], + actions: [ + { + name: 'Item Wiki Page...', + link: + 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=20005&lang=en_US', + }, + ], + tags: [ + { + internal_name: 'Unique', + name: 'Unique', + category: 'Quality', + color: '7D6D00', + category_name: 'Quality', + }, + { + internal_name: 'TF_ItemDynamicRecipeTool', + name: 'Recipe', + category: 'Type', + category_name: 'Type', + }, + ], + app_data: { quantity: '1', def_index: '20005', quality: '6' }, + }, false, true); + + assert.deepEqual(econItem, { + name: 'Chemistry Set', + fullName: "Bat Strangifier Chemistry Set Series #2", + id: "30125", + img: 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIYwkCSQn3uyxKh8bZBvuYN-wBid0wq8hXjW49lVl_NrC2ZjFjJlPHV6FcDPRj8Am1Cn5i6pE3DIfuoOxReV_x9NyRdNFoUKY/', + tradable: true, + craftable: true, + quality: 'Unique', + target: "Bat", + output: 'Strangifier', + outputQuality: 'Unique', + itemNumber: { type: 'series', value: 2 }, + defindex: 20005, + outputDefindex: 5661, + targetDefindex: 0, + classes: [], + type: 'TF_ItemDynamicRecipeTool', + parts: [], + spells: [], + marketable: true, + commodity: false, + level: 5, + }); + }); + + it('Case #15 - bat target', () => { + class MockSchema extends Schema { + getDefindex(input) { + if (input === 'Bat') { + return 0; + } + + return super.getDefindex(input); + } + } + + const format = createFormat(new MockSchema()); + const econItem = format.parseEconItem( + {"appid":"440","classid":"638769830","instanceid":"11040671","icon_url":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIYwkCSQn3uyxKh8bZBvuYN-wBid0wq8hXjW49lVl_NrC2ZjFjJlPHV6FcDPRj8Am1Cn5i6pE3DIfuoOxReV_x9NyRdNFoUKY","icon_url_large":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIYwkCSQn3uyxKh8bZBvuYN-wBid0wq8hXjW49lVl_NrC2ZjFjJlPHV6FcDPRj8Am1Cn5i6pE3DIfuoOxReV_x9NyRdNFoUKY","icon_drag_url":"","name":"Collector's Bat Chemistry Set","market_hash_name":"Collector's Bat Chemistry Set","market_name":"Collector's Bat Chemistry Set","name_color":"7D6D00","background_color":"3C352E","type":"Level 5 Recipe","tradable":1,"marketable":1,"commodity":0,"market_tradable_restriction":"7","market_marketable_restriction":"0","descriptions":[{"value":"This item has a set of inputs that, once fulfilled, will\nreward you with what's listed in its outputs."},{"value":" "},{"value":"The following are the inputs that must be fulfilled."},{"value":"Festive Black Box x 198","color":"8b8989"},{"value":" "},{"value":"You will receive all of the following outputs once all of the inputs are fulfilled."},{"value":"Collector's Festive Black Box","color":"8b8989"},{"value":" "},{"value":"This is a limited use item. Uses: 1","color":"00a000","app_data":{"limited":1}}],"actions":[{"name":"Item Wiki Page...","link":"http:\/\/wiki.teamfortress.com\/scripts\/itemredirect.php?id=20007&lang=en_US"}],"tags":[{"internal_name":"Unique","name":"Unique","category":"Quality","color":"7D6D00","category_name":"Quality"},{"internal_name":"TF_ItemDynamicRecipeTool","name":"Recipe","category":"Type","category_name":"Type"}],"app_data":{"quantity":"1","def_index":"20007","quality":"6"}}, + false, true + ); + + assert.deepEqual(econItem, { + name: 'Chemistry Set', + fullName: "Collector's Bat Chemistry Set", + img: 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIYwkCSQn3uyxKh8bZBvuYN-wBid0wq8hXjW49lVl_NrC2ZjFjJlPHV6FcDPRj8Am1Cn5i6pE3DIfuoOxReV_x9NyRdNFoUKY/', + id: undefined, + tradable: true, + craftable: true, + quality: 'Unique', + output: 'Bat', + outputQuality: 'Collector\'s', + defindex: 20005, + outputDefindex: 0, + classes: [], + type: 'TF_ItemDynamicRecipeTool', + parts: [], + spells: [], + marketable: true, + commodity: false, + level: 5, + }); + }); + + it('Case #16 - bat', () => { + class MockSchema extends Schema { + getDefindex() { + return 0; + } + } + + const format = createFormat(new MockSchema()); + const econItem = format.parseEconItem({"appid":"440","classid":"171635229","instanceid":"0","icon_url":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIUwUQSSTuuSpEjYbiXaHaCuVSyI9l4MQCjjJvk1IrYbTjMmM2cFyRAPYICqI5pFruWX8wptdtU1jiacVz","icon_url_large":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIUwUQSSTuuSpEjYbiXaHaCuVSyI9l4MQCjjJvk1IrYbTjMmM2cFyRAPYICqI5pFruWX8wptdtU1jiacVz","icon_drag_url":"","name":"Bat","market_hash_name":"Bat","market_name":"Bat","name_color":"7D6D00","background_color":"3C352E","type":"Level 1 Bat","tradable":1,"marketable":0,"commodity":0,"market_tradable_restriction":"7","market_marketable_restriction":"0","descriptions":[{"value":"''lol''"}],"actions":[{"name":"Item Wiki Page...","link":"http:\/\/wiki.teamfortress.com\/scripts\/itemredirect.php?id=190&lang=en_US"}],"tags":[{"internal_name":"Unique","name":"Unique","category":"Quality","color":"7D6D00","category_name":"Quality"},{"internal_name":"melee","name":"Melee weapon","category":"Type","category_name":"Type"},{"internal_name":"Scout","name":"Scout","category":"Class","category_name":"Class"}],"app_data":{"def_index":"0","quality":"6"}}, false, true); + + assert.deepEqual(econItem, { + name: 'Bat', + fullName: "Bat", + defindex: 0, + img: 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIUwUQSSTuuSpEjYbiXaHaCuVSyI9l4MQCjjJvk1IrYbTjMmM2cFyRAPYICqI5pFruWX8wptdtU1jiacVz/', + id: undefined, + tradable: true, + craftable: true, + quality: 'Unique', + classes: [], + type: 'melee', + parts: [], + spells: [], + marketable: false, + commodity: false, + level: 1, + classes: ['Scout'] + }); + }) +}); + +describe('Econ item with true defindex', () => { + it('Case #1 - skin', () => { + const econItem = parseEconItem( + { + appid: 440, + contextid: '2', + assetid: '8656785508', + classid: '3543846179', + instanceid: '3516082756', + amount: '1', + currency: 0, + background_color: '3C352E', + icon_url: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffjDz5zdwmTVPAOCsot8Qn-Whg07dR3XcGzuehWe1q65oHFOuQpN4kZGpOECffQZl39vho_1KdefJbbonvq3SvubmwUG028UzYUYzA', + icon_url_large: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffjDz5zdwmTVPAOCsot8Qn-Whg07dR3XcGzuehWe1q65oHFOuQpN4kZGpOECffQZl39vho_1KdefJbbonvq3SvubmwUG028UzYUYzA', + descriptions: [ + { + value: 'Commando Grade Rocket Launcher (Field-Tested)', + color: '8847ff', + }, + { value: 'Festivized', color: 'ffd700' }, + { + value: + 'Halloween: Pumpkin Bombs (spell only active during event)', + color: '7ea9d1', + }, + { value: 'Sheen: Agonizing Emerald', color: '7ea9d1' }, + { value: 'Killstreaks Active', color: '7ea9d1' }, + { + value: '\nGift from: VLaDOS | S>C.MOON YELLOW BELT', + color: '7ea9d1', + }, + { + value: + 'Date Received: Tuesday, September 10, 2019 (9:36:39) GMT', + }, + { value: ' ' }, + { value: ' ' }, + { value: 'Concealed Killer Collection' }, + { + value: ' Sand Cannon Rocket Launcher', + color: 'eb4b4b', + }, + { value: ' Red Rock Roscoe Pistol', color: 'eb4b4b' }, + { + value: ' Psychedelic Slugger Revolver', + color: 'd32ce6', + }, + { value: ' Purple Range Sniper Rifle', color: 'd32ce6' }, + { + value: ' Sudden Flurry Stickybomb Launcher', + color: 'd32ce6', + }, + { value: ' Night Terror Scattergun', color: '8847ff' }, + { + value: ' Carpet Bomber Stickybomb Launcher', + color: '8847ff', + }, + { + value: '✔ Woodland Warrior Rocket Launcher', + color: '8847ff', + }, + { value: ' Wrapped Reviver Medi Gun', color: '8847ff' }, + { value: ' Night Owl Sniper Rifle', color: '4b69ff' }, + { value: ' Woodsy Widowmaker SMG', color: '4b69ff' }, + { + value: ' Backwoods Boomstick Shotgun', + color: '4b69ff', + }, + { + value: ' King of the Jungle Minigun', + color: '4b69ff', + }, + { value: ' Masked Mender Medi Gun', color: '4b69ff' }, + { value: ' Forest Fire Flame Thrower', color: '4b69ff' }, + ], + tradable: 1, + actions: [ + { + link: + 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=15006&lang=en_US', + name: 'Item Wiki Page...', + }, + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D11534198800805877074', + name: 'Inspect in Game...', + }, + ], + fraudwarnings: [ + 'This item has been renamed.\nOriginal name: "Rocket Launcher"', + ], + name: "''post live spell rocket louncher !!!!!!!''", + name_color: 'FAFAFA', + type: '', + market_name: + 'Festivized Specialized Killstreak Woodland Warrior Rocket Launcher (Field-Tested)', + market_hash_name: + 'Festivized Specialized Killstreak Woodland Warrior Rocket Launcher (Field-Tested)', + market_actions: [ + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D11534198800805877074', + name: 'Inspect in Game...', + }, + ], + commodity: 0, + market_tradable_restriction: 7, + market_marketable_restriction: 0, + marketable: 1, + tags: [ + { + category: 'Quality', + internal_name: 'paintkitweapon', + localized_category_name: 'Quality', + localized_tag_name: 'Decorated Weapon', + color: 'FAFAFA', + }, + { + category: 'Type', + internal_name: 'primary', + localized_category_name: 'Type', + localized_tag_name: 'Primary weapon', + }, + { + category: 'Class', + internal_name: 'Soldier', + localized_category_name: 'Class', + localized_tag_name: 'Soldier', + }, + { + category: 'Rarity', + internal_name: 'Rarity_Mythical', + localized_category_name: 'Grade', + localized_tag_name: 'Commando', + color: '8847ff', + }, + { + category: 'Collection', + internal_name: 'concealedkiller_collection', + localized_category_name: 'Collection', + localized_tag_name: 'Concealed Killer Collection', + }, + { + category: 'Exterior', + internal_name: 'TFUI_InvTooltip_FieldTested', + localized_category_name: 'Exterior', + localized_tag_name: 'Field-Tested', + }, + ], + }, + false, true, { useTrueDefindex: true } + ); + + assert.deepEqual(econItem, { + name: 'Rocket Launcher', + fullName: + 'Festivized Specialized Killstreak Woodland Warrior Rocket Launcher (Field-Tested)', + id: '8656785508', + img: + 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffjDz5zdwmTVPAOCsot8Qn-Whg07dR3XcGzuehWe1q65oHFOuQpN4kZGpOECffQZl39vho_1KdefJbbonvq3SvubmwUG028UzYUYzA/', + tradable: true, + craftable: true, + quality: 'Decorated Weapon', + texture: 'Woodland Warrior', + wear: 'Field-Tested', + defindex: 15006, + festivized: true, + killstreak: 'Specialized Killstreak', + classes: ['Soldier'], + type: 'primary', + collection: 'Concealed Killer Collection', + grade: 'Commando', + parts: [], + spells: ['Pumpkin Bombs'], + marketable: true, + commodity: false, + sheen: "Agonizing Emerald", + level: -1, + }); + }); + + it('Case #2 - skin', () => { + const econItem = parseEconItem({ + "appid":"440", + "classid":"2625497429", + "instanceid":"4048537137", + "icon_url":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffgYghuZgHPUPUOCacF4w3tG3J86sI7V47mp-JTLQu-vNTGYbh_MNgYHMeFXPHVY139uEk9g_VbK52LqTSvg3pcnpTOhA", + "icon_url_large":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffgYghuZgHPUPUOCacF4w3tG3J86sI7V47mp-JTLQu-vNTGYbh_MNgYHMeFXPHVY139uEk9g_VbK52LqTSvg3pcnpTOhA", + "icon_drag_url":"", + "name":"Shell Shocker Rocket Launcher", + "market_hash_name":"Strange Specialized Killstreak Shell Shocker Rocket Launcher (Battle Scarred)", + "market_name":"Strange Specialized Killstreak Shell Shocker Rocket Launcher (Battle Scarred)", + "name_color":"CF6A32", + "background_color":"3C352E", + "type":"", + "tradable":1, + "marketable":1, + "commodity":0, + "market_tradable_restriction":"7", + "market_marketable_restriction":"0", + "descriptions":[ + { + "value":"Assassin Grade Rocket Launcher (Battle Scarred)", + "color":"d32ce6" + }, + { + "value":"Strange Stat Clock Attached", + "color":"CF6A32" + }, + { + "value":" Kills: 5121", + "color":"756b5e" + }, + { + "value":" Pyros Killed: 712", + "color":"756b5e" + }, + { + "value":"Team Colored Decorated Weapon" + }, + { + "value":"Halloween: Pumpkin Bombs (spell only active during event)", + "color":"7ea9d1" + }, + { + "value":"Sheen: Mean Green", + "color":"7ea9d1" + }, + { + "value":"Killstreaks Active", + "color":"7ea9d1" + }, + { + "value":" " + }, + { + "value":" " + }, + { + "value":"Powerhouse Collection" + }, + { + "value":" Liquid Asset Stickybomb Launcher", + "color":"eb4b4b", + "app_data":{ + "def_index":"15045" + } + }, + { + "value":" Thunderbolt Sniper Rifle", + "color":"eb4b4b", + "app_data":{ + "def_index":"15059" + } + }, + { + "value":" Current Event Scattergun", + "color":"d32ce6", + "app_data":{ + "def_index":"15053" + } + }, + { + "value":" Pink Elephant Stickybomb Launcher", + "color":"d32ce6", + "app_data":{ + "def_index":"15048" + } + }, + { + "value":"✔ Shell Shocker Rocket Launcher", + "color":"d32ce6", + "app_data":{ + "def_index":"15052" + } + }, + { + "value":" Flash Fryer Flame Thrower", + "color":"8847ff", + "app_data":{ + "def_index":"15049" + } + }, + { + "value":" Spark of Life Medi Gun", + "color":"8847ff", + "app_data":{ + "def_index":"15050" + } + }, + { + "value":" Dead Reckoner Revolver", + "color":"8847ff", + "app_data":{ + "def_index":"15051" + } + }, + { + "value":" Black Dahlia Pistol", + "color":"8847ff", + "app_data":{ + "def_index":"15046" + } + }, + { + "value":" Sandstone Special Pistol", + "color":"8847ff", + "app_data":{ + "def_index":"15056" + } + }, + { + "value":" Brick House Minigun", + "color":"4b69ff", + "app_data":{ + "def_index":"15055" + } + }, + { + "value":" Aqua Marine Rocket Launcher", + "color":"4b69ff", + "app_data":{ + "def_index":"15057" + } + }, + { + "value":" Low Profile SMG", + "color":"4b69ff", + "app_data":{ + "def_index":"15058" + } + }, + { + "value":" Turbine Torcher Flame Thrower", + "color":"4b69ff", + "app_data":{ + "def_index":"15054" + } + }, + { + "value":" Lightning Rod Shotgun", + "color":"4b69ff", + "app_data":{ + "def_index":"15047" + } + } + ], + "actions":[ + { + "name":"Item Wiki Page...", + "link":"http:\/\/wiki.teamfortress.com\/scripts\/itemredirect.php?id=15052&lang=en_US" + }, + { + "name":"Inspect in Game...", + "link":"steam:\/\/rungame\/440\/76561202255233023\/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D7998211058114246468" + } + ], + "market_actions":[ + { + "name":"Inspect in Game...", + "link":"steam:\/\/rungame\/440\/76561202255233023\/+tf_econ_item_preview%20M%listingid%A%assetid%D7998211058114246468" + } + ], + "tags":[ + { + "internal_name":"strange", + "name":"Strange", + "category":"Quality", + "color":"CF6A32", + "category_name":"Quality" + }, + { + "internal_name":"primary", + "name":"Primary weapon", + "category":"Type", + "category_name":"Type" + }, + { + "internal_name":"Soldier", + "name":"Soldier", + "category":"Class", + "category_name":"Class" + }, + { + "internal_name":"Rarity_Legendary", + "name":"Assassin", + "category":"Rarity", + "color":"d32ce6", + "category_name":"Grade" + }, + { + "internal_name":"Powerhouse_collection", + "name":"Powerhouse Collection", + "category":"Collection", + "category_name":"Collection" + }, + { + "internal_name":"TFUI_InvTooltip_BattleScared", + "name":"Battle Scarred", + "category":"Exterior", + "category_name":"Exterior" + } + ], + "app_data":{ + "def_index":"15052", + "quality":"11" + } + }, false, true, { useTrueDefindex: true }); + + assert.deepEqual(econItem, { + name: 'Rocket Launcher', + fullName: 'Strange Specialized Killstreak Shell Shocker Rocket Launcher (Battle Scarred)', + id: undefined, + img: 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffgYghuZgHPUPUOCacF4w3tG3J86sI7V47mp-JTLQu-vNTGYbh_MNgYHMeFXPHVY139uEk9g_VbK52LqTSvg3pcnpTOhA/', + tradable: true, + craftable: true, + quality: "Strange", + texture: "Shell Shocker", + wear: "Battle Scarred", + killstreak: "Specialized Killstreak", + classes: [ 'Soldier' ], + type: 'primary', + collection: 'Powerhouse Collection', + grade: 'Assassin', + parts: [ 'Pyros Killed' ], + spells: [ 'Pumpkin Bombs' ], + marketable: true, + commodity: false, + "defindex": 15052, + sheen: "Mean Green", + level: -1, + }); + }); + + it('Case #3 - bad wiki link', () => { + const econItem = parseEconItem({ + appid: 440, + contextid: '2', + assetid: '8407830034', + classid: '3662018019', + instanceid: '11040671', + amount: '1', + currency: 0, + background_color: '3C352E', + icon_url: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffsDz5zdwmTVPAOCcot8Qn-Wxg07dR3XcGzub5ffwvmttSXYrAlY9xFTMaCUvbXNQz_6EkwiPRYKJaIon-9jHjrOWoUG0280KDki-w', + icon_url_large: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffsDz5zdwmTVPAOCcot8Qn-Wxg07dR3XcGzub5ffwvmttSXYrAlY9xFTMaCUvbXNQz_6EkwiPRYKJaIon-9jHjrOWoUG0280KDki-w', + descriptions: [ + { + value: 'Mercenary Grade Flame Thrower (Minimal Wear)', + color: '4b69ff', + }, + { value: '★ Unusual Effect: Cool', color: 'ffd700' }, + { value: 'Festivized', color: 'ffd700' }, + { + value: 'Extinguishing teammates restores 20 health', + color: '7ea9d1', + }, + { value: 'Sheen: Agonizing Emerald', color: '7ea9d1' }, + { value: 'Killstreaks Active', color: '7ea9d1' }, + { + value: + 'Afterburn reduces Medi Gun healing and resist shield effects.\nAlt-Fire: Release a blast of air that pushes enemies and projectiles and extinguishes teammates that are on fire.', + }, + { value: ' ' }, + { value: ' ' }, + { value: 'Concealed Killer Collection' }, + { value: ' Sand Cannon Rocket Launcher', color: 'eb4b4b' }, + { value: ' Red Rock Roscoe Pistol', color: 'eb4b4b' }, + { value: ' Psychedelic Slugger Revolver', color: 'd32ce6' }, + { value: ' Purple Range Sniper Rifle', color: 'd32ce6' }, + { + value: ' Sudden Flurry Stickybomb Launcher', + color: 'd32ce6', + }, + { value: ' Night Terror Scattergun', color: '8847ff' }, + { + value: ' Carpet Bomber Stickybomb Launcher', + color: '8847ff', + }, + { + value: ' Woodland Warrior Rocket Launcher', + color: '8847ff', + }, + { value: ' Wrapped Reviver Medi Gun', color: '8847ff' }, + { value: ' Night Owl Sniper Rifle', color: '4b69ff' }, + { value: ' Woodsy Widowmaker SMG', color: '4b69ff' }, + { value: ' Backwoods Boomstick Shotgun', color: '4b69ff' }, + { value: ' King of the Jungle Minigun', color: '4b69ff' }, + { value: ' Masked Mender Medi Gun', color: '4b69ff' }, + { value: '★ Forest Fire Flame Thrower', color: '4b69ff' }, + ], + tradable: 1, + actions: [ + { + link: + 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=15005&lang=en_US', + name: 'Item Wiki Page...', + }, + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D6922402693932635553', + name: 'Inspect in Game...', + }, + ], + name: 'Festivized Forest Fire Flame Thrower', + name_color: '8650AC', + type: '', + market_name: + 'Unusual Festivized Specialized Killstreak Forest Fire Flame Thrower (Minimal Wear)', + market_hash_name: + 'Unusual Festivized Specialized Killstreak Forest Fire Flame Thrower (Minimal Wear)', + market_actions: [ + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D6922402693932635553', + name: 'Inspect in Game...', + }, + ], + commodity: 0, + market_tradable_restriction: 7, + market_marketable_restriction: 0, + marketable: 1, + tags: [ + { + category: 'Quality', + internal_name: 'rarity4', + localized_category_name: 'Quality', + localized_tag_name: 'Unusual', + color: '8650AC', + }, + { + category: 'Type', + internal_name: 'primary', + localized_category_name: 'Type', + localized_tag_name: 'Primary weapon', + }, + { + category: 'Class', + internal_name: 'Pyro', + localized_category_name: 'Class', + localized_tag_name: 'Pyro', + }, + { + category: 'Rarity', + internal_name: 'Rarity_Rare', + localized_category_name: 'Grade', + localized_tag_name: 'Mercenary', + color: '4b69ff', + }, + { + category: 'Collection', + internal_name: 'concealedkiller_collection', + localized_category_name: 'Collection', + localized_tag_name: 'Concealed Killer Collection', + }, + { + category: 'Exterior', + internal_name: 'TFUI_InvTooltip_MinimalWear', + localized_category_name: 'Exterior', + localized_tag_name: 'Minimal Wear', + }, + ], + }, true, true, { useTrueDefindex: true }); + + assert.deepEqual(econItem, { + name: 'Flame Thrower', + fullName: + 'Cool Festivized Specialized Killstreak Forest Fire Flame Thrower (Minimal Wear)', + id: '8407830034', + img: + 'https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffsDz5zdwmTVPAOCcot8Qn-Wxg07dR3XcGzub5ffwvmttSXYrAlY9xFTMaCUvbXNQz_6EkwiPRYKJaIon-9jHjrOWoUG0280KDki-w/', + tradable: true, + craftable: true, + quality: 5, + texture: 9, + wear: 2, + killstreak: 2, + festivized: true, + effect: 703, + classes: ['Pyro'], + type: 'primary', + collection: 'Concealed Killer Collection', + grade: 'Mercenary', + parts: [], + spells: [], + marketable: true, + commodity: false, + sheen: "Agonizing Emerald", + level: -1, + defindex: 15005 + }); + }) +}); diff --git a/test/fixName.js b/test/fixName.js index 054598c..5f5e663 100644 --- a/test/fixName.js +++ b/test/fixName.js @@ -1,35 +1,35 @@ -const { assert } = require('chai'); - -const { fixName } = require('../dist/static') - -describe('fixName', () => { - it('Case #1', () => { - assert.equal(fixName('Strange Australium Festivized Professional Killstreak Scattergun'), 'Strange Festivized Professional Killstreak Australium Scattergun'); - }) - - it('Case #2', () => { - assert.equal(fixName('Omniscient Orb Strange Balloonihoodie'), 'Strange Omniscient Orb Balloonihoodie'); - }) -}); - -describe('fixName compability', () => { - it('Case #1', () => { - assert.equal(fixName('Collector\'s Battalion\'s Backup Chemistry Set'), 'Collector\'s Battalion\'s Backup Chemistry Set'); - }) - - it('Case #2', () => { - assert.equal(fixName('Strange Festivized Professional Killstreak Australium Scattergun'), 'Strange Festivized Professional Killstreak Australium Scattergun'); - }) - - it('Case #3', () => { - assert.equal(fixName('Strange Omniscient Orb Balloonihoodie'), 'Strange Omniscient Orb Balloonihoodie'); - }) - - it('Case #4', () => { - assert.equal(fixName('Hat #25'), 'Hat #25'); - }) - - it('Case #5', () => { - assert.equal(fixName('Strange Unique Sniper Rifle'), 'Strange Unique Sniper Rifle'); - }) -}) +const { assert } = require('chai'); + +const { fixName } = require('../dist/static') + +describe('fixName', () => { + it('Case #1', () => { + assert.equal(fixName('Strange Australium Festivized Professional Killstreak Scattergun'), 'Strange Festivized Professional Killstreak Australium Scattergun'); + }) + + it('Case #2', () => { + assert.equal(fixName('Omniscient Orb Strange Balloonihoodie'), 'Strange Omniscient Orb Balloonihoodie'); + }) +}); + +describe('fixName compability', () => { + it('Case #1', () => { + assert.equal(fixName('Collector\'s Battalion\'s Backup Chemistry Set'), 'Collector\'s Battalion\'s Backup Chemistry Set'); + }) + + it('Case #2', () => { + assert.equal(fixName('Strange Festivized Professional Killstreak Australium Scattergun'), 'Strange Festivized Professional Killstreak Australium Scattergun'); + }) + + it('Case #3', () => { + assert.equal(fixName('Strange Omniscient Orb Balloonihoodie'), 'Strange Omniscient Orb Balloonihoodie'); + }) + + it('Case #4', () => { + assert.equal(fixName('Hat #25'), 'Hat #25'); + }) + + it('Case #5', () => { + assert.equal(fixName('Strange Unique Sniper Rifle'), 'Strange Unique Sniper Rifle'); + }) +}) diff --git a/test/interchange.js b/test/interchange.js index b52e007..e0b1a44 100644 --- a/test/interchange.js +++ b/test/interchange.js @@ -1,1600 +1,1610 @@ -/** - * Testing how formats - * seemlessly transfer between each other. - * @todo add type test with typescript for this one. - */ -const { assert } = require('chai'); - -const { parseEconItem, parseSKU, parseString, toSKU, stringify, createBPListing } = require('../dist/static'); - -/** - * StartFormat - EconItem - * Endformat - Listing - * StartEndFormat - Attributes, Name, SKU - */ - -describe('Name to SKU', () => { - it('Case #1', () => { - const name = 'Non-Craftable Unusual Taunt: The Trackman\'s Touchdown Unusualifier'; - - const attributes = parseString(name, true, true); - - const sku = toSKU(attributes); - - assert.equal(sku, '9258;5;uncraftable;td-30917'); - }); - - it('Case #2', () => { - const name = 'Pyroland Nightmare Calamitous Cauldron'; - - const attributes = parseString(name, true, true); - - const sku = toSKU(attributes); - - assert.equal(sku, '31146;5;u159'); - }); - - it('Case #3', () => { - const name = 'Strange Professional Killstreak Golden Frying Pan'; - - const attributes = parseString(name, true, true); - - const sku = toSKU(attributes); - - assert.equal(sku, '1071;11;kt-3'); - }); - - it('Case #4', () => { - const name = 'Non-Craftable Professional Killstreak Sniper Rifle Kit'; - - const attributes = parseString(name, true, true); - - const sku = toSKU(attributes); - - assert.equal(sku, '6526;6;uncraftable;kt-3;td-201'); - }); - - it('Case #5', () => { - const name = 'Strange Professional Killstreak Festivized Australium Medi Gun'; - - const attributes = parseString(name, true, true); - - const sku = toSKU(attributes); - - assert.equal(sku, '211;11;australium;kt-3;festive'); - }); - - it('Case #6', () => { - const name = 'Strange Professional Killstreak Australium Medi Gun'; - - const attributes = parseString(name, true, true); - - const sku = toSKU(attributes); - - assert.equal(sku, '211;11;australium;kt-3'); - }); - - it('Case #7', () => { - const name = 'Professional Killstreak Strange Silver Botkiller Sniper Rifle Mk.I'; - - const attributes = parseString(name, true, true); - - const sku = toSKU(attributes); - - assert.equal(sku, '792;11;kt-3'); - }) - - /* Chemistry sets currently don't work. - it('Case #7', () => { - const name = 'Original Chemistry Set'; - - const attributes = parseString(name, true, true); - - const sku = toSKU(attributes); - - assert.equal(sku, '20006;6;od-513;oq-14'); - }); - - it('Case #8', () => { - const name = 'Outback Intellectual Strangifier Chemistry Set'; - - const attributes = parseString(name, true, true); - - const sku = toSKU(attributes); - - assert.equal(sku, '20005;6;td-645;od-6522;oq-6'); - }); - */ -}); - -describe('Econ to SKU', () => { - it('Case #1', () => { - const econ = { - appid: 440, - contextid: '2', - assetid: '8733746813', - classid: '221512872', - instanceid: '92637229', - amount: '1', - currency: 0, - background_color: '3C352E', - icon_url: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEDe1VBDEjdqCEX2PfnGOaDBeEUlNQK6ZFH3jMlwwB_Y7vhZ2Q0JFKQAKQJXadrpF6-UXE268I3UNHg8esHfF28tdHHO65sbo88eQy8bA', - icon_url_large: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEDe1VBDEjdqCEX2PfnGOaDBeEUlNQK6ZFH3jMlwwB_Y7vhZ2Q0JFKQAKQJXadrpF6-UXE268I3UNHg8esHfF28tdHHO65sbo88eQy8bA', - descriptions: [ - { - value: 'Holiday Restriction: Halloween / Full Moon', - color: 'd83636', - }, - { - value: - 'Halloween: Spectral Spectrum (spell only active during event)', - color: '7ea9d1', - }, - { value: '' }, - ], - tradable: 1, - actions: [ - { - link: - 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=30290&lang=en_US', - name: 'Item Wiki Page...', - }, - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D16238051287194648628', - name: 'Inspect in Game...', - }, - ], - name: 'Haunted PY-40 Incinibot', - name_color: '38f3ab', - type: 'Level 58 Mask', - market_name: 'Haunted PY-40 Incinibot', - market_hash_name: 'Haunted PY-40 Incinibot', - market_actions: [ - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D16238051287194648628', - name: 'Inspect in Game...', - }, - ], - commodity: 0, - market_tradable_restriction: 7, - market_marketable_restriction: 0, - marketable: 1, - tags: [ - { - category: 'Quality', - internal_name: 'haunted', - localized_category_name: 'Quality', - localized_tag_name: 'Haunted', - color: '38f3ab', - }, - { - category: 'Type', - internal_name: 'misc', - localized_category_name: 'Type', - localized_tag_name: 'Cosmetic', - }, - { - category: 'Class', - internal_name: 'Pyro', - localized_category_name: 'Class', - localized_tag_name: 'Pyro', - }, - ], - }; - - const attributes = parseEconItem(econ, true, true); - - const sku = toSKU(attributes); - - assert.equal(sku, '30290;13'); - }) - - it('Case #2', () => { - const econ = { - appid: 440, - contextid: '2', - assetid: '8610658018', - classid: '171010366', - instanceid: '176498576', - amount: '1', - currency: 0, - background_color: '3C352E', - icon_url: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEbfgYfXh7wqwdTmsHiCM2ACfIHnpRh5MkG3G8zyVMpYebiYm8wdFGTBPILC_BvrQu9X3RqupQ6AYPhp-wHZ0yx43BgcxIX', - icon_url_large: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEbfgYfXh7wqwdTmsHiCM2ACfIHnpRh5MkG3G8zyVMpYebiYm8wdFGTBPILC_BvrQu9X3RqupQ6AYPhp-wHZ0yx43BgcxIX', - descriptions: [ - { value: '★ Unusual Effect: Smoking', color: 'ffd700' }, - ], - tradable: 1, - actions: [ - { - link: - 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=318&lang=en_US', - name: 'Item Wiki Page...', - }, - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D10290164463146604828', - name: 'Inspect in Game...', - }, - ], - name: "Unusual Prancer's Pride", - name_color: '8650AC', - type: 'Level 88 Hat', - market_name: "Unusual Prancer's Pride", - market_hash_name: "Unusual Prancer's Pride", - market_actions: [ - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D10290164463146604828', - name: 'Inspect in Game...', - }, - ], - commodity: 0, - market_tradable_restriction: 7, - market_marketable_restriction: 0, - marketable: 1, - tags: [ - { - category: 'Quality', - internal_name: 'rarity4', - localized_category_name: 'Quality', - localized_tag_name: 'Unusual', - color: '8650AC', - }, - { - category: 'Type', - internal_name: 'misc', - localized_category_name: 'Type', - localized_tag_name: 'Cosmetic', - }, - { - category: 'Class', - internal_name: 'Pyro', - localized_category_name: 'Class', - localized_tag_name: 'Pyro', - }, - ], - }; - - const attributes = parseEconItem(econ, true, true); - - const sku = toSKU(attributes); - - assert.equal(sku, '318;5;u35'); - }); - - it('Case #3', () => { - const econ = { - appid: 440, - contextid: '2', - assetid: '8407830034', - classid: '3662018019', - instanceid: '11040671', - amount: '1', - currency: 0, - background_color: '3C352E', - icon_url: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffsDz5zdwmTVPAOCcot8Qn-Wxg07dR3XcGzub5ffwvmttSXYrAlY9xFTMaCUvbXNQz_6EkwiPRYKJaIon-9jHjrOWoUG0280KDki-w', - icon_url_large: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffsDz5zdwmTVPAOCcot8Qn-Wxg07dR3XcGzub5ffwvmttSXYrAlY9xFTMaCUvbXNQz_6EkwiPRYKJaIon-9jHjrOWoUG0280KDki-w', - descriptions: [ - { - value: 'Mercenary Grade Flame Thrower (Minimal Wear)', - color: '4b69ff', - }, - { value: '★ Unusual Effect: Cool', color: 'ffd700' }, - { value: 'Festivized', color: 'ffd700' }, - { - value: 'Extinguishing teammates restores 20 health', - color: '7ea9d1', - }, - { value: 'Sheen: Agonizing Emerald', color: '7ea9d1' }, - { value: 'Killstreaks Active', color: '7ea9d1' }, - { - value: - 'Afterburn reduces Medi Gun healing and resist shield effects.\nAlt-Fire: Release a blast of air that pushes enemies and projectiles and extinguishes teammates that are on fire.', - }, - { value: ' ' }, - { value: ' ' }, - { value: 'Concealed Killer Collection' }, - { value: ' Sand Cannon Rocket Launcher', color: 'eb4b4b' }, - { value: ' Red Rock Roscoe Pistol', color: 'eb4b4b' }, - { value: ' Psychedelic Slugger Revolver', color: 'd32ce6' }, - { value: ' Purple Range Sniper Rifle', color: 'd32ce6' }, - { - value: ' Sudden Flurry Stickybomb Launcher', - color: 'd32ce6', - }, - { value: ' Night Terror Scattergun', color: '8847ff' }, - { - value: ' Carpet Bomber Stickybomb Launcher', - color: '8847ff', - }, - { - value: ' Woodland Warrior Rocket Launcher', - color: '8847ff', - }, - { value: ' Wrapped Reviver Medi Gun', color: '8847ff' }, - { value: ' Night Owl Sniper Rifle', color: '4b69ff' }, - { value: ' Woodsy Widowmaker SMG', color: '4b69ff' }, - { value: ' Backwoods Boomstick Shotgun', color: '4b69ff' }, - { value: ' King of the Jungle Minigun', color: '4b69ff' }, - { value: ' Masked Mender Medi Gun', color: '4b69ff' }, - { value: '★ Forest Fire Flame Thrower', color: '4b69ff' }, - ], - tradable: 1, - actions: [ - { - link: - 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=15005&lang=en_US', - name: 'Item Wiki Page...', - }, - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D6922402693932635553', - name: 'Inspect in Game...', - }, - ], - name: 'Festivized Forest Fire Flame Thrower', - name_color: '8650AC', - type: '', - market_name: - 'Unusual Festivized Specialized Killstreak Forest Fire Flame Thrower (Minimal Wear)', - market_hash_name: - 'Unusual Festivized Specialized Killstreak Forest Fire Flame Thrower (Minimal Wear)', - market_actions: [ - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D6922402693932635553', - name: 'Inspect in Game...', - }, - ], - commodity: 0, - market_tradable_restriction: 7, - market_marketable_restriction: 0, - marketable: 1, - tags: [ - { - category: 'Quality', - internal_name: 'rarity4', - localized_category_name: 'Quality', - localized_tag_name: 'Unusual', - color: '8650AC', - }, - { - category: 'Type', - internal_name: 'primary', - localized_category_name: 'Type', - localized_tag_name: 'Primary weapon', - }, - { - category: 'Class', - internal_name: 'Pyro', - localized_category_name: 'Class', - localized_tag_name: 'Pyro', - }, - { - category: 'Rarity', - internal_name: 'Rarity_Rare', - localized_category_name: 'Grade', - localized_tag_name: 'Mercenary', - color: '4b69ff', - }, - { - category: 'Collection', - internal_name: 'concealedkiller_collection', - localized_category_name: 'Collection', - localized_tag_name: 'Concealed Killer Collection', - }, - { - category: 'Exterior', - internal_name: 'TFUI_InvTooltip_MinimalWear', - localized_category_name: 'Exterior', - localized_tag_name: 'Minimal Wear', - }, - ], - }; - - const attributes = parseEconItem(econ, true, true); - - const sku = toSKU(attributes); - - assert.equal(sku, '208;5;u703;w2;pk9;kt-2;festive'); - }) - - it('Case #4', () => { - const econ = { - appid: 440, - contextid: '2', - assetid: '8574678947', - classid: '3555490789', - instanceid: '856289751', - amount: '1', - currency: 0, - background_color: '3C352E', - icon_url: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEDewlDDUq7hytIncTqD-CJGu8_l9sn4pUbi2Ftw1ApbbXtNmM_cVTEV_lbWaw7pQu0W3Rr6sVlAdPvoOhScFnt4pyGbefmPm6lTg', - icon_url_large: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEDewlDDUq7hytIncTqD-CJGu8_l9sn4pUbi2Ftw1ApbbXtNmM_cVTEV_lbWaw7pQu0W3Rr6sVlAdPvoOhScFnt4pyGbefmPm6lTg', - descriptions: [ - { value: 'Commando Grade Hat', color: '8847ff' }, - { - value: '★ Unusual Effect: Twisted Radiance', - color: 'ffd700', - }, - { value: ' ' }, - { value: ' ' }, - { value: 'Spooky Spoils Collection' }, - { value: ' Mister Bones', color: 'eb4b4b' }, - { value: " Pyr'o Lantern", color: 'eb4b4b' }, - { value: ' Racc Mann', color: 'd32ce6' }, - { value: ' Head of the Dead', color: 'd32ce6' }, - { value: ' Elizabeth the Third', color: 'd32ce6' }, - { value: ' The Trick Stabber', color: 'd32ce6' }, - { value: ' El Zapateador', color: '8847ff' }, - { value: ' The Horrible Horns', color: '8847ff' }, - { value: '★ Skullbrero', color: '8847ff' }, - { value: ' Soviet Strongmann', color: '8847ff' }, - { value: ' Voodoo Vizier', color: '8847ff' }, - { value: " Madmann's Muzzle", color: '8847ff' }, - { value: ' BINOCULUS!', color: '4b69ff' }, - { value: ' Derangement Garment', color: '4b69ff' }, - { value: ' Convict Cap', color: '4b69ff' }, - { value: ' El Mostacho', color: '4b69ff' }, - { value: ' Candy Cranium', color: '4b69ff' }, - { value: ' Bat Hat', color: '4b69ff' }, - { value: ' Pocket Halloween Boss', color: '4b69ff' }, - { value: ' Party Poncho', color: '4b69ff' }, - { value: ' Fuel Injector', color: '4b69ff' }, - { value: ' Bread Biter', color: '4b69ff' }, - ], - tradable: 1, - actions: [ - { - link: - 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=31066&lang=en_US', - name: 'Item Wiki Page...', - }, - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D5006617706189886078', - name: 'Inspect in Game...', - }, - ], - name: 'Unusual Skullbrero', - name_color: '8650AC', - type: 'Level 57 Hat', - market_name: 'Unusual Skullbrero', - market_hash_name: 'Unusual Skullbrero', - market_actions: [ - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D5006617706189886078', - name: 'Inspect in Game...', - }, - ], - commodity: 0, - market_tradable_restriction: 7, - market_marketable_restriction: 0, - marketable: 1, - tags: [ - { - category: 'Quality', - internal_name: 'rarity4', - localized_category_name: 'Quality', - localized_tag_name: 'Unusual', - color: '8650AC', - }, - { - category: 'Type', - internal_name: 'misc', - localized_category_name: 'Type', - localized_tag_name: 'Cosmetic', - }, - { - category: 'Class', - internal_name: 'Pyro', - localized_category_name: 'Class', - localized_tag_name: 'Pyro', - }, - { - category: 'Rarity', - internal_name: 'Rarity_Mythical', - localized_category_name: 'Grade', - localized_tag_name: 'Commando', - color: '8847ff', - }, - { - category: 'Collection', - internal_name: 'halloween2019_collection_name', - localized_category_name: 'Collection', - localized_tag_name: 'Spooky Spoils Collection', - }, - ], - }; - - const attributes = parseEconItem(econ, true, true); - - const sku = toSKU(attributes); - - assert.equal(sku, '31066;5;u130'); - }) - - it('Case #5', () => { - const econ = { - appid: 440, - contextid: '2', - assetid: '8656785508', - classid: '3543846179', - instanceid: '3516082756', - amount: '1', - currency: 0, - background_color: '3C352E', - icon_url: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffjDz5zdwmTVPAOCsot8Qn-Whg07dR3XcGzuehWe1q65oHFOuQpN4kZGpOECffQZl39vho_1KdefJbbonvq3SvubmwUG028UzYUYzA', - icon_url_large: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffjDz5zdwmTVPAOCsot8Qn-Whg07dR3XcGzuehWe1q65oHFOuQpN4kZGpOECffQZl39vho_1KdefJbbonvq3SvubmwUG028UzYUYzA', - descriptions: [ - { - value: 'Commando Grade Rocket Launcher (Field-Tested)', - color: '8847ff', - }, - { value: 'Festivized', color: 'ffd700' }, - { - value: - 'Halloween: Pumpkin Bombs (spell only active during event)', - color: '7ea9d1', - }, - { value: 'Sheen: Agonizing Emerald', color: '7ea9d1' }, - { value: 'Killstreaks Active', color: '7ea9d1' }, - { - value: '\nGift from: VLaDOS | S>C.MOON YELLOW BELT', - color: '7ea9d1', - }, - { - value: - 'Date Received: Tuesday, September 10, 2019 (9:36:39) GMT', - }, - { value: ' ' }, - { value: ' ' }, - { value: 'Concealed Killer Collection' }, - { value: ' Sand Cannon Rocket Launcher', color: 'eb4b4b' }, - { value: ' Red Rock Roscoe Pistol', color: 'eb4b4b' }, - { value: ' Psychedelic Slugger Revolver', color: 'd32ce6' }, - { value: ' Purple Range Sniper Rifle', color: 'd32ce6' }, - { - value: ' Sudden Flurry Stickybomb Launcher', - color: 'd32ce6', - }, - { value: ' Night Terror Scattergun', color: '8847ff' }, - { - value: ' Carpet Bomber Stickybomb Launcher', - color: '8847ff', - }, - { - value: '✔ Woodland Warrior Rocket Launcher', - color: '8847ff', - }, - { value: ' Wrapped Reviver Medi Gun', color: '8847ff' }, - { value: ' Night Owl Sniper Rifle', color: '4b69ff' }, - { value: ' Woodsy Widowmaker SMG', color: '4b69ff' }, - { value: ' Backwoods Boomstick Shotgun', color: '4b69ff' }, - { value: ' King of the Jungle Minigun', color: '4b69ff' }, - { value: ' Masked Mender Medi Gun', color: '4b69ff' }, - { value: ' Forest Fire Flame Thrower', color: '4b69ff' }, - ], - tradable: 1, - actions: [ - { - link: - 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=15006&lang=en_US', - name: 'Item Wiki Page...', - }, - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D11534198800805877074', - name: 'Inspect in Game...', - }, - ], - fraudwarnings: [ - 'This item has been renamed.\nOriginal name: "Rocket Launcher"', - ], - name: "''post live spell rocket louncher !!!!!!!''", - name_color: 'FAFAFA', - type: '', - market_name: - 'Festivized Specialized Killstreak Woodland Warrior Rocket Launcher (Field-Tested)', - market_hash_name: - 'Festivized Specialized Killstreak Woodland Warrior Rocket Launcher (Field-Tested)', - market_actions: [ - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D11534198800805877074', - name: 'Inspect in Game...', - }, - ], - commodity: 0, - market_tradable_restriction: 7, - market_marketable_restriction: 0, - marketable: 1, - tags: [ - { - category: 'Quality', - internal_name: 'paintkitweapon', - localized_category_name: 'Quality', - localized_tag_name: 'Decorated Weapon', - color: 'FAFAFA', - }, - { - category: 'Type', - internal_name: 'primary', - localized_category_name: 'Type', - localized_tag_name: 'Primary weapon', - }, - { - category: 'Class', - internal_name: 'Soldier', - localized_category_name: 'Class', - localized_tag_name: 'Soldier', - }, - { - category: 'Rarity', - internal_name: 'Rarity_Mythical', - localized_category_name: 'Grade', - localized_tag_name: 'Commando', - color: '8847ff', - }, - { - category: 'Collection', - internal_name: 'concealedkiller_collection', - localized_category_name: 'Collection', - localized_tag_name: 'Concealed Killer Collection', - }, - { - category: 'Exterior', - internal_name: 'TFUI_InvTooltip_FieldTested', - localized_category_name: 'Exterior', - localized_tag_name: 'Field-Tested', - }, - ], - }; - - const attributes = parseEconItem(econ, true, true); - - const sku = toSKU(attributes); - - assert.equal(sku, '205;15;w3;pk6;kt-2;festive'); - }) - - it('Case #6 - with true defindex', () => { - const econ = { - appid: 440, - contextid: '2', - assetid: '8407830034', - classid: '3662018019', - instanceid: '11040671', - amount: '1', - currency: 0, - background_color: '3C352E', - icon_url: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffsDz5zdwmTVPAOCcot8Qn-Wxg07dR3XcGzub5ffwvmttSXYrAlY9xFTMaCUvbXNQz_6EkwiPRYKJaIon-9jHjrOWoUG0280KDki-w', - icon_url_large: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffsDz5zdwmTVPAOCcot8Qn-Wxg07dR3XcGzub5ffwvmttSXYrAlY9xFTMaCUvbXNQz_6EkwiPRYKJaIon-9jHjrOWoUG0280KDki-w', - descriptions: [ - { - value: 'Mercenary Grade Flame Thrower (Minimal Wear)', - color: '4b69ff', - }, - { value: '★ Unusual Effect: Cool', color: 'ffd700' }, - { value: 'Festivized', color: 'ffd700' }, - { - value: 'Extinguishing teammates restores 20 health', - color: '7ea9d1', - }, - { value: 'Sheen: Agonizing Emerald', color: '7ea9d1' }, - { value: 'Killstreaks Active', color: '7ea9d1' }, - { - value: - 'Afterburn reduces Medi Gun healing and resist shield effects.\nAlt-Fire: Release a blast of air that pushes enemies and projectiles and extinguishes teammates that are on fire.', - }, - { value: ' ' }, - { value: ' ' }, - { value: 'Concealed Killer Collection' }, - { value: ' Sand Cannon Rocket Launcher', color: 'eb4b4b' }, - { value: ' Red Rock Roscoe Pistol', color: 'eb4b4b' }, - { value: ' Psychedelic Slugger Revolver', color: 'd32ce6' }, - { value: ' Purple Range Sniper Rifle', color: 'd32ce6' }, - { - value: ' Sudden Flurry Stickybomb Launcher', - color: 'd32ce6', - }, - { value: ' Night Terror Scattergun', color: '8847ff' }, - { - value: ' Carpet Bomber Stickybomb Launcher', - color: '8847ff', - }, - { - value: ' Woodland Warrior Rocket Launcher', - color: '8847ff', - }, - { value: ' Wrapped Reviver Medi Gun', color: '8847ff' }, - { value: ' Night Owl Sniper Rifle', color: '4b69ff' }, - { value: ' Woodsy Widowmaker SMG', color: '4b69ff' }, - { value: ' Backwoods Boomstick Shotgun', color: '4b69ff' }, - { value: ' King of the Jungle Minigun', color: '4b69ff' }, - { value: ' Masked Mender Medi Gun', color: '4b69ff' }, - { value: '★ Forest Fire Flame Thrower', color: '4b69ff' }, - ], - tradable: 1, - actions: [ - { - link: - 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=15005&lang=en_US', - name: 'Item Wiki Page...', - }, - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D6922402693932635553', - name: 'Inspect in Game...', - }, - ], - name: 'Festivized Forest Fire Flame Thrower', - name_color: '8650AC', - type: '', - market_name: - 'Unusual Festivized Specialized Killstreak Forest Fire Flame Thrower (Minimal Wear)', - market_hash_name: - 'Unusual Festivized Specialized Killstreak Forest Fire Flame Thrower (Minimal Wear)', - market_actions: [ - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D6922402693932635553', - name: 'Inspect in Game...', - }, - ], - commodity: 0, - market_tradable_restriction: 7, - market_marketable_restriction: 0, - marketable: 1, - tags: [ - { - category: 'Quality', - internal_name: 'rarity4', - localized_category_name: 'Quality', - localized_tag_name: 'Unusual', - color: '8650AC', - }, - { - category: 'Type', - internal_name: 'primary', - localized_category_name: 'Type', - localized_tag_name: 'Primary weapon', - }, - { - category: 'Class', - internal_name: 'Pyro', - localized_category_name: 'Class', - localized_tag_name: 'Pyro', - }, - { - category: 'Rarity', - internal_name: 'Rarity_Rare', - localized_category_name: 'Grade', - localized_tag_name: 'Mercenary', - color: '4b69ff', - }, - { - category: 'Collection', - internal_name: 'concealedkiller_collection', - localized_category_name: 'Collection', - localized_tag_name: 'Concealed Killer Collection', - }, - { - category: 'Exterior', - internal_name: 'TFUI_InvTooltip_MinimalWear', - localized_category_name: 'Exterior', - localized_tag_name: 'Minimal Wear', - }, - ], - }; - - const attributes = parseEconItem(econ, true, true, { useTrueDefindex: true }); - - const sku = toSKU(attributes); - - assert.equal(sku, '15005;5;u703;w2;pk9;kt-2;festive'); - }) - - it('Case #7 - with true defindex', () => { - const econ = { - appid: 440, - contextid: '2', - assetid: '8656785508', - classid: '3543846179', - instanceid: '3516082756', - amount: '1', - currency: 0, - background_color: '3C352E', - icon_url: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffjDz5zdwmTVPAOCsot8Qn-Whg07dR3XcGzuehWe1q65oHFOuQpN4kZGpOECffQZl39vho_1KdefJbbonvq3SvubmwUG028UzYUYzA', - icon_url_large: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffjDz5zdwmTVPAOCsot8Qn-Whg07dR3XcGzuehWe1q65oHFOuQpN4kZGpOECffQZl39vho_1KdefJbbonvq3SvubmwUG028UzYUYzA', - descriptions: [ - { - value: 'Commando Grade Rocket Launcher (Field-Tested)', - color: '8847ff', - }, - { value: 'Festivized', color: 'ffd700' }, - { - value: - 'Halloween: Pumpkin Bombs (spell only active during event)', - color: '7ea9d1', - }, - { value: 'Sheen: Agonizing Emerald', color: '7ea9d1' }, - { value: 'Killstreaks Active', color: '7ea9d1' }, - { - value: '\nGift from: VLaDOS | S>C.MOON YELLOW BELT', - color: '7ea9d1', - }, - { - value: - 'Date Received: Tuesday, September 10, 2019 (9:36:39) GMT', - }, - { value: ' ' }, - { value: ' ' }, - { value: 'Concealed Killer Collection' }, - { value: ' Sand Cannon Rocket Launcher', color: 'eb4b4b' }, - { value: ' Red Rock Roscoe Pistol', color: 'eb4b4b' }, - { value: ' Psychedelic Slugger Revolver', color: 'd32ce6' }, - { value: ' Purple Range Sniper Rifle', color: 'd32ce6' }, - { - value: ' Sudden Flurry Stickybomb Launcher', - color: 'd32ce6', - }, - { value: ' Night Terror Scattergun', color: '8847ff' }, - { - value: ' Carpet Bomber Stickybomb Launcher', - color: '8847ff', - }, - { - value: '✔ Woodland Warrior Rocket Launcher', - color: '8847ff', - }, - { value: ' Wrapped Reviver Medi Gun', color: '8847ff' }, - { value: ' Night Owl Sniper Rifle', color: '4b69ff' }, - { value: ' Woodsy Widowmaker SMG', color: '4b69ff' }, - { value: ' Backwoods Boomstick Shotgun', color: '4b69ff' }, - { value: ' King of the Jungle Minigun', color: '4b69ff' }, - { value: ' Masked Mender Medi Gun', color: '4b69ff' }, - { value: ' Forest Fire Flame Thrower', color: '4b69ff' }, - ], - tradable: 1, - actions: [ - { - link: - 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=15006&lang=en_US', - name: 'Item Wiki Page...', - }, - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D11534198800805877074', - name: 'Inspect in Game...', - }, - ], - fraudwarnings: [ - 'This item has been renamed.\nOriginal name: "Rocket Launcher"', - ], - name: "''post live spell rocket louncher !!!!!!!''", - name_color: 'FAFAFA', - type: '', - market_name: - 'Festivized Specialized Killstreak Woodland Warrior Rocket Launcher (Field-Tested)', - market_hash_name: - 'Festivized Specialized Killstreak Woodland Warrior Rocket Launcher (Field-Tested)', - market_actions: [ - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D11534198800805877074', - name: 'Inspect in Game...', - }, - ], - commodity: 0, - market_tradable_restriction: 7, - market_marketable_restriction: 0, - marketable: 1, - tags: [ - { - category: 'Quality', - internal_name: 'paintkitweapon', - localized_category_name: 'Quality', - localized_tag_name: 'Decorated Weapon', - color: 'FAFAFA', - }, - { - category: 'Type', - internal_name: 'primary', - localized_category_name: 'Type', - localized_tag_name: 'Primary weapon', - }, - { - category: 'Class', - internal_name: 'Soldier', - localized_category_name: 'Class', - localized_tag_name: 'Soldier', - }, - { - category: 'Rarity', - internal_name: 'Rarity_Mythical', - localized_category_name: 'Grade', - localized_tag_name: 'Commando', - color: '8847ff', - }, - { - category: 'Collection', - internal_name: 'concealedkiller_collection', - localized_category_name: 'Collection', - localized_tag_name: 'Concealed Killer Collection', - }, - { - category: 'Exterior', - internal_name: 'TFUI_InvTooltip_FieldTested', - localized_category_name: 'Exterior', - localized_tag_name: 'Field-Tested', - }, - ], - }; - - const attributes = parseEconItem(econ, true, true, { useTrueDefindex: true }); - - const sku = toSKU(attributes); - - assert.equal(sku, '15006;15;w3;pk6;kt-2;festive'); - }) -}); - -describe('SKU to Name', () => { - it('Case #1', () => { - const sku = '9258;5;uncraftable;td-30917'; - - const attributes = parseSKU(sku); - - const name = stringify(attributes); - - assert.equal(name, 'Non-Craftable Unusual Taunt: The Trackman\'s Touchdown Unusualifier'); - }); - - it('Case #2', () => { - const sku = '31146;5;u159'; - - const attributes = parseSKU(sku); - - const name = stringify(attributes); - - assert.equal(name, 'Pyroland Nightmare Calamitous Cauldron'); - }); - - it('Case #3', () => { - const sku = '1071;11;kt-3'; - - const attributes = parseSKU(sku); - - const name = stringify(attributes); - - assert.equal(name, 'Strange Professional Killstreak Golden Frying Pan'); - }); - - it('Case #4', () => { - const sku = '6526;6;uncraftable;kt-3;td-201'; - - const attributes = parseSKU(sku); - - const name = stringify(attributes); - - assert.equal(name, 'Non-Craftable Professional Killstreak Sniper Rifle Kit'); - }); - - it('Case #5', () => { - const sku = '211;11;australium;kt-3;festive'; - - const attributes = parseSKU(sku); - - const name = stringify(attributes); - - assert.equal(name, 'Strange Festivized Professional Killstreak Australium Medi Gun'); - }); - - it('Case #6', () => { - const sku = '211;11;australium;kt-3'; - - const attributes = parseSKU(sku); - - const name = stringify(attributes); - - assert.equal(name, 'Strange Professional Killstreak Australium Medi Gun'); - }); - - it('Case #7', () => { - const sku = '792;11;kt-3'; - - const attributes = parseSKU(sku); - - const name = stringify(attributes); - - assert.equal(name, 'Strange Professional Killstreak Silver Botkiller Sniper Rifle Mk.I'); - }) -}); - -describe('SKU to Listing', () => { - it('Case #1', () => { - const sku = '9258;5;uncraftable;td-30917'; - - const attributes = parseSKU(sku); - - const listing = createBPListing(attributes); - - assert.deepEqual(listing, { - quality: 5, - craftable: 0, - item_name: 'Unusualifier', - priceindex: 30917 - }); - }); - - it('Case #2', () => { - const sku = '31146;5;u159'; - - const attributes = parseSKU(sku); - - const listing = createBPListing(attributes); - - assert.deepEqual(listing, { - quality: 5, - craftable: 1, - item_name: 'Calamitous Cauldron', - priceindex: 159 - }); - }); - - it('Case #3', () => { - const sku = '1071;11;kt-3'; - - const attributes = parseSKU(sku); - - const listing = createBPListing(attributes); - - assert.deepEqual(listing, { - quality: 11, - craftable: 1, - item_name: 'Professional Killstreak Golden Frying Pan', - priceindex: 0 - }); - }); - - it('Case #4', () => { - const sku = '6526;6;uncraftable;kt-3;td-201'; - - const attributes = parseSKU(sku); - - const listing = createBPListing(attributes); - - assert.deepEqual(listing, { - quality: 6, - craftable: 0, - item_name: 'Professional Killstreak Kit', - priceindex: '3-201' - }); - }); - - it('Case #5', () => { - const sku = '211;11;australium;kt-3;festive'; - - const attributes = parseSKU(sku); - - const listing = createBPListing(attributes); - - assert.deepEqual(listing, { - quality: 11, - craftable: 1, - item_name: 'Festivized Professional Killstreak Australium Medi Gun', - priceindex: 0 - }); - }); - - it('Case #6', () => { - const sku = '211;11;australium;kt-3'; - - const attributes = parseSKU(sku); - - const listing = createBPListing(attributes); - - assert.deepEqual(listing, { - quality: 11, - craftable: 1, - item_name: 'Professional Killstreak Australium Medi Gun', - priceindex: 0 - }); - }); - - it('Case #7', () => { - const sku = '792;11;kt-3'; - - const attributes = parseSKU(sku); - - const listing = createBPListing(attributes); - - assert.deepEqual(listing, { - quality: 11, - craftable: 1, - item_name: 'Professional Killstreak Silver Botkiller Sniper Rifle Mk.I', - priceindex: 0 - }); - }) -}); - -describe('Econ to Listing', () => { - it('Case #1', () => { - const econ = { - appid: 440, - contextid: '2', - assetid: '8733746813', - classid: '221512872', - instanceid: '92637229', - amount: '1', - currency: 0, - background_color: '3C352E', - icon_url: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEDe1VBDEjdqCEX2PfnGOaDBeEUlNQK6ZFH3jMlwwB_Y7vhZ2Q0JFKQAKQJXadrpF6-UXE268I3UNHg8esHfF28tdHHO65sbo88eQy8bA', - icon_url_large: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEDe1VBDEjdqCEX2PfnGOaDBeEUlNQK6ZFH3jMlwwB_Y7vhZ2Q0JFKQAKQJXadrpF6-UXE268I3UNHg8esHfF28tdHHO65sbo88eQy8bA', - descriptions: [ - { - value: 'Holiday Restriction: Halloween / Full Moon', - color: 'd83636', - }, - { - value: - 'Halloween: Spectral Spectrum (spell only active during event)', - color: '7ea9d1', - }, - { value: '' }, - ], - tradable: 1, - actions: [ - { - link: - 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=30290&lang=en_US', - name: 'Item Wiki Page...', - }, - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D16238051287194648628', - name: 'Inspect in Game...', - }, - ], - name: 'Haunted PY-40 Incinibot', - name_color: '38f3ab', - type: 'Level 58 Mask', - market_name: 'Haunted PY-40 Incinibot', - market_hash_name: 'Haunted PY-40 Incinibot', - market_actions: [ - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D16238051287194648628', - name: 'Inspect in Game...', - }, - ], - commodity: 0, - market_tradable_restriction: 7, - market_marketable_restriction: 0, - marketable: 1, - tags: [ - { - category: 'Quality', - internal_name: 'haunted', - localized_category_name: 'Quality', - localized_tag_name: 'Haunted', - color: '38f3ab', - }, - { - category: 'Type', - internal_name: 'misc', - localized_category_name: 'Type', - localized_tag_name: 'Cosmetic', - }, - { - category: 'Class', - internal_name: 'Pyro', - localized_category_name: 'Class', - localized_tag_name: 'Pyro', - }, - ], - }; - - const attributes = parseEconItem(econ, true, true); - - const listing = createBPListing(attributes); - - assert.deepEqual(listing, { - quality: 13, - craftable: 1, - item_name: 'PY-40 Incinibot', - priceindex: 0 - }); - }) - - it('Case #2', () => { - const econ = { - appid: 440, - contextid: '2', - assetid: '8610658018', - classid: '171010366', - instanceid: '176498576', - amount: '1', - currency: 0, - background_color: '3C352E', - icon_url: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEbfgYfXh7wqwdTmsHiCM2ACfIHnpRh5MkG3G8zyVMpYebiYm8wdFGTBPILC_BvrQu9X3RqupQ6AYPhp-wHZ0yx43BgcxIX', - icon_url_large: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEbfgYfXh7wqwdTmsHiCM2ACfIHnpRh5MkG3G8zyVMpYebiYm8wdFGTBPILC_BvrQu9X3RqupQ6AYPhp-wHZ0yx43BgcxIX', - descriptions: [ - { value: '★ Unusual Effect: Smoking', color: 'ffd700' }, - ], - tradable: 1, - actions: [ - { - link: - 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=318&lang=en_US', - name: 'Item Wiki Page...', - }, - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D10290164463146604828', - name: 'Inspect in Game...', - }, - ], - name: "Unusual Prancer's Pride", - name_color: '8650AC', - type: 'Level 88 Hat', - market_name: "Unusual Prancer's Pride", - market_hash_name: "Unusual Prancer's Pride", - market_actions: [ - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D10290164463146604828', - name: 'Inspect in Game...', - }, - ], - commodity: 0, - market_tradable_restriction: 7, - market_marketable_restriction: 0, - marketable: 1, - tags: [ - { - category: 'Quality', - internal_name: 'rarity4', - localized_category_name: 'Quality', - localized_tag_name: 'Unusual', - color: '8650AC', - }, - { - category: 'Type', - internal_name: 'misc', - localized_category_name: 'Type', - localized_tag_name: 'Cosmetic', - }, - { - category: 'Class', - internal_name: 'Pyro', - localized_category_name: 'Class', - localized_tag_name: 'Pyro', - }, - ], - }; - - const attributes = parseEconItem(econ, true, true); - - const listing = createBPListing(attributes); - - assert.deepEqual(listing, { - quality: 5, - craftable: 1, - item_name: "Prancer's Pride", - priceindex: 35 - }); - }); - - it('Case #3', () => { - const econ = { - appid: 440, - contextid: '2', - assetid: '8555715171', - classid: '3717643208', - instanceid: '344437314', - amount: '1', - currency: 0, - background_color: '3C352E', - icon_url: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEJeQQaWA_dtDlRj82oVPeJUbRTyohkssUGjDBox1IsNrKxaWc1JFWQWPYHDKFsow2_WyVlv4lzWtBtJvRLsg', - icon_url_large: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEJeQQaWA_dtDlRj82oVPeJUbRTyohkssUGjDBox1IsNrKxaWc1JFWQWPYHDKFsow2_WyVlv4lzWtBtJvRLsg', - descriptions: [ - { value: "★ Unusual Effect: Nuts n' Bolts", color: 'ffd700' }, - { value: "''hmm epic''" }, - ], - tradable: 1, - actions: [ - { - link: - 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=434&lang=en_US', - name: 'Item Wiki Page...', - }, - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D16442165943709427870', - name: 'Inspect in Game...', - }, - ], - name: 'Unusual Brain Bucket', - name_color: '8650AC', - type: 'Level 82 Hat', - market_name: 'Unusual Brain Bucket', - market_hash_name: 'Unusual Brain Bucket', - market_actions: [ - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D16442165943709427870', - name: 'Inspect in Game...', - }, - ], - commodity: 0, - market_tradable_restriction: 7, - market_marketable_restriction: 0, - marketable: 1, - tags: [ - { - category: 'Quality', - internal_name: 'rarity4', - localized_category_name: 'Quality', - localized_tag_name: 'Unusual', - color: '8650AC', - }, - { - category: 'Type', - internal_name: 'misc', - localized_category_name: 'Type', - localized_tag_name: 'Cosmetic', - }, - { - category: 'Class', - internal_name: 'Soldier', - localized_category_name: 'Class', - localized_tag_name: 'Soldier', - }, - ], - }; - - const attributes = parseEconItem(econ, true, true); - - const listing = createBPListing(attributes); - - assert.deepEqual(listing, { quality: 5, craftable: 1, item_name: 'Brain Bucket', priceindex: 31 }); - }) - - it('Case #4', () => { - const econ = { - appid: 440, - contextid: '2', - assetid: '8574678947', - classid: '3555490789', - instanceid: '856289751', - amount: '1', - currency: 0, - background_color: '3C352E', - icon_url: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEDewlDDUq7hytIncTqD-CJGu8_l9sn4pUbi2Ftw1ApbbXtNmM_cVTEV_lbWaw7pQu0W3Rr6sVlAdPvoOhScFnt4pyGbefmPm6lTg', - icon_url_large: - 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEDewlDDUq7hytIncTqD-CJGu8_l9sn4pUbi2Ftw1ApbbXtNmM_cVTEV_lbWaw7pQu0W3Rr6sVlAdPvoOhScFnt4pyGbefmPm6lTg', - descriptions: [ - { value: 'Commando Grade Hat', color: '8847ff' }, - { - value: '★ Unusual Effect: Twisted Radiance', - color: 'ffd700', - }, - { value: ' ' }, - { value: ' ' }, - { value: 'Spooky Spoils Collection' }, - { value: ' Mister Bones', color: 'eb4b4b' }, - { value: " Pyr'o Lantern", color: 'eb4b4b' }, - { value: ' Racc Mann', color: 'd32ce6' }, - { value: ' Head of the Dead', color: 'd32ce6' }, - { value: ' Elizabeth the Third', color: 'd32ce6' }, - { value: ' The Trick Stabber', color: 'd32ce6' }, - { value: ' El Zapateador', color: '8847ff' }, - { value: ' The Horrible Horns', color: '8847ff' }, - { value: '★ Skullbrero', color: '8847ff' }, - { value: ' Soviet Strongmann', color: '8847ff' }, - { value: ' Voodoo Vizier', color: '8847ff' }, - { value: " Madmann's Muzzle", color: '8847ff' }, - { value: ' BINOCULUS!', color: '4b69ff' }, - { value: ' Derangement Garment', color: '4b69ff' }, - { value: ' Convict Cap', color: '4b69ff' }, - { value: ' El Mostacho', color: '4b69ff' }, - { value: ' Candy Cranium', color: '4b69ff' }, - { value: ' Bat Hat', color: '4b69ff' }, - { value: ' Pocket Halloween Boss', color: '4b69ff' }, - { value: ' Party Poncho', color: '4b69ff' }, - { value: ' Fuel Injector', color: '4b69ff' }, - { value: ' Bread Biter', color: '4b69ff' }, - ], - tradable: 1, - actions: [ - { - link: - 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=31066&lang=en_US', - name: 'Item Wiki Page...', - }, - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D5006617706189886078', - name: 'Inspect in Game...', - }, - ], - name: 'Unusual Skullbrero', - name_color: '8650AC', - type: 'Level 57 Hat', - market_name: 'Unusual Skullbrero', - market_hash_name: 'Unusual Skullbrero', - market_actions: [ - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D5006617706189886078', - name: 'Inspect in Game...', - }, - ], - commodity: 0, - market_tradable_restriction: 7, - market_marketable_restriction: 0, - marketable: 1, - tags: [ - { - category: 'Quality', - internal_name: 'rarity4', - localized_category_name: 'Quality', - localized_tag_name: 'Unusual', - color: '8650AC', - }, - { - category: 'Type', - internal_name: 'misc', - localized_category_name: 'Type', - localized_tag_name: 'Cosmetic', - }, - { - category: 'Class', - internal_name: 'Pyro', - localized_category_name: 'Class', - localized_tag_name: 'Pyro', - }, - { - category: 'Rarity', - internal_name: 'Rarity_Mythical', - localized_category_name: 'Grade', - localized_tag_name: 'Commando', - color: '8847ff', - }, - { - category: 'Collection', - internal_name: 'halloween2019_collection_name', - localized_category_name: 'Collection', - localized_tag_name: 'Spooky Spoils Collection', - }, - ], - }; - - const attributes = parseEconItem(econ, true, true); - - const listing = createBPListing(attributes); - - assert.deepEqual(listing, { quality: 5, craftable: 1, item_name: 'Skullbrero', priceindex: 130 }); - }) - - it('Case #5', () => { - const econ = { - appid: 440, - contextid: '2', - assetid: '8434754722', - classid: '88783771', - instanceid: '92739934', - amount: '1', - currency: 0, - background_color: '3C352E', - icon_url: - 'IzMF03bi9WpSBq-S-ekoE33L-iLqGFHVaU25ZzQNQcXdEH9myp0erksICfTcePMQFc1nqWSMU5OD2NwOx3sIyShXOjLx2Sk5MbUqMcbBnQz4ruyeU2DgVzPLKCnYCGFgGOIYfAeFr3HysPORE2vPELl_RQEMdaFX9GxObM-BOEE_goVdrTXqlBwkHRNxJ5VFcVbihGQdNlNSNRp3', - icon_url_large: - 'IzMF03bi9WpSBq-S-ekoE33L-iLqGFHVaU25ZzQNQcXdEH9myp0erksICfTcePMQFc1nqWSMU5OD2NwOx3sIyShXOjLx2Sk5MbUqMcbBnQz4ruyeU2DgVzPLKCnYCGFgGOIYfAeFr3HysPORE2vPELl_RQEMdaFX9GxObM-BOEE_goVdrTXqlBwkHRNxJ5VFcVbihGQdNlNSNRp3', - descriptions: [ - { - value: "Paint Color: Noble Hatter's Violet", - color: '756b5e', - }, - { - value: - 'Halloween: Spectral Spectrum (spell only active during event)', - color: '7ea9d1', - }, - { - value: - "The K-9 mane is perfect for tricky social situations. People will either only want to talk about the hat, which means they'll be distracted from that rash making its way up your jugular,or they'll avoid you altogether. It's a win/win!", - }, - ], - tradable: 1, - actions: [ - { - link: - 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=876&lang=en_US', - name: 'Item Wiki Page...', - }, - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D7378163898213210976', - name: 'Inspect in Game...', - }, - ], - name: 'Genuine K-9 Mane', - name_color: '4D7455', - type: 'Level 1 Spirit Animal', - market_name: 'Genuine K-9 Mane', - market_hash_name: 'Genuine K-9 Mane', - market_actions: [ - { - link: - 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D7378163898213210976', - name: 'Inspect in Game...', - }, - ], - commodity: 0, - market_tradable_restriction: 7, - market_marketable_restriction: 0, - marketable: 1, - tags: [ - { - category: 'Quality', - internal_name: 'rarity1', - localized_category_name: 'Quality', - localized_tag_name: 'Genuine', - color: '4D7455', - }, - { - category: 'Type', - internal_name: 'misc', - localized_category_name: 'Type', - localized_tag_name: 'Cosmetic', - }, - { - category: 'Class', - internal_name: 'Demoman', - localized_category_name: 'Class', - localized_tag_name: 'Demoman', - }, - { - category: 'Class', - internal_name: 'Heavy', - localized_category_name: 'Class', - localized_tag_name: 'Heavy', - }, - ], - }; - - const attributes = parseEconItem(econ, true, true); - - const listing = createBPListing(attributes); - - assert.deepEqual(listing, { quality: 1, craftable: 1, item_name: 'K-9 Mane', priceindex: 0 }); - }) -}); +/** + * Testing how formats + * seemlessly transfer between each other. + * @todo add type test with typescript for this one. + */ +const { assert } = require('chai'); + +const { parseEconItem, parseSKU, parseString, toSKU, stringify, createBPListing } = require('../dist/static'); + +/** + * StartFormat - EconItem + * Endformat - Listing + * StartEndFormat - Attributes, Name, SKU + */ + +describe('Name to SKU', () => { + it('Case #1', () => { + const name = 'Non-Craftable Unusual Taunt: The Trackman\'s Touchdown Unusualifier'; + + const attributes = parseString(name, true, true); + + const sku = toSKU(attributes); + + assert.equal(sku, '9258;5;uncraftable;td-30917'); + }); + + it('Case #2', () => { + const name = 'Pyroland Nightmare Calamitous Cauldron'; + + const attributes = parseString(name, true, true); + + const sku = toSKU(attributes); + + assert.equal(sku, '31146;5;u159'); + }); + + it('Case #3', () => { + const name = 'Strange Professional Killstreak Golden Frying Pan'; + + const attributes = parseString(name, true, true); + + const sku = toSKU(attributes); + + assert.equal(sku, '1071;11;kt-3'); + }); + + it('Case #4', () => { + const name = 'Non-Craftable Professional Killstreak Sniper Rifle Kit'; + + const attributes = parseString(name, true, true); + + const sku = toSKU(attributes); + + assert.equal(sku, '6526;6;uncraftable;kt-3;td-201'); + }); + + it('Case #5', () => { + const name = 'Strange Professional Killstreak Festivized Australium Medi Gun'; + + const attributes = parseString(name, true, true); + + const sku = toSKU(attributes); + + assert.equal(sku, '211;11;australium;kt-3;festive'); + }); + + it('Case #6', () => { + const name = 'Strange Professional Killstreak Australium Medi Gun'; + + const attributes = parseString(name, true, true); + + const sku = toSKU(attributes); + + assert.equal(sku, '211;11;australium;kt-3'); + }); + + it('Case #7', () => { + const name = 'Professional Killstreak Strange Silver Botkiller Sniper Rifle Mk.I'; + + const attributes = parseString(name, true, true); + + const sku = toSKU(attributes); + + assert.equal(sku, '792;11;kt-3'); + }) + + /* Chemistry sets currently don't work. + it('Case #7', () => { + const name = 'Original Chemistry Set'; + + const attributes = parseString(name, true, true); + + const sku = toSKU(attributes); + + assert.equal(sku, '20006;6;od-513;oq-14'); + }); + + it('Case #8', () => { + const name = 'Outback Intellectual Strangifier Chemistry Set'; + + const attributes = parseString(name, true, true); + + const sku = toSKU(attributes); + + assert.equal(sku, '20005;6;td-645;od-6522;oq-6'); + }); + */ + + it('Case #9 - Unusual Haunted Metal Scrap', () => { + const name = 'Unusual Haunted Metal Scrap'; + + const attributes = parseString(name, true, true); + + const sku = toSKU(attributes); + + assert.equal(sku, '267;5'); + }) +}); + +describe('Econ to SKU', () => { + it('Case #1', () => { + const econ = { + appid: 440, + contextid: '2', + assetid: '8733746813', + classid: '221512872', + instanceid: '92637229', + amount: '1', + currency: 0, + background_color: '3C352E', + icon_url: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEDe1VBDEjdqCEX2PfnGOaDBeEUlNQK6ZFH3jMlwwB_Y7vhZ2Q0JFKQAKQJXadrpF6-UXE268I3UNHg8esHfF28tdHHO65sbo88eQy8bA', + icon_url_large: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEDe1VBDEjdqCEX2PfnGOaDBeEUlNQK6ZFH3jMlwwB_Y7vhZ2Q0JFKQAKQJXadrpF6-UXE268I3UNHg8esHfF28tdHHO65sbo88eQy8bA', + descriptions: [ + { + value: 'Holiday Restriction: Halloween / Full Moon', + color: 'd83636', + }, + { + value: + 'Halloween: Spectral Spectrum (spell only active during event)', + color: '7ea9d1', + }, + { value: '' }, + ], + tradable: 1, + actions: [ + { + link: + 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=30290&lang=en_US', + name: 'Item Wiki Page...', + }, + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D16238051287194648628', + name: 'Inspect in Game...', + }, + ], + name: 'Haunted PY-40 Incinibot', + name_color: '38f3ab', + type: 'Level 58 Mask', + market_name: 'Haunted PY-40 Incinibot', + market_hash_name: 'Haunted PY-40 Incinibot', + market_actions: [ + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D16238051287194648628', + name: 'Inspect in Game...', + }, + ], + commodity: 0, + market_tradable_restriction: 7, + market_marketable_restriction: 0, + marketable: 1, + tags: [ + { + category: 'Quality', + internal_name: 'haunted', + localized_category_name: 'Quality', + localized_tag_name: 'Haunted', + color: '38f3ab', + }, + { + category: 'Type', + internal_name: 'misc', + localized_category_name: 'Type', + localized_tag_name: 'Cosmetic', + }, + { + category: 'Class', + internal_name: 'Pyro', + localized_category_name: 'Class', + localized_tag_name: 'Pyro', + }, + ], + }; + + const attributes = parseEconItem(econ, true, true); + + const sku = toSKU(attributes); + + assert.equal(sku, '30290;13'); + }) + + it('Case #2', () => { + const econ = { + appid: 440, + contextid: '2', + assetid: '8610658018', + classid: '171010366', + instanceid: '176498576', + amount: '1', + currency: 0, + background_color: '3C352E', + icon_url: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEbfgYfXh7wqwdTmsHiCM2ACfIHnpRh5MkG3G8zyVMpYebiYm8wdFGTBPILC_BvrQu9X3RqupQ6AYPhp-wHZ0yx43BgcxIX', + icon_url_large: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEbfgYfXh7wqwdTmsHiCM2ACfIHnpRh5MkG3G8zyVMpYebiYm8wdFGTBPILC_BvrQu9X3RqupQ6AYPhp-wHZ0yx43BgcxIX', + descriptions: [ + { value: '★ Unusual Effect: Smoking', color: 'ffd700' }, + ], + tradable: 1, + actions: [ + { + link: + 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=318&lang=en_US', + name: 'Item Wiki Page...', + }, + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D10290164463146604828', + name: 'Inspect in Game...', + }, + ], + name: "Unusual Prancer's Pride", + name_color: '8650AC', + type: 'Level 88 Hat', + market_name: "Unusual Prancer's Pride", + market_hash_name: "Unusual Prancer's Pride", + market_actions: [ + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D10290164463146604828', + name: 'Inspect in Game...', + }, + ], + commodity: 0, + market_tradable_restriction: 7, + market_marketable_restriction: 0, + marketable: 1, + tags: [ + { + category: 'Quality', + internal_name: 'rarity4', + localized_category_name: 'Quality', + localized_tag_name: 'Unusual', + color: '8650AC', + }, + { + category: 'Type', + internal_name: 'misc', + localized_category_name: 'Type', + localized_tag_name: 'Cosmetic', + }, + { + category: 'Class', + internal_name: 'Pyro', + localized_category_name: 'Class', + localized_tag_name: 'Pyro', + }, + ], + }; + + const attributes = parseEconItem(econ, true, true); + + const sku = toSKU(attributes); + + assert.equal(sku, '318;5;u35'); + }); + + it('Case #3', () => { + const econ = { + appid: 440, + contextid: '2', + assetid: '8407830034', + classid: '3662018019', + instanceid: '11040671', + amount: '1', + currency: 0, + background_color: '3C352E', + icon_url: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffsDz5zdwmTVPAOCcot8Qn-Wxg07dR3XcGzub5ffwvmttSXYrAlY9xFTMaCUvbXNQz_6EkwiPRYKJaIon-9jHjrOWoUG0280KDki-w', + icon_url_large: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffsDz5zdwmTVPAOCcot8Qn-Wxg07dR3XcGzub5ffwvmttSXYrAlY9xFTMaCUvbXNQz_6EkwiPRYKJaIon-9jHjrOWoUG0280KDki-w', + descriptions: [ + { + value: 'Mercenary Grade Flame Thrower (Minimal Wear)', + color: '4b69ff', + }, + { value: '★ Unusual Effect: Cool', color: 'ffd700' }, + { value: 'Festivized', color: 'ffd700' }, + { + value: 'Extinguishing teammates restores 20 health', + color: '7ea9d1', + }, + { value: 'Sheen: Agonizing Emerald', color: '7ea9d1' }, + { value: 'Killstreaks Active', color: '7ea9d1' }, + { + value: + 'Afterburn reduces Medi Gun healing and resist shield effects.\nAlt-Fire: Release a blast of air that pushes enemies and projectiles and extinguishes teammates that are on fire.', + }, + { value: ' ' }, + { value: ' ' }, + { value: 'Concealed Killer Collection' }, + { value: ' Sand Cannon Rocket Launcher', color: 'eb4b4b' }, + { value: ' Red Rock Roscoe Pistol', color: 'eb4b4b' }, + { value: ' Psychedelic Slugger Revolver', color: 'd32ce6' }, + { value: ' Purple Range Sniper Rifle', color: 'd32ce6' }, + { + value: ' Sudden Flurry Stickybomb Launcher', + color: 'd32ce6', + }, + { value: ' Night Terror Scattergun', color: '8847ff' }, + { + value: ' Carpet Bomber Stickybomb Launcher', + color: '8847ff', + }, + { + value: ' Woodland Warrior Rocket Launcher', + color: '8847ff', + }, + { value: ' Wrapped Reviver Medi Gun', color: '8847ff' }, + { value: ' Night Owl Sniper Rifle', color: '4b69ff' }, + { value: ' Woodsy Widowmaker SMG', color: '4b69ff' }, + { value: ' Backwoods Boomstick Shotgun', color: '4b69ff' }, + { value: ' King of the Jungle Minigun', color: '4b69ff' }, + { value: ' Masked Mender Medi Gun', color: '4b69ff' }, + { value: '★ Forest Fire Flame Thrower', color: '4b69ff' }, + ], + tradable: 1, + actions: [ + { + link: + 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=15005&lang=en_US', + name: 'Item Wiki Page...', + }, + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D6922402693932635553', + name: 'Inspect in Game...', + }, + ], + name: 'Festivized Forest Fire Flame Thrower', + name_color: '8650AC', + type: '', + market_name: + 'Unusual Festivized Specialized Killstreak Forest Fire Flame Thrower (Minimal Wear)', + market_hash_name: + 'Unusual Festivized Specialized Killstreak Forest Fire Flame Thrower (Minimal Wear)', + market_actions: [ + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D6922402693932635553', + name: 'Inspect in Game...', + }, + ], + commodity: 0, + market_tradable_restriction: 7, + market_marketable_restriction: 0, + marketable: 1, + tags: [ + { + category: 'Quality', + internal_name: 'rarity4', + localized_category_name: 'Quality', + localized_tag_name: 'Unusual', + color: '8650AC', + }, + { + category: 'Type', + internal_name: 'primary', + localized_category_name: 'Type', + localized_tag_name: 'Primary weapon', + }, + { + category: 'Class', + internal_name: 'Pyro', + localized_category_name: 'Class', + localized_tag_name: 'Pyro', + }, + { + category: 'Rarity', + internal_name: 'Rarity_Rare', + localized_category_name: 'Grade', + localized_tag_name: 'Mercenary', + color: '4b69ff', + }, + { + category: 'Collection', + internal_name: 'concealedkiller_collection', + localized_category_name: 'Collection', + localized_tag_name: 'Concealed Killer Collection', + }, + { + category: 'Exterior', + internal_name: 'TFUI_InvTooltip_MinimalWear', + localized_category_name: 'Exterior', + localized_tag_name: 'Minimal Wear', + }, + ], + }; + + const attributes = parseEconItem(econ, true, true); + + const sku = toSKU(attributes); + + assert.equal(sku, '208;5;u703;w2;pk9;kt-2;festive'); + }) + + it('Case #4', () => { + const econ = { + appid: 440, + contextid: '2', + assetid: '8574678947', + classid: '3555490789', + instanceid: '856289751', + amount: '1', + currency: 0, + background_color: '3C352E', + icon_url: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEDewlDDUq7hytIncTqD-CJGu8_l9sn4pUbi2Ftw1ApbbXtNmM_cVTEV_lbWaw7pQu0W3Rr6sVlAdPvoOhScFnt4pyGbefmPm6lTg', + icon_url_large: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEDewlDDUq7hytIncTqD-CJGu8_l9sn4pUbi2Ftw1ApbbXtNmM_cVTEV_lbWaw7pQu0W3Rr6sVlAdPvoOhScFnt4pyGbefmPm6lTg', + descriptions: [ + { value: 'Commando Grade Hat', color: '8847ff' }, + { + value: '★ Unusual Effect: Twisted Radiance', + color: 'ffd700', + }, + { value: ' ' }, + { value: ' ' }, + { value: 'Spooky Spoils Collection' }, + { value: ' Mister Bones', color: 'eb4b4b' }, + { value: " Pyr'o Lantern", color: 'eb4b4b' }, + { value: ' Racc Mann', color: 'd32ce6' }, + { value: ' Head of the Dead', color: 'd32ce6' }, + { value: ' Elizabeth the Third', color: 'd32ce6' }, + { value: ' The Trick Stabber', color: 'd32ce6' }, + { value: ' El Zapateador', color: '8847ff' }, + { value: ' The Horrible Horns', color: '8847ff' }, + { value: '★ Skullbrero', color: '8847ff' }, + { value: ' Soviet Strongmann', color: '8847ff' }, + { value: ' Voodoo Vizier', color: '8847ff' }, + { value: " Madmann's Muzzle", color: '8847ff' }, + { value: ' BINOCULUS!', color: '4b69ff' }, + { value: ' Derangement Garment', color: '4b69ff' }, + { value: ' Convict Cap', color: '4b69ff' }, + { value: ' El Mostacho', color: '4b69ff' }, + { value: ' Candy Cranium', color: '4b69ff' }, + { value: ' Bat Hat', color: '4b69ff' }, + { value: ' Pocket Halloween Boss', color: '4b69ff' }, + { value: ' Party Poncho', color: '4b69ff' }, + { value: ' Fuel Injector', color: '4b69ff' }, + { value: ' Bread Biter', color: '4b69ff' }, + ], + tradable: 1, + actions: [ + { + link: + 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=31066&lang=en_US', + name: 'Item Wiki Page...', + }, + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D5006617706189886078', + name: 'Inspect in Game...', + }, + ], + name: 'Unusual Skullbrero', + name_color: '8650AC', + type: 'Level 57 Hat', + market_name: 'Unusual Skullbrero', + market_hash_name: 'Unusual Skullbrero', + market_actions: [ + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D5006617706189886078', + name: 'Inspect in Game...', + }, + ], + commodity: 0, + market_tradable_restriction: 7, + market_marketable_restriction: 0, + marketable: 1, + tags: [ + { + category: 'Quality', + internal_name: 'rarity4', + localized_category_name: 'Quality', + localized_tag_name: 'Unusual', + color: '8650AC', + }, + { + category: 'Type', + internal_name: 'misc', + localized_category_name: 'Type', + localized_tag_name: 'Cosmetic', + }, + { + category: 'Class', + internal_name: 'Pyro', + localized_category_name: 'Class', + localized_tag_name: 'Pyro', + }, + { + category: 'Rarity', + internal_name: 'Rarity_Mythical', + localized_category_name: 'Grade', + localized_tag_name: 'Commando', + color: '8847ff', + }, + { + category: 'Collection', + internal_name: 'halloween2019_collection_name', + localized_category_name: 'Collection', + localized_tag_name: 'Spooky Spoils Collection', + }, + ], + }; + + const attributes = parseEconItem(econ, true, true); + + const sku = toSKU(attributes); + + assert.equal(sku, '31066;5;u130'); + }) + + it('Case #5', () => { + const econ = { + appid: 440, + contextid: '2', + assetid: '8656785508', + classid: '3543846179', + instanceid: '3516082756', + amount: '1', + currency: 0, + background_color: '3C352E', + icon_url: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffjDz5zdwmTVPAOCsot8Qn-Whg07dR3XcGzuehWe1q65oHFOuQpN4kZGpOECffQZl39vho_1KdefJbbonvq3SvubmwUG028UzYUYzA', + icon_url_large: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffjDz5zdwmTVPAOCsot8Qn-Whg07dR3XcGzuehWe1q65oHFOuQpN4kZGpOECffQZl39vho_1KdefJbbonvq3SvubmwUG028UzYUYzA', + descriptions: [ + { + value: 'Commando Grade Rocket Launcher (Field-Tested)', + color: '8847ff', + }, + { value: 'Festivized', color: 'ffd700' }, + { + value: + 'Halloween: Pumpkin Bombs (spell only active during event)', + color: '7ea9d1', + }, + { value: 'Sheen: Agonizing Emerald', color: '7ea9d1' }, + { value: 'Killstreaks Active', color: '7ea9d1' }, + { + value: '\nGift from: VLaDOS | S>C.MOON YELLOW BELT', + color: '7ea9d1', + }, + { + value: + 'Date Received: Tuesday, September 10, 2019 (9:36:39) GMT', + }, + { value: ' ' }, + { value: ' ' }, + { value: 'Concealed Killer Collection' }, + { value: ' Sand Cannon Rocket Launcher', color: 'eb4b4b' }, + { value: ' Red Rock Roscoe Pistol', color: 'eb4b4b' }, + { value: ' Psychedelic Slugger Revolver', color: 'd32ce6' }, + { value: ' Purple Range Sniper Rifle', color: 'd32ce6' }, + { + value: ' Sudden Flurry Stickybomb Launcher', + color: 'd32ce6', + }, + { value: ' Night Terror Scattergun', color: '8847ff' }, + { + value: ' Carpet Bomber Stickybomb Launcher', + color: '8847ff', + }, + { + value: '✔ Woodland Warrior Rocket Launcher', + color: '8847ff', + }, + { value: ' Wrapped Reviver Medi Gun', color: '8847ff' }, + { value: ' Night Owl Sniper Rifle', color: '4b69ff' }, + { value: ' Woodsy Widowmaker SMG', color: '4b69ff' }, + { value: ' Backwoods Boomstick Shotgun', color: '4b69ff' }, + { value: ' King of the Jungle Minigun', color: '4b69ff' }, + { value: ' Masked Mender Medi Gun', color: '4b69ff' }, + { value: ' Forest Fire Flame Thrower', color: '4b69ff' }, + ], + tradable: 1, + actions: [ + { + link: + 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=15006&lang=en_US', + name: 'Item Wiki Page...', + }, + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D11534198800805877074', + name: 'Inspect in Game...', + }, + ], + fraudwarnings: [ + 'This item has been renamed.\nOriginal name: "Rocket Launcher"', + ], + name: "''post live spell rocket louncher !!!!!!!''", + name_color: 'FAFAFA', + type: '', + market_name: + 'Festivized Specialized Killstreak Woodland Warrior Rocket Launcher (Field-Tested)', + market_hash_name: + 'Festivized Specialized Killstreak Woodland Warrior Rocket Launcher (Field-Tested)', + market_actions: [ + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D11534198800805877074', + name: 'Inspect in Game...', + }, + ], + commodity: 0, + market_tradable_restriction: 7, + market_marketable_restriction: 0, + marketable: 1, + tags: [ + { + category: 'Quality', + internal_name: 'paintkitweapon', + localized_category_name: 'Quality', + localized_tag_name: 'Decorated Weapon', + color: 'FAFAFA', + }, + { + category: 'Type', + internal_name: 'primary', + localized_category_name: 'Type', + localized_tag_name: 'Primary weapon', + }, + { + category: 'Class', + internal_name: 'Soldier', + localized_category_name: 'Class', + localized_tag_name: 'Soldier', + }, + { + category: 'Rarity', + internal_name: 'Rarity_Mythical', + localized_category_name: 'Grade', + localized_tag_name: 'Commando', + color: '8847ff', + }, + { + category: 'Collection', + internal_name: 'concealedkiller_collection', + localized_category_name: 'Collection', + localized_tag_name: 'Concealed Killer Collection', + }, + { + category: 'Exterior', + internal_name: 'TFUI_InvTooltip_FieldTested', + localized_category_name: 'Exterior', + localized_tag_name: 'Field-Tested', + }, + ], + }; + + const attributes = parseEconItem(econ, true, true); + + const sku = toSKU(attributes); + + assert.equal(sku, '205;15;w3;pk6;kt-2;festive'); + }) + + it('Case #6 - with true defindex', () => { + const econ = { + appid: 440, + contextid: '2', + assetid: '8407830034', + classid: '3662018019', + instanceid: '11040671', + amount: '1', + currency: 0, + background_color: '3C352E', + icon_url: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffsDz5zdwmTVPAOCcot8Qn-Wxg07dR3XcGzub5ffwvmttSXYrAlY9xFTMaCUvbXNQz_6EkwiPRYKJaIon-9jHjrOWoUG0280KDki-w', + icon_url_large: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffsDz5zdwmTVPAOCcot8Qn-Wxg07dR3XcGzub5ffwvmttSXYrAlY9xFTMaCUvbXNQz_6EkwiPRYKJaIon-9jHjrOWoUG0280KDki-w', + descriptions: [ + { + value: 'Mercenary Grade Flame Thrower (Minimal Wear)', + color: '4b69ff', + }, + { value: '★ Unusual Effect: Cool', color: 'ffd700' }, + { value: 'Festivized', color: 'ffd700' }, + { + value: 'Extinguishing teammates restores 20 health', + color: '7ea9d1', + }, + { value: 'Sheen: Agonizing Emerald', color: '7ea9d1' }, + { value: 'Killstreaks Active', color: '7ea9d1' }, + { + value: + 'Afterburn reduces Medi Gun healing and resist shield effects.\nAlt-Fire: Release a blast of air that pushes enemies and projectiles and extinguishes teammates that are on fire.', + }, + { value: ' ' }, + { value: ' ' }, + { value: 'Concealed Killer Collection' }, + { value: ' Sand Cannon Rocket Launcher', color: 'eb4b4b' }, + { value: ' Red Rock Roscoe Pistol', color: 'eb4b4b' }, + { value: ' Psychedelic Slugger Revolver', color: 'd32ce6' }, + { value: ' Purple Range Sniper Rifle', color: 'd32ce6' }, + { + value: ' Sudden Flurry Stickybomb Launcher', + color: 'd32ce6', + }, + { value: ' Night Terror Scattergun', color: '8847ff' }, + { + value: ' Carpet Bomber Stickybomb Launcher', + color: '8847ff', + }, + { + value: ' Woodland Warrior Rocket Launcher', + color: '8847ff', + }, + { value: ' Wrapped Reviver Medi Gun', color: '8847ff' }, + { value: ' Night Owl Sniper Rifle', color: '4b69ff' }, + { value: ' Woodsy Widowmaker SMG', color: '4b69ff' }, + { value: ' Backwoods Boomstick Shotgun', color: '4b69ff' }, + { value: ' King of the Jungle Minigun', color: '4b69ff' }, + { value: ' Masked Mender Medi Gun', color: '4b69ff' }, + { value: '★ Forest Fire Flame Thrower', color: '4b69ff' }, + ], + tradable: 1, + actions: [ + { + link: + 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=15005&lang=en_US', + name: 'Item Wiki Page...', + }, + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D6922402693932635553', + name: 'Inspect in Game...', + }, + ], + name: 'Festivized Forest Fire Flame Thrower', + name_color: '8650AC', + type: '', + market_name: + 'Unusual Festivized Specialized Killstreak Forest Fire Flame Thrower (Minimal Wear)', + market_hash_name: + 'Unusual Festivized Specialized Killstreak Forest Fire Flame Thrower (Minimal Wear)', + market_actions: [ + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D6922402693932635553', + name: 'Inspect in Game...', + }, + ], + commodity: 0, + market_tradable_restriction: 7, + market_marketable_restriction: 0, + marketable: 1, + tags: [ + { + category: 'Quality', + internal_name: 'rarity4', + localized_category_name: 'Quality', + localized_tag_name: 'Unusual', + color: '8650AC', + }, + { + category: 'Type', + internal_name: 'primary', + localized_category_name: 'Type', + localized_tag_name: 'Primary weapon', + }, + { + category: 'Class', + internal_name: 'Pyro', + localized_category_name: 'Class', + localized_tag_name: 'Pyro', + }, + { + category: 'Rarity', + internal_name: 'Rarity_Rare', + localized_category_name: 'Grade', + localized_tag_name: 'Mercenary', + color: '4b69ff', + }, + { + category: 'Collection', + internal_name: 'concealedkiller_collection', + localized_category_name: 'Collection', + localized_tag_name: 'Concealed Killer Collection', + }, + { + category: 'Exterior', + internal_name: 'TFUI_InvTooltip_MinimalWear', + localized_category_name: 'Exterior', + localized_tag_name: 'Minimal Wear', + }, + ], + }; + + const attributes = parseEconItem(econ, true, true, { useTrueDefindex: true }); + + const sku = toSKU(attributes); + + assert.equal(sku, '15005;5;u703;w2;pk9;kt-2;festive'); + }) + + it('Case #7 - with true defindex', () => { + const econ = { + appid: 440, + contextid: '2', + assetid: '8656785508', + classid: '3543846179', + instanceid: '3516082756', + amount: '1', + currency: 0, + background_color: '3C352E', + icon_url: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffjDz5zdwmTVPAOCsot8Qn-Whg07dR3XcGzuehWe1q65oHFOuQpN4kZGpOECffQZl39vho_1KdefJbbonvq3SvubmwUG028UzYUYzA', + icon_url_large: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEMaQkUTxr2vTx8mMnvA-aHAfQ_ktk664MayTdinxVwPffjDz5zdwmTVPAOCsot8Qn-Whg07dR3XcGzuehWe1q65oHFOuQpN4kZGpOECffQZl39vho_1KdefJbbonvq3SvubmwUG028UzYUYzA', + descriptions: [ + { + value: 'Commando Grade Rocket Launcher (Field-Tested)', + color: '8847ff', + }, + { value: 'Festivized', color: 'ffd700' }, + { + value: + 'Halloween: Pumpkin Bombs (spell only active during event)', + color: '7ea9d1', + }, + { value: 'Sheen: Agonizing Emerald', color: '7ea9d1' }, + { value: 'Killstreaks Active', color: '7ea9d1' }, + { + value: '\nGift from: VLaDOS | S>C.MOON YELLOW BELT', + color: '7ea9d1', + }, + { + value: + 'Date Received: Tuesday, September 10, 2019 (9:36:39) GMT', + }, + { value: ' ' }, + { value: ' ' }, + { value: 'Concealed Killer Collection' }, + { value: ' Sand Cannon Rocket Launcher', color: 'eb4b4b' }, + { value: ' Red Rock Roscoe Pistol', color: 'eb4b4b' }, + { value: ' Psychedelic Slugger Revolver', color: 'd32ce6' }, + { value: ' Purple Range Sniper Rifle', color: 'd32ce6' }, + { + value: ' Sudden Flurry Stickybomb Launcher', + color: 'd32ce6', + }, + { value: ' Night Terror Scattergun', color: '8847ff' }, + { + value: ' Carpet Bomber Stickybomb Launcher', + color: '8847ff', + }, + { + value: '✔ Woodland Warrior Rocket Launcher', + color: '8847ff', + }, + { value: ' Wrapped Reviver Medi Gun', color: '8847ff' }, + { value: ' Night Owl Sniper Rifle', color: '4b69ff' }, + { value: ' Woodsy Widowmaker SMG', color: '4b69ff' }, + { value: ' Backwoods Boomstick Shotgun', color: '4b69ff' }, + { value: ' King of the Jungle Minigun', color: '4b69ff' }, + { value: ' Masked Mender Medi Gun', color: '4b69ff' }, + { value: ' Forest Fire Flame Thrower', color: '4b69ff' }, + ], + tradable: 1, + actions: [ + { + link: + 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=15006&lang=en_US', + name: 'Item Wiki Page...', + }, + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D11534198800805877074', + name: 'Inspect in Game...', + }, + ], + fraudwarnings: [ + 'This item has been renamed.\nOriginal name: "Rocket Launcher"', + ], + name: "''post live spell rocket louncher !!!!!!!''", + name_color: 'FAFAFA', + type: '', + market_name: + 'Festivized Specialized Killstreak Woodland Warrior Rocket Launcher (Field-Tested)', + market_hash_name: + 'Festivized Specialized Killstreak Woodland Warrior Rocket Launcher (Field-Tested)', + market_actions: [ + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D11534198800805877074', + name: 'Inspect in Game...', + }, + ], + commodity: 0, + market_tradable_restriction: 7, + market_marketable_restriction: 0, + marketable: 1, + tags: [ + { + category: 'Quality', + internal_name: 'paintkitweapon', + localized_category_name: 'Quality', + localized_tag_name: 'Decorated Weapon', + color: 'FAFAFA', + }, + { + category: 'Type', + internal_name: 'primary', + localized_category_name: 'Type', + localized_tag_name: 'Primary weapon', + }, + { + category: 'Class', + internal_name: 'Soldier', + localized_category_name: 'Class', + localized_tag_name: 'Soldier', + }, + { + category: 'Rarity', + internal_name: 'Rarity_Mythical', + localized_category_name: 'Grade', + localized_tag_name: 'Commando', + color: '8847ff', + }, + { + category: 'Collection', + internal_name: 'concealedkiller_collection', + localized_category_name: 'Collection', + localized_tag_name: 'Concealed Killer Collection', + }, + { + category: 'Exterior', + internal_name: 'TFUI_InvTooltip_FieldTested', + localized_category_name: 'Exterior', + localized_tag_name: 'Field-Tested', + }, + ], + }; + + const attributes = parseEconItem(econ, true, true, { useTrueDefindex: true }); + + const sku = toSKU(attributes); + + assert.equal(sku, '15006;15;w3;pk6;kt-2;festive'); + }) +}); + +describe('SKU to Name', () => { + it('Case #1', () => { + const sku = '9258;5;uncraftable;td-30917'; + + const attributes = parseSKU(sku); + + const name = stringify(attributes); + + assert.equal(name, 'Non-Craftable Unusual Taunt: The Trackman\'s Touchdown Unusualifier'); + }); + + it('Case #2', () => { + const sku = '31146;5;u159'; + + const attributes = parseSKU(sku); + + const name = stringify(attributes); + + assert.equal(name, 'Pyroland Nightmare Calamitous Cauldron'); + }); + + it('Case #3', () => { + const sku = '1071;11;kt-3'; + + const attributes = parseSKU(sku); + + const name = stringify(attributes); + + assert.equal(name, 'Strange Professional Killstreak Golden Frying Pan'); + }); + + it('Case #4', () => { + const sku = '6526;6;uncraftable;kt-3;td-201'; + + const attributes = parseSKU(sku); + + const name = stringify(attributes); + + assert.equal(name, 'Non-Craftable Professional Killstreak Sniper Rifle Kit'); + }); + + it('Case #5', () => { + const sku = '211;11;australium;kt-3;festive'; + + const attributes = parseSKU(sku); + + const name = stringify(attributes); + + assert.equal(name, 'Strange Festivized Professional Killstreak Australium Medi Gun'); + }); + + it('Case #6', () => { + const sku = '211;11;australium;kt-3'; + + const attributes = parseSKU(sku); + + const name = stringify(attributes); + + assert.equal(name, 'Strange Professional Killstreak Australium Medi Gun'); + }); + + it('Case #7', () => { + const sku = '792;11;kt-3'; + + const attributes = parseSKU(sku); + + const name = stringify(attributes); + + assert.equal(name, 'Strange Professional Killstreak Silver Botkiller Sniper Rifle Mk.I'); + }) +}); + +describe('SKU to Listing', () => { + it('Case #1', () => { + const sku = '9258;5;uncraftable;td-30917'; + + const attributes = parseSKU(sku); + + const listing = createBPListing(attributes); + + assert.deepEqual(listing, { + quality: 5, + craftable: 0, + item_name: 'Unusualifier', + priceindex: 30917 + }); + }); + + it('Case #2', () => { + const sku = '31146;5;u159'; + + const attributes = parseSKU(sku); + + const listing = createBPListing(attributes); + + assert.deepEqual(listing, { + quality: 5, + craftable: 1, + item_name: 'Calamitous Cauldron', + priceindex: 159 + }); + }); + + it('Case #3', () => { + const sku = '1071;11;kt-3'; + + const attributes = parseSKU(sku); + + const listing = createBPListing(attributes); + + assert.deepEqual(listing, { + quality: 11, + craftable: 1, + item_name: 'Professional Killstreak Golden Frying Pan', + priceindex: 0 + }); + }); + + it('Case #4', () => { + const sku = '6526;6;uncraftable;kt-3;td-201'; + + const attributes = parseSKU(sku); + + const listing = createBPListing(attributes); + + assert.deepEqual(listing, { + quality: 6, + craftable: 0, + item_name: 'Professional Killstreak Kit', + priceindex: '3-201' + }); + }); + + it('Case #5', () => { + const sku = '211;11;australium;kt-3;festive'; + + const attributes = parseSKU(sku); + + const listing = createBPListing(attributes); + + assert.deepEqual(listing, { + quality: 11, + craftable: 1, + item_name: 'Festivized Professional Killstreak Australium Medi Gun', + priceindex: 0 + }); + }); + + it('Case #6', () => { + const sku = '211;11;australium;kt-3'; + + const attributes = parseSKU(sku); + + const listing = createBPListing(attributes); + + assert.deepEqual(listing, { + quality: 11, + craftable: 1, + item_name: 'Professional Killstreak Australium Medi Gun', + priceindex: 0 + }); + }); + + it('Case #7', () => { + const sku = '792;11;kt-3'; + + const attributes = parseSKU(sku); + + const listing = createBPListing(attributes); + + assert.deepEqual(listing, { + quality: 11, + craftable: 1, + item_name: 'Professional Killstreak Silver Botkiller Sniper Rifle Mk.I', + priceindex: 0 + }); + }) +}); + +describe('Econ to Listing', () => { + it('Case #1', () => { + const econ = { + appid: 440, + contextid: '2', + assetid: '8733746813', + classid: '221512872', + instanceid: '92637229', + amount: '1', + currency: 0, + background_color: '3C352E', + icon_url: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEDe1VBDEjdqCEX2PfnGOaDBeEUlNQK6ZFH3jMlwwB_Y7vhZ2Q0JFKQAKQJXadrpF6-UXE268I3UNHg8esHfF28tdHHO65sbo88eQy8bA', + icon_url_large: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEDe1VBDEjdqCEX2PfnGOaDBeEUlNQK6ZFH3jMlwwB_Y7vhZ2Q0JFKQAKQJXadrpF6-UXE268I3UNHg8esHfF28tdHHO65sbo88eQy8bA', + descriptions: [ + { + value: 'Holiday Restriction: Halloween / Full Moon', + color: 'd83636', + }, + { + value: + 'Halloween: Spectral Spectrum (spell only active during event)', + color: '7ea9d1', + }, + { value: '' }, + ], + tradable: 1, + actions: [ + { + link: + 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=30290&lang=en_US', + name: 'Item Wiki Page...', + }, + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D16238051287194648628', + name: 'Inspect in Game...', + }, + ], + name: 'Haunted PY-40 Incinibot', + name_color: '38f3ab', + type: 'Level 58 Mask', + market_name: 'Haunted PY-40 Incinibot', + market_hash_name: 'Haunted PY-40 Incinibot', + market_actions: [ + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D16238051287194648628', + name: 'Inspect in Game...', + }, + ], + commodity: 0, + market_tradable_restriction: 7, + market_marketable_restriction: 0, + marketable: 1, + tags: [ + { + category: 'Quality', + internal_name: 'haunted', + localized_category_name: 'Quality', + localized_tag_name: 'Haunted', + color: '38f3ab', + }, + { + category: 'Type', + internal_name: 'misc', + localized_category_name: 'Type', + localized_tag_name: 'Cosmetic', + }, + { + category: 'Class', + internal_name: 'Pyro', + localized_category_name: 'Class', + localized_tag_name: 'Pyro', + }, + ], + }; + + const attributes = parseEconItem(econ, true, true); + + const listing = createBPListing(attributes); + + assert.deepEqual(listing, { + quality: 13, + craftable: 1, + item_name: 'PY-40 Incinibot', + priceindex: 0 + }); + }) + + it('Case #2', () => { + const econ = { + appid: 440, + contextid: '2', + assetid: '8610658018', + classid: '171010366', + instanceid: '176498576', + amount: '1', + currency: 0, + background_color: '3C352E', + icon_url: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEbfgYfXh7wqwdTmsHiCM2ACfIHnpRh5MkG3G8zyVMpYebiYm8wdFGTBPILC_BvrQu9X3RqupQ6AYPhp-wHZ0yx43BgcxIX', + icon_url_large: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEbfgYfXh7wqwdTmsHiCM2ACfIHnpRh5MkG3G8zyVMpYebiYm8wdFGTBPILC_BvrQu9X3RqupQ6AYPhp-wHZ0yx43BgcxIX', + descriptions: [ + { value: '★ Unusual Effect: Smoking', color: 'ffd700' }, + ], + tradable: 1, + actions: [ + { + link: + 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=318&lang=en_US', + name: 'Item Wiki Page...', + }, + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D10290164463146604828', + name: 'Inspect in Game...', + }, + ], + name: "Unusual Prancer's Pride", + name_color: '8650AC', + type: 'Level 88 Hat', + market_name: "Unusual Prancer's Pride", + market_hash_name: "Unusual Prancer's Pride", + market_actions: [ + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D10290164463146604828', + name: 'Inspect in Game...', + }, + ], + commodity: 0, + market_tradable_restriction: 7, + market_marketable_restriction: 0, + marketable: 1, + tags: [ + { + category: 'Quality', + internal_name: 'rarity4', + localized_category_name: 'Quality', + localized_tag_name: 'Unusual', + color: '8650AC', + }, + { + category: 'Type', + internal_name: 'misc', + localized_category_name: 'Type', + localized_tag_name: 'Cosmetic', + }, + { + category: 'Class', + internal_name: 'Pyro', + localized_category_name: 'Class', + localized_tag_name: 'Pyro', + }, + ], + }; + + const attributes = parseEconItem(econ, true, true); + + const listing = createBPListing(attributes); + + assert.deepEqual(listing, { + quality: 5, + craftable: 1, + item_name: "Prancer's Pride", + priceindex: 35 + }); + }); + + it('Case #3', () => { + const econ = { + appid: 440, + contextid: '2', + assetid: '8555715171', + classid: '3717643208', + instanceid: '344437314', + amount: '1', + currency: 0, + background_color: '3C352E', + icon_url: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEJeQQaWA_dtDlRj82oVPeJUbRTyohkssUGjDBox1IsNrKxaWc1JFWQWPYHDKFsow2_WyVlv4lzWtBtJvRLsg', + icon_url_large: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEJeQQaWA_dtDlRj82oVPeJUbRTyohkssUGjDBox1IsNrKxaWc1JFWQWPYHDKFsow2_WyVlv4lzWtBtJvRLsg', + descriptions: [ + { value: "★ Unusual Effect: Nuts n' Bolts", color: 'ffd700' }, + { value: "''hmm epic''" }, + ], + tradable: 1, + actions: [ + { + link: + 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=434&lang=en_US', + name: 'Item Wiki Page...', + }, + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D16442165943709427870', + name: 'Inspect in Game...', + }, + ], + name: 'Unusual Brain Bucket', + name_color: '8650AC', + type: 'Level 82 Hat', + market_name: 'Unusual Brain Bucket', + market_hash_name: 'Unusual Brain Bucket', + market_actions: [ + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D16442165943709427870', + name: 'Inspect in Game...', + }, + ], + commodity: 0, + market_tradable_restriction: 7, + market_marketable_restriction: 0, + marketable: 1, + tags: [ + { + category: 'Quality', + internal_name: 'rarity4', + localized_category_name: 'Quality', + localized_tag_name: 'Unusual', + color: '8650AC', + }, + { + category: 'Type', + internal_name: 'misc', + localized_category_name: 'Type', + localized_tag_name: 'Cosmetic', + }, + { + category: 'Class', + internal_name: 'Soldier', + localized_category_name: 'Class', + localized_tag_name: 'Soldier', + }, + ], + }; + + const attributes = parseEconItem(econ, true, true); + + const listing = createBPListing(attributes); + + assert.deepEqual(listing, { quality: 5, craftable: 1, item_name: 'Brain Bucket', priceindex: 31 }); + }) + + it('Case #4', () => { + const econ = { + appid: 440, + contextid: '2', + assetid: '8574678947', + classid: '3555490789', + instanceid: '856289751', + amount: '1', + currency: 0, + background_color: '3C352E', + icon_url: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEDewlDDUq7hytIncTqD-CJGu8_l9sn4pUbi2Ftw1ApbbXtNmM_cVTEV_lbWaw7pQu0W3Rr6sVlAdPvoOhScFnt4pyGbefmPm6lTg', + icon_url_large: + 'fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEDewlDDUq7hytIncTqD-CJGu8_l9sn4pUbi2Ftw1ApbbXtNmM_cVTEV_lbWaw7pQu0W3Rr6sVlAdPvoOhScFnt4pyGbefmPm6lTg', + descriptions: [ + { value: 'Commando Grade Hat', color: '8847ff' }, + { + value: '★ Unusual Effect: Twisted Radiance', + color: 'ffd700', + }, + { value: ' ' }, + { value: ' ' }, + { value: 'Spooky Spoils Collection' }, + { value: ' Mister Bones', color: 'eb4b4b' }, + { value: " Pyr'o Lantern", color: 'eb4b4b' }, + { value: ' Racc Mann', color: 'd32ce6' }, + { value: ' Head of the Dead', color: 'd32ce6' }, + { value: ' Elizabeth the Third', color: 'd32ce6' }, + { value: ' The Trick Stabber', color: 'd32ce6' }, + { value: ' El Zapateador', color: '8847ff' }, + { value: ' The Horrible Horns', color: '8847ff' }, + { value: '★ Skullbrero', color: '8847ff' }, + { value: ' Soviet Strongmann', color: '8847ff' }, + { value: ' Voodoo Vizier', color: '8847ff' }, + { value: " Madmann's Muzzle", color: '8847ff' }, + { value: ' BINOCULUS!', color: '4b69ff' }, + { value: ' Derangement Garment', color: '4b69ff' }, + { value: ' Convict Cap', color: '4b69ff' }, + { value: ' El Mostacho', color: '4b69ff' }, + { value: ' Candy Cranium', color: '4b69ff' }, + { value: ' Bat Hat', color: '4b69ff' }, + { value: ' Pocket Halloween Boss', color: '4b69ff' }, + { value: ' Party Poncho', color: '4b69ff' }, + { value: ' Fuel Injector', color: '4b69ff' }, + { value: ' Bread Biter', color: '4b69ff' }, + ], + tradable: 1, + actions: [ + { + link: + 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=31066&lang=en_US', + name: 'Item Wiki Page...', + }, + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D5006617706189886078', + name: 'Inspect in Game...', + }, + ], + name: 'Unusual Skullbrero', + name_color: '8650AC', + type: 'Level 57 Hat', + market_name: 'Unusual Skullbrero', + market_hash_name: 'Unusual Skullbrero', + market_actions: [ + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D5006617706189886078', + name: 'Inspect in Game...', + }, + ], + commodity: 0, + market_tradable_restriction: 7, + market_marketable_restriction: 0, + marketable: 1, + tags: [ + { + category: 'Quality', + internal_name: 'rarity4', + localized_category_name: 'Quality', + localized_tag_name: 'Unusual', + color: '8650AC', + }, + { + category: 'Type', + internal_name: 'misc', + localized_category_name: 'Type', + localized_tag_name: 'Cosmetic', + }, + { + category: 'Class', + internal_name: 'Pyro', + localized_category_name: 'Class', + localized_tag_name: 'Pyro', + }, + { + category: 'Rarity', + internal_name: 'Rarity_Mythical', + localized_category_name: 'Grade', + localized_tag_name: 'Commando', + color: '8847ff', + }, + { + category: 'Collection', + internal_name: 'halloween2019_collection_name', + localized_category_name: 'Collection', + localized_tag_name: 'Spooky Spoils Collection', + }, + ], + }; + + const attributes = parseEconItem(econ, true, true); + + const listing = createBPListing(attributes); + + assert.deepEqual(listing, { quality: 5, craftable: 1, item_name: 'Skullbrero', priceindex: 130 }); + }) + + it('Case #5', () => { + const econ = { + appid: 440, + contextid: '2', + assetid: '8434754722', + classid: '88783771', + instanceid: '92739934', + amount: '1', + currency: 0, + background_color: '3C352E', + icon_url: + 'IzMF03bi9WpSBq-S-ekoE33L-iLqGFHVaU25ZzQNQcXdEH9myp0erksICfTcePMQFc1nqWSMU5OD2NwOx3sIyShXOjLx2Sk5MbUqMcbBnQz4ruyeU2DgVzPLKCnYCGFgGOIYfAeFr3HysPORE2vPELl_RQEMdaFX9GxObM-BOEE_goVdrTXqlBwkHRNxJ5VFcVbihGQdNlNSNRp3', + icon_url_large: + 'IzMF03bi9WpSBq-S-ekoE33L-iLqGFHVaU25ZzQNQcXdEH9myp0erksICfTcePMQFc1nqWSMU5OD2NwOx3sIyShXOjLx2Sk5MbUqMcbBnQz4ruyeU2DgVzPLKCnYCGFgGOIYfAeFr3HysPORE2vPELl_RQEMdaFX9GxObM-BOEE_goVdrTXqlBwkHRNxJ5VFcVbihGQdNlNSNRp3', + descriptions: [ + { + value: "Paint Color: Noble Hatter's Violet", + color: '756b5e', + }, + { + value: + 'Halloween: Spectral Spectrum (spell only active during event)', + color: '7ea9d1', + }, + { + value: + "The K-9 mane is perfect for tricky social situations. People will either only want to talk about the hat, which means they'll be distracted from that rash making its way up your jugular,or they'll avoid you altogether. It's a win/win!", + }, + ], + tradable: 1, + actions: [ + { + link: + 'http://wiki.teamfortress.com/scripts/itemredirect.php?id=876&lang=en_US', + name: 'Item Wiki Page...', + }, + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20S%owner_steamid%A%assetid%D7378163898213210976', + name: 'Inspect in Game...', + }, + ], + name: 'Genuine K-9 Mane', + name_color: '4D7455', + type: 'Level 1 Spirit Animal', + market_name: 'Genuine K-9 Mane', + market_hash_name: 'Genuine K-9 Mane', + market_actions: [ + { + link: + 'steam://rungame/440/76561202255233023/+tf_econ_item_preview%20M%listingid%A%assetid%D7378163898213210976', + name: 'Inspect in Game...', + }, + ], + commodity: 0, + market_tradable_restriction: 7, + market_marketable_restriction: 0, + marketable: 1, + tags: [ + { + category: 'Quality', + internal_name: 'rarity1', + localized_category_name: 'Quality', + localized_tag_name: 'Genuine', + color: '4D7455', + }, + { + category: 'Type', + internal_name: 'misc', + localized_category_name: 'Type', + localized_tag_name: 'Cosmetic', + }, + { + category: 'Class', + internal_name: 'Demoman', + localized_category_name: 'Class', + localized_tag_name: 'Demoman', + }, + { + category: 'Class', + internal_name: 'Heavy', + localized_category_name: 'Class', + localized_tag_name: 'Heavy', + }, + ], + }; + + const attributes = parseEconItem(econ, true, true); + + const listing = createBPListing(attributes); + + assert.deepEqual(listing, { quality: 1, craftable: 1, item_name: 'K-9 Mane', priceindex: 0 }); + }) +}); diff --git a/test/parseString.js b/test/parseString.js index 620725f..43e8326 100644 --- a/test/parseString.js +++ b/test/parseString.js @@ -1,2009 +1,2019 @@ -const { assert } = require('chai'); - -const { parseString, schema, Schema } = require('../dist/static'); -const { createFormat } = require('../dist'); - -describe('parseString', () => { - it('Case #1', () => { - const itemObject = parseString( - 'Cool Killstreak Aqua Marine Rocket Launcher (Battle Scarred)' - ); - - assert.deepEqual(itemObject, { - name: 'Rocket Launcher', - craftable: true, - killstreak: 'Killstreak', - wear: 'Battle Scarred', - texture: 'Aqua Marine', - effect: 'Cool', - quality: 'Unusual', - }); - }); - - it('Case #2', () => { - const itemObject = parseString( - "Strange High Roller's Rocket Launcher (Factory New)" - ); - - assert.deepEqual(itemObject, { - name: 'Rocket Launcher', - craftable: true, - wear: 'Factory New', - texture: "High Roller's", - quality: 'Strange', - }); - }); - - it('Case #3', () => { - const itemObject = parseString( - "Collector's Battalion's Backup Chemistry Set" - ); - - assert.deepEqual(itemObject, { - name: 'Chemistry Set', - craftable: true, - output: "Battalion's Backup", - outputQuality: "Collector's", - quality: 'Unique', - }); - }); - - it('Case #4', () => { - const itemObject = parseString( - 'Strange Festivized Professional Killstreak Australium Scattergun' - ); - - assert.deepEqual(itemObject, { - name: 'Scattergun', - craftable: true, - australium: true, - festivized: true, - killstreak: 'Professional Killstreak', - quality: 'Strange', - }); - }); - - it('Case #5', () => { - const itemObject = parseString('Demonflame Modest Pile of Hat'); - - assert.deepEqual(itemObject, { - name: 'Modest Pile of Hat', - craftable: true, - effect: 'Demonflame', - quality: 'Unusual', - }); - }); - - it('Case #6', () => { - const itemObject = parseString('Strange Omniscient Orb Balloonihoodie'); - - assert.deepEqual(itemObject, { - name: 'Balloonihoodie', - craftable: true, - effect: 'Omniscient Orb', - quality: 'Unusual', - elevated: true, - }); - }); - - it('Case #7', () => { - const itemObject = parseString( - 'Non-Craftable Specialized Killstreak Gunboats Kit Fabricator' - ); - - assert.deepEqual(itemObject, { - name: 'Specialized Killstreak Kit Fabricator', - craftable: false, - killstreak: 'Specialized Killstreak', - target: 'Gunboats', - quality: 'Unique', - }); - }); - - it('Case #8', () => { - const itemObject = parseString('Archimedes Strangifier Chemistry Set'); - - assert.deepEqual(itemObject, { - name: 'Chemistry Set', - craftable: true, - target: 'Archimedes', - output: 'Strangifier', - outputQuality: 'Unique', - quality: 'Unique', - }); - }); - - it('Case #9', () => { - const itemObject = parseString('Strange Backwards Ballcap'); - - assert.deepEqual(itemObject, { - name: 'Backwards Ballcap', - craftable: true, - quality: 'Strange', - }); - }); - - it('Case #10', () => { - const itemObject = parseString( - 'Professional Killstreak Iron Curtain Kit Fabricator' - ); - - assert.deepEqual(itemObject, { - name: 'Professional Killstreak Kit Fabricator', - craftable: true, - killstreak: 'Professional Killstreak', - target: 'Iron Curtain', - quality: 'Unique', - }); - }); - - it('Case #11', () => { - const itemObject = parseString( - 'Strange Professional Killstreak Festive Grenade Launcher' - ); - - assert.deepEqual(itemObject, { - name: 'Festive Grenade Launcher', - craftable: true, - killstreak: 'Professional Killstreak', - quality: 'Strange', - }); - }); - - it('Case #12', () => { - const itemObject = parseString('Strange Unique Sniper Rifle'); - - assert.deepEqual(itemObject, { - name: 'Sniper Rifle', - craftable: true, - quality: 'Unique', - elevated: true, - }); - }); - - it('Case #13', () => { - const itemObject = parseString('Australium Gold'); - - assert.deepEqual(itemObject, { - name: 'Australium Gold', - craftable: true, - quality: 'Unique', - }); - }); - - it('Case #14', () => { - const itemObject = parseString('Blue Moon Case #118'); - - assert.deepEqual(itemObject, { - name: 'Blue Moon Case', - craftable: true, - itemNumber: { type: 'crate', value: 118 }, - quality: 'Unique', - }); - }); - - it('Case #15', () => { - const itemObject = parseString('Hat #25'); - - assert.deepEqual(itemObject, { - name: 'Hat', - craftable: true, - itemNumber: { type: 'craft', value: 25 }, - quality: 'Unique', - }); - }); - - it('Case #16', () => { - const itemObject = parseString('The Tartan Shade'); - - assert.deepEqual(itemObject, { - name: 'Tartan Shade', - craftable: true, - quality: 'Unique', - isUniqueHat: true, - }); - }); - - it('Case #17', () => { - const itemObject = parseString('Strange Cool Breeze'); - - assert.deepEqual(itemObject, { - name: 'Cool Breeze', - craftable: true, - quality: 'Strange', - }); - }); - - it('Case #18', () => { - const itemObject = parseString('Strange Hot Case'); - - assert.deepEqual(itemObject, { - name: 'Hot Case', - craftable: true, - quality: 'Strange', - }); - }); - - it('Case #18', () => { - const itemObject = parseString('Strange Hot Heels'); - - assert.deepEqual(itemObject, { - name: 'Hot Heels', - craftable: true, - quality: 'Strange', - }); - }); - - it('Case #19', () => { - const itemObject = parseString('Strange A Head Full of Hot Air'); - - assert.deepEqual(itemObject, { - name: 'A Head Full of Hot Air', - craftable: true, - quality: 'Strange', - }); - }); - - it('Case #20', () => { - const itemObject = parseString('Strange Vintage Tyrolean'); - - assert.deepEqual(itemObject, { - name: 'Vintage Tyrolean', - quality: 'Strange', - craftable: true, - }); - }); - - it('Case #21', () => { - const itemObject = parseString('Strange Vintage Vintage Tyrolean'); - - assert.deepEqual(itemObject, { - name: 'Vintage Tyrolean', - quality: 'Vintage', - elevated: true, - craftable: true, - }); - }); - - it('Case #22', () => { - const itemObject = parseString('Vintage Tyrolean'); - - assert.deepEqual(itemObject, { - name: 'Vintage Tyrolean', - quality: 'Unique', - craftable: true, - }); - }); - - it('Case #23', () => { - const itemObject = parseString('Vintage Vintage Tyrolean'); - - assert.deepEqual(itemObject, { - name: 'Vintage Tyrolean', - quality: 'Vintage', - craftable: true, - }); - }); - - it('Case #24', () => { - const itemObject = parseString('Strange Haunted Hat'); - - assert.deepEqual(itemObject, { - name: 'Haunted Hat', - quality: 'Strange', - craftable: true, - }); - }); - - it('Case #25', () => { - const itemObject = parseString('Strange Haunted Haunted Hat'); - - assert.deepEqual(itemObject, { - name: 'Haunted Hat', - quality: 'Haunted', - elevated: true, - craftable: true, - }); - }); - - it('Case #26', () => { - const itemObject = parseString('Haunted Hat'); - - assert.deepEqual(itemObject, { - name: 'Haunted Hat', - quality: 'Unique', - craftable: true, - }); - }); - - it('Case #27', () => { - const itemObject = parseString('Haunted Haunted Hat'); - - assert.deepEqual(itemObject, { - name: 'Haunted Hat', - quality: 'Haunted', - craftable: true, - }); - }); - - it('Case #28', () => { - const itemObject = parseString( - 'Eerie Orbiting Fire Condor Cap', - false, - false - ); - - assert.deepEqual(itemObject, { - name: 'Condor Cap', - quality: 'Unusual', - effect: 'Eerie Orbiting Fire', - craftable: true, - }); - }); - - it('Case #29', () => { - const itemObject = parseString( - 'Haunted Ghosts War Paint (Battle Scarred)', - false, - false - ); - - assert.deepEqual(itemObject, { - name: 'War Paint', - quality: 'Decorated Weapon', - texture: 'Haunted Ghosts', - craftable: true, - wear: 'Battle Scarred', - }); - }); - - it('Case #30', () => { - const itemObject = parseString( - 'Spellbound Aspect Taunt: Most Wanted', - false, - false - ); - - assert.deepEqual(itemObject, { - name: 'Taunt: Most Wanted', - quality: 'Unusual', - effect: 'Spellbound Aspect', - craftable: true, - }); - }); - - it('Case #31', () => { - const itemObject = parseString( - 'Haunted Phantasm Jr Bonk Boy', - false, - false - ); - - assert.deepEqual(itemObject, { - name: 'Bonk Boy', - quality: 'Unusual', - effect: 'Haunted Phantasm Jr', - craftable: true, - }); - }); - - it('Case #32', () => { - const itemObject = parseString( - 'Ghastly Ghosts Jr Bonk Boy', - false, - false - ); - - assert.deepEqual(itemObject, { - name: 'Bonk Boy', - quality: 'Unusual', - effect: 'Ghastly Ghosts Jr', - craftable: true, - }); - }); - - it('Case #33', () => { - const itemObject = parseString( - 'Haunted Ghosts Battle Boonie', - false, - false - ); - - assert.deepEqual(itemObject, { - name: 'Battle Boonie', - quality: 'Unusual', - effect: 'Haunted Ghosts', - craftable: true, - }); - }); - - it('Case #34', () => { - const itemObject = parseString('Smoking Jacket', false, false); - - assert.deepEqual(itemObject, { - name: 'Smoking Jacket', - craftable: true, - quality: 'Unique', - }); - }); - - it('Case #35', () => { - const itemObject = parseString( - 'Smoking Smoking Skid Lid', - false, - false - ); - - assert.deepEqual(itemObject, { - name: 'Smoking Skid Lid', - craftable: true, - quality: 'Unusual', - effect: 'Smoking', - }); - }); - - it('Case #36', () => { - const itemObject = parseString( - 'Purple Energy Smoking Skid Lid', - false, - false - ); - - assert.deepEqual(itemObject, { - name: 'Smoking Skid Lid', - craftable: true, - quality: 'Unusual', - effect: 'Purple Energy', - }); - }); - - it('Case #37', () => { - const itemObject = parseString('Smoking Skid Lid', false, false); - - assert.deepEqual(itemObject, { - name: 'Smoking Skid Lid', - craftable: true, - quality: 'Unique', - }); - }); - - it('Case #38', () => { - const itemObject = parseString( - 'Strange Cosmetic Part: Kills', - false, - false - ); - - assert.deepEqual(itemObject, { - name: 'Strange Cosmetic Part: Kills', - craftable: true, - quality: 'Unique', - }); - }); - - it('Case #39', () => { - const itemObject = parseString('The Value of Teamwork', false, false); - - assert.deepEqual(itemObject, { - name: 'The Value of Teamwork', - craftable: true, - quality: 'Unique', - }); - }); - - it('Case #40', () => { - const itemObject = parseString( - 'The Essential Accessories', - false, - false - ); - - assert.deepEqual(itemObject, { - name: 'The Essential Accessories', - craftable: true, - quality: 'Unique', - }); - }); - - it('Case #41', () => { - const itemObject = parseString('Genuine Atomic Accolade', false, false); - - assert.deepEqual(itemObject, { - name: 'Atomic Accolade', - craftable: true, - quality: 'Genuine', - }); - }); - - it('Case #42', () => { - const itemObject = parseString('Bonk! Atomic Punch', false, false); - - assert.deepEqual(itemObject, { - name: 'Bonk! Atomic Punch', - craftable: true, - quality: 'Unique', - }); - }); - - it('Case #43 - Item with native `The` with craft number', () => { - const itemObject = parseString( - 'The Concealed Killer Weapons Case #93', - false, - false - ); - - assert.deepEqual(itemObject, { - name: 'The Concealed Killer Weapons Case', - craftable: true, - quality: 'Unique', - itemNumber: { type: 'crate', value: 93 }, - }); - }); - - it('Case #44 - Old retired keys', () => { - const itemObject = parseString( - 'Non-Craftable Naughty Winter Crate Key 2014', - false, - false - ); - - assert.deepEqual(itemObject, { - name: 'Naughty Winter Crate Key 2014', - craftable: false, - quality: 'Unique', - }); - }); - - it('Case #45 - Munition case', () => { - const itemObject = parseString( - 'Mann Co. Supply Munition #83', - false, - false - ); - - assert.deepEqual(itemObject, { - name: 'Mann Co. Supply Munition', - craftable: true, - quality: 'Unique', - itemNumber: { value: 83, type: 'crate' }, - }); - }); - - it('Case #46 - Taunt: The Hot Wheeler', () => { - const itemObject = parseString('Taunt: The Hot Wheeler', false, false); - - assert.deepEqual(itemObject, { - name: 'Taunt: The Hot Wheeler', - craftable: true, - quality: 'Unique', - }); - }); -}); - -describe('parseString with numbers', () => { - it('Case #1', () => { - const itemObject = parseString( - 'Cool Killstreak Aqua Marine Rocket Launcher (Battle Scarred)', - true, - false - ); - - assert.deepEqual(itemObject, { - name: 'Rocket Launcher', - craftable: true, - killstreak: 1, - wear: 5, - texture: 57, - effect: 703, - quality: 5, - }); - }); - - it('Case #2', () => { - const itemObject = parseString( - "Strange High Roller's Rocket Launcher (Factory New)", - true, - false - ); - - assert.deepEqual(itemObject, { - name: 'Rocket Launcher', - craftable: true, - wear: 1, - texture: 79, - quality: 11, - }); - }); - - it('Case #3', () => { - const itemObject = parseString( - "Collector's Battalion's Backup Chemistry Set", - true, - false - ); - - assert.deepEqual(itemObject, { - name: 'Chemistry Set', - craftable: true, - output: "Battalion's Backup", - outputQuality: 14, - quality: 6, - }); - }); - - it('Case #4', () => { - const itemObject = parseString( - 'Strange Festivized Professional Killstreak Australium Scattergun', - true, - false - ); - - assert.deepEqual(itemObject, { - name: 'Scattergun', - craftable: true, - australium: true, - festivized: true, - killstreak: 3, - quality: 11, - }); - }); - - it('Case #5', () => { - const itemObject = parseString( - 'Demonflame Modest Pile of Hat', - true, - false - ); - - assert.deepEqual(itemObject, { - name: 'Modest Pile of Hat', - craftable: true, - effect: 80, - quality: 5, - }); - }); - - it('Case #6', () => { - const itemObject = parseString( - 'Strange Omniscient Orb Balloonihoodie', - true, - false - ); - - assert.deepEqual(itemObject, { - name: 'Balloonihoodie', - craftable: true, - effect: 120, - quality: 5, - elevated: true, - }); - }); - - it('Case #7', () => { - const itemObject = parseString( - 'Non-Craftable Specialized Killstreak Gunboats Kit Fabricator', - true, - false - ); - - assert.deepEqual(itemObject, { - name: 'Specialized Killstreak Kit Fabricator', - craftable: false, - killstreak: 2, - target: 'Gunboats', - quality: 6, - }); - }); - - it('Case #8', () => { - const itemObject = parseString( - 'Archimedes Strangifier Chemistry Set', - true, - false - ); - - assert.deepEqual(itemObject, { - name: 'Chemistry Set', - craftable: true, - target: 'Archimedes', - output: 'Strangifier', - outputQuality: 6, - quality: 6, - }); - }); - - it('Case #9', () => { - const itemObject = parseString( - 'Strange Backwards Ballcap', - true, - false - ); - - assert.deepEqual(itemObject, { - name: 'Backwards Ballcap', - craftable: true, - quality: 11, - }); - }); - - it('Case #10', () => { - const itemObject = parseString( - 'Professional Killstreak Iron Curtain Kit Fabricator', - true, - false - ); - - assert.deepEqual(itemObject, { - name: 'Professional Killstreak Kit Fabricator', - craftable: true, - killstreak: 3, - target: 'Iron Curtain', - quality: 6, - }); - }); - - it('Case #11', () => { - const itemObject = parseString( - 'Strange Professional Killstreak Festive Grenade Launcher', - true, - false - ); - - assert.deepEqual(itemObject, { - name: 'Festive Grenade Launcher', - craftable: true, - killstreak: 3, - quality: 11, - }); - }); - - it('Case #12', () => { - const itemObject = parseString( - 'Strange Unique Sniper Rifle', - true, - false - ); - - assert.deepEqual(itemObject, { - name: 'Sniper Rifle', - craftable: true, - quality: 6, - elevated: true, - }); - }); - - it('Case #13', () => { - const itemObject = parseString('Australium Gold', true, false); - - assert.deepEqual(itemObject, { - name: 'Australium Gold', - craftable: true, - quality: 6, - }); - }); - - it('Case #14', () => { - const itemObject = parseString('Blue Moon Case #118', true, false); - - assert.deepEqual(itemObject, { - name: 'Blue Moon Case', - craftable: true, - itemNumber: { type: 'crate', value: 118 }, - quality: 6, - }); - }); - - it('Case #15', () => { - const itemObject = parseString('Hat #25', true, false); - - assert.deepEqual(itemObject, { - name: 'Hat', - craftable: true, - itemNumber: { type: 'craft', value: 25 }, - quality: 6, - }); - }); - - it('Case #16', () => { - const itemObject = parseString('The Tartan Shade', true, false); - - assert.deepEqual(itemObject, { - name: 'Tartan Shade', - craftable: true, - quality: 6, - isUniqueHat: true, - }); - }); - - it('Case #17', () => { - const itemObject = parseString('Strange Cool Breeze', true, false); - - assert.deepEqual(itemObject, { - name: 'Cool Breeze', - craftable: true, - quality: 11, - }); - }); - - it('Case #18', () => { - const itemObject = parseString('Strange Hot Case', true, false); - - assert.deepEqual(itemObject, { - name: 'Hot Case', - craftable: true, - quality: 11, - }); - }); - - it('Case #18', () => { - const itemObject = parseString('Strange Hot Heels', true, false); - - assert.deepEqual(itemObject, { - name: 'Hot Heels', - craftable: true, - quality: 11, - }); - }); - - it('Case #19', () => { - const itemObject = parseString( - 'Strange A Head Full of Hot Air', - true, - false - ); - - assert.deepEqual(itemObject, { - name: 'A Head Full of Hot Air', - craftable: true, - quality: 11, - }); - }); - - it('Case #20', () => { - const itemObject = parseString('Strange Vintage Tyrolean', true, false); - - assert.deepEqual(itemObject, { - name: 'Vintage Tyrolean', - quality: 11, - craftable: true, - }); - }); - - it('Case #21', () => { - const itemObject = parseString( - 'Strange Vintage Vintage Tyrolean', - true, - false - ); - - assert.deepEqual(itemObject, { - name: 'Vintage Tyrolean', - quality: 3, - elevated: true, - craftable: true, - }); - }); - - it('Case #22', () => { - const itemObject = parseString('Vintage Tyrolean', true, false); - - assert.deepEqual(itemObject, { - name: 'Vintage Tyrolean', - quality: 6, - craftable: true, - }); - }); - - it('Case #23', () => { - const itemObject = parseString('Vintage Vintage Tyrolean', true, false); - - assert.deepEqual(itemObject, { - name: 'Vintage Tyrolean', - quality: 3, - craftable: true, - }); - }); - - it('Case #24', () => { - const itemObject = parseString('Strange Haunted Hat', true, false); - - assert.deepEqual(itemObject, { - name: 'Haunted Hat', - quality: 11, - craftable: true, - }); - }); - - it('Case #25', () => { - const itemObject = parseString( - 'Strange Haunted Haunted Hat', - true, - false - ); - - assert.deepEqual(itemObject, { - name: 'Haunted Hat', - quality: 13, - elevated: true, - craftable: true, - }); - }); - - it('Case #26', () => { - const itemObject = parseString('Haunted Hat', true, false); - - assert.deepEqual(itemObject, { - name: 'Haunted Hat', - quality: 6, - craftable: true, - }); - }); - - it('Case #27', () => { - const itemObject = parseString('Haunted Haunted Hat', true, false); - - assert.deepEqual(itemObject, { - name: 'Haunted Hat', - quality: 13, - craftable: true, - }); - }); - - it('Case #28', () => { - const itemObject = parseString( - 'Eerie Orbiting Fire Condor Cap', - true, - false - ); - - assert.deepEqual(itemObject, { - name: 'Condor Cap', - quality: 5, - effect: 40, - craftable: true, - }); - }); - - it('Case #29', () => { - const itemObject = parseString( - 'Haunted Ghosts War Paint (Battle Scarred)', - true, - false - ); - - assert.deepEqual(itemObject, { - name: 'War Paint', - quality: 15, - texture: 236, - craftable: true, - wear: 5, - }); - }); - - it('Case #30', () => { - const itemObject = parseString( - 'Spellbound Aspect Taunt: Most Wanted', - true, - false - ); - - assert.deepEqual(itemObject, { - name: 'Taunt: Most Wanted', - quality: 5, - effect: 3043, - craftable: true, - }); - }); - - it('Case #31', () => { - const itemObject = parseString( - 'Haunted Phantasm Jr Bonk Boy', - true, - false - ); - - assert.deepEqual(itemObject, { - name: 'Bonk Boy', - quality: 5, - effect: 86, - craftable: true, - }); - }); - - it('Case #32', () => { - const itemObject = parseString( - 'Ghastly Ghosts Jr Bonk Boy', - true, - false - ); - - assert.deepEqual(itemObject, { - name: 'Bonk Boy', - quality: 5, - effect: 85, - craftable: true, - }); - }); - - it('Case #33', () => { - const itemObject = parseString( - 'Haunted Ghosts Battle Boonie', - true, - false - ); - - assert.deepEqual(itemObject, { - name: 'Battle Boonie', - quality: 5, - effect: 8, - craftable: true, - }); - }); - - it('Case #34', () => { - const itemObject = parseString('Smoking Jacket', true, false); - - assert.deepEqual(itemObject, { - name: 'Smoking Jacket', - craftable: true, - quality: 6, - }); - }); - - it('Case #35', () => { - const itemObject = parseString('Smoking Smoking Skid Lid', true, false); - - assert.deepEqual(itemObject, { - name: 'Smoking Skid Lid', - craftable: true, - quality: 5, - effect: 35, - }); - }); - - it('Case #36', () => { - const itemObject = parseString( - 'Purple Energy Smoking Skid Lid', - true, - false - ); - - assert.deepEqual(itemObject, { - name: 'Smoking Skid Lid', - craftable: true, - quality: 5, - effect: 10, - }); - }); - - it('Case #37', () => { - const itemObject = parseString('Smoking Skid Lid', true, false); - - assert.deepEqual(itemObject, { - name: 'Smoking Skid Lid', - craftable: true, - quality: 6, - }); - }); - - it('Case #38', () => { - const itemObject = parseString( - 'Strange Cosmetic Part: Kills', - true, - false - ); - - assert.deepEqual(itemObject, { - name: 'Strange Cosmetic Part: Kills', - craftable: true, - quality: 6, - }); - }); - - it('Case #39', () => { - const itemObject = parseString('The Value of Teamwork', true, false); - - assert.deepEqual(itemObject, { - name: 'The Value of Teamwork', - craftable: true, - quality: 6, - }); - }); - - it('Case #40', () => { - const itemObject = parseString( - 'The Essential Accessories', - true, - false - ); - - assert.deepEqual(itemObject, { - name: 'The Essential Accessories', - craftable: true, - quality: 6, - }); - }); - - it('Case #41', () => { - const itemObject = parseString('Genuine Atomic Accolade', true, false); - - assert.deepEqual(itemObject, { - name: 'Atomic Accolade', - craftable: true, - quality: 1, - }); - }); - - it('Case #42', () => { - const itemObject = parseString('Bonk! Atomic Punch', true, false); - - assert.deepEqual(itemObject, { - name: 'Bonk! Atomic Punch', - craftable: true, - quality: 6, - }); - }); - - it('Case #43 - Item with native `The` with craft number', () => { - const itemObject = parseString( - 'The Concealed Killer Weapons Case #93', - true, - false - ); - - assert.deepEqual(itemObject, { - name: 'The Concealed Killer Weapons Case', - craftable: true, - quality: 6, - itemNumber: { type: 'crate', value: 93 }, - }); - }); - - it('Case #44 - Old retired keys', () => { - const itemObject = parseString( - 'Non-Craftable Naughty Winter Crate Key 2014', - true, - false - ); - - assert.deepEqual(itemObject, { - name: 'Naughty Winter Crate Key 2014', - craftable: false, - quality: 6, - }); - }); - - it('Case #45 - Munition case', () => { - const itemObject = parseString( - 'Mann Co. Supply Munition #83', - true, - false - ); - - assert.deepEqual(itemObject, { - name: 'Mann Co. Supply Munition', - craftable: true, - quality: 6, - itemNumber: { value: 83, type: 'crate' }, - }); - }); - - it('Case #46 - Red Rock Roscoe Texture', () => { - class MockSchema extends Schema { - getTextureEnum() { - this.loadTextures(); - - return 0; - } - } - - const format = createFormat(new MockSchema()); - - const itemObject = format.parseString( - 'Festivized Specialized Killstreak Red Rock Roscoe Pistol (Field-Tested)', - true, - false - ); - assert.deepEqual(itemObject, { - name: 'Pistol', - quality: 15, - wear: 3, - festivized: true, - killstreak: 2, - texture: 0, - craftable: true, - }); - }); -}); - -describe('parseString with defindexes and numbers.', () => { - it('Case #1', () => { - const itemObject = parseString( - 'Cool Killstreak Aqua Marine Rocket Launcher (Battle Scarred)', - true, - true - ); - - assert.deepEqual(itemObject, { - name: 'Rocket Launcher', - craftable: true, - killstreak: 1, - wear: 5, - texture: 57, - effect: 703, - quality: 5, - defindex: 205, - }); - }); - - it('Case #2', () => { - const itemObject = parseString( - "Strange High Roller's Rocket Launcher (Factory New)", - true, - true - ); - - assert.deepEqual(itemObject, { - name: 'Rocket Launcher', - craftable: true, - wear: 1, - texture: 79, - quality: 11, - defindex: 205, - }); - }); - /* - it('Case #3', () => { - const itemObject = parseString( - "Collector's Battalion's Backup Chemistry Set", - true, true - ); - - assert.deepEqual(itemObject, { - name: 'Chemistry Set', - craftable: true, - output: "Battalion's Backup", - outputQuality: 14, - quality: 6, - outputDefindex: 226, - defindex: 20000, - }); - }); - */ - it('Case #4', () => { - const itemObject = parseString( - 'Strange Festivized Professional Killstreak Australium Scattergun', - true, - true - ); - - assert.deepEqual(itemObject, { - name: 'Scattergun', - craftable: true, - australium: true, - festivized: true, - killstreak: 3, - quality: 11, - defindex: 200, - }); - }); - - it('Case #5', () => { - const itemObject = parseString( - 'Demonflame Modest Pile of Hat', - true, - true - ); - - assert.deepEqual(itemObject, { - name: 'Modest Pile of Hat', - craftable: true, - effect: 80, - quality: 5, - defindex: 139, - }); - }); - - it('Case #6', () => { - const itemObject = parseString( - 'Strange Omniscient Orb Balloonihoodie', - true, - true - ); - - assert.deepEqual(itemObject, { - name: 'Balloonihoodie', - craftable: true, - effect: 120, - quality: 5, - elevated: true, - defindex: 30928, - }); - }); - - it('Case #7', () => { - const itemObject = parseString( - 'Non-Craftable Specialized Killstreak Gunboats Kit Fabricator', - true, - true - ); - - assert.deepEqual(itemObject, { - name: 'Specialized Killstreak Kit Fabricator', - defindex: 'HERE', - craftable: false, - killstreak: 2, - target: 'Gunboats', - quality: 6, - targetDefindex: 133, - defindex: 20002, - }); - }); - - it('Case #8', () => { - const itemObject = parseString( - 'Archimedes Strangifier Chemistry Set', - true, - true - ); - - assert.deepEqual(itemObject, { - name: 'Chemistry Set', - craftable: true, - target: 'Archimedes', - output: 'Strangifier', - outputQuality: 6, - quality: 6, - targetDefindex: 828, - outputDefindex: 5661, - defindex: 20005, - }); - }); - - it('Case #9', () => { - const itemObject = parseString('Strange Backwards Ballcap', true, true); - - assert.deepEqual(itemObject, { - name: 'Backwards Ballcap', - craftable: true, - quality: 11, - defindex: 617, - }); - }); - - it('Case #10', () => { - const itemObject = parseString( - 'Professional Killstreak Iron Curtain Kit Fabricator', - true, - true - ); - - assert.deepEqual(itemObject, { - name: 'Professional Killstreak Kit Fabricator', - craftable: true, - killstreak: 3, - target: 'Iron Curtain', - quality: 6, - targetDefindex: 298, - defindex: 20003, - }); - }); - - it('Case #11', () => { - const itemObject = parseString( - 'Strange Professional Killstreak Festive Grenade Launcher', - true, - true - ); - - assert.deepEqual(itemObject, { - name: 'Festive Grenade Launcher', - craftable: true, - killstreak: 3, - quality: 11, - defindex: 1007, - }); - }); - - it('Case #12', () => { - const itemObject = parseString( - 'Strange Unique Sniper Rifle', - true, - true - ); - - assert.deepEqual(itemObject, { - name: 'Sniper Rifle', - craftable: true, - quality: 6, - elevated: true, - defindex: 201, - }); - }); - - it('Case #13', () => { - const itemObject = parseString('Australium Gold', true, true); - - assert.deepEqual(itemObject, { - name: 'Australium Gold', - craftable: true, - quality: 6, - defindex: 5037, - }); - }); - - it('Case #14', () => { - const itemObject = parseString('Blue Moon Case #118', true, true); - - assert.deepEqual(itemObject, { - name: 'Blue Moon Case', - craftable: true, - itemNumber: { type: 'crate', value: 118 }, - quality: 6, - }); - }); - - it('Case #15', () => { - const itemObject = parseString('The Tartan Shade', true, true); - - assert.deepEqual(itemObject, { - name: 'Tartan Shade', - craftable: true, - quality: 6, - isUniqueHat: true, - defindex: 30064, - }); - }); - - it('Case #16', () => { - const itemObject = parseString('Strange Cool Breeze', true, true); - - assert.deepEqual(itemObject, { - name: 'Cool Breeze', - craftable: true, - quality: 11, - defindex: 979, - }); - }); - - it('Case #17', () => { - const itemObject = parseString('Strange Hot Case', true, true); - - assert.deepEqual(itemObject, { - name: 'Hot Case', - craftable: true, - quality: 11, - defindex: 30986, - }); - }); - - it('Case #18', () => { - const itemObject = parseString('Strange Hot Heels', true, true); - - assert.deepEqual(itemObject, { - name: 'Hot Heels', - craftable: true, - quality: 11, - defindex: 30754, - }); - }); - - it('Case #19', () => { - const itemObject = parseString( - 'Strange A Head Full of Hot Air', - true, - true - ); - - assert.deepEqual(itemObject, { - name: 'A Head Full of Hot Air', - craftable: true, - quality: 11, - defindex: 30662, - }); - }); - - it('Case #20', () => { - const itemObject = parseString( - 'Taunt: Kazotsky Kick Unusualifier', - true, - true - ); - - assert.deepEqual(itemObject, { - name: 'Unusualifier', - craftable: true, - quality: 5, - defindex: 9258, - target: 'Taunt: Kazotsky Kick', - targetDefindex: 1157, - }); - }); - - it('Case #21', () => { - const itemObject = parseString('Ghostly Gibus Strangifier', true, true); - - assert.deepEqual(itemObject, { - name: 'Strangifier', - craftable: true, - quality: 6, - defindex: 5661, - target: 'Ghostly Gibus', - targetDefindex: 940, - }); - }); - - it('Case #22', () => { - const itemObject = parseString('Strange Bacon Grease', true, true); - - assert.deepEqual(itemObject, { - name: 'Strange Bacon Grease', - craftable: true, - quality: 6, - defindex: 5633, - }); - }); - - it('Case #23', () => { - const itemObject = parseString('Strange Vintage Tyrolean', true, true); - - assert.deepEqual(itemObject, { - name: 'Vintage Tyrolean', - quality: 11, - craftable: true, - defindex: 101, - }); - }); - - it('Case #24', () => { - const itemObject = parseString( - 'Strange Vintage Vintage Tyrolean', - true, - true - ); - - assert.deepEqual(itemObject, { - name: 'Vintage Tyrolean', - quality: 3, - elevated: true, - craftable: true, - defindex: 101, - }); - }); - - it('Case #25', () => { - const itemObject = parseString('Vintage Tyrolean', true, true); - - assert.deepEqual(itemObject, { - name: 'Vintage Tyrolean', - quality: 6, - craftable: true, - defindex: 101, - }); - }); - - it('Case #26', () => { - const itemObject = parseString('Vintage Vintage Tyrolean', true, true); - - assert.deepEqual(itemObject, { - name: 'Vintage Tyrolean', - quality: 3, - craftable: true, - defindex: 101, - }); - }); - - it('Case #27', () => { - const itemObject = parseString('Strange Haunted Hat', true, true); - - assert.deepEqual(itemObject, { - name: 'Haunted Hat', - quality: 11, - craftable: true, - defindex: 30300, - }); - }); - - it('Case #28', () => { - const itemObject = parseString( - 'Strange Haunted Haunted Hat', - true, - true - ); - - assert.deepEqual(itemObject, { - name: 'Haunted Hat', - quality: 13, - elevated: true, - craftable: true, - defindex: 30300, - }); - }); - - it('Case #29', () => { - const itemObject = parseString('Haunted Hat', true, true); - - assert.deepEqual(itemObject, { - name: 'Haunted Hat', - quality: 6, - craftable: true, - defindex: 30300, - }); - }); - - it('Case #30', () => { - const itemObject = parseString('Haunted Haunted Hat', true, true); - - assert.deepEqual(itemObject, { - name: 'Haunted Hat', - defindex: 30300, - quality: 13, - craftable: true, - }); - }); - - it('Case #31', () => { - const itemObject = parseString( - 'Eerie Orbiting Fire Condor Cap', - true, - true - ); - - assert.deepEqual(itemObject, { - name: 'Condor Cap', - quality: 5, - effect: 40, - craftable: true, - defindex: 30553, - }); - }); - - it('Case #32', () => { - const itemObject = parseString( - 'Haunted Ghosts War Paint (Battle Scarred)', - true, - true - ); - - assert.deepEqual(itemObject, { - name: 'War Paint', - quality: 15, - texture: 236, - craftable: true, - wear: 5, - defindex: 9536, - }); - }); - - it('Case #33', () => { - const itemObject = parseString( - 'Spellbound Aspect Taunt: Most Wanted', - true, - true - ); - - assert.deepEqual(itemObject, { - name: 'Taunt: Most Wanted', - quality: 5, - effect: 3043, - craftable: true, - defindex: 30614, - }); - }); - - it('Case #34', () => { - const itemObject = parseString( - 'Haunted Phantasm Jr Bonk Boy', - true, - true - ); - - assert.deepEqual(itemObject, { - name: 'Bonk Boy', - quality: 5, - effect: 86, - craftable: true, - defindex: 451, - }); - }); - - it('Case #35', () => { - const itemObject = parseString( - 'Ghastly Ghosts Jr Bonk Boy', - true, - true - ); - - assert.deepEqual(itemObject, { - name: 'Bonk Boy', - defindex: 451, - quality: 5, - effect: 85, - craftable: true, - }); - }); - - it('Case #36', () => { - const itemObject = parseString( - 'Haunted Ghosts Battle Boonie', - true, - true - ); - - assert.deepEqual(itemObject, { - name: 'Battle Boonie', - quality: 5, - effect: 8, - craftable: true, - defindex: 30907, - }); - }); - - it('Case #37', () => { - const itemObject = parseString('Smoking Jacket', true, true); - - assert.deepEqual(itemObject, { - name: 'Smoking Jacket', - craftable: true, - quality: 6, - defindex: 31124, - }); - }); - - it('Case #38', () => { - const itemObject = parseString('Smoking Smoking Skid Lid', true, true); - - assert.deepEqual(itemObject, { - name: 'Smoking Skid Lid', - craftable: true, - quality: 5, - effect: 35, - defindex: 30399, - }); - }); - - it('Case #39', () => { - const itemObject = parseString( - 'Purple Energy Smoking Skid Lid', - true, - true - ); - - assert.deepEqual(itemObject, { - name: 'Smoking Skid Lid', - craftable: true, - quality: 5, - effect: 10, - defindex: 30399, - }); - }); - - it('Case #40', () => { - const itemObject = parseString('Smoking Skid Lid', true, true); - - assert.deepEqual(itemObject, { - name: 'Smoking Skid Lid', - craftable: true, - quality: 6, - defindex: 30399, - }); - }); - - it('Case #41', () => { - const itemObject = parseString( - 'Strange Cosmetic Part: Kills', - true, - true - ); - - assert.deepEqual(itemObject, { - name: 'Strange Cosmetic Part: Kills', - craftable: true, - quality: 6, - defindex: 6060, - }); - }); - - it('Case #42', () => { - const itemObject = parseString('The Value of Teamwork', true, true); - - assert.deepEqual(itemObject, { - name: 'The Value of Teamwork', - craftable: true, - quality: 6, - defindex: 5064, - }); - }); - - it('Case #43', () => { - const itemObject = parseString('The Essential Accessories', true, true); - - assert.deepEqual(itemObject, { - name: 'The Essential Accessories', - craftable: true, - quality: 6, - defindex: 347, - }); - }); - - it('Case #44', () => { - const itemObject = parseString('Genuine Atomic Accolade', true, true); - - assert.deepEqual(itemObject, { - name: 'Atomic Accolade', - defindex: 767, - craftable: true, - quality: 1, - }); - }); - - it('Case #45', () => { - const itemObject = parseString('Bonk! Atomic Punch', true, true); - - assert.deepEqual(itemObject, { - name: 'Bonk! Atomic Punch', - defindex: 46, - craftable: true, - quality: 6, - }); - }); - - it('Case #46 - The Value of Teamwork', () => { - const itemObject = parseString('The Value of Teamwork', true, true); - - assert.deepEqual(itemObject, { - name: 'The Value of Teamwork', - quality: 6, - craftable: true, - defindex: 5064, - }); - }); - - it('Case #47 - The Bitter Taste of Defeat and Lime', () => { - const itemObject = parseString( - 'The Bitter Taste of Defeat and Lime', - true, - true - ); - - assert.deepEqual(itemObject, { - name: 'The Bitter Taste of Defeat and Lime', - quality: 6, - craftable: true, - defindex: 5054, - }); - }); - - it('Case #48 - Item with native `The` with craft number', () => { - const itemObject = parseString( - 'The Concealed Killer Weapons Case #93', - true, - true - ); - - assert.deepEqual(itemObject, { - name: 'The Concealed Killer Weapons Case', - craftable: true, - quality: 6, - defindex: 5806, - itemNumber: { type: 'crate', value: 93 }, - }); - }); - - it('Case #49 - Old retired keys', () => { - const itemObject = parseString( - 'Non-Craftable Naughty Winter Crate Key 2014', - true, - true - ); - - assert.deepEqual(itemObject, { - name: 'Naughty Winter Crate Key 2014', - craftable: false, - quality: 6, - defindex: 5791, - }); - }); - - it('Case #50 - Munition case', () => { - const itemObject = parseString( - 'Mann Co. Supply Munition #83', - true, - true - ); - - assert.deepEqual(itemObject, { - name: 'Mann Co. Supply Munition', - defindex: 5734, - craftable: true, - quality: 6, - itemNumber: { value: 83, type: 'crate' }, - }); - }); - - it('Case #51 - Bat', () => { - class MockSchema extends Schema { - getDefindex() { - return 0; - } - } - - const format = createFormat(new MockSchema()); - - const itemObject = format.parseString('Bat', true, true); - assert.deepEqual(itemObject, { - name: 'Bat', - quality: 6, - defindex: 0, - craftable: true, - }); - }); - - it('Case #52 - Bat output', () => { - class MockSchema extends Schema { - getDefindex(input) { - if (input === 'Bat') { - return 0; - } - - return super.getDefindex(input); - } - } - - const format = createFormat(new MockSchema()); - - const itemObject = format.parseString( - "Collector's Bat Chemistry Set", - true, - true - ); - assert.deepEqual(itemObject, { - name: 'Chemistry Set', - quality: 6, - defindex: 20005, - craftable: true, - output: 'Bat', - outputDefindex: 0, - outputQuality: 14, - }); - }); - - it('Case #52 - Bat target', () => { - class MockSchema extends Schema { - getDefindex(input) { - if (input === 'Bat') { - return 0; - } - - return super.getDefindex(input); - } - } - - const format = createFormat(new MockSchema()); - - const itemObject = format.parseString( - 'Non-Craftable Specialized Killstreak Bat Kit Fabricator', - true, - true - ); - assert.deepEqual(itemObject, { - name: 'Specialized Killstreak Kit Fabricator', - quality: 6, - defindex: 20002, - craftable: false, - killstreak: 2, - target: 'Bat', - targetDefindex: 0, - }); - }); - - it('Case #53 - Accursed Apparition', () => { - const itemObject = parseString('Accursed Apparition', true, true); - assert.deepEqual(itemObject, { - name: 'Accursed Apparition', - quality: 6, - craftable: true, - defindex: 30206, - }); - }); -}); +const { assert } = require('chai'); + +const { parseString, schema, Schema } = require('../dist/static'); +const { createFormat } = require('../dist'); + +describe('parseString', () => { + it('Case #1', () => { + const itemObject = parseString( + 'Cool Killstreak Aqua Marine Rocket Launcher (Battle Scarred)' + ); + + assert.deepEqual(itemObject, { + name: 'Rocket Launcher', + craftable: true, + killstreak: 'Killstreak', + wear: 'Battle Scarred', + texture: 'Aqua Marine', + effect: 'Cool', + quality: 'Unusual', + }); + }); + + it('Case #2', () => { + const itemObject = parseString( + "Strange High Roller's Rocket Launcher (Factory New)" + ); + + assert.deepEqual(itemObject, { + name: 'Rocket Launcher', + craftable: true, + wear: 'Factory New', + texture: "High Roller's", + quality: 'Strange', + }); + }); + + it('Case #3', () => { + const itemObject = parseString( + "Collector's Battalion's Backup Chemistry Set" + ); + + assert.deepEqual(itemObject, { + name: 'Chemistry Set', + craftable: true, + output: "Battalion's Backup", + outputQuality: "Collector's", + quality: 'Unique', + }); + }); + + it('Case #4', () => { + const itemObject = parseString( + 'Strange Festivized Professional Killstreak Australium Scattergun' + ); + + assert.deepEqual(itemObject, { + name: 'Scattergun', + craftable: true, + australium: true, + festivized: true, + killstreak: 'Professional Killstreak', + quality: 'Strange', + }); + }); + + it('Case #5', () => { + const itemObject = parseString('Demonflame Modest Pile of Hat'); + + assert.deepEqual(itemObject, { + name: 'Modest Pile of Hat', + craftable: true, + effect: 'Demonflame', + quality: 'Unusual', + }); + }); + + it('Case #6', () => { + const itemObject = parseString('Strange Omniscient Orb Balloonihoodie'); + + assert.deepEqual(itemObject, { + name: 'Balloonihoodie', + craftable: true, + effect: 'Omniscient Orb', + quality: 'Unusual', + elevated: true, + }); + }); + + it('Case #7', () => { + const itemObject = parseString( + 'Non-Craftable Specialized Killstreak Gunboats Kit Fabricator' + ); + + assert.deepEqual(itemObject, { + name: 'Specialized Killstreak Kit Fabricator', + craftable: false, + killstreak: 'Specialized Killstreak', + target: 'Gunboats', + quality: 'Unique', + }); + }); + + it('Case #8', () => { + const itemObject = parseString('Archimedes Strangifier Chemistry Set'); + + assert.deepEqual(itemObject, { + name: 'Chemistry Set', + craftable: true, + target: 'Archimedes', + output: 'Strangifier', + outputQuality: 'Unique', + quality: 'Unique', + }); + }); + + it('Case #9', () => { + const itemObject = parseString('Strange Backwards Ballcap'); + + assert.deepEqual(itemObject, { + name: 'Backwards Ballcap', + craftable: true, + quality: 'Strange', + }); + }); + + it('Case #10', () => { + const itemObject = parseString( + 'Professional Killstreak Iron Curtain Kit Fabricator' + ); + + assert.deepEqual(itemObject, { + name: 'Professional Killstreak Kit Fabricator', + craftable: true, + killstreak: 'Professional Killstreak', + target: 'Iron Curtain', + quality: 'Unique', + }); + }); + + it('Case #11', () => { + const itemObject = parseString( + 'Strange Professional Killstreak Festive Grenade Launcher' + ); + + assert.deepEqual(itemObject, { + name: 'Festive Grenade Launcher', + craftable: true, + killstreak: 'Professional Killstreak', + quality: 'Strange', + }); + }); + + it('Case #12', () => { + const itemObject = parseString('Strange Unique Sniper Rifle'); + + assert.deepEqual(itemObject, { + name: 'Sniper Rifle', + craftable: true, + quality: 'Unique', + elevated: true, + }); + }); + + it('Case #13', () => { + const itemObject = parseString('Australium Gold'); + + assert.deepEqual(itemObject, { + name: 'Australium Gold', + craftable: true, + quality: 'Unique', + }); + }); + + it('Case #14', () => { + const itemObject = parseString('Blue Moon Case #118'); + + assert.deepEqual(itemObject, { + name: 'Blue Moon Case', + craftable: true, + itemNumber: { type: 'crate', value: 118 }, + quality: 'Unique', + }); + }); + + it('Case #15', () => { + const itemObject = parseString('Hat #25'); + + assert.deepEqual(itemObject, { + name: 'Hat', + craftable: true, + itemNumber: { type: 'craft', value: 25 }, + quality: 'Unique', + }); + }); + + it('Case #16', () => { + const itemObject = parseString('The Tartan Shade'); + + assert.deepEqual(itemObject, { + name: 'Tartan Shade', + craftable: true, + quality: 'Unique', + isUniqueHat: true, + }); + }); + + it('Case #17', () => { + const itemObject = parseString('Strange Cool Breeze'); + + assert.deepEqual(itemObject, { + name: 'Cool Breeze', + craftable: true, + quality: 'Strange', + }); + }); + + it('Case #18', () => { + const itemObject = parseString('Strange Hot Case'); + + assert.deepEqual(itemObject, { + name: 'Hot Case', + craftable: true, + quality: 'Strange', + }); + }); + + it('Case #18', () => { + const itemObject = parseString('Strange Hot Heels'); + + assert.deepEqual(itemObject, { + name: 'Hot Heels', + craftable: true, + quality: 'Strange', + }); + }); + + it('Case #19', () => { + const itemObject = parseString('Strange A Head Full of Hot Air'); + + assert.deepEqual(itemObject, { + name: 'A Head Full of Hot Air', + craftable: true, + quality: 'Strange', + }); + }); + + it('Case #20', () => { + const itemObject = parseString('Strange Vintage Tyrolean'); + + assert.deepEqual(itemObject, { + name: 'Vintage Tyrolean', + quality: 'Strange', + craftable: true, + }); + }); + + it('Case #21', () => { + const itemObject = parseString('Strange Vintage Vintage Tyrolean'); + + assert.deepEqual(itemObject, { + name: 'Vintage Tyrolean', + quality: 'Vintage', + elevated: true, + craftable: true, + }); + }); + + it('Case #22', () => { + const itemObject = parseString('Vintage Tyrolean'); + + assert.deepEqual(itemObject, { + name: 'Vintage Tyrolean', + quality: 'Unique', + craftable: true, + }); + }); + + it('Case #23', () => { + const itemObject = parseString('Vintage Vintage Tyrolean'); + + assert.deepEqual(itemObject, { + name: 'Vintage Tyrolean', + quality: 'Vintage', + craftable: true, + }); + }); + + it('Case #24', () => { + const itemObject = parseString('Strange Haunted Hat'); + + assert.deepEqual(itemObject, { + name: 'Haunted Hat', + quality: 'Strange', + craftable: true, + }); + }); + + it('Case #25', () => { + const itemObject = parseString('Strange Haunted Haunted Hat'); + + assert.deepEqual(itemObject, { + name: 'Haunted Hat', + quality: 'Haunted', + elevated: true, + craftable: true, + }); + }); + + it('Case #26', () => { + const itemObject = parseString('Haunted Hat'); + + assert.deepEqual(itemObject, { + name: 'Haunted Hat', + quality: 'Unique', + craftable: true, + }); + }); + + it('Case #27', () => { + const itemObject = parseString('Haunted Haunted Hat'); + + assert.deepEqual(itemObject, { + name: 'Haunted Hat', + quality: 'Haunted', + craftable: true, + }); + }); + + it('Case #28', () => { + const itemObject = parseString( + 'Eerie Orbiting Fire Condor Cap', + false, + false + ); + + assert.deepEqual(itemObject, { + name: 'Condor Cap', + quality: 'Unusual', + effect: 'Eerie Orbiting Fire', + craftable: true, + }); + }); + + it('Case #29', () => { + const itemObject = parseString( + 'Haunted Ghosts War Paint (Battle Scarred)', + false, + false + ); + + assert.deepEqual(itemObject, { + name: 'War Paint', + quality: 'Decorated Weapon', + texture: 'Haunted Ghosts', + craftable: true, + wear: 'Battle Scarred', + }); + }); + + it('Case #30', () => { + const itemObject = parseString( + 'Spellbound Aspect Taunt: Most Wanted', + false, + false + ); + + assert.deepEqual(itemObject, { + name: 'Taunt: Most Wanted', + quality: 'Unusual', + effect: 'Spellbound Aspect', + craftable: true, + }); + }); + + it('Case #31', () => { + const itemObject = parseString( + 'Haunted Phantasm Jr Bonk Boy', + false, + false + ); + + assert.deepEqual(itemObject, { + name: 'Bonk Boy', + quality: 'Unusual', + effect: 'Haunted Phantasm Jr', + craftable: true, + }); + }); + + it('Case #32', () => { + const itemObject = parseString( + 'Ghastly Ghosts Jr Bonk Boy', + false, + false + ); + + assert.deepEqual(itemObject, { + name: 'Bonk Boy', + quality: 'Unusual', + effect: 'Ghastly Ghosts Jr', + craftable: true, + }); + }); + + it('Case #33', () => { + const itemObject = parseString( + 'Haunted Ghosts Battle Boonie', + false, + false + ); + + assert.deepEqual(itemObject, { + name: 'Battle Boonie', + quality: 'Unusual', + effect: 'Haunted Ghosts', + craftable: true, + }); + }); + + it('Case #34', () => { + const itemObject = parseString('Smoking Jacket', false, false); + + assert.deepEqual(itemObject, { + name: 'Smoking Jacket', + craftable: true, + quality: 'Unique', + }); + }); + + it('Case #35', () => { + const itemObject = parseString( + 'Smoking Smoking Skid Lid', + false, + false + ); + + assert.deepEqual(itemObject, { + name: 'Smoking Skid Lid', + craftable: true, + quality: 'Unusual', + effect: 'Smoking', + }); + }); + + it('Case #36', () => { + const itemObject = parseString( + 'Purple Energy Smoking Skid Lid', + false, + false + ); + + assert.deepEqual(itemObject, { + name: 'Smoking Skid Lid', + craftable: true, + quality: 'Unusual', + effect: 'Purple Energy', + }); + }); + + it('Case #37', () => { + const itemObject = parseString('Smoking Skid Lid', false, false); + + assert.deepEqual(itemObject, { + name: 'Smoking Skid Lid', + craftable: true, + quality: 'Unique', + }); + }); + + it('Case #38', () => { + const itemObject = parseString( + 'Strange Cosmetic Part: Kills', + false, + false + ); + + assert.deepEqual(itemObject, { + name: 'Strange Cosmetic Part: Kills', + craftable: true, + quality: 'Unique', + }); + }); + + it('Case #39', () => { + const itemObject = parseString('The Value of Teamwork', false, false); + + assert.deepEqual(itemObject, { + name: 'The Value of Teamwork', + craftable: true, + quality: 'Unique', + }); + }); + + it('Case #40', () => { + const itemObject = parseString( + 'The Essential Accessories', + false, + false + ); + + assert.deepEqual(itemObject, { + name: 'The Essential Accessories', + craftable: true, + quality: 'Unique', + }); + }); + + it('Case #41', () => { + const itemObject = parseString('Genuine Atomic Accolade', false, false); + + assert.deepEqual(itemObject, { + name: 'Atomic Accolade', + craftable: true, + quality: 'Genuine', + }); + }); + + it('Case #42', () => { + const itemObject = parseString('Bonk! Atomic Punch', false, false); + + assert.deepEqual(itemObject, { + name: 'Bonk! Atomic Punch', + craftable: true, + quality: 'Unique', + }); + }); + + it('Case #43 - Item with native `The` with craft number', () => { + const itemObject = parseString( + 'The Concealed Killer Weapons Case #93', + false, + false + ); + + assert.deepEqual(itemObject, { + name: 'The Concealed Killer Weapons Case', + craftable: true, + quality: 'Unique', + itemNumber: { type: 'crate', value: 93 }, + }); + }); + + it('Case #44 - Old retired keys', () => { + const itemObject = parseString( + 'Non-Craftable Naughty Winter Crate Key 2014', + false, + false + ); + + assert.deepEqual(itemObject, { + name: 'Naughty Winter Crate Key 2014', + craftable: false, + quality: 'Unique', + }); + }); + + it('Case #45 - Munition case', () => { + const itemObject = parseString( + 'Mann Co. Supply Munition #83', + false, + false + ); + + assert.deepEqual(itemObject, { + name: 'Mann Co. Supply Munition', + craftable: true, + quality: 'Unique', + itemNumber: { value: 83, type: 'crate' }, + }); + }); + + it('Case #46 - Taunt: The Hot Wheeler', () => { + const itemObject = parseString('Taunt: The Hot Wheeler', false, false); + + assert.deepEqual(itemObject, { + name: 'Taunt: The Hot Wheeler', + craftable: true, + quality: 'Unique', + }); + }); +}); + +describe('parseString with numbers', () => { + it('Case #1', () => { + const itemObject = parseString( + 'Cool Killstreak Aqua Marine Rocket Launcher (Battle Scarred)', + true, + false + ); + + assert.deepEqual(itemObject, { + name: 'Rocket Launcher', + craftable: true, + killstreak: 1, + wear: 5, + texture: 57, + effect: 703, + quality: 5, + }); + }); + + it('Case #2', () => { + const itemObject = parseString( + "Strange High Roller's Rocket Launcher (Factory New)", + true, + false + ); + + assert.deepEqual(itemObject, { + name: 'Rocket Launcher', + craftable: true, + wear: 1, + texture: 79, + quality: 11, + }); + }); + + it('Case #3', () => { + const itemObject = parseString( + "Collector's Battalion's Backup Chemistry Set", + true, + false + ); + + assert.deepEqual(itemObject, { + name: 'Chemistry Set', + craftable: true, + output: "Battalion's Backup", + outputQuality: 14, + quality: 6, + }); + }); + + it('Case #4', () => { + const itemObject = parseString( + 'Strange Festivized Professional Killstreak Australium Scattergun', + true, + false + ); + + assert.deepEqual(itemObject, { + name: 'Scattergun', + craftable: true, + australium: true, + festivized: true, + killstreak: 3, + quality: 11, + }); + }); + + it('Case #5', () => { + const itemObject = parseString( + 'Demonflame Modest Pile of Hat', + true, + false + ); + + assert.deepEqual(itemObject, { + name: 'Modest Pile of Hat', + craftable: true, + effect: 80, + quality: 5, + }); + }); + + it('Case #6', () => { + const itemObject = parseString( + 'Strange Omniscient Orb Balloonihoodie', + true, + false + ); + + assert.deepEqual(itemObject, { + name: 'Balloonihoodie', + craftable: true, + effect: 120, + quality: 5, + elevated: true, + }); + }); + + it('Case #7', () => { + const itemObject = parseString( + 'Non-Craftable Specialized Killstreak Gunboats Kit Fabricator', + true, + false + ); + + assert.deepEqual(itemObject, { + name: 'Specialized Killstreak Kit Fabricator', + craftable: false, + killstreak: 2, + target: 'Gunboats', + quality: 6, + }); + }); + + it('Case #8', () => { + const itemObject = parseString( + 'Archimedes Strangifier Chemistry Set', + true, + false + ); + + assert.deepEqual(itemObject, { + name: 'Chemistry Set', + craftable: true, + target: 'Archimedes', + output: 'Strangifier', + outputQuality: 6, + quality: 6, + }); + }); + + it('Case #9', () => { + const itemObject = parseString( + 'Strange Backwards Ballcap', + true, + false + ); + + assert.deepEqual(itemObject, { + name: 'Backwards Ballcap', + craftable: true, + quality: 11, + }); + }); + + it('Case #10', () => { + const itemObject = parseString( + 'Professional Killstreak Iron Curtain Kit Fabricator', + true, + false + ); + + assert.deepEqual(itemObject, { + name: 'Professional Killstreak Kit Fabricator', + craftable: true, + killstreak: 3, + target: 'Iron Curtain', + quality: 6, + }); + }); + + it('Case #11', () => { + const itemObject = parseString( + 'Strange Professional Killstreak Festive Grenade Launcher', + true, + false + ); + + assert.deepEqual(itemObject, { + name: 'Festive Grenade Launcher', + craftable: true, + killstreak: 3, + quality: 11, + }); + }); + + it('Case #12', () => { + const itemObject = parseString( + 'Strange Unique Sniper Rifle', + true, + false + ); + + assert.deepEqual(itemObject, { + name: 'Sniper Rifle', + craftable: true, + quality: 6, + elevated: true, + }); + }); + + it('Case #13', () => { + const itemObject = parseString('Australium Gold', true, false); + + assert.deepEqual(itemObject, { + name: 'Australium Gold', + craftable: true, + quality: 6, + }); + }); + + it('Case #14', () => { + const itemObject = parseString('Blue Moon Case #118', true, false); + + assert.deepEqual(itemObject, { + name: 'Blue Moon Case', + craftable: true, + itemNumber: { type: 'crate', value: 118 }, + quality: 6, + }); + }); + + it('Case #15', () => { + const itemObject = parseString('Hat #25', true, false); + + assert.deepEqual(itemObject, { + name: 'Hat', + craftable: true, + itemNumber: { type: 'craft', value: 25 }, + quality: 6, + }); + }); + + it('Case #16', () => { + const itemObject = parseString('The Tartan Shade', true, false); + + assert.deepEqual(itemObject, { + name: 'Tartan Shade', + craftable: true, + quality: 6, + isUniqueHat: true, + }); + }); + + it('Case #17', () => { + const itemObject = parseString('Strange Cool Breeze', true, false); + + assert.deepEqual(itemObject, { + name: 'Cool Breeze', + craftable: true, + quality: 11, + }); + }); + + it('Case #18', () => { + const itemObject = parseString('Strange Hot Case', true, false); + + assert.deepEqual(itemObject, { + name: 'Hot Case', + craftable: true, + quality: 11, + }); + }); + + it('Case #18', () => { + const itemObject = parseString('Strange Hot Heels', true, false); + + assert.deepEqual(itemObject, { + name: 'Hot Heels', + craftable: true, + quality: 11, + }); + }); + + it('Case #19', () => { + const itemObject = parseString( + 'Strange A Head Full of Hot Air', + true, + false + ); + + assert.deepEqual(itemObject, { + name: 'A Head Full of Hot Air', + craftable: true, + quality: 11, + }); + }); + + it('Case #20', () => { + const itemObject = parseString('Strange Vintage Tyrolean', true, false); + + assert.deepEqual(itemObject, { + name: 'Vintage Tyrolean', + quality: 11, + craftable: true, + }); + }); + + it('Case #21', () => { + const itemObject = parseString( + 'Strange Vintage Vintage Tyrolean', + true, + false + ); + + assert.deepEqual(itemObject, { + name: 'Vintage Tyrolean', + quality: 3, + elevated: true, + craftable: true, + }); + }); + + it('Case #22', () => { + const itemObject = parseString('Vintage Tyrolean', true, false); + + assert.deepEqual(itemObject, { + name: 'Vintage Tyrolean', + quality: 6, + craftable: true, + }); + }); + + it('Case #23', () => { + const itemObject = parseString('Vintage Vintage Tyrolean', true, false); + + assert.deepEqual(itemObject, { + name: 'Vintage Tyrolean', + quality: 3, + craftable: true, + }); + }); + + it('Case #24', () => { + const itemObject = parseString('Strange Haunted Hat', true, false); + + assert.deepEqual(itemObject, { + name: 'Haunted Hat', + quality: 11, + craftable: true, + }); + }); + + it('Case #25', () => { + const itemObject = parseString( + 'Strange Haunted Haunted Hat', + true, + false + ); + + assert.deepEqual(itemObject, { + name: 'Haunted Hat', + quality: 13, + elevated: true, + craftable: true, + }); + }); + + it('Case #26', () => { + const itemObject = parseString('Haunted Hat', true, false); + + assert.deepEqual(itemObject, { + name: 'Haunted Hat', + quality: 6, + craftable: true, + }); + }); + + it('Case #27', () => { + const itemObject = parseString('Haunted Haunted Hat', true, false); + + assert.deepEqual(itemObject, { + name: 'Haunted Hat', + quality: 13, + craftable: true, + }); + }); + + it('Case #28', () => { + const itemObject = parseString( + 'Eerie Orbiting Fire Condor Cap', + true, + false + ); + + assert.deepEqual(itemObject, { + name: 'Condor Cap', + quality: 5, + effect: 40, + craftable: true, + }); + }); + + it('Case #29', () => { + const itemObject = parseString( + 'Haunted Ghosts War Paint (Battle Scarred)', + true, + false + ); + + assert.deepEqual(itemObject, { + name: 'War Paint', + quality: 15, + texture: 236, + craftable: true, + wear: 5, + }); + }); + + it('Case #30', () => { + const itemObject = parseString( + 'Spellbound Aspect Taunt: Most Wanted', + true, + false + ); + + assert.deepEqual(itemObject, { + name: 'Taunt: Most Wanted', + quality: 5, + effect: 3043, + craftable: true, + }); + }); + + it('Case #31', () => { + const itemObject = parseString( + 'Haunted Phantasm Jr Bonk Boy', + true, + false + ); + + assert.deepEqual(itemObject, { + name: 'Bonk Boy', + quality: 5, + effect: 86, + craftable: true, + }); + }); + + it('Case #32', () => { + const itemObject = parseString( + 'Ghastly Ghosts Jr Bonk Boy', + true, + false + ); + + assert.deepEqual(itemObject, { + name: 'Bonk Boy', + quality: 5, + effect: 85, + craftable: true, + }); + }); + + it('Case #33', () => { + const itemObject = parseString( + 'Haunted Ghosts Battle Boonie', + true, + false + ); + + assert.deepEqual(itemObject, { + name: 'Battle Boonie', + quality: 5, + effect: 8, + craftable: true, + }); + }); + + it('Case #34', () => { + const itemObject = parseString('Smoking Jacket', true, false); + + assert.deepEqual(itemObject, { + name: 'Smoking Jacket', + craftable: true, + quality: 6, + }); + }); + + it('Case #35', () => { + const itemObject = parseString('Smoking Smoking Skid Lid', true, false); + + assert.deepEqual(itemObject, { + name: 'Smoking Skid Lid', + craftable: true, + quality: 5, + effect: 35, + }); + }); + + it('Case #36', () => { + const itemObject = parseString( + 'Purple Energy Smoking Skid Lid', + true, + false + ); + + assert.deepEqual(itemObject, { + name: 'Smoking Skid Lid', + craftable: true, + quality: 5, + effect: 10, + }); + }); + + it('Case #37', () => { + const itemObject = parseString('Smoking Skid Lid', true, false); + + assert.deepEqual(itemObject, { + name: 'Smoking Skid Lid', + craftable: true, + quality: 6, + }); + }); + + it('Case #38', () => { + const itemObject = parseString( + 'Strange Cosmetic Part: Kills', + true, + false + ); + + assert.deepEqual(itemObject, { + name: 'Strange Cosmetic Part: Kills', + craftable: true, + quality: 6, + }); + }); + + it('Case #39', () => { + const itemObject = parseString('The Value of Teamwork', true, false); + + assert.deepEqual(itemObject, { + name: 'The Value of Teamwork', + craftable: true, + quality: 6, + }); + }); + + it('Case #40', () => { + const itemObject = parseString( + 'The Essential Accessories', + true, + false + ); + + assert.deepEqual(itemObject, { + name: 'The Essential Accessories', + craftable: true, + quality: 6, + }); + }); + + it('Case #41', () => { + const itemObject = parseString('Genuine Atomic Accolade', true, false); + + assert.deepEqual(itemObject, { + name: 'Atomic Accolade', + craftable: true, + quality: 1, + }); + }); + + it('Case #42', () => { + const itemObject = parseString('Bonk! Atomic Punch', true, false); + + assert.deepEqual(itemObject, { + name: 'Bonk! Atomic Punch', + craftable: true, + quality: 6, + }); + }); + + it('Case #43 - Item with native `The` with craft number', () => { + const itemObject = parseString( + 'The Concealed Killer Weapons Case #93', + true, + false + ); + + assert.deepEqual(itemObject, { + name: 'The Concealed Killer Weapons Case', + craftable: true, + quality: 6, + itemNumber: { type: 'crate', value: 93 }, + }); + }); + + it('Case #44 - Old retired keys', () => { + const itemObject = parseString( + 'Non-Craftable Naughty Winter Crate Key 2014', + true, + false + ); + + assert.deepEqual(itemObject, { + name: 'Naughty Winter Crate Key 2014', + craftable: false, + quality: 6, + }); + }); + + it('Case #45 - Munition case', () => { + const itemObject = parseString( + 'Mann Co. Supply Munition #83', + true, + false + ); + + assert.deepEqual(itemObject, { + name: 'Mann Co. Supply Munition', + craftable: true, + quality: 6, + itemNumber: { value: 83, type: 'crate' }, + }); + }); + + it('Case #46 - Red Rock Roscoe Texture', () => { + class MockSchema extends Schema { + getTextureEnum() { + this.loadTextures(); + + return 0; + } + } + + const format = createFormat(new MockSchema()); + + const itemObject = format.parseString( + 'Festivized Specialized Killstreak Red Rock Roscoe Pistol (Field-Tested)', + true, + false + ); + assert.deepEqual(itemObject, { + name: 'Pistol', + quality: 15, + wear: 3, + festivized: true, + killstreak: 2, + texture: 0, + craftable: true, + }); + }); +}); + +describe('parseString with defindexes and numbers.', () => { + it('Case #1', () => { + const itemObject = parseString( + 'Cool Killstreak Aqua Marine Rocket Launcher (Battle Scarred)', + true, + true + ); + + assert.deepEqual(itemObject, { + name: 'Rocket Launcher', + craftable: true, + killstreak: 1, + wear: 5, + texture: 57, + effect: 703, + quality: 5, + defindex: 205, + }); + }); + + it('Case #2', () => { + const itemObject = parseString( + "Strange High Roller's Rocket Launcher (Factory New)", + true, + true + ); + + assert.deepEqual(itemObject, { + name: 'Rocket Launcher', + craftable: true, + wear: 1, + texture: 79, + quality: 11, + defindex: 205, + }); + }); + /* + it('Case #3', () => { + const itemObject = parseString( + "Collector's Battalion's Backup Chemistry Set", + true, true + ); + + assert.deepEqual(itemObject, { + name: 'Chemistry Set', + craftable: true, + output: "Battalion's Backup", + outputQuality: 14, + quality: 6, + outputDefindex: 226, + defindex: 20000, + }); + }); + */ + it('Case #4', () => { + const itemObject = parseString( + 'Strange Festivized Professional Killstreak Australium Scattergun', + true, + true + ); + + assert.deepEqual(itemObject, { + name: 'Scattergun', + craftable: true, + australium: true, + festivized: true, + killstreak: 3, + quality: 11, + defindex: 200, + }); + }); + + it('Case #5', () => { + const itemObject = parseString( + 'Demonflame Modest Pile of Hat', + true, + true + ); + + assert.deepEqual(itemObject, { + name: 'Modest Pile of Hat', + craftable: true, + effect: 80, + quality: 5, + defindex: 139, + }); + }); + + it('Case #6', () => { + const itemObject = parseString( + 'Strange Omniscient Orb Balloonihoodie', + true, + true + ); + + assert.deepEqual(itemObject, { + name: 'Balloonihoodie', + craftable: true, + effect: 120, + quality: 5, + elevated: true, + defindex: 30928, + }); + }); + + it('Case #7', () => { + const itemObject = parseString( + 'Non-Craftable Specialized Killstreak Gunboats Kit Fabricator', + true, + true + ); + + assert.deepEqual(itemObject, { + name: 'Specialized Killstreak Kit Fabricator', + defindex: 'HERE', + craftable: false, + killstreak: 2, + target: 'Gunboats', + quality: 6, + targetDefindex: 133, + defindex: 20002, + }); + }); + + it('Case #8', () => { + const itemObject = parseString( + 'Archimedes Strangifier Chemistry Set', + true, + true + ); + + assert.deepEqual(itemObject, { + name: 'Chemistry Set', + craftable: true, + target: 'Archimedes', + output: 'Strangifier', + outputQuality: 6, + quality: 6, + targetDefindex: 828, + outputDefindex: 5661, + defindex: 20005, + }); + }); + + it('Case #9', () => { + const itemObject = parseString('Strange Backwards Ballcap', true, true); + + assert.deepEqual(itemObject, { + name: 'Backwards Ballcap', + craftable: true, + quality: 11, + defindex: 617, + }); + }); + + it('Case #10', () => { + const itemObject = parseString( + 'Professional Killstreak Iron Curtain Kit Fabricator', + true, + true + ); + + assert.deepEqual(itemObject, { + name: 'Professional Killstreak Kit Fabricator', + craftable: true, + killstreak: 3, + target: 'Iron Curtain', + quality: 6, + targetDefindex: 298, + defindex: 20003, + }); + }); + + it('Case #11', () => { + const itemObject = parseString( + 'Strange Professional Killstreak Festive Grenade Launcher', + true, + true + ); + + assert.deepEqual(itemObject, { + name: 'Festive Grenade Launcher', + craftable: true, + killstreak: 3, + quality: 11, + defindex: 1007, + }); + }); + + it('Case #12', () => { + const itemObject = parseString( + 'Strange Unique Sniper Rifle', + true, + true + ); + + assert.deepEqual(itemObject, { + name: 'Sniper Rifle', + craftable: true, + quality: 6, + elevated: true, + defindex: 201, + }); + }); + + it('Case #13', () => { + const itemObject = parseString('Australium Gold', true, true); + + assert.deepEqual(itemObject, { + name: 'Australium Gold', + craftable: true, + quality: 6, + defindex: 5037, + }); + }); + + it('Case #14', () => { + const itemObject = parseString('Blue Moon Case #118', true, true); + + assert.deepEqual(itemObject, { + name: 'Blue Moon Case', + craftable: true, + itemNumber: { type: 'crate', value: 118 }, + quality: 6, + }); + }); + + it('Case #15', () => { + const itemObject = parseString('The Tartan Shade', true, true); + + assert.deepEqual(itemObject, { + name: 'Tartan Shade', + craftable: true, + quality: 6, + isUniqueHat: true, + defindex: 30064, + }); + }); + + it('Case #16', () => { + const itemObject = parseString('Strange Cool Breeze', true, true); + + assert.deepEqual(itemObject, { + name: 'Cool Breeze', + craftable: true, + quality: 11, + defindex: 979, + }); + }); + + it('Case #17', () => { + const itemObject = parseString('Strange Hot Case', true, true); + + assert.deepEqual(itemObject, { + name: 'Hot Case', + craftable: true, + quality: 11, + defindex: 30986, + }); + }); + + it('Case #18', () => { + const itemObject = parseString('Strange Hot Heels', true, true); + + assert.deepEqual(itemObject, { + name: 'Hot Heels', + craftable: true, + quality: 11, + defindex: 30754, + }); + }); + + it('Case #19', () => { + const itemObject = parseString( + 'Strange A Head Full of Hot Air', + true, + true + ); + + assert.deepEqual(itemObject, { + name: 'A Head Full of Hot Air', + craftable: true, + quality: 11, + defindex: 30662, + }); + }); + + it('Case #20', () => { + const itemObject = parseString( + 'Taunt: Kazotsky Kick Unusualifier', + true, + true + ); + + assert.deepEqual(itemObject, { + name: 'Unusualifier', + craftable: true, + quality: 5, + defindex: 9258, + target: 'Taunt: Kazotsky Kick', + targetDefindex: 1157, + }); + }); + + it('Case #21', () => { + const itemObject = parseString('Ghostly Gibus Strangifier', true, true); + + assert.deepEqual(itemObject, { + name: 'Strangifier', + craftable: true, + quality: 6, + defindex: 5661, + target: 'Ghostly Gibus', + targetDefindex: 940, + }); + }); + + it('Case #22', () => { + const itemObject = parseString('Strange Bacon Grease', true, true); + + assert.deepEqual(itemObject, { + name: 'Strange Bacon Grease', + craftable: true, + quality: 6, + defindex: 5633, + }); + }); + + it('Case #23', () => { + const itemObject = parseString('Strange Vintage Tyrolean', true, true); + + assert.deepEqual(itemObject, { + name: 'Vintage Tyrolean', + quality: 11, + craftable: true, + defindex: 101, + }); + }); + + it('Case #24', () => { + const itemObject = parseString( + 'Strange Vintage Vintage Tyrolean', + true, + true + ); + + assert.deepEqual(itemObject, { + name: 'Vintage Tyrolean', + quality: 3, + elevated: true, + craftable: true, + defindex: 101, + }); + }); + + it('Case #25', () => { + const itemObject = parseString('Vintage Tyrolean', true, true); + + assert.deepEqual(itemObject, { + name: 'Vintage Tyrolean', + quality: 6, + craftable: true, + defindex: 101, + }); + }); + + it('Case #26', () => { + const itemObject = parseString('Vintage Vintage Tyrolean', true, true); + + assert.deepEqual(itemObject, { + name: 'Vintage Tyrolean', + quality: 3, + craftable: true, + defindex: 101, + }); + }); + + it('Case #27', () => { + const itemObject = parseString('Strange Haunted Hat', true, true); + + assert.deepEqual(itemObject, { + name: 'Haunted Hat', + quality: 11, + craftable: true, + defindex: 30300, + }); + }); + + it('Case #28', () => { + const itemObject = parseString( + 'Strange Haunted Haunted Hat', + true, + true + ); + + assert.deepEqual(itemObject, { + name: 'Haunted Hat', + quality: 13, + elevated: true, + craftable: true, + defindex: 30300, + }); + }); + + it('Case #29', () => { + const itemObject = parseString('Haunted Hat', true, true); + + assert.deepEqual(itemObject, { + name: 'Haunted Hat', + quality: 6, + craftable: true, + defindex: 30300, + }); + }); + + it('Case #30', () => { + const itemObject = parseString('Haunted Haunted Hat', true, true); + + assert.deepEqual(itemObject, { + name: 'Haunted Hat', + defindex: 30300, + quality: 13, + craftable: true, + }); + }); + + it('Case #31', () => { + const itemObject = parseString( + 'Eerie Orbiting Fire Condor Cap', + true, + true + ); + + assert.deepEqual(itemObject, { + name: 'Condor Cap', + quality: 5, + effect: 40, + craftable: true, + defindex: 30553, + }); + }); + + it('Case #32', () => { + const itemObject = parseString( + 'Haunted Ghosts War Paint (Battle Scarred)', + true, + true + ); + + assert.deepEqual(itemObject, { + name: 'War Paint', + quality: 15, + texture: 236, + craftable: true, + wear: 5, + defindex: 9536, + }); + }); + + it('Case #33', () => { + const itemObject = parseString( + 'Spellbound Aspect Taunt: Most Wanted', + true, + true + ); + + assert.deepEqual(itemObject, { + name: 'Taunt: Most Wanted', + quality: 5, + effect: 3043, + craftable: true, + defindex: 30614, + }); + }); + + it('Case #34', () => { + const itemObject = parseString( + 'Haunted Phantasm Jr Bonk Boy', + true, + true + ); + + assert.deepEqual(itemObject, { + name: 'Bonk Boy', + quality: 5, + effect: 86, + craftable: true, + defindex: 451, + }); + }); + + it('Case #35', () => { + const itemObject = parseString( + 'Ghastly Ghosts Jr Bonk Boy', + true, + true + ); + + assert.deepEqual(itemObject, { + name: 'Bonk Boy', + defindex: 451, + quality: 5, + effect: 85, + craftable: true, + }); + }); + + it('Case #36', () => { + const itemObject = parseString( + 'Haunted Ghosts Battle Boonie', + true, + true + ); + + assert.deepEqual(itemObject, { + name: 'Battle Boonie', + quality: 5, + effect: 8, + craftable: true, + defindex: 30907, + }); + }); + + it('Case #37', () => { + const itemObject = parseString('Smoking Jacket', true, true); + + assert.deepEqual(itemObject, { + name: 'Smoking Jacket', + craftable: true, + quality: 6, + defindex: 31124, + }); + }); + + it('Case #38', () => { + const itemObject = parseString('Smoking Smoking Skid Lid', true, true); + + assert.deepEqual(itemObject, { + name: 'Smoking Skid Lid', + craftable: true, + quality: 5, + effect: 35, + defindex: 30399, + }); + }); + + it('Case #39', () => { + const itemObject = parseString( + 'Purple Energy Smoking Skid Lid', + true, + true + ); + + assert.deepEqual(itemObject, { + name: 'Smoking Skid Lid', + craftable: true, + quality: 5, + effect: 10, + defindex: 30399, + }); + }); + + it('Case #40', () => { + const itemObject = parseString('Smoking Skid Lid', true, true); + + assert.deepEqual(itemObject, { + name: 'Smoking Skid Lid', + craftable: true, + quality: 6, + defindex: 30399, + }); + }); + + it('Case #41', () => { + const itemObject = parseString( + 'Strange Cosmetic Part: Kills', + true, + true + ); + + assert.deepEqual(itemObject, { + name: 'Strange Cosmetic Part: Kills', + craftable: true, + quality: 6, + defindex: 6060, + }); + }); + + it('Case #42', () => { + const itemObject = parseString('The Value of Teamwork', true, true); + + assert.deepEqual(itemObject, { + name: 'The Value of Teamwork', + craftable: true, + quality: 6, + defindex: 5064, + }); + }); + + it('Case #43', () => { + const itemObject = parseString('The Essential Accessories', true, true); + + assert.deepEqual(itemObject, { + name: 'The Essential Accessories', + craftable: true, + quality: 6, + defindex: 347, + }); + }); + + it('Case #44', () => { + const itemObject = parseString('Genuine Atomic Accolade', true, true); + + assert.deepEqual(itemObject, { + name: 'Atomic Accolade', + defindex: 767, + craftable: true, + quality: 1, + }); + }); + + it('Case #45', () => { + const itemObject = parseString('Bonk! Atomic Punch', true, true); + + assert.deepEqual(itemObject, { + name: 'Bonk! Atomic Punch', + defindex: 46, + craftable: true, + quality: 6, + }); + }); + + it('Case #46 - The Value of Teamwork', () => { + const itemObject = parseString('The Value of Teamwork', true, true); + + assert.deepEqual(itemObject, { + name: 'The Value of Teamwork', + quality: 6, + craftable: true, + defindex: 5064, + }); + }); + + it('Case #47 - The Bitter Taste of Defeat and Lime', () => { + const itemObject = parseString( + 'The Bitter Taste of Defeat and Lime', + true, + true + ); + + assert.deepEqual(itemObject, { + name: 'The Bitter Taste of Defeat and Lime', + quality: 6, + craftable: true, + defindex: 5054, + }); + }); + + it('Case #48 - Item with native `The` with craft number', () => { + const itemObject = parseString( + 'The Concealed Killer Weapons Case #93', + true, + true + ); + + assert.deepEqual(itemObject, { + name: 'The Concealed Killer Weapons Case', + craftable: true, + quality: 6, + defindex: 5806, + itemNumber: { type: 'crate', value: 93 }, + }); + }); + + it('Case #49 - Old retired keys', () => { + const itemObject = parseString( + 'Non-Craftable Naughty Winter Crate Key 2014', + true, + true + ); + + assert.deepEqual(itemObject, { + name: 'Naughty Winter Crate Key 2014', + craftable: false, + quality: 6, + defindex: 5791, + }); + }); + + it('Case #50 - Munition case', () => { + const itemObject = parseString( + 'Mann Co. Supply Munition #83', + true, + true + ); + + assert.deepEqual(itemObject, { + name: 'Mann Co. Supply Munition', + defindex: 5734, + craftable: true, + quality: 6, + itemNumber: { value: 83, type: 'crate' }, + }); + }); + + it('Case #51 - Bat', () => { + class MockSchema extends Schema { + getDefindex() { + return 0; + } + } + + const format = createFormat(new MockSchema()); + + const itemObject = format.parseString('Bat', true, true); + assert.deepEqual(itemObject, { + name: 'Bat', + quality: 6, + defindex: 0, + craftable: true, + }); + }); + + it('Case #52 - Bat output', () => { + class MockSchema extends Schema { + getDefindex(input) { + if (input === 'Bat') { + return 0; + } + + return super.getDefindex(input); + } + } + + const format = createFormat(new MockSchema()); + + const itemObject = format.parseString( + "Collector's Bat Chemistry Set", + true, + true + ); + assert.deepEqual(itemObject, { + name: 'Chemistry Set', + quality: 6, + defindex: 20005, + craftable: true, + output: 'Bat', + outputDefindex: 0, + outputQuality: 14, + }); + }); + + it('Case #52 - Bat target', () => { + class MockSchema extends Schema { + getDefindex(input) { + if (input === 'Bat') { + return 0; + } + + return super.getDefindex(input); + } + } + + const format = createFormat(new MockSchema()); + + const itemObject = format.parseString( + 'Non-Craftable Specialized Killstreak Bat Kit Fabricator', + true, + true + ); + assert.deepEqual(itemObject, { + name: 'Specialized Killstreak Kit Fabricator', + quality: 6, + defindex: 20002, + craftable: false, + killstreak: 2, + target: 'Bat', + targetDefindex: 0, + }); + }); + + it('Case #53 - Accursed Apparition', () => { + const itemObject = parseString('Accursed Apparition', true, true); + assert.deepEqual(itemObject, { + name: 'Accursed Apparition', + quality: 6, + craftable: true, + defindex: 30206, + }); + }); + + it('Case #54 - Unusual Haunted Metal Scrap', () => { + const itemObject = parseString('Unusual Haunted Metal Scrap', true, true); + assert.deepEqual(itemObject, { + name: 'Haunted Metal Scrap', + quality: 5, + craftable: true, + defindex: 267, + }); + }); +}); diff --git a/test/sku.js b/test/sku.js index b0a41ca..dd93c72 100644 --- a/test/sku.js +++ b/test/sku.js @@ -1,410 +1,410 @@ -const { assert } = require('chai'); - -const { toSKU, parseSKU } = require('../dist/static'); - -describe('toSKU', () => { - it('case #1', () => { - const sku = toSKU({ - defindex: 5021, - quality: 6, - craftable: true, - }); - - assert.equal(sku, '5021;6'); - }); - - it('case #2', () => { - const sku = toSKU({ - defindex: 30094, - quality: 5, - craftable: true, - effect: 62, - }); - - assert.equal(sku, '30094;5;u62'); - }); - - it('case #3', () => { - const sku = toSKU({ - defindex: 17249, - quality: 11, - craftable: true, - effect: 703, - wear: 5, - texture: 249, - }); - - assert.equal(sku, '17249;11;u703;w5;pk249'); - }); - - it('case #4', () => { - const sku = toSKU({ - defindex: 30351, - quality: 5, - craftable: true, - effect: 11, - elevated: true, - }); - - assert.equal(sku, '30351;5;u11;strange'); - }); - - it('case #5', () => { - const sku = toSKU({ - defindex: 20006, - quality: 6, - craftable: true, - outputDefindex: 513, - outputQuality: 14, - }); - - assert.equal(sku, '20006;6;od-513;oq-14'); - }); - - it('case #6', () => { - const sku = toSKU({ - defindex: 20000, - quality: 6, - craftable: true, - targetDefindex: 486, - outputDefindex: 6522, - outputQuality: 6, - }); - - assert.equal(sku, '20000;6;td-486;od-6522;oq-6'); - }); - - it('case #7', () => { - const sku = toSKU({ - defindex: 6526, - quality: 6, - craftable: false, - killstreak: 3, - targetDefindex: 200, - }); - - assert.equal(sku, '6526;6;uncraftable;kt-3;td-200'); - }); - - it('case #8', () => { - const sku = toSKU({ - defindex: 6526, - quality: 6, - craftable: false, - killstreak: 3, - targetDefindex: 200, - }); - - assert.equal(sku, '6526;6;uncraftable;kt-3;td-200'); - }); - - it('case #9', () => { - const sku = toSKU({ - defindex: 15010, - quality: 15, - craftable: true, - wear: 5, - texture: 2, - elevated: true, - killstreak: 1, - }); - - assert.equal(sku, '15010;15;w5;pk2;strange;kt-1'); - }); - - it('case #10', () => { - const sku = toSKU({ - defindex: 15085, - quality: 11, - craftable: true, - wear: 3, - texture: 60, - killstreak: 2, - }); - - assert.equal(sku, '15085;11;w3;pk60;kt-2'); - }); - - it('case #11', () => { - const sku = toSKU( { - defindex: 16308, - quality: 11, - craftable: true, - wear: 3, - texture: 308, - }); - - assert.equal(sku, '16308;11;w3;pk308'); - }); - - it('case #12', () => { - const sku = toSKU({ - defindex: 5883, - quality: 6, - craftable: true, - itemNumber: { type: 'crate', value: 109 }, - }); - - assert.equal(sku, '5883;6;c109'); - }); - - it('case #13 - Red Rock Roscoe texture', () => { - const sku = toSKU({ - defindex: 15013, - quality: 15, - wear: 3, - texture: 0, - festivized: true, - killstreak: 2, - craftable: true - }); - - assert.equal(sku, '15013;15;w3;pk0;kt-2;festive'); - }) - - it('case #14 - Bat', () => { - const sku = toSKU({ - defindex: 0, - quality: 6, - craftable: true, - }); - - assert.equal(sku, '0;6'); - }) - - it('case #15 - Bat output', () => { - const sku = toSKU({ - defindex: 20006, - quality: 6, - craftable: true, - outputDefindex: 0, - outputQuality: 6, - }); - - assert.equal(sku, '20006;6;od-0;oq-6'); - }) - - it('case #16 - Bat target', () => { - const sku = toSKU({ - defindex: 20000, - quality: 6, - craftable: true, - targetDefindex: 0, - outputDefindex: 6522, - outputQuality: 6, - }); - - assert.equal(sku, '20000;6;td-0;od-6522;oq-6'); - }) -}); - -describe('parseSKU', () => { - it('case #1', () => { - const skuAttrs = parseSKU('5021;6'); - - assert.deepEqual(skuAttrs, { - defindex: 5021, - quality: 6, - craftable: true, - }); - }); - - it('case #2', () => { - const skuAttrs = parseSKU('30094;5;u62'); - - assert.deepEqual(skuAttrs, { - defindex: 30094, - quality: 5, - craftable: true, - effect: 62, - }); - }); - - it('case #3', () => { - const skuAttrs = parseSKU('17249;11;u703;w5;pk249'); - - assert.deepEqual(skuAttrs, { - defindex: 17249, - quality: 11, - craftable: true, - effect: 703, - wear: 5, - texture: 249, - }); - }); - - it('case #4', () => { - const skuAttrs = parseSKU('30351;5;u11;strange'); - - assert.deepEqual(skuAttrs, { - defindex: 30351, - quality: 5, - craftable: true, - effect: 11, - elevated: true, - }); - }); - - it('case #5', () => { - const skuAttrs = parseSKU('20006;6;od-513;oq-14'); - - assert.deepEqual(skuAttrs, { - defindex: 20006, - quality: 6, - craftable: true, - outputDefindex: 513, - outputQuality: 14, - }); - }); - - it('case #6', () => { - const skuAttrs = parseSKU('20000;6;td-486;od-6522;oq-6'); - - assert.deepEqual(skuAttrs, { - defindex: 20000, - quality: 6, - craftable: true, - targetDefindex: 486, - outputDefindex: 6522, - outputQuality: 6, - }); - }); - - it('case #7', () => { - const skuAttrs = parseSKU('6526;6;uncraftable;kt-3;td-200'); - - assert.deepEqual(skuAttrs, { - defindex: 6526, - quality: 6, - craftable: false, - killstreak: 3, - targetDefindex: 200, - }); - }); - - it('case #8', () => { - const skuAttrs = parseSKU('20003;6;kt-3;td-356;od-6526;oq-6'); - - assert.deepEqual(skuAttrs, { - defindex: 20003, - quality: 6, - craftable: true, - killstreak: 3, - targetDefindex: 356, - outputDefindex: 6526, - outputQuality: 6 - }); - }); - - it('case #9', () => { - const skuAttrs = parseSKU('15010;15;w5;pk2;strange;kt-1'); - - assert.deepEqual(skuAttrs, { - defindex: 15010, - quality: 15, - craftable: true, - wear: 5, - texture: 2, - elevated: true, - killstreak: 1, - }); - }); - - it('case #10', () => { - const skuAttrs = parseSKU('15085;11;w3;pk60;kt-2'); - - assert.deepEqual(skuAttrs, { - defindex: 15085, - quality: 11, - craftable: true, - wear: 3, - texture: 60, - killstreak: 2, - }); - }); - - it('case #11', () => { - const skuAttrs = parseSKU('16308;11;w3;pk308'); - - assert.deepEqual(skuAttrs, { - defindex: 16308, - quality: 11, - craftable: true, - wear: 3, - texture: 308, - }); - }); - - it('case #12', () => { - const skuAttrs = parseSKU('5883;6;c109'); - - assert.deepEqual(skuAttrs, { - defindex: 5883, - quality: 6, - craftable: true, - itemNumber: { type: 'crate', value: 109 }, - }); - }); - - it('case #13 - strangifier chemistry set', () => { - const skuAttrs = parseSKU('20005;6;td-441;od-5783;oq-6'); - - assert.deepEqual(skuAttrs, { - defindex: 20005, - quality: 6, - craftable: true, - targetDefindex: 441, - outputDefindex: 5783, - outputQuality: 6 - }); - }) - - it('case #14 - Red Rock Roscoe texture', () => { - const skuAttrs = parseSKU('15013;15;w3;pk0;kt-2;festive'); - - assert.deepEqual(skuAttrs, { - defindex: 15013, - quality: 15, - wear: 3, - texture: 0, - festivized: true, - killstreak: 2, - craftable: true - }); - }) - - it('case #15 - Bat', () => { - const skuAttrs = parseSKU('0;6'); - - assert.deepEqual(skuAttrs, { - defindex: 0, - quality: 6, - craftable: true, - }); - }) - - it('case #16 - Bat output', () => { - const skuAttrs = parseSKU('20006;6;od-0;oq-6'); - - assert.deepEqual(skuAttrs, { - defindex: 20006, - quality: 6, - craftable: true, - outputDefindex: 0, - outputQuality: 6, - }); - }) - - it('case #17 - Bat target', () => { - const skuAttrs = parseSKU('20000;6;td-0;od-6522;oq-6'); - - assert.deepEqual(skuAttrs, { - defindex: 20000, - quality: 6, - craftable: true, - targetDefindex: 0, - outputDefindex: 6522, - outputQuality: 6, - }); - }) -}); +const { assert } = require('chai'); + +const { toSKU, parseSKU } = require('../dist/static'); + +describe('toSKU', () => { + it('case #1', () => { + const sku = toSKU({ + defindex: 5021, + quality: 6, + craftable: true, + }); + + assert.equal(sku, '5021;6'); + }); + + it('case #2', () => { + const sku = toSKU({ + defindex: 30094, + quality: 5, + craftable: true, + effect: 62, + }); + + assert.equal(sku, '30094;5;u62'); + }); + + it('case #3', () => { + const sku = toSKU({ + defindex: 17249, + quality: 11, + craftable: true, + effect: 703, + wear: 5, + texture: 249, + }); + + assert.equal(sku, '17249;11;u703;w5;pk249'); + }); + + it('case #4', () => { + const sku = toSKU({ + defindex: 30351, + quality: 5, + craftable: true, + effect: 11, + elevated: true, + }); + + assert.equal(sku, '30351;5;u11;strange'); + }); + + it('case #5', () => { + const sku = toSKU({ + defindex: 20006, + quality: 6, + craftable: true, + outputDefindex: 513, + outputQuality: 14, + }); + + assert.equal(sku, '20006;6;od-513;oq-14'); + }); + + it('case #6', () => { + const sku = toSKU({ + defindex: 20000, + quality: 6, + craftable: true, + targetDefindex: 486, + outputDefindex: 6522, + outputQuality: 6, + }); + + assert.equal(sku, '20000;6;td-486;od-6522;oq-6'); + }); + + it('case #7', () => { + const sku = toSKU({ + defindex: 6526, + quality: 6, + craftable: false, + killstreak: 3, + targetDefindex: 200, + }); + + assert.equal(sku, '6526;6;uncraftable;kt-3;td-200'); + }); + + it('case #8', () => { + const sku = toSKU({ + defindex: 6526, + quality: 6, + craftable: false, + killstreak: 3, + targetDefindex: 200, + }); + + assert.equal(sku, '6526;6;uncraftable;kt-3;td-200'); + }); + + it('case #9', () => { + const sku = toSKU({ + defindex: 15010, + quality: 15, + craftable: true, + wear: 5, + texture: 2, + elevated: true, + killstreak: 1, + }); + + assert.equal(sku, '15010;15;w5;pk2;strange;kt-1'); + }); + + it('case #10', () => { + const sku = toSKU({ + defindex: 15085, + quality: 11, + craftable: true, + wear: 3, + texture: 60, + killstreak: 2, + }); + + assert.equal(sku, '15085;11;w3;pk60;kt-2'); + }); + + it('case #11', () => { + const sku = toSKU( { + defindex: 16308, + quality: 11, + craftable: true, + wear: 3, + texture: 308, + }); + + assert.equal(sku, '16308;11;w3;pk308'); + }); + + it('case #12', () => { + const sku = toSKU({ + defindex: 5883, + quality: 6, + craftable: true, + itemNumber: { type: 'crate', value: 109 }, + }); + + assert.equal(sku, '5883;6;c109'); + }); + + it('case #13 - Red Rock Roscoe texture', () => { + const sku = toSKU({ + defindex: 15013, + quality: 15, + wear: 3, + texture: 0, + festivized: true, + killstreak: 2, + craftable: true + }); + + assert.equal(sku, '15013;15;w3;pk0;kt-2;festive'); + }) + + it('case #14 - Bat', () => { + const sku = toSKU({ + defindex: 0, + quality: 6, + craftable: true, + }); + + assert.equal(sku, '0;6'); + }) + + it('case #15 - Bat output', () => { + const sku = toSKU({ + defindex: 20006, + quality: 6, + craftable: true, + outputDefindex: 0, + outputQuality: 6, + }); + + assert.equal(sku, '20006;6;od-0;oq-6'); + }) + + it('case #16 - Bat target', () => { + const sku = toSKU({ + defindex: 20000, + quality: 6, + craftable: true, + targetDefindex: 0, + outputDefindex: 6522, + outputQuality: 6, + }); + + assert.equal(sku, '20000;6;td-0;od-6522;oq-6'); + }) +}); + +describe('parseSKU', () => { + it('case #1', () => { + const skuAttrs = parseSKU('5021;6'); + + assert.deepEqual(skuAttrs, { + defindex: 5021, + quality: 6, + craftable: true, + }); + }); + + it('case #2', () => { + const skuAttrs = parseSKU('30094;5;u62'); + + assert.deepEqual(skuAttrs, { + defindex: 30094, + quality: 5, + craftable: true, + effect: 62, + }); + }); + + it('case #3', () => { + const skuAttrs = parseSKU('17249;11;u703;w5;pk249'); + + assert.deepEqual(skuAttrs, { + defindex: 17249, + quality: 11, + craftable: true, + effect: 703, + wear: 5, + texture: 249, + }); + }); + + it('case #4', () => { + const skuAttrs = parseSKU('30351;5;u11;strange'); + + assert.deepEqual(skuAttrs, { + defindex: 30351, + quality: 5, + craftable: true, + effect: 11, + elevated: true, + }); + }); + + it('case #5', () => { + const skuAttrs = parseSKU('20006;6;od-513;oq-14'); + + assert.deepEqual(skuAttrs, { + defindex: 20006, + quality: 6, + craftable: true, + outputDefindex: 513, + outputQuality: 14, + }); + }); + + it('case #6', () => { + const skuAttrs = parseSKU('20000;6;td-486;od-6522;oq-6'); + + assert.deepEqual(skuAttrs, { + defindex: 20000, + quality: 6, + craftable: true, + targetDefindex: 486, + outputDefindex: 6522, + outputQuality: 6, + }); + }); + + it('case #7', () => { + const skuAttrs = parseSKU('6526;6;uncraftable;kt-3;td-200'); + + assert.deepEqual(skuAttrs, { + defindex: 6526, + quality: 6, + craftable: false, + killstreak: 3, + targetDefindex: 200, + }); + }); + + it('case #8', () => { + const skuAttrs = parseSKU('20003;6;kt-3;td-356;od-6526;oq-6'); + + assert.deepEqual(skuAttrs, { + defindex: 20003, + quality: 6, + craftable: true, + killstreak: 3, + targetDefindex: 356, + outputDefindex: 6526, + outputQuality: 6 + }); + }); + + it('case #9', () => { + const skuAttrs = parseSKU('15010;15;w5;pk2;strange;kt-1'); + + assert.deepEqual(skuAttrs, { + defindex: 15010, + quality: 15, + craftable: true, + wear: 5, + texture: 2, + elevated: true, + killstreak: 1, + }); + }); + + it('case #10', () => { + const skuAttrs = parseSKU('15085;11;w3;pk60;kt-2'); + + assert.deepEqual(skuAttrs, { + defindex: 15085, + quality: 11, + craftable: true, + wear: 3, + texture: 60, + killstreak: 2, + }); + }); + + it('case #11', () => { + const skuAttrs = parseSKU('16308;11;w3;pk308'); + + assert.deepEqual(skuAttrs, { + defindex: 16308, + quality: 11, + craftable: true, + wear: 3, + texture: 308, + }); + }); + + it('case #12', () => { + const skuAttrs = parseSKU('5883;6;c109'); + + assert.deepEqual(skuAttrs, { + defindex: 5883, + quality: 6, + craftable: true, + itemNumber: { type: 'crate', value: 109 }, + }); + }); + + it('case #13 - strangifier chemistry set', () => { + const skuAttrs = parseSKU('20005;6;td-441;od-5783;oq-6'); + + assert.deepEqual(skuAttrs, { + defindex: 20005, + quality: 6, + craftable: true, + targetDefindex: 441, + outputDefindex: 5783, + outputQuality: 6 + }); + }) + + it('case #14 - Red Rock Roscoe texture', () => { + const skuAttrs = parseSKU('15013;15;w3;pk0;kt-2;festive'); + + assert.deepEqual(skuAttrs, { + defindex: 15013, + quality: 15, + wear: 3, + texture: 0, + festivized: true, + killstreak: 2, + craftable: true + }); + }) + + it('case #15 - Bat', () => { + const skuAttrs = parseSKU('0;6'); + + assert.deepEqual(skuAttrs, { + defindex: 0, + quality: 6, + craftable: true, + }); + }) + + it('case #16 - Bat output', () => { + const skuAttrs = parseSKU('20006;6;od-0;oq-6'); + + assert.deepEqual(skuAttrs, { + defindex: 20006, + quality: 6, + craftable: true, + outputDefindex: 0, + outputQuality: 6, + }); + }) + + it('case #17 - Bat target', () => { + const skuAttrs = parseSKU('20000;6;td-0;od-6522;oq-6'); + + assert.deepEqual(skuAttrs, { + defindex: 20000, + quality: 6, + craftable: true, + targetDefindex: 0, + outputDefindex: 6522, + outputQuality: 6, + }); + }) +}); diff --git a/test/stringify.js b/test/stringify.js index 55edfd5..95b5248 100644 --- a/test/stringify.js +++ b/test/stringify.js @@ -1,585 +1,596 @@ -const { assert } = require('chai'); - -const { stringify } = require('../dist/static'); - -describe('stringify', () => { - it('Case #1', () => { - const itemString = stringify({ - name: 'Rocket Launcher', - craftable: true, - killstreak: 'Killstreak', - wear: 'Battle Scarred', - texture: 'Aqua Marine', - effect: 'Cool', - quality: 'Unusual' - }); - - assert.equal(itemString, 'Cool Killstreak Aqua Marine Rocket Launcher (Battle Scarred)'); - }); - - it('Case #2', () => { - const itemString = stringify({ - name: 'Rocket Launcher', - craftable: true, - wear: 'Factory New', - texture: 'High Roller\'s', - quality: 'Strange' - }); - - assert.equal(itemString, 'Strange High Roller\'s Rocket Launcher (Factory New)'); - }); - - it('Case #3', () => { - const itemString = stringify({ - name: 'Chemistry Set', - craftable: true, - output: 'Battalion\'s Backup', - outputQuality: 'Collector\'s', - quality: 'Unique' - }); - - assert.equal(itemString, 'Collector\'s Battalion\'s Backup Chemistry Set'); - }); - - it('Case #4', () => { - const itemString = stringify({ - name: 'Scattergun', - craftable: true, - australium: true, - festivized: true, - killstreak: 'Professional Killstreak', - quality: 'Strange' - }); - - assert.equal(itemString, 'Strange Festivized Professional Killstreak Australium Scattergun'); - }); - - it('Case #5', () => { - const itemString = stringify({ - name: 'Modest Pile of Hat', - craftable: true, - effect: 'Demonflame', - quality: 'Unusual' - }); - - assert.equal(itemString, 'Demonflame Modest Pile of Hat'); - }); - - it('Case #6', () => { - const itemString = stringify({ - name: 'Balloonihoodie', - craftable: true, - effect: 'Omniscient Orb', - quality: 'Unusual', - elevated: true - }); - - assert.equal(itemString, 'Strange Omniscient Orb Balloonihoodie'); - }); - - it('Case #7', () => { - const itemString = stringify({ - name: 'Specialized Killstreak Kit Fabricator', - craftable: false, - killstreak: 'Specialized Killstreak', - target: 'Gunboats', - quality: 'Unique' - }); - - assert.equal(itemString, 'Non-Craftable Specialized Killstreak Gunboats Kit Fabricator'); - }); - - it('Case #8', () => { - const itemString = stringify({ - name: 'Chemistry Set', - craftable: true, - target: 'Archimedes', - output: 'Strangifier', - outputQuality: 'Unique', - quality: 'Unique' - }); - - assert.equal(itemString, 'Archimedes Strangifier Chemistry Set'); - }); - - it('Case #9', () => { - const itemString = stringify({ - name: 'Backwards Ballcap', - craftable: true, - quality: 'Strange' - }); - - assert.equal(itemString, 'Strange Backwards Ballcap'); - }); - - it('Case #10', () => { - const itemString = stringify({ - name: 'Professional Killstreak Kit Fabricator', - craftable: true, - killstreak: 'Professional Killstreak', - target: 'Iron Curtain', - quality: 'Unique' - }); - - assert.equal(itemString, 'Professional Killstreak Iron Curtain Kit Fabricator'); - }); - - it('Case #11', () => { - const itemString = stringify({ - name: 'Festive Grenade Launcher', - craftable: true, - killstreak: 'Professional Killstreak', - quality: 'Strange' - }); - - assert.equal(itemString, 'Strange Professional Killstreak Festive Grenade Launcher'); - }); - - it('Case #12', () => { - const itemString = stringify({ - name: 'Sniper Rifle', - craftable: true, - quality: 'Unique', - elevated: true - }); - - assert.equal(itemString, 'Strange Unique Sniper Rifle'); - }); - - it('Case #13', () => { - const itemString = stringify({ name: 'Australium Gold', craftable: true, quality: 'Unique' }); - - assert.equal(itemString, 'Australium Gold'); - }); - - it('Case #14', () => { - const itemString = stringify({ - name: 'Blue Moon Case', - craftable: true, - itemNumber: { type: 'case', value: '118' }, - quality: 'Unique' - }); - - assert.equal(itemString, 'Blue Moon Case #118'); - }); - - it('Case #15', () => { - const itemString = stringify({ - name: 'Hat', - craftable: true, - itemNumber: { type: 'craft', value: '25' }, - quality: 'Unique' - }); - - assert.equal(itemString, 'Hat #25'); - }); - - it('Case #16', () => { - const itemString = stringify({ name: 'Tartan Shade', craftable: true, quality: 'Unique', isUniqueHat: true }); - - assert.deepEqual(itemString, 'The Tartan Shade'); - }) - - it('Case #17', () => { - const itemString = stringify({ - name: 'Unusualifier', - craftable: true, - quality: 'Unusual', - target: 'Taunt: Kazotsky Kick', - }); - - assert.deepEqual(itemString, 'Unusual Taunt: Kazotsky Kick Unusualifier'); - }) -}) - -describe('stringify from defindexes and numbers.', () => { - it('Case #1', () => { - const itemString = stringify({ - defindex: 20003, - quality: 6, - craftable: true, - killstreak: 3, - targetDefindex: 1151 - }) - - assert.equal(itemString, 'Professional Killstreak Iron Bomber Kit Fabricator'); - }); - - it('Case #2', () => { - const itemString = stringify({ - name: 'Rocket Launcher', - craftable: true, - killstreak: 1, - wear: 5, - texture: 57, - effect: 703, - quality: 5, - defindex: 205, - }) - - assert.equal(itemString, 'Cool Killstreak Aqua Marine Rocket Launcher (Battle Scarred)'); - }); - - it('Case #3', () => { - const itemString = stringify({ - name: 'Rocket Launcher', - craftable: true, - wear: 1, - texture: 79, - quality: 11, - defindex: 205, - }) - - assert.equal(itemString, 'Strange High Roller\'s Rocket Launcher (Factory New)'); - }); - - it('Case #4', () => { - const itemString = stringify({ - name: 'Chemistry Set', - craftable: true, - output: "Battalion's Backup", - outputQuality: 14, - quality: 6, - outputDefindex: 226, - defindex: 20000, - }) - - assert.equal(itemString, 'Collector\'s Battalion\'s Backup Chemistry Set'); - }); - - it('Case #5', () => { - const itemString = stringify({ - name: 'Scattergun', - craftable: true, - australium: true, - festivized: true, - killstreak: 3, - quality: 11, - defindex: 200, - }) - - assert.equal(itemString, 'Strange Festivized Professional Killstreak Australium Scattergun'); - }); - - it('Case #6', () => { - const itemString = stringify({ - name: 'Modest Pile of Hat', - craftable: true, - effect: 80, - quality: 5, - defindex: 139, - }) - - assert.equal(itemString, 'Demonflame Modest Pile of Hat'); - }); - - it('Case #7', () => { - const itemString = stringify({ - name: 'Balloonihoodie', - craftable: true, - effect: 120, - quality: 5, - elevated: true, - defindex: 30928, - }) - - assert.equal(itemString, 'Strange Omniscient Orb Balloonihoodie'); - }); - - it('Case #8', () => { - const itemString = stringify({ - name: 'Specialized Killstreak Kit Fabricator', - defindex: 'HERE', - craftable: false, - killstreak: 2, - target: 'Gunboats', - quality: 6, - targetDefindex: 133, - defindex: 20002, - }) - - assert.equal(itemString, 'Non-Craftable Specialized Killstreak Gunboats Kit Fabricator'); - }); - - it('Case #9', () => { - const itemString = stringify({ - name: 'Chemistry Set', - craftable: true, - target: 'Archimedes', - output: 'Strangifier', - outputQuality: 6, - defindex: 'NOT NEEDED HERE', - quality: 6, - targetDefindex: 828, - outputDefindex: 5661, - defindex: 20000, - }) - - assert.equal(itemString, 'Archimedes Strangifier Chemistry Set'); - }); - - it('Case #10', () => { - const itemString = stringify({ - name: 'Backwards Ballcap', - craftable: true, - quality: 11, - defindex: 617, - }) - - assert.equal(itemString, 'Strange Backwards Ballcap'); - }); - - it('Case #11', () => { - const itemString = stringify({ - name: 'Professional Killstreak Kit Fabricator', - craftable: true, - killstreak: 3, - target: 'Iron Curtain', - quality: 6, - targetDefindex: 298, - defindex: 20003, - }) - - assert.equal(itemString, 'Professional Killstreak Iron Curtain Kit Fabricator'); - }); - - it('Case #12', () => { - const itemString = stringify({ - name: 'Festive Grenade Launcher', - craftable: true, - killstreak: 3, - quality: 11, - defindex: 1007, - }) - - assert.equal(itemString, 'Strange Professional Killstreak Festive Grenade Launcher'); - }); - - it('Case #13', () => { - const itemString = stringify({ - name: 'Sniper Rifle', - craftable: true, - quality: 6, - elevated: true, - defindex: 201, - }) - - assert.equal(itemString, 'Strange Unique Sniper Rifle'); - }); - - it('Case #14', () => { - const itemString = stringify({ - name: 'Australium Gold', - craftable: true, - quality: 6, - defindex: 5037, - }) - - assert.equal(itemString, 'Australium Gold'); - }); - - it('Case #15', () => { - const itemString = stringify({ - name: 'Blue Moon Case', - craftable: true, - itemNumber: { type: 'crate', value: 118 }, - quality: 6, - }) - - assert.equal(itemString, 'Blue Moon Case #118'); - }); - - it('Case #16', () => { - const itemString = stringify({ - name: 'Tartan Shade', - craftable: true, - quality: 6, - isUniqueHat: true, - defindex: 30064, - }) - - assert.equal(itemString, 'The Tartan Shade'); - }); - - it('Case #17', () => { - const itemString = stringify({ - name: 'Hot Case', - craftable: true, - quality: 11, - defindex: 30986, - }) - - assert.equal(itemString, 'Strange Hot Case'); - }); - - it('Case #18', () => { - const itemString = stringify({ - name: 'Hot Heels', - craftable: true, - quality: 11, - defindex: 30754, - }) - - assert.equal(itemString, 'Strange Hot Heels'); - }); - - it('Case #19', () => { - const itemString = stringify({ - name: 'A Head Full of Hot Air', - craftable: true, - quality: 11, - defindex: 30662, - }) - - assert.equal(itemString, 'Strange A Head Full of Hot Air'); - }); - - it('Case #20', () => { - const itemString = stringify({ - name: 'Unusualifier', - craftable: true, - quality: 5, - defindex: 9258, - target: 'Taunt: Kazotsky Kick', - targetDefindex: 1157, - }) - - assert.equal(itemString, 'Unusual Taunt: Kazotsky Kick Unusualifier'); - }); - - it('Case #21', () => { - const itemString = stringify({ - name: 'Strangifier', - craftable: true, - quality: 6, - defindex: 5661, - target: 'Ghostly Gibus', - targetDefindex: 940, - }) - - assert.equal(itemString, 'Ghostly Gibus Strangifier'); - }); - - it('Case #22', () => { - const itemString = stringify({ - name: 'Strange Bacon Grease', - craftable: true, - quality: 6, - defindex: 5633, - }) - - assert.equal(itemString, 'Strange Bacon Grease'); - }); - - it('Case #23', () => { - const itemString = stringify({ - "defindex": 30300, - quality: 13, - craftable: true, - }); - - assert.equal(itemString, 'Haunted Haunted Hat'); - }) - - it('Case #24 - fixed names', () => { - const itemString = stringify({ defindex: 5791, quality: 6, craftable: false }); - - assert.equal(itemString, 'Non-Craftable Naughty Winter Crate Key 2014'); - }); - - it('Case #25 - unique hat only defindex', () => { - const itemString = stringify({ defindex: 876, quality: 6, craftable: true }, { determineUniqueHat: true }); - - assert.equal(itemString, 'The K-9 Mane'); - }); - - it('Case #26 - unique hat only defindex off', () => { - const itemString = stringify({ defindex: 876, quality: 6, craftable: true }, { determineUniqueHat: false }); - - assert.equal(itemString, 'K-9 Mane'); - }); - - it('Case #26 - unique hat only defindex with other attributes', () => { - const itemString = stringify({ defindex: 876, quality: 6, craftable: false }, { determineUniqueHat: true }); - - assert.equal(itemString, 'Non-Craftable K-9 Mane'); - }); - - it('Case #26 - unique hat with bad name', () => { - const itemString = stringify({ name: 'K-9 Mane', quality: 6, craftable: true }, { determineUniqueHat: true }); - - assert.equal(itemString, 'The K-9 Mane'); - }); - - it('Case #27 - strange unique with determineUniqueHat', () => { - const itemString = stringify({ name: 'K-9 Mane', quality: 6, craftable: true, elevated: true }, { determineUniqueHat: true }); - - assert.equal(itemString, 'Strange Unique K-9 Mane'); - }); - - it('Case #27 - craft number with determineUniqueHat', () => { - const itemString = stringify({ name: 'Surgeon\'s Stahlhelm', quality: 6, craftable: true, itemNumber: { type: 'craft', value: 1 } }, { determineUniqueHat: true }); - - assert.equal(itemString, 'The Surgeon\'s Stahlhelm #1'); - }); - - it('Case #28 - case with determineUniqueHat', () => { - const itemString = stringify({ name: 'Gargoyle Case', quality: 6, craftable: true, itemNumber: { type: 'crate', value: 98 } }, { determineUniqueHat: true }); - - assert.equal(itemString, 'Gargoyle Case #98'); - }); - - it('Case #29 - The Bitter Taste of Defeat and Lime with determineUniqueHat', () => { - const itemString = stringify({ name: 'The Bitter Taste of Defeat and Lime', quality: 6, craftable: true }, { determineUniqueHat: true }); - - assert.equal(itemString, 'The Bitter Taste of Defeat and Lime'); - }) - - it('Case #30 - Normal quality item', () => { - const itemString = stringify({ defindex: 211, quality: 0, craftable: true, elevated: true }); - - assert.equal(itemString, 'Strange Normal Medi Gun'); - }); - - it('Case #31 - Normal quality item #2', () => { - const itemString = stringify({ name: 'Medi Gun', quality: 'Normal', craftable: true, elevated: true }); - - assert.equal(itemString, 'Strange Normal Medi Gun'); - }); - - it('Case #32 - Red Rock Roscoe texture', () => { - const itemString = stringify({ name: 'Pistol', quality: 'Decorated Weapon', craftable: true, wear: 'Field-Tested', festivized: true, killstreak: 'Specialized Killstreak', texture: 0 }); - - assert.equal(itemString, 'Festivized Specialized Killstreak Red Rock Roscoe Pistol (Field-Tested)'); - }); - - it('Case #33 - Bat', () => { - const itemString = stringify({ defindex: 0, quality: 'Unique', craftable: true }); - - assert.equal(itemString, 'Bat'); - }) - - it('Case #34 - Bat output', () => { - const itemString = stringify({ - name: 'Chemistry Set', - craftable: true, - outputDefindex: 0, - outputQuality: 'Collector\'s', - quality: 'Unique' - }); - - assert.equal(itemString, 'Collector\'s Bat Chemistry Set'); - }) - - it('Case #34 - Bat target', () => { - const itemString = stringify({ - name: 'Specialized Killstreak Kit Fabricator', - craftable: false, - killstreak: 'Specialized Killstreak', - targetDefindex: 0, - quality: 'Unique' - }); - - assert.equal(itemString, 'Non-Craftable Specialized Killstreak Bat Kit Fabricator'); - }) -}); +const { assert } = require('chai'); + +const { stringify } = require('../dist/static'); + +describe('stringify', () => { + it('Case #1', () => { + const itemString = stringify({ + name: 'Rocket Launcher', + craftable: true, + killstreak: 'Killstreak', + wear: 'Battle Scarred', + texture: 'Aqua Marine', + effect: 'Cool', + quality: 'Unusual' + }); + + assert.equal(itemString, 'Cool Killstreak Aqua Marine Rocket Launcher (Battle Scarred)'); + }); + + it('Case #2', () => { + const itemString = stringify({ + name: 'Rocket Launcher', + craftable: true, + wear: 'Factory New', + texture: 'High Roller\'s', + quality: 'Strange' + }); + + assert.equal(itemString, 'Strange High Roller\'s Rocket Launcher (Factory New)'); + }); + + it('Case #3', () => { + const itemString = stringify({ + name: 'Chemistry Set', + craftable: true, + output: 'Battalion\'s Backup', + outputQuality: 'Collector\'s', + quality: 'Unique' + }); + + assert.equal(itemString, 'Collector\'s Battalion\'s Backup Chemistry Set'); + }); + + it('Case #4', () => { + const itemString = stringify({ + name: 'Scattergun', + craftable: true, + australium: true, + festivized: true, + killstreak: 'Professional Killstreak', + quality: 'Strange' + }); + + assert.equal(itemString, 'Strange Festivized Professional Killstreak Australium Scattergun'); + }); + + it('Case #5', () => { + const itemString = stringify({ + name: 'Modest Pile of Hat', + craftable: true, + effect: 'Demonflame', + quality: 'Unusual' + }); + + assert.equal(itemString, 'Demonflame Modest Pile of Hat'); + }); + + it('Case #6', () => { + const itemString = stringify({ + name: 'Balloonihoodie', + craftable: true, + effect: 'Omniscient Orb', + quality: 'Unusual', + elevated: true + }); + + assert.equal(itemString, 'Strange Omniscient Orb Balloonihoodie'); + }); + + it('Case #7', () => { + const itemString = stringify({ + name: 'Specialized Killstreak Kit Fabricator', + craftable: false, + killstreak: 'Specialized Killstreak', + target: 'Gunboats', + quality: 'Unique' + }); + + assert.equal(itemString, 'Non-Craftable Specialized Killstreak Gunboats Kit Fabricator'); + }); + + it('Case #8', () => { + const itemString = stringify({ + name: 'Chemistry Set', + craftable: true, + target: 'Archimedes', + output: 'Strangifier', + outputQuality: 'Unique', + quality: 'Unique' + }); + + assert.equal(itemString, 'Archimedes Strangifier Chemistry Set'); + }); + + it('Case #9', () => { + const itemString = stringify({ + name: 'Backwards Ballcap', + craftable: true, + quality: 'Strange' + }); + + assert.equal(itemString, 'Strange Backwards Ballcap'); + }); + + it('Case #10', () => { + const itemString = stringify({ + name: 'Professional Killstreak Kit Fabricator', + craftable: true, + killstreak: 'Professional Killstreak', + target: 'Iron Curtain', + quality: 'Unique' + }); + + assert.equal(itemString, 'Professional Killstreak Iron Curtain Kit Fabricator'); + }); + + it('Case #11', () => { + const itemString = stringify({ + name: 'Festive Grenade Launcher', + craftable: true, + killstreak: 'Professional Killstreak', + quality: 'Strange' + }); + + assert.equal(itemString, 'Strange Professional Killstreak Festive Grenade Launcher'); + }); + + it('Case #12', () => { + const itemString = stringify({ + name: 'Sniper Rifle', + craftable: true, + quality: 'Unique', + elevated: true + }); + + assert.equal(itemString, 'Strange Unique Sniper Rifle'); + }); + + it('Case #13', () => { + const itemString = stringify({ name: 'Australium Gold', craftable: true, quality: 'Unique' }); + + assert.equal(itemString, 'Australium Gold'); + }); + + it('Case #14', () => { + const itemString = stringify({ + name: 'Blue Moon Case', + craftable: true, + itemNumber: { type: 'case', value: '118' }, + quality: 'Unique' + }); + + assert.equal(itemString, 'Blue Moon Case #118'); + }); + + it('Case #15', () => { + const itemString = stringify({ + name: 'Hat', + craftable: true, + itemNumber: { type: 'craft', value: '25' }, + quality: 'Unique' + }); + + assert.equal(itemString, 'Hat #25'); + }); + + it('Case #16', () => { + const itemString = stringify({ name: 'Tartan Shade', craftable: true, quality: 'Unique', isUniqueHat: true }); + + assert.deepEqual(itemString, 'The Tartan Shade'); + }) + + it('Case #17', () => { + const itemString = stringify({ + name: 'Unusualifier', + craftable: true, + quality: 'Unusual', + target: 'Taunt: Kazotsky Kick', + }); + + assert.deepEqual(itemString, 'Unusual Taunt: Kazotsky Kick Unusualifier'); + }) +}) + +describe('stringify from defindexes and numbers.', () => { + it('Case #1', () => { + const itemString = stringify({ + defindex: 20003, + quality: 6, + craftable: true, + killstreak: 3, + targetDefindex: 1151 + }) + + assert.equal(itemString, 'Professional Killstreak Iron Bomber Kit Fabricator'); + }); + + it('Case #2', () => { + const itemString = stringify({ + name: 'Rocket Launcher', + craftable: true, + killstreak: 1, + wear: 5, + texture: 57, + effect: 703, + quality: 5, + defindex: 205, + }) + + assert.equal(itemString, 'Cool Killstreak Aqua Marine Rocket Launcher (Battle Scarred)'); + }); + + it('Case #3', () => { + const itemString = stringify({ + name: 'Rocket Launcher', + craftable: true, + wear: 1, + texture: 79, + quality: 11, + defindex: 205, + }) + + assert.equal(itemString, 'Strange High Roller\'s Rocket Launcher (Factory New)'); + }); + + it('Case #4', () => { + const itemString = stringify({ + name: 'Chemistry Set', + craftable: true, + output: "Battalion's Backup", + outputQuality: 14, + quality: 6, + outputDefindex: 226, + defindex: 20000, + }) + + assert.equal(itemString, 'Collector\'s Battalion\'s Backup Chemistry Set'); + }); + + it('Case #5', () => { + const itemString = stringify({ + name: 'Scattergun', + craftable: true, + australium: true, + festivized: true, + killstreak: 3, + quality: 11, + defindex: 200, + }) + + assert.equal(itemString, 'Strange Festivized Professional Killstreak Australium Scattergun'); + }); + + it('Case #6', () => { + const itemString = stringify({ + name: 'Modest Pile of Hat', + craftable: true, + effect: 80, + quality: 5, + defindex: 139, + }) + + assert.equal(itemString, 'Demonflame Modest Pile of Hat'); + }); + + it('Case #7', () => { + const itemString = stringify({ + name: 'Balloonihoodie', + craftable: true, + effect: 120, + quality: 5, + elevated: true, + defindex: 30928, + }) + + assert.equal(itemString, 'Strange Omniscient Orb Balloonihoodie'); + }); + + it('Case #8', () => { + const itemString = stringify({ + name: 'Specialized Killstreak Kit Fabricator', + defindex: 'HERE', + craftable: false, + killstreak: 2, + target: 'Gunboats', + quality: 6, + targetDefindex: 133, + defindex: 20002, + }) + + assert.equal(itemString, 'Non-Craftable Specialized Killstreak Gunboats Kit Fabricator'); + }); + + it('Case #9', () => { + const itemString = stringify({ + name: 'Chemistry Set', + craftable: true, + target: 'Archimedes', + output: 'Strangifier', + outputQuality: 6, + defindex: 'NOT NEEDED HERE', + quality: 6, + targetDefindex: 828, + outputDefindex: 5661, + defindex: 20000, + }) + + assert.equal(itemString, 'Archimedes Strangifier Chemistry Set'); + }); + + it('Case #10', () => { + const itemString = stringify({ + name: 'Backwards Ballcap', + craftable: true, + quality: 11, + defindex: 617, + }) + + assert.equal(itemString, 'Strange Backwards Ballcap'); + }); + + it('Case #11', () => { + const itemString = stringify({ + name: 'Professional Killstreak Kit Fabricator', + craftable: true, + killstreak: 3, + target: 'Iron Curtain', + quality: 6, + targetDefindex: 298, + defindex: 20003, + }) + + assert.equal(itemString, 'Professional Killstreak Iron Curtain Kit Fabricator'); + }); + + it('Case #12', () => { + const itemString = stringify({ + name: 'Festive Grenade Launcher', + craftable: true, + killstreak: 3, + quality: 11, + defindex: 1007, + }) + + assert.equal(itemString, 'Strange Professional Killstreak Festive Grenade Launcher'); + }); + + it('Case #13', () => { + const itemString = stringify({ + name: 'Sniper Rifle', + craftable: true, + quality: 6, + elevated: true, + defindex: 201, + }) + + assert.equal(itemString, 'Strange Unique Sniper Rifle'); + }); + + it('Case #14', () => { + const itemString = stringify({ + name: 'Australium Gold', + craftable: true, + quality: 6, + defindex: 5037, + }) + + assert.equal(itemString, 'Australium Gold'); + }); + + it('Case #15', () => { + const itemString = stringify({ + name: 'Blue Moon Case', + craftable: true, + itemNumber: { type: 'crate', value: 118 }, + quality: 6, + }) + + assert.equal(itemString, 'Blue Moon Case #118'); + }); + + it('Case #16', () => { + const itemString = stringify({ + name: 'Tartan Shade', + craftable: true, + quality: 6, + isUniqueHat: true, + defindex: 30064, + }) + + assert.equal(itemString, 'The Tartan Shade'); + }); + + it('Case #17', () => { + const itemString = stringify({ + name: 'Hot Case', + craftable: true, + quality: 11, + defindex: 30986, + }) + + assert.equal(itemString, 'Strange Hot Case'); + }); + + it('Case #18', () => { + const itemString = stringify({ + name: 'Hot Heels', + craftable: true, + quality: 11, + defindex: 30754, + }) + + assert.equal(itemString, 'Strange Hot Heels'); + }); + + it('Case #19', () => { + const itemString = stringify({ + name: 'A Head Full of Hot Air', + craftable: true, + quality: 11, + defindex: 30662, + }) + + assert.equal(itemString, 'Strange A Head Full of Hot Air'); + }); + + it('Case #20', () => { + const itemString = stringify({ + name: 'Unusualifier', + craftable: true, + quality: 5, + defindex: 9258, + target: 'Taunt: Kazotsky Kick', + targetDefindex: 1157, + }) + + assert.equal(itemString, 'Unusual Taunt: Kazotsky Kick Unusualifier'); + }); + + it('Case #21', () => { + const itemString = stringify({ + name: 'Strangifier', + craftable: true, + quality: 6, + defindex: 5661, + target: 'Ghostly Gibus', + targetDefindex: 940, + }) + + assert.equal(itemString, 'Ghostly Gibus Strangifier'); + }); + + it('Case #22', () => { + const itemString = stringify({ + name: 'Strange Bacon Grease', + craftable: true, + quality: 6, + defindex: 5633, + }) + + assert.equal(itemString, 'Strange Bacon Grease'); + }); + + it('Case #23', () => { + const itemString = stringify({ + "defindex": 30300, + quality: 13, + craftable: true, + }); + + assert.equal(itemString, 'Haunted Haunted Hat'); + }) + + it('Case #24 - fixed names', () => { + const itemString = stringify({ defindex: 5791, quality: 6, craftable: false }); + + assert.equal(itemString, 'Non-Craftable Naughty Winter Crate Key 2014'); + }); + + it('Case #25 - unique hat only defindex', () => { + const itemString = stringify({ defindex: 876, quality: 6, craftable: true }, { determineUniqueHat: true }); + + assert.equal(itemString, 'The K-9 Mane'); + }); + + it('Case #26 - unique hat only defindex off', () => { + const itemString = stringify({ defindex: 876, quality: 6, craftable: true }, { determineUniqueHat: false }); + + assert.equal(itemString, 'K-9 Mane'); + }); + + it('Case #26 - unique hat only defindex with other attributes', () => { + const itemString = stringify({ defindex: 876, quality: 6, craftable: false }, { determineUniqueHat: true }); + + assert.equal(itemString, 'Non-Craftable K-9 Mane'); + }); + + it('Case #26 - unique hat with bad name', () => { + const itemString = stringify({ name: 'K-9 Mane', quality: 6, craftable: true }, { determineUniqueHat: true }); + + assert.equal(itemString, 'The K-9 Mane'); + }); + + it('Case #27 - strange unique with determineUniqueHat', () => { + const itemString = stringify({ name: 'K-9 Mane', quality: 6, craftable: true, elevated: true }, { determineUniqueHat: true }); + + assert.equal(itemString, 'Strange Unique K-9 Mane'); + }); + + it('Case #27 - craft number with determineUniqueHat', () => { + const itemString = stringify({ name: 'Surgeon\'s Stahlhelm', quality: 6, craftable: true, itemNumber: { type: 'craft', value: 1 } }, { determineUniqueHat: true }); + + assert.equal(itemString, 'The Surgeon\'s Stahlhelm #1'); + }); + + it('Case #28 - case with determineUniqueHat', () => { + const itemString = stringify({ name: 'Gargoyle Case', quality: 6, craftable: true, itemNumber: { type: 'crate', value: 98 } }, { determineUniqueHat: true }); + + assert.equal(itemString, 'Gargoyle Case #98'); + }); + + it('Case #29 - The Bitter Taste of Defeat and Lime with determineUniqueHat', () => { + const itemString = stringify({ name: 'The Bitter Taste of Defeat and Lime', quality: 6, craftable: true }, { determineUniqueHat: true }); + + assert.equal(itemString, 'The Bitter Taste of Defeat and Lime'); + }) + + it('Case #30 - Normal quality item', () => { + const itemString = stringify({ defindex: 211, quality: 0, craftable: true, elevated: true }); + + assert.equal(itemString, 'Strange Normal Medi Gun'); + }); + + it('Case #31 - Normal quality item #2', () => { + const itemString = stringify({ name: 'Medi Gun', quality: 'Normal', craftable: true, elevated: true }); + + assert.equal(itemString, 'Strange Normal Medi Gun'); + }); + + it('Case #32 - Red Rock Roscoe texture', () => { + const itemString = stringify({ name: 'Pistol', quality: 'Decorated Weapon', craftable: true, wear: 'Field-Tested', festivized: true, killstreak: 'Specialized Killstreak', texture: 0 }); + + assert.equal(itemString, 'Festivized Specialized Killstreak Red Rock Roscoe Pistol (Field-Tested)'); + }); + + it('Case #33 - Bat', () => { + const itemString = stringify({ defindex: 0, quality: 'Unique', craftable: true }); + + assert.equal(itemString, 'Bat'); + }) + + it('Case #34 - Bat output', () => { + const itemString = stringify({ + name: 'Chemistry Set', + craftable: true, + outputDefindex: 0, + outputQuality: 'Collector\'s', + quality: 'Unique' + }); + + assert.equal(itemString, 'Collector\'s Bat Chemistry Set'); + }) + + it('Case #34 - Bat target', () => { + const itemString = stringify({ + name: 'Specialized Killstreak Kit Fabricator', + craftable: false, + killstreak: 'Specialized Killstreak', + targetDefindex: 0, + quality: 'Unique' + }); + + assert.equal(itemString, 'Non-Craftable Specialized Killstreak Bat Kit Fabricator'); + }) + + it('Case #35 - Unusual Haunted Metal Scrap', () => { + const itemString = stringify({ + name: 'Haunted Metal Scrap', + craftable: true, + quality: 'Unusual', + effect: 0, + }); + + assert.equal(itemString, 'Unusual Haunted Metal Scrap'); + }); +}); diff --git a/tsconfig.json b/tsconfig.json index 468c517..18fb280 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,70 +1,70 @@ -{ - "compilerOptions": { - /* Visit https://aka.ms/tsconfig.json to read more about this file */ - - /* Basic Options */ - // "incremental": true, /* Enable incremental compilation */ - "target": "es2016", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */ - "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */ - // "lib": [], /* Specify library files to be included in the compilation. */ - "allowJs": true, /* Allow javascript files to be compiled. */ - "checkJs": true, /* Report errors in .js files. */ - // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ - "declaration": true, /* Generates corresponding '.d.ts' file. */ - // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ - // "sourceMap": true, /* Generates corresponding '.map' file. */ - // "outFile": "./", /* Concatenate and emit output to single file. */ - "outDir": "./dist", /* Redirect output structure to the directory. */ - "rootDir": "./src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ - // "composite": true, /* Enable project compilation */ - // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ - // "removeComments": true, /* Do not emit comments to output. */ - // "noEmit": true, /* Do not emit outputs. */ - // "importHelpers": true, /* Import emit helpers from 'tslib'. */ - // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ - // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ - - /* Strict Type-Checking Options */ - "strict": true, /* Enable all strict type-checking options. */ - // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ - // "strictNullChecks": true, /* Enable strict null checks. */ - // "strictFunctionTypes": true, /* Enable strict checking of function types. */ - // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ - // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ - // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ - // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ - - /* Additional Checks */ - // "noUnusedLocals": true, /* Report errors on unused locals. */ - // "noUnusedParameters": true, /* Report errors on unused parameters. */ - // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ - // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ - - /* Module Resolution Options */ - // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ - // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ - // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ - // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ - // "typeRoots": [], /* List of folders to include type definitions from. */ - // "types": [], /* Type declaration files to be included in compilation. */ - // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ - "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ - // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ - // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ - - /* Source Map Options */ - // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ - // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ - // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ - // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ - - /* Experimental Options */ - // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ - // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ - - /* Advanced Options */ - "skipLibCheck": true, /* Skip type checking of declaration files. */ - "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ - }, - "exclude": ["./test/**/*", "./dist/**/*", "./node_modules/**/*", "./static.js"] -} +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig.json to read more about this file */ + + /* Basic Options */ + // "incremental": true, /* Enable incremental compilation */ + "target": "es2016", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */ + "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */ + // "lib": [], /* Specify library files to be included in the compilation. */ + "allowJs": true, /* Allow javascript files to be compiled. */ + "checkJs": true, /* Report errors in .js files. */ + // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ + "declaration": true, /* Generates corresponding '.d.ts' file. */ + // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ + // "sourceMap": true, /* Generates corresponding '.map' file. */ + // "outFile": "./", /* Concatenate and emit output to single file. */ + "outDir": "./dist", /* Redirect output structure to the directory. */ + "rootDir": "./src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ + // "composite": true, /* Enable project compilation */ + // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ + // "removeComments": true, /* Do not emit comments to output. */ + // "noEmit": true, /* Do not emit outputs. */ + // "importHelpers": true, /* Import emit helpers from 'tslib'. */ + // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ + // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ + + /* Strict Type-Checking Options */ + "strict": true, /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* Enable strict null checks. */ + // "strictFunctionTypes": true, /* Enable strict checking of function types. */ + // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ + // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ + // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ + // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ + + /* Additional Checks */ + // "noUnusedLocals": true, /* Report errors on unused locals. */ + // "noUnusedParameters": true, /* Report errors on unused parameters. */ + // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + + /* Module Resolution Options */ + // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ + // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ + // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ + // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ + // "typeRoots": [], /* List of folders to include type definitions from. */ + // "types": [], /* Type declaration files to be included in compilation. */ + // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ + "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ + // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + + /* Source Map Options */ + // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ + // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ + + /* Experimental Options */ + // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ + // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ + + /* Advanced Options */ + "skipLibCheck": true, /* Skip type checking of declaration files. */ + "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ + }, + "exclude": ["./test/**/*", "./dist/**/*", "./node_modules/**/*", "./static.js"] +}