diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..6647180 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,15 @@ +module.exports = { + extends: [ + "eslint:recommended", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended", + "plugin:@typescript-eslint/recommended-requiring-type-checking", + "prettier", + ], + parser: "@typescript-eslint/parser", + ignorePatterns: [".eslintrc.js"], + parserOptions: { + project: "./tsconfig.json", + }, + plugins: ["@typescript-eslint"], +}; diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..0f76943 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,70 @@ +name: CI + +on: + push: + branches: + - main + pull_request: + branches: + - main + +jobs: + test: + name: Test + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: [10.x, 12.x, 14.x, 15.x] + + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Setup Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v1 + with: + node-version: ${{ matrix.node-version }} + - name: Install dependencies + run: npm ci + - name: Run unit tests + env: + POESESSID: ${{ secrets.POESESSID }} + run: env POESESSID=$POESESSID npm run test:ci + + docs: + name: Generate documentation + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - run: npm ci --ignore-scripts + - run: npm run build:docs + - name: Deploy to GitHub Pages + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./docs + + release: + name: Release + needs: test + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v2 + with: + fetch-depth: 0 + - name: Setup Node.js + uses: actions/setup-node@v1 + with: + node-version: 12 + - name: Install dependencies + run: npm ci + - name: Build + run: npm run build --if-present + - name: Release + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + run: npx semantic-release diff --git a/.gitignore b/.gitignore index 6704566..8d00a70 100644 --- a/.gitignore +++ b/.gitignore @@ -4,10 +4,6 @@ logs npm-debug.log* yarn-debug.log* yarn-error.log* -lerna-debug.log* - -# Diagnostic reports (https://nodejs.org/api/report.html) -report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json # Runtime data pids @@ -15,17 +11,22 @@ pids *.seed *.pid.lock +# Distribution +dist/ + +# Documentation +docs/ + # Directory for instrumented libs generated by jscoverage/JSCover lib-cov # Coverage directory used by tools like istanbul coverage -*.lcov # nyc test coverage .nyc_output -# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) .grunt # Bower dependency directory (https://bower.io/) @@ -44,21 +45,12 @@ jspm_packages/ # TypeScript v1 declaration files typings/ -# TypeScript cache -*.tsbuildinfo - # Optional npm cache directory .npm # Optional eslint cache .eslintcache -# Microbundle cache -.rpt2_cache/ -.rts2_cache_cjs/ -.rts2_cache_es/ -.rts2_cache_umd/ - # Optional REPL history .node_repl_history @@ -70,35 +62,11 @@ typings/ # dotenv environment variables file .env -.env.test - -# parcel-bundler cache (https://parceljs.org/) -.cache -# Next.js build output +# next.js build output .next -# Nuxt.js build / generate output -.nuxt -dist - -# Gatsby files -.cache/ -# Comment in the public line in if your project uses Gatsby and *not* Next.js -# https://nextjs.org/blog/next-9-1#public-directory-support -# public - -# vuepress build output -.vuepress/dist - -# Serverless directories -.serverless/ - -# FuseBox cache -.fusebox/ - -# DynamoDB Local files -.dynamodb/ +# VSCODE +.vscode -# TernJS port file -.tern-port +src/playground.ts \ No newline at end of file diff --git a/.mocharc.js b/.mocharc.js new file mode 100644 index 0000000..3d1fbe8 --- /dev/null +++ b/.mocharc.js @@ -0,0 +1,5 @@ +module.exports = { + spec: ["src/**/*.spec.ts"], + require: ["ts-node/register/transpile-only", "./src/mochaFixtures.ts"], + recursive: true, +}; diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..33da1bb --- /dev/null +++ b/.prettierrc @@ -0,0 +1,10 @@ +{ + "tabWidth": 4, + "useTabs": false, + "semi": true, + "singleQuote": false, + "trailingComma": "es5", + "bracketSpacing": true, + "arrowParens": "always", + "printWidth": 100 +} diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..e69de29 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..31b7f4e --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,40 @@ +# Contributing + +Thanks for wanting to contribute to this project! + +When contributing to this repository, please first discuss the change you wish to make via issue, email, or any other method with the owners of this repository before making a change. + +## Report bugs using Github's [issues](https://github.com/klayveR/poe-api-wrappers/issues) + +We use GitHub issues to track public bugs. Report a bug by [opening a new issue](https://github.com/klayveR/poe-api-wrappers/issues/new). + +## Code contribution guidelines + +To make changes to the codebase, fork the repository from the `main` branch. When you are done, please submit a pull request. Please do **not** update the version in `package.json`. + +### Tests + +If you've added code that needs to be tested, add tests and make sure the tests pass. +To run the test suite, create a `.env` file in the root directory with the following content. + +``` +POESESSID=your-poe-session-id +``` + +Then, run the tests with `npm run test` or `npm run test:coverage` to also generate coverage reports. + +### Documentation + +APIs that are available to the end-user should be documented using [TypeDoc doc comments](https://typedoc.org/guides/doccomments/). Code that is only used internally does not necessarily need to be documented if it's intuitive and easy to understand, but it's obviously preferred to document it. + +### Commits + +Commit messages should follow the [angular commit message format](https://github.com/angular/angular/blob/master/CONTRIBUTING.md#-commit-message-format). + +### Code Style + +To guarantee a uniform code style, please run `npm run prettier`. Also, make sure your code lints (`npm run lint`). + +## License + +By contributing, you agree that your contributions will be licensed under its MIT License. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d2d45cc --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 Tobias Hoffmann + +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. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..4958d6a --- /dev/null +++ b/README.md @@ -0,0 +1,97 @@ +# Path of Exile API Wrappers + +This library was created to make interacting with the official and third-party APIs for Path of Exile easier. Data can be requested with a simple function call, the responses are then converted into fully typed class objects which you can interact with. For example, when posting a search query to the trade API, you can immediately request the listings by calling a function on the search result object which contains the hashes (see [Examples](#examples)). Please check out the documentation for more information. + +Since there are so many APIs with varying response structures, things may be incorrect or missing. If you notice something that needs to be added or fixed, please submit an [issue](https://github.com/klayveR/poe-api-wrappers/issues). + +# Getting started + +**Install with npm:** + +```bash +$ npm i @klayver/poe-api-wrappers --save +``` + +# Contributing + +Please refer to [CONTRIBUTING.md](https://github.com/klayveR/poe-api-wrappers/blob/main/CONTRIBUTING.md). + +# Examples + +## Path of Exile API + +> ⚠️ The following examples do not handle errors to keep it simple. You should wrap your calls in a try/catch block or do whatever you do to catch errors (see [Handling errors](#handling-errors)). Also, keep in mind that many APIs are rate limited, so if you want to hit an API often in a short timeframe, consider implementing logic to comply with rate limits. + +Before making requests to the official API, you should set your user agent, as requested by GGG [here](https://www.pathofexile.com/forum/view-thread/3019033/page/1#p23790007). + +```typescript +import { PathOfExile } from "@klayver/poe-api-wrappers"; + +PathOfExile.Settings.userAgent = "my-awesome-tool-name, contact@me.com"; +``` + +**Get 10 public stash tab chunks and do something with them** + +```typescript +let chunk = await PathOfExile.PublicStashTabs.get(); + +for (let i = 0; i < 9; i++) { + console.log(`This chunk has ${chunk.stashes.length} stashes.`); + chunk = await chunk.getNext(); +} +``` + +**Get the entire Standard league ladder and filter it by online players** + +```typescript +// Get the ladder with the first 200 entries +const ladder = await PathOfExile.Ladders.get("Standard", { limit: 200 }); + +// Request the remaining entries in chunks of 200 until there are no entries left +while ((await ladder.getNextEntries()) != null) { + console.log(`Current entries: ${ladder.entries.length}`); +} + +// Filter by online players +const online = ladder.filterBy("online", true); +console.log(`${online.length}/${ladder.total} players are currently online.`); +``` + +**Execute a search query and get the prices for the first 10 results** + +```typescript +const query = { + query: { + status: { option: "online" }, + name: "Shavronne's Wrappings", + type: "Occultist's Vestment", + }, + sort: { price: "asc" }, +}; + +const search = await PathOfExile.Trade.search("Standard", query); +const results = await search.getNextItems(); + +if (results != null) { + for (const result of results) { + const price = result.listing.price; + console.log(`Item is being sold for ${price.amount} ${price.currency}`); + } +} +``` + +### Handling errors + +Requests to the Path of Exile API throw custom errors when something goes wrong. The thrown custom error class include the same error codes as the ones documented in the [official developer API documentation](https://th.pathofexile.com/developer/docs/api-errors). Please note that you should also check for other errors, which might occur when, for example, no internet connection is available. + +```typescript +try { + await PathOfExile.Account.getAvatars("invalid"); +} catch (error: unknown) { + if (error instanceof PathOfExile.APIError) { + console.log(`Request failed with code ${error.code}: ${error.message}`); + } + + // Handle other errors... +} +``` diff --git a/nyc-config.js b/nyc-config.js new file mode 100644 index 0000000..5f46432 --- /dev/null +++ b/nyc-config.js @@ -0,0 +1,8 @@ +"use strict"; + +const { parserPlugins } = require("@istanbuljs/schema").defaults.nyc; + +module.exports = { + cache: false, + parserPlugins: parserPlugins.concat("typescript", "decorators-legacy"), +}; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..5b0de0a --- /dev/null +++ b/package-lock.json @@ -0,0 +1,8690 @@ +{ + "name": "@klayver/poe-api-wrappers", + "version": "0.1.0", + "lockfileVersion": 1, + "requires": true, + "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.12", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.12.tgz", + "integrity": "sha512-3eJJ841uKxeV8dcN/2yGEUy+RfgQspPEgQat85umsE1rotuquQ2AbIub4S6j7c50a2d+4myc+zSlnXeIHrOnhQ==", + "dev": true + }, + "@babel/core": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.13.10.tgz", + "integrity": "sha512-bfIYcT0BdKeAZrovpMqX2Mx5NrgAckGbwT982AkdS5GNfn3KMGiprlBAtmBcFZRUmpaufS6WZFP8trvx8ptFDw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.13.9", + "@babel/helper-compilation-targets": "^7.13.10", + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helpers": "^7.13.10", + "@babel/parser": "^7.13.10", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.13.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", + "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", + "dev": true, + "requires": { + "@babel/types": "^7.13.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-compilation-targets": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.10.tgz", + "integrity": "sha512-/Xju7Qg1GQO4mHZ/Kcs6Au7gfafgZnwm+a7sy/ow/tV1sHeraRUHbjdat8/UvDor4Tez+siGKDk6zIKtCPKVJA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.13.8", + "@babel/helper-validator-option": "^7.12.17", + "browserslist": "^4.14.5", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@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.12", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.12.tgz", + "integrity": "sha512-7zVQqMO3V+K4JOOj40kxiCrMf6xlQAkewBB0eu2b03OO/Q21ZutOzjpfD79A5gtE/2OWi1nv625MrDlGlkbknQ==", + "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.0", + "@babel/types": "^7.13.12" + } + }, + "@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.10", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.13.10.tgz", + "integrity": "sha512-4VO883+MWPDUVRF3PhiLBUFHoX/bsLTGFpFK/HqvvfBZz2D57u9XzPVNFVBTc0PW/CWR9BXTOKt8NF4DInUHcQ==", + "dev": true, + "requires": { + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0" + } + }, + "@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.12", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.12.tgz", + "integrity": "sha512-4T7Pb244rxH24yR116LAuJ+adxXXnHhZaLJjegJVKSdoNCe4x1eDBaud5YIcQFcqzsaD5BHvJw5BQ0AZapdCRw==", + "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.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.0.tgz", + "integrity": "sha512-xys5xi5JEhzC3RzEmSGrs/b3pJW/o87SypZ+G/PhaE7uqVQNv/jlmVIBXuoh5atqQ434LfXV+sf23Oxj0bchJQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.13.0", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.13.0", + "@babel/types": "^7.13.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + }, + "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.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.12.tgz", + "integrity": "sha512-K4nY2xFN4QMvQwkQ+zmBDp6ANMbVNw6BbxWmYA4qNjhR9W+Lj/8ky5MEY2Me5r+B2c6/v6F53oMndG+f9s3IiA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "@eslint/eslintrc": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.0.tgz", + "integrity": "sha512-2ZPCc+uNbjV5ERJr+aKSPRwZgKd2z11x0EgLvb1PURmUrn9QNRXFqje0Ldq454PfAVyaJYyrDvvIKSFP4NnBog==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "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 + }, + "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 + }, + "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 + } + } + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + } + }, + "@istanbuljs/nyc-config-typescript": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@istanbuljs/nyc-config-typescript/-/nyc-config-typescript-1.0.1.tgz", + "integrity": "sha512-/gz6LgVpky205LuoOfwEZmnUtaSmdk0QIMcNFj9OvxhiMhPpKftMgZmGN7jNj7jR+lr8IB1Yks3QSSSNSxfoaQ==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2" + } + }, + "@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 + }, + "@nodelib/fs.scandir": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", + "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.4", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", + "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", + "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.4", + "fastq": "^1.6.0" + } + }, + "@octokit/auth-token": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.4.5.tgz", + "integrity": "sha512-BpGYsPgJt05M7/L/5FoE1PiAbdxXFZkX/3kDYcsvd1v6UhlnE5e96dTDr0ezX/EFwciQxf3cNV0loipsURU+WA==", + "dev": true, + "requires": { + "@octokit/types": "^6.0.3" + } + }, + "@octokit/core": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.3.1.tgz", + "integrity": "sha512-Dc5NNQOYjgZU5S1goN6A/E500yXOfDUFRGQB8/2Tl16AcfvS3H9PudyOe3ZNE/MaVyHPIfC0htReHMJb1tMrvw==", + "dev": true, + "requires": { + "@octokit/auth-token": "^2.4.4", + "@octokit/graphql": "^4.5.8", + "@octokit/request": "^5.4.12", + "@octokit/request-error": "^2.0.5", + "@octokit/types": "^6.0.3", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/endpoint": { + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.11.tgz", + "integrity": "sha512-fUIPpx+pZyoLW4GCs3yMnlj2LfoXTWDUVPTC4V3MUEKZm48W+XYpeWSZCv+vYF1ZABUm2CqnDVf1sFtIYrj7KQ==", + "dev": true, + "requires": { + "@octokit/types": "^6.0.3", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/graphql": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.6.1.tgz", + "integrity": "sha512-2lYlvf4YTDgZCTXTW4+OX+9WTLFtEUc6hGm4qM1nlZjzxj+arizM4aHWzBVBCxY9glh7GIs0WEuiSgbVzv8cmA==", + "dev": true, + "requires": { + "@octokit/request": "^5.3.0", + "@octokit/types": "^6.0.3", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/openapi-types": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-5.3.2.tgz", + "integrity": "sha512-NxF1yfYOUO92rCx3dwvA2onF30Vdlg7YUkMVXkeptqpzA3tRLplThhFleV/UKWFgh7rpKu1yYRbvNDUtzSopKA==", + "dev": true + }, + "@octokit/plugin-paginate-rest": { + "version": "2.13.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.13.3.tgz", + "integrity": "sha512-46lptzM9lTeSmIBt/sVP/FLSTPGx6DCzAdSX3PfeJ3mTf4h9sGC26WpaQzMEq/Z44cOcmx8VsOhO+uEgE3cjYg==", + "dev": true, + "requires": { + "@octokit/types": "^6.11.0" + } + }, + "@octokit/plugin-request-log": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.3.tgz", + "integrity": "sha512-4RFU4li238jMJAzLgAwkBAw+4Loile5haQMQr+uhFq27BmyJXcXSKvoQKqh0agsZEiUlW6iSv3FAgvmGkur7OQ==", + "dev": true + }, + "@octokit/plugin-rest-endpoint-methods": { + "version": "4.13.5", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-4.13.5.tgz", + "integrity": "sha512-kYKcWkFm4Ldk8bZai2RVEP1z97k1C/Ay2FN9FNTBg7JIyKoiiJjks4OtT6cuKeZX39tqa+C3J9xeYc6G+6g8uQ==", + "dev": true, + "requires": { + "@octokit/types": "^6.12.2", + "deprecation": "^2.3.1" + } + }, + "@octokit/request": { + "version": "5.4.14", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.4.14.tgz", + "integrity": "sha512-VkmtacOIQp9daSnBmDI92xNIeLuSRDOIuplp/CJomkvzt7M18NXgG044Cx/LFKLgjKt9T2tZR6AtJayba9GTSA==", + "dev": true, + "requires": { + "@octokit/endpoint": "^6.0.1", + "@octokit/request-error": "^2.0.0", + "@octokit/types": "^6.7.1", + "deprecation": "^2.0.0", + "is-plain-object": "^5.0.0", + "node-fetch": "^2.6.1", + "once": "^1.4.0", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/request-error": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.0.5.tgz", + "integrity": "sha512-T/2wcCFyM7SkXzNoyVNWjyVlUwBvW3igM3Btr/eKYiPmucXTtkxt2RBsf6gn3LTzaLSLTQtNmvg+dGsOxQrjZg==", + "dev": true, + "requires": { + "@octokit/types": "^6.0.3", + "deprecation": "^2.0.0", + "once": "^1.4.0" + } + }, + "@octokit/rest": { + "version": "18.3.5", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.3.5.tgz", + "integrity": "sha512-ZPeRms3WhWxQBEvoIh0zzf8xdU2FX0Capa7+lTca8YHmRsO3QNJzf1H3PcuKKsfgp91/xVDRtX91sTe1kexlbw==", + "dev": true, + "requires": { + "@octokit/core": "^3.2.3", + "@octokit/plugin-paginate-rest": "^2.6.2", + "@octokit/plugin-request-log": "^1.0.2", + "@octokit/plugin-rest-endpoint-methods": "4.13.5" + } + }, + "@octokit/types": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.12.2.tgz", + "integrity": "sha512-kCkiN8scbCmSq+gwdJV0iLgHc0O/GTPY1/cffo9kECu1MvatLPh9E+qFhfRIktKfHEA6ZYvv6S1B4Wnv3bi3pA==", + "dev": true, + "requires": { + "@octokit/openapi-types": "^5.3.2" + } + }, + "@semantic-release/changelog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@semantic-release/changelog/-/changelog-5.0.1.tgz", + "integrity": "sha512-unvqHo5jk4dvAf2nZ3aw4imrlwQ2I50eVVvq9D47Qc3R+keNqepx1vDYwkjF8guFXnOYaYcR28yrZWno1hFbiw==", + "dev": true, + "requires": { + "@semantic-release/error": "^2.1.0", + "aggregate-error": "^3.0.0", + "fs-extra": "^9.0.0", + "lodash": "^4.17.4" + } + }, + "@semantic-release/commit-analyzer": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-8.0.1.tgz", + "integrity": "sha512-5bJma/oB7B4MtwUkZC2Bf7O1MHfi4gWe4mA+MIQ3lsEV0b422Bvl1z5HRpplDnMLHH3EXMoRdEng6Ds5wUqA3A==", + "dev": true, + "requires": { + "conventional-changelog-angular": "^5.0.0", + "conventional-commits-filter": "^2.0.0", + "conventional-commits-parser": "^3.0.7", + "debug": "^4.0.0", + "import-from": "^3.0.0", + "lodash": "^4.17.4", + "micromatch": "^4.0.2" + } + }, + "@semantic-release/error": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-2.2.0.tgz", + "integrity": "sha512-9Tj/qn+y2j+sjCI3Jd+qseGtHjOAeg7dU2/lVcqIQ9TV3QDaDXDYXcoOHU+7o2Hwh8L8ymL4gfuO7KxDs3q2zg==", + "dev": true + }, + "@semantic-release/git": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@semantic-release/git/-/git-9.0.0.tgz", + "integrity": "sha512-AZ4Zha5NAPAciIJH3ipzw/WU9qLAn8ENaoVAhD6srRPxTpTzuV3NhNh14rcAo8Paj9dO+5u4rTKcpetOBluYVw==", + "dev": true, + "requires": { + "@semantic-release/error": "^2.1.0", + "aggregate-error": "^3.0.0", + "debug": "^4.0.0", + "dir-glob": "^3.0.0", + "execa": "^4.0.0", + "lodash": "^4.17.4", + "micromatch": "^4.0.0", + "p-reduce": "^2.0.0" + } + }, + "@semantic-release/github": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-7.2.0.tgz", + "integrity": "sha512-tMRnWiiWb43whRHvbDGXq4DGEbKRi56glDpXDJZit4PIiwDPX7Kx3QzmwRtDOcG+8lcpGjpdPabYZ9NBxoI2mw==", + "dev": true, + "requires": { + "@octokit/rest": "^18.0.0", + "@semantic-release/error": "^2.2.0", + "aggregate-error": "^3.0.0", + "bottleneck": "^2.18.1", + "debug": "^4.0.0", + "dir-glob": "^3.0.0", + "fs-extra": "^9.0.0", + "globby": "^11.0.0", + "http-proxy-agent": "^4.0.0", + "https-proxy-agent": "^5.0.0", + "issue-parser": "^6.0.0", + "lodash": "^4.17.4", + "mime": "^2.4.3", + "p-filter": "^2.0.0", + "p-retry": "^4.0.0", + "url-join": "^4.0.0" + } + }, + "@semantic-release/npm": { + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-7.0.10.tgz", + "integrity": "sha512-DXFEhgSt5u22imTWbw8wfcVGB90nFJNcjUBtJI3zswJojzZ7yXpY4i2Va5RBRQRTtj00BfG0stbilAtKrKp35g==", + "dev": true, + "requires": { + "@semantic-release/error": "^2.2.0", + "aggregate-error": "^3.0.0", + "execa": "^5.0.0", + "fs-extra": "^9.0.0", + "lodash": "^4.17.15", + "nerf-dart": "^1.0.0", + "normalize-url": "^5.0.0", + "npm": "^6.14.9", + "rc": "^1.2.8", + "read-pkg": "^5.0.0", + "registry-auth-token": "^4.0.0", + "semver": "^7.1.2", + "tempy": "^1.0.0" + }, + "dependencies": { + "execa": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz", + "integrity": "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.0.tgz", + "integrity": "sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==", + "dev": true + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + } + } + }, + "@semantic-release/release-notes-generator": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-9.0.2.tgz", + "integrity": "sha512-xGFSidhGqB27uwgWCU6y0gbf4r/no5flOAkJyFFc4+bPf8S+LfAVm7xhhlK5VPXLt2Iu1RBH8F+IgMK2ah5YpA==", + "dev": true, + "requires": { + "conventional-changelog-angular": "^5.0.0", + "conventional-changelog-writer": "^4.0.0", + "conventional-commits-filter": "^2.0.0", + "conventional-commits-parser": "^3.0.0", + "debug": "^4.0.0", + "get-stream": "^5.0.0", + "import-from": "^3.0.0", + "into-stream": "^6.0.0", + "lodash": "^4.17.4", + "read-pkg-up": "^7.0.0" + } + }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true + }, + "@types/chai": { + "version": "4.2.15", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.15.tgz", + "integrity": "sha512-rYff6FI+ZTKAPkJUoyz7Udq3GaoDZnxYDEvdEdFZASiA7PoErltHezDishqQiSDWrGxvxmplH304jyzQmjp0AQ==", + "dev": true + }, + "@types/chai-as-promised": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.3.tgz", + "integrity": "sha512-FQnh1ohPXJELpKhzjuDkPLR2BZCAqed+a6xV4MI/T3XzHfd2FlarfUGUdZYgqYe8oxkYn0fchHEeHfHqdZ96sg==", + "dev": true, + "requires": { + "@types/chai": "*" + } + }, + "@types/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "dev": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/json-schema": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", + "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", + "dev": true + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, + "@types/minimist": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.1.tgz", + "integrity": "sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==", + "dev": true + }, + "@types/mocha": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.2.tgz", + "integrity": "sha512-Lwh0lzzqT5Pqh6z61P3c3P5nm6fzQK/MMHl9UKeneAeInVflBSz1O2EkX6gM6xfJd7FBXBY5purtLx7fUiZ7Hw==", + "dev": true + }, + "@types/node": { + "version": "14.14.35", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.35.tgz", + "integrity": "sha512-Lt+wj8NVPx0zUmUwumiVXapmaLUcAk3yPuHCFVXras9k5VT9TdhJqKqGVUQCD60OTMCl0qxJ57OiTL0Mic3Iag==", + "dev": true + }, + "@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", + "dev": true + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "dev": true + }, + "@typescript-eslint/eslint-plugin": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.19.0.tgz", + "integrity": "sha512-CRQNQ0mC2Pa7VLwKFbrGVTArfdVDdefS+gTw0oC98vSI98IX5A8EVH4BzJ2FOB0YlCmm8Im36Elad/Jgtvveaw==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "4.19.0", + "@typescript-eslint/scope-manager": "4.19.0", + "debug": "^4.1.1", + "functional-red-black-tree": "^1.0.1", + "lodash": "^4.17.15", + "regexpp": "^3.0.0", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + } + }, + "@typescript-eslint/experimental-utils": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.19.0.tgz", + "integrity": "sha512-9/23F1nnyzbHKuoTqFN1iXwN3bvOm/PRIXSBR3qFAYotK/0LveEOHr5JT1WZSzcD6BESl8kPOG3OoDRKO84bHA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/scope-manager": "4.19.0", + "@typescript-eslint/types": "4.19.0", + "@typescript-eslint/typescript-estree": "4.19.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + } + }, + "@typescript-eslint/parser": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.19.0.tgz", + "integrity": "sha512-/uabZjo2ZZhm66rdAu21HA8nQebl3lAIDcybUoOxoI7VbZBYavLIwtOOmykKCJy+Xq6Vw6ugkiwn8Js7D6wieA==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "4.19.0", + "@typescript-eslint/types": "4.19.0", + "@typescript-eslint/typescript-estree": "4.19.0", + "debug": "^4.1.1" + } + }, + "@typescript-eslint/scope-manager": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.19.0.tgz", + "integrity": "sha512-GGy4Ba/hLXwJXygkXqMzduqOMc+Na6LrJTZXJWVhRrSuZeXmu8TAnniQVKgj8uTRKe4igO2ysYzH+Np879G75g==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.19.0", + "@typescript-eslint/visitor-keys": "4.19.0" + } + }, + "@typescript-eslint/types": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.19.0.tgz", + "integrity": "sha512-A4iAlexVvd4IBsSTNxdvdepW0D4uR/fwxDrKUa+iEY9UWvGREu2ZyB8ylTENM1SH8F7bVC9ac9+si3LWNxcBuA==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.19.0.tgz", + "integrity": "sha512-3xqArJ/A62smaQYRv2ZFyTA+XxGGWmlDYrsfZG68zJeNbeqRScnhf81rUVa6QG4UgzHnXw5VnMT5cg75dQGDkA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.19.0", + "@typescript-eslint/visitor-keys": "4.19.0", + "debug": "^4.1.1", + "globby": "^11.0.1", + "is-glob": "^4.0.1", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.19.0.tgz", + "integrity": "sha512-aGPS6kz//j7XLSlgpzU2SeTqHPsmRYxFztj2vPuMMFJXZudpRSehE3WCV+BaxwZFvfAqMoSd86TEuM0PQ59E/A==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.19.0", + "eslint-visitor-keys": "^2.0.0" + } + }, + "@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 + }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "dev": true + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" + } + }, + "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-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + }, + "dependencies": { + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + } + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "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" + } + }, + "ansicolors": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", + "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=", + "dev": true + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "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 + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "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" + } + }, + "argv-formatter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/argv-formatter/-/argv-formatter-1.0.0.tgz", + "integrity": "sha1-oMoMvCmltz6Dbuvhy/bF4OTrgvk=", + "dev": true + }, + "array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", + "dev": true + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "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 + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "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==", + "dev": true + }, + "axios": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", + "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", + "requires": { + "follow-redirects": "^1.10.0" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "before-after-hook": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.0.tgz", + "integrity": "sha512-jH6rKQIfroBbhEXVmI7XmXe3ix5S/PgJqpzdDPnR8JGLHWNYLsYZ6tK5iWOF/Ra3oqEX0NobXGlzbiylIzVphQ==", + "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 + }, + "bottleneck": { + "version": "2.19.5", + "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", + "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==", + "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.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz", + "integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001181", + "colorette": "^1.2.1", + "electron-to-chromium": "^1.3.649", + "escalade": "^3.1.1", + "node-releases": "^1.1.70" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "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" + } + }, + "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 + }, + "camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + } + }, + "caniuse-lite": { + "version": "1.0.30001204", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001204.tgz", + "integrity": "sha512-JUdjWpcxfJ9IPamy2f5JaRDCaqJOxDzOSKtbdx4rH9VivMd1vIzoPumsJa9LoMIi4Fx2BV2KZOxWhNkBjaYivQ==", + "dev": true + }, + "cardinal": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", + "integrity": "sha1-fMEFXYItISlU0HsIXeolHMe8VQU=", + "dev": true, + "requires": { + "ansicolors": "~0.3.2", + "redeyed": "~2.1.0" + } + }, + "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" + } + }, + "chai-as-promised": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", + "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", + "dev": true, + "requires": { + "check-error": "^1.0.2" + } + }, + "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.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.3.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + } + }, + "class-transformer": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.4.0.tgz", + "integrity": "sha512-ETWD/H2TbWbKEi7m9N4Km5+cw1hNcqJSxlSYhsLsNjQzWWiZIYA1zafxpK9PwVfaZ6AqR5rrjPVUBGESm5tQUA==" + }, + "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 + }, + "cli-table": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.6.tgz", + "integrity": "sha512-ZkNZbnZjKERTY5NwC2SeMeLeifSPq/pubeRoTpdr3WchLlnZg6hEgvHkK5zL7KNFdd9PmHN8lxrENUwI3cE8vQ==", + "dev": true, + "requires": { + "colors": "1.0.3" + } + }, + "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 + }, + "colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", + "dev": true + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "compare-func": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "dev": true, + "requires": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" + } + }, + "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 + }, + "conventional-changelog-angular": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.12.tgz", + "integrity": "sha512-5GLsbnkR/7A89RyHLvvoExbiGbd9xKdKqDTrArnPbOqBqG/2wIosu0fHwpeIRI8Tl94MhVNBXcLJZl92ZQ5USw==", + "dev": true, + "requires": { + "compare-func": "^2.0.0", + "q": "^1.5.1" + } + }, + "conventional-changelog-eslint": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.9.tgz", + "integrity": "sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==", + "dev": true, + "requires": { + "q": "^1.5.1" + } + }, + "conventional-changelog-writer": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.1.0.tgz", + "integrity": "sha512-WwKcUp7WyXYGQmkLsX4QmU42AZ1lqlvRW9mqoyiQzdD+rJWbTepdWoKJuwXTS+yq79XKnQNa93/roViPQrAQgw==", + "dev": true, + "requires": { + "compare-func": "^2.0.0", + "conventional-commits-filter": "^2.0.7", + "dateformat": "^3.0.0", + "handlebars": "^4.7.6", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "semver": "^6.0.0", + "split": "^1.0.0", + "through2": "^4.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "conventional-commits-filter": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", + "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", + "dev": true, + "requires": { + "lodash.ismatch": "^4.4.0", + "modify-values": "^1.0.0" + } + }, + "conventional-commits-parser": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.1.tgz", + "integrity": "sha512-OG9kQtmMZBJD/32NEw5IhN5+HnBqVjy03eC+I71I0oQRFA5rOgA4OtPOYG7mz1GkCfCNxn3gKIX8EiHJYuf1cA==", + "dev": true, + "requires": { + "JSONStream": "^1.0.4", + "is-text-path": "^1.0.1", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0", + "trim-off-newlines": "^1.0.0" + } + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cosmiconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "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" + } + }, + "crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "dev": true + }, + "dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "dev": true + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "dev": true, + "requires": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "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-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "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" + } + }, + "del": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", + "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", + "dev": true, + "requires": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + } + }, + "deprecation": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", + "dev": true + }, + "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 + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "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" + } + }, + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + } + }, + "dotenv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", + "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==", + "dev": true + }, + "dotenv-cli": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/dotenv-cli/-/dotenv-cli-4.0.0.tgz", + "integrity": "sha512-ByKEec+ashePEXthZaA1fif9XDtcaRnkN7eGdBDx3HHRjwZ/rA1go83Cbs4yRrx3JshsCf96FjAyIA2M672+CQ==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.1", + "dotenv": "^8.1.0", + "dotenv-expand": "^5.1.0", + "minimist": "^1.1.3" + } + }, + "dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", + "dev": true + }, + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "dev": true, + "requires": { + "readable-stream": "^2.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "electron-to-chromium": { + "version": "1.3.694", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.694.tgz", + "integrity": "sha512-8YJ/OZjbK5luOd27dmk34B47oa/zNGRHrKTEmfO3qPns1kFAJ36Lb+OtYzNlCoXtkPYuDbX0ztofuL7ArMHJkQ==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "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" + } + }, + "env-ci": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-5.0.2.tgz", + "integrity": "sha512-Xc41mKvjouTXD3Oy9AqySz1IeyvJvHZ20Twf5ZLYbNpPPIuCnL/qHCmNlD01LoNy0JTunw9HPYVptD19Ac7Mbw==", + "dev": true, + "requires": { + "execa": "^4.0.0", + "java-properties": "^1.0.0" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "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": "7.22.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.22.0.tgz", + "integrity": "sha512-3VawOtjSJUQiiqac8MQc+w457iGLfuNGLFn8JmF051tTKbh5/x/0vlcEj8OgDCaw7Ysa2Jn8paGshV7x2abKXg==", + "dev": true, + "requires": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash": "^4.17.21", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.4", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "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.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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 + }, + "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 + }, + "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": "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-prettier": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.1.0.tgz", + "integrity": "sha512-oKMhGv3ihGbCIimCAjqkdzx2Q+jthoqnXSP+d86M9tptwugycmTFdVR4IpLgq2c4SHifbwO90z2fQ8/Aio73yw==", + "dev": true + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", + "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", + "dev": true + }, + "espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "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" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "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" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "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-glob": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", + "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + } + }, + "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 + }, + "fastq": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", + "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "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" + } + }, + "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" + } + }, + "find-versions": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-4.0.0.tgz", + "integrity": "sha512-wgpWy002tA+wgmO27buH/9KzyEOQnKsG/R0yrcjPT9BOFm0zRBVQbZ95nRGXWMywS8YR5knRbpohio0bcJABxQ==", + "dev": true, + "requires": { + "semver-regex": "^3.1.2" + } + }, + "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.1.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", + "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", + "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==" + }, + "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" + } + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "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==", + "dev": 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==", + "dev": 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-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "git-log-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/git-log-parser/-/git-log-parser-1.2.0.tgz", + "integrity": "sha1-LmpMGxP8AAKCB7p5WnrDFme5/Uo=", + "dev": true, + "requires": { + "argv-formatter": "~1.0.0", + "spawn-error-forwarder": "~1.0.0", + "split2": "~1.0.0", + "stream-combiner2": "~1.1.1", + "through2": "~2.0.0", + "traverse": "~0.6.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "split2": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-1.0.0.tgz", + "integrity": "sha1-UuLiIdiMdfmnP5BVbiY/+WdysxQ=", + "dev": true, + "requires": { + "through2": "~2.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "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.7.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.7.0.tgz", + "integrity": "sha512-Aipsz6ZKRxa/xQkZhNg0qIWXT6x6rD46f6x/PCnBomlttdIyAPak4YD9jTmKpZ72uROSMU87qJtcgpgHaVchiA==", + "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 + } + } + }, + "globby": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz", + "integrity": "sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + } + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, + "handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "dev": true, + "requires": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" + } + }, + "hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "hasha": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "dev": true, + "requires": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + }, + "dependencies": { + "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 + } + } + }, + "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 + }, + "hook-std": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-2.0.0.tgz", + "integrity": "sha512-zZ6T5WcuBMIUVh49iPQS9t977t7C0l7OtHrpeMb5uk48JdflRX0NSFvCekfYNmGQETnLq9W/isMyHl69kxGi8g==", + "dev": true + }, + "hosted-git-info": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.1.tgz", + "integrity": "sha512-eT7NrxAsppPRQEBSwKSosReE+v8OzABwEScQYk5d4uxaEPlzxTIku7LINXtBGalthkLhJnq5lBI89PfK43zAKg==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true + }, + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "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" + }, + "dependencies": { + "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 + } + } + }, + "import-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz", + "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==", + "dev": true, + "requires": { + "resolve-from": "^5.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==", + "dev": true + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true + }, + "into-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz", + "integrity": "sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==", + "dev": true, + "requires": { + "from2": "^2.3.0", + "p-is-promise": "^3.0.0" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": 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-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "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-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "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-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true + }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "is-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", + "dev": true, + "requires": { + "text-extensions": "^1.0.0" + } + }, + "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-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 + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "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 + }, + "issue-parser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-6.0.0.tgz", + "integrity": "sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==", + "dev": true, + "requires": { + "lodash.capitalize": "^4.2.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.uniqby": "^4.7.0" + } + }, + "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" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "istanbul-lib-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" + }, + "dependencies": { + "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" + } + } + } + }, + "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" + } + }, + "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" + } + }, + "java-properties": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/java-properties/-/java-properties-1.0.2.tgz", + "integrity": "sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==", + "dev": true + }, + "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-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "json-schema-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 + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json5": { + "version": "2.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==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "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" + } + }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lodash.capitalize": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", + "integrity": "sha1-+CbJtOKoUR2E46yinbBeGk87cqk=", + "dev": true + }, + "lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha1-ZHYsSGGAglGKw99Mz11YhtriA0c=", + "dev": true + }, + "lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", + "dev": true + }, + "lodash.ismatch": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", + "integrity": "sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc=", + "dev": true + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", + "dev": true + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=", + "dev": true + }, + "lodash.toarray": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz", + "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE=", + "dev": true + }, + "lodash.uniqby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", + "integrity": "sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI=", + "dev": true + }, + "log-symbols": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "dev": true, + "requires": { + "chalk": "^4.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" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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" + } + }, + "lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", + "dev": true + }, + "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" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "map-obj": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.2.0.tgz", + "integrity": "sha512-NAq0fCmZYGz9UFEQyndp7sisrow4GroyGeKluyKC/chuITZsPyOyC1UJZPJlVFImhXdROIP5xqouRLThT3BbpQ==", + "dev": true + }, + "marked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/marked/-/marked-2.0.1.tgz", + "integrity": "sha512-5+/fKgMv2hARmMW7DOpykr2iLhl0NgjyELk5yn92iE7z8Se1IS9n3UsFm86hFXIkvMBmVxki8+ckcpjBeyo/hw==", + "dev": true + }, + "marked-terminal": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-4.1.1.tgz", + "integrity": "sha512-t7Mdf6T3PvOEyN01c3tYxDzhyKZ8xnkp8Rs6Fohno63L/0pFTJ5Qtwto2AQVuDtbQiWzD+4E5AAu1Z2iLc8miQ==", + "dev": true, + "requires": { + "ansi-escapes": "^4.3.1", + "cardinal": "^2.1.1", + "chalk": "^4.1.0", + "cli-table": "^0.3.1", + "node-emoji": "^1.10.0", + "supports-hyperlinks": "^2.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.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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" + } + } + } + }, + "meow": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "dev": true, + "requires": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", + "dev": true + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true + }, + "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 + }, + "minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + } + }, + "mocha": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.3.2.tgz", + "integrity": "sha512-UdmISwr/5w+uXLPKspgoV7/RXZwKRTiTjJ2/AC5ZiEztIoOYdfKb19+9jNmEInzx5pBsCyJQzarAxqIGBNYJhg==", + "dev": true, + "requires": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.1", + "debug": "4.3.1", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.1.6", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.0.0", + "log-symbols": "4.0.0", + "minimatch": "3.0.4", + "ms": "2.1.3", + "nanoid": "3.1.20", + "serialize-javascript": "5.0.1", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "wide-align": "1.1.3", + "workerpool": "6.1.0", + "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 + }, + "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" + } + }, + "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.0.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz", + "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "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" + } + }, + "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 + }, + "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-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" + } + }, + "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": "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" + } + }, + "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 + } + } + }, + "modify-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", + "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", + "dev": true + }, + "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.20", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", + "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", + "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 + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "nerf-dart": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/nerf-dart/-/nerf-dart-1.0.0.tgz", + "integrity": "sha1-5tq3/r9a2Bbqgc9cYpxaDr3nLBo=", + "dev": true + }, + "node-emoji": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.10.0.tgz", + "integrity": "sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw==", + "dev": true, + "requires": { + "lodash.toarray": "^4.4.0" + } + }, + "node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", + "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-package-data": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.2.tgz", + "integrity": "sha512-6CdZocmfGaKnIHPVFhJJZ3GuR8SsLKvDANFp47Jmy51aKIr8akjAWTSxtpI+MBgBFdSMRyo4hMpDlT6dTffgZg==", + "dev": true, + "requires": { + "hosted-git-info": "^4.0.1", + "resolve": "^1.20.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + } + }, + "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 + }, + "normalize-url": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-5.3.0.tgz", + "integrity": "sha512-9/nOVLYYe/dO/eJeQUNaGUF4m4Z5E7cb9oNTKabH+bNf19mqj60txTcveQxL0GlcWLXCxkOu2/LwL8oW0idIDA==", + "dev": true + }, + "npm": { + "version": "6.14.11", + "resolved": "https://registry.npmjs.org/npm/-/npm-6.14.11.tgz", + "integrity": "sha512-1Zh7LjuIoEhIyjkBflSSGzfjuPQwDlghNloppjruOH5bmj9midT9qcNT0tRUZRR04shU9ekrxNy9+UTBrqeBpQ==", + "dev": true, + "requires": { + "JSONStream": "^1.3.5", + "abbrev": "~1.1.1", + "ansicolors": "~0.3.2", + "ansistyles": "~0.1.3", + "aproba": "^2.0.0", + "archy": "~1.0.0", + "bin-links": "^1.1.8", + "bluebird": "^3.5.5", + "byte-size": "^5.0.1", + "cacache": "^12.0.3", + "call-limit": "^1.1.1", + "chownr": "^1.1.4", + "ci-info": "^2.0.0", + "cli-columns": "^3.1.2", + "cli-table3": "^0.5.1", + "cmd-shim": "^3.0.3", + "columnify": "~1.5.4", + "config-chain": "^1.1.12", + "debuglog": "*", + "detect-indent": "~5.0.0", + "detect-newline": "^2.1.0", + "dezalgo": "~1.0.3", + "editor": "~1.0.0", + "figgy-pudding": "^3.5.1", + "find-npm-prefix": "^1.0.2", + "fs-vacuum": "~1.2.10", + "fs-write-stream-atomic": "~1.0.10", + "gentle-fs": "^2.3.1", + "glob": "^7.1.6", + "graceful-fs": "^4.2.4", + "has-unicode": "~2.0.1", + "hosted-git-info": "^2.8.8", + "iferr": "^1.0.2", + "imurmurhash": "*", + "infer-owner": "^1.0.4", + "inflight": "~1.0.6", + "inherits": "^2.0.4", + "ini": "^1.3.8", + "init-package-json": "^1.10.3", + "is-cidr": "^3.0.0", + "json-parse-better-errors": "^1.0.2", + "lazy-property": "~1.0.0", + "libcipm": "^4.0.8", + "libnpm": "^3.0.1", + "libnpmaccess": "^3.0.2", + "libnpmhook": "^5.0.3", + "libnpmorg": "^1.0.1", + "libnpmsearch": "^2.0.2", + "libnpmteam": "^1.0.2", + "libnpx": "^10.2.4", + "lock-verify": "^2.1.0", + "lockfile": "^1.0.4", + "lodash._baseindexof": "*", + "lodash._baseuniq": "~4.6.0", + "lodash._bindcallback": "*", + "lodash._cacheindexof": "*", + "lodash._createcache": "*", + "lodash._getnative": "*", + "lodash.clonedeep": "~4.5.0", + "lodash.restparam": "*", + "lodash.union": "~4.6.0", + "lodash.uniq": "~4.5.0", + "lodash.without": "~4.4.0", + "lru-cache": "^5.1.1", + "meant": "^1.0.2", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.5", + "move-concurrently": "^1.0.1", + "node-gyp": "^5.1.0", + "nopt": "^4.0.3", + "normalize-package-data": "^2.5.0", + "npm-audit-report": "^1.3.3", + "npm-cache-filename": "~1.0.2", + "npm-install-checks": "^3.0.2", + "npm-lifecycle": "^3.1.5", + "npm-package-arg": "^6.1.1", + "npm-packlist": "^1.4.8", + "npm-pick-manifest": "^3.0.2", + "npm-profile": "^4.0.4", + "npm-registry-fetch": "^4.0.7", + "npm-user-validate": "^1.0.1", + "npmlog": "~4.1.2", + "once": "~1.4.0", + "opener": "^1.5.2", + "osenv": "^0.1.5", + "pacote": "^9.5.12", + "path-is-inside": "~1.0.2", + "promise-inflight": "~1.0.1", + "qrcode-terminal": "^0.12.0", + "query-string": "^6.8.2", + "qw": "~1.0.1", + "read": "~1.0.7", + "read-cmd-shim": "^1.0.5", + "read-installed": "~4.0.3", + "read-package-json": "^2.1.1", + "read-package-tree": "^5.3.1", + "readable-stream": "^3.6.0", + "readdir-scoped-modules": "^1.1.0", + "request": "^2.88.0", + "retry": "^0.12.0", + "rimraf": "^2.7.1", + "safe-buffer": "^5.1.2", + "semver": "^5.7.1", + "sha": "^3.0.0", + "slide": "~1.1.6", + "sorted-object": "~2.0.1", + "sorted-union-stream": "~2.1.3", + "ssri": "^6.0.1", + "stringify-package": "^1.0.1", + "tar": "^4.4.13", + "text-table": "~0.2.0", + "tiny-relative-date": "^1.3.0", + "uid-number": "0.0.6", + "umask": "~1.1.0", + "unique-filename": "^1.1.1", + "unpipe": "~1.0.0", + "update-notifier": "^2.5.0", + "uuid": "^3.3.3", + "validate-npm-package-license": "^3.0.4", + "validate-npm-package-name": "~3.0.0", + "which": "^1.3.1", + "worker-farm": "^1.7.0", + "write-file-atomic": "^2.4.3" + }, + "dependencies": { + "JSONStream": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true + }, + "agent-base": { + "version": "4.3.0", + "bundled": true, + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "agentkeepalive": { + "version": "3.5.2", + "bundled": true, + "dev": true, + "requires": { + "humanize-ms": "^1.2.1" + } + }, + "ansi-align": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "string-width": "^2.0.0" + } + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "bundled": true, + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "ansicolors": { + "version": "0.3.2", + "bundled": true, + "dev": true + }, + "ansistyles": { + "version": "0.1.3", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "archy": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "asap": { + "version": "2.0.6", + "bundled": true, + "dev": true + }, + "asn1": { + "version": "0.2.4", + "bundled": true, + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "bundled": true, + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "bundled": true, + "dev": true + }, + "aws4": { + "version": "1.8.0", + "bundled": true, + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "bin-links": { + "version": "1.1.8", + "bundled": true, + "dev": true, + "requires": { + "bluebird": "^3.5.3", + "cmd-shim": "^3.0.0", + "gentle-fs": "^2.3.0", + "graceful-fs": "^4.1.15", + "npm-normalize-package-bin": "^1.0.0", + "write-file-atomic": "^2.3.0" + } + }, + "bluebird": { + "version": "3.5.5", + "bundled": true, + "dev": true + }, + "boxen": { + "version": "1.3.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.0.0" + } + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "builtins": { + "version": "1.0.3", + "bundled": true, + "dev": true + }, + "byline": { + "version": "5.0.0", + "bundled": true, + "dev": true + }, + "byte-size": { + "version": "5.0.1", + "bundled": true, + "dev": true + }, + "cacache": { + "version": "12.0.3", + "bundled": true, + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "call-limit": { + "version": "1.1.1", + "bundled": true, + "dev": true + }, + "camelcase": { + "version": "4.1.0", + "bundled": true, + "dev": true + }, + "capture-stack-trace": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "caseless": { + "version": "0.12.0", + "bundled": true, + "dev": true + }, + "chalk": { + "version": "2.4.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chownr": { + "version": "1.1.4", + "bundled": true, + "dev": true + }, + "ci-info": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "cidr-regex": { + "version": "2.0.10", + "bundled": true, + "dev": true, + "requires": { + "ip-regex": "^2.1.0" + } + }, + "cli-boxes": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "cli-columns": { + "version": "3.1.2", + "bundled": true, + "dev": true, + "requires": { + "string-width": "^2.0.0", + "strip-ansi": "^3.0.1" + } + }, + "cli-table3": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "colors": "^1.1.2", + "object-assign": "^4.1.0", + "string-width": "^2.1.1" + } + }, + "cliui": { + "version": "5.0.0", + "bundled": true, + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "bundled": true, + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "string-width": { + "version": "3.1.0", + "bundled": true, + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "clone": { + "version": "1.0.4", + "bundled": true, + "dev": true + }, + "cmd-shim": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "mkdirp": "~0.5.0" + } + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "color-convert": { + "version": "1.9.1", + "bundled": true, + "dev": true, + "requires": { + "color-name": "^1.1.1" + } + }, + "color-name": { + "version": "1.1.3", + "bundled": true, + "dev": true + }, + "colors": { + "version": "1.3.3", + "bundled": true, + "dev": true, + "optional": true + }, + "columnify": { + "version": "1.5.4", + "bundled": true, + "dev": true, + "requires": { + "strip-ansi": "^3.0.0", + "wcwidth": "^1.0.0" + } + }, + "combined-stream": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "bundled": true, + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "config-chain": { + "version": "1.1.12", + "bundled": true, + "dev": true, + "requires": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "configstore": { + "version": "3.1.5", + "bundled": true, + "dev": true, + "requires": { + "dot-prop": "^4.2.1", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" + } + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "copy-concurrently": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + }, + "dependencies": { + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "iferr": { + "version": "0.1.5", + "bundled": true, + "dev": true + } + } + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "create-error-class": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "requires": { + "capture-stack-trace": "^1.0.0" + } + }, + "cross-spawn": { + "version": "5.1.0", + "bundled": true, + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "lru-cache": { + "version": "4.1.5", + "bundled": true, + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "yallist": { + "version": "2.1.2", + "bundled": true, + "dev": true + } + } + }, + "crypto-random-string": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "cyclist": { + "version": "0.2.2", + "bundled": true, + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "debug": { + "version": "3.1.0", + "bundled": true, + "dev": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true + } + } + }, + "debuglog": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "decamelize": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "bundled": true, + "dev": true + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true + }, + "defaults": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, + "define-properties": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "delayed-stream": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "detect-indent": { + "version": "5.0.0", + "bundled": true, + "dev": true + }, + "detect-newline": { + "version": "2.1.0", + "bundled": true, + "dev": true + }, + "dezalgo": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "requires": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "dot-prop": { + "version": "4.2.1", + "bundled": true, + "dev": true, + "requires": { + "is-obj": "^1.0.0" + } + }, + "dotenv": { + "version": "5.0.1", + "bundled": true, + "dev": true + }, + "duplexer3": { + "version": "0.1.4", + "bundled": true, + "dev": true + }, + "duplexify": { + "version": "3.6.0", + "bundled": true, + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "editor": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "bundled": true, + "dev": true + }, + "encoding": { + "version": "0.1.12", + "bundled": true, + "dev": true, + "requires": { + "iconv-lite": "~0.4.13" + } + }, + "end-of-stream": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "env-paths": { + "version": "2.2.0", + "bundled": true, + "dev": true + }, + "err-code": { + "version": "1.1.2", + "bundled": true, + "dev": true + }, + "errno": { + "version": "0.1.7", + "bundled": true, + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "es-abstract": { + "version": "1.12.0", + "bundled": true, + "dev": true, + "requires": { + "es-to-primitive": "^1.1.1", + "function-bind": "^1.1.1", + "has": "^1.0.1", + "is-callable": "^1.1.3", + "is-regex": "^1.0.4" + } + }, + "es-to-primitive": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es6-promise": { + "version": "4.2.8", + "bundled": true, + "dev": true + }, + "es6-promisify": { + "version": "5.0.0", + "bundled": true, + "dev": true, + "requires": { + "es6-promise": "^4.0.3" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "bundled": true, + "dev": true + }, + "execa": { + "version": "0.7.0", + "bundled": true, + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "dependencies": { + "get-stream": { + "version": "3.0.0", + "bundled": true, + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "bundled": true, + "dev": true + }, + "extsprintf": { + "version": "1.3.0", + "bundled": true, + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "figgy-pudding": { + "version": "3.5.1", + "bundled": true, + "dev": true + }, + "find-npm-prefix": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "flush-write-stream": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.4" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "forever-agent": { + "version": "0.6.1", + "bundled": true, + "dev": true + }, + "form-data": { + "version": "2.3.2", + "bundled": true, + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "1.0.6", + "mime-types": "^2.1.12" + } + }, + "from2": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "fs-minipass": { + "version": "1.2.7", + "bundled": true, + "dev": true, + "requires": { + "minipass": "^2.6.0" + }, + "dependencies": { + "minipass": { + "version": "2.9.0", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + } + } + }, + "fs-vacuum": { + "version": "1.2.10", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "path-is-inside": "^1.0.1", + "rimraf": "^2.5.2" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + }, + "dependencies": { + "iferr": { + "version": "0.1.5", + "bundled": true, + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "function-bind": { + "version": "1.1.1", + "bundled": true, + "dev": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + }, + "dependencies": { + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "genfun": { + "version": "5.0.0", + "bundled": true, + "dev": true + }, + "gentle-fs": { + "version": "2.3.1", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^1.1.2", + "chownr": "^1.1.2", + "cmd-shim": "^3.0.3", + "fs-vacuum": "^1.2.10", + "graceful-fs": "^4.1.11", + "iferr": "^0.1.5", + "infer-owner": "^1.0.4", + "mkdirp": "^0.5.1", + "path-is-inside": "^1.0.2", + "read-cmd-shim": "^1.0.1", + "slide": "^1.1.6" + }, + "dependencies": { + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "iferr": { + "version": "0.1.5", + "bundled": true, + "dev": true + } + } + }, + "get-caller-file": { + "version": "2.0.5", + "bundled": true, + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "bundled": true, + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "getpass": { + "version": "0.1.7", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.6", + "bundled": true, + "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" + } + }, + "global-dirs": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "requires": { + "ini": "^1.3.4" + } + }, + "got": { + "version": "6.7.1", + "bundled": true, + "dev": true, + "requires": { + "create-error-class": "^3.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "unzip-response": "^2.0.1", + "url-parse-lax": "^1.0.0" + }, + "dependencies": { + "get-stream": { + "version": "3.0.0", + "bundled": true, + "dev": true + } + } + }, + "graceful-fs": { + "version": "4.2.4", + "bundled": true, + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "har-validator": { + "version": "5.1.5", + "bundled": true, + "dev": true, + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "bundled": true, + "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" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "bundled": true, + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "bundled": true, + "dev": true + } + } + }, + "has": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "has-symbols": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "hosted-git-info": { + "version": "2.8.8", + "bundled": true, + "dev": true + }, + "http-cache-semantics": { + "version": "3.8.1", + "bundled": true, + "dev": true + }, + "http-proxy-agent": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "agent-base": "4", + "debug": "3.1.0" + } + }, + "http-signature": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-proxy-agent": { + "version": "2.2.4", + "bundled": true, + "dev": true, + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + } + }, + "humanize-ms": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "requires": { + "ms": "^2.0.0" + } + }, + "iconv-lite": { + "version": "0.4.23", + "bundled": true, + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "iferr": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "ignore-walk": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "import-lazy": { + "version": "2.1.0", + "bundled": true, + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "bundled": true, + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "bundled": true, + "dev": true + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.8", + "bundled": true, + "dev": true + }, + "init-package-json": { + "version": "1.10.3", + "bundled": true, + "dev": true, + "requires": { + "glob": "^7.1.1", + "npm-package-arg": "^4.0.0 || ^5.0.0 || ^6.0.0", + "promzard": "^0.3.0", + "read": "~1.0.1", + "read-package-json": "1 || 2", + "semver": "2.x || 3.x || 4 || 5", + "validate-npm-package-license": "^3.0.1", + "validate-npm-package-name": "^3.0.0" + } + }, + "ip": { + "version": "1.1.5", + "bundled": true, + "dev": true + }, + "ip-regex": { + "version": "2.1.0", + "bundled": true, + "dev": true + }, + "is-callable": { + "version": "1.1.4", + "bundled": true, + "dev": true + }, + "is-ci": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "requires": { + "ci-info": "^1.5.0" + }, + "dependencies": { + "ci-info": { + "version": "1.6.0", + "bundled": true, + "dev": true + } + } + }, + "is-cidr": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "cidr-regex": "^2.0.10" + } + }, + "is-date-object": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-installed-globally": { + "version": "0.1.0", + "bundled": true, + "dev": true, + "requires": { + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" + } + }, + "is-npm": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "is-obj": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "is-path-inside": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "is-redirect": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "is-regex": { + "version": "1.0.4", + "bundled": true, + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, + "is-retry-allowed": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "is-symbol": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "has-symbols": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "isexe": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "isstream": { + "version": "0.1.2", + "bundled": true, + "dev": true + }, + "jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "bundled": true, + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "bundled": true, + "dev": true + }, + "jsonparse": { + "version": "1.3.1", + "bundled": true, + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "latest-version": { + "version": "3.1.0", + "bundled": true, + "dev": true, + "requires": { + "package-json": "^4.0.0" + } + }, + "lazy-property": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "libcipm": { + "version": "4.0.8", + "bundled": true, + "dev": true, + "requires": { + "bin-links": "^1.1.2", + "bluebird": "^3.5.1", + "figgy-pudding": "^3.5.1", + "find-npm-prefix": "^1.0.2", + "graceful-fs": "^4.1.11", + "ini": "^1.3.5", + "lock-verify": "^2.1.0", + "mkdirp": "^0.5.1", + "npm-lifecycle": "^3.0.0", + "npm-logical-tree": "^1.2.1", + "npm-package-arg": "^6.1.0", + "pacote": "^9.1.0", + "read-package-json": "^2.0.13", + "rimraf": "^2.6.2", + "worker-farm": "^1.6.0" + } + }, + "libnpm": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "bin-links": "^1.1.2", + "bluebird": "^3.5.3", + "find-npm-prefix": "^1.0.2", + "libnpmaccess": "^3.0.2", + "libnpmconfig": "^1.2.1", + "libnpmhook": "^5.0.3", + "libnpmorg": "^1.0.1", + "libnpmpublish": "^1.1.2", + "libnpmsearch": "^2.0.2", + "libnpmteam": "^1.0.2", + "lock-verify": "^2.0.2", + "npm-lifecycle": "^3.0.0", + "npm-logical-tree": "^1.2.1", + "npm-package-arg": "^6.1.0", + "npm-profile": "^4.0.2", + "npm-registry-fetch": "^4.0.0", + "npmlog": "^4.1.2", + "pacote": "^9.5.3", + "read-package-json": "^2.0.13", + "stringify-package": "^1.0.0" + } + }, + "libnpmaccess": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^2.0.0", + "get-stream": "^4.0.0", + "npm-package-arg": "^6.1.0", + "npm-registry-fetch": "^4.0.0" + } + }, + "libnpmconfig": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1", + "find-up": "^3.0.0", + "ini": "^1.3.5" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.2.0", + "bundled": true, + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "bundled": true, + "dev": true + } + } + }, + "libnpmhook": { + "version": "5.0.3", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^2.0.0", + "figgy-pudding": "^3.4.1", + "get-stream": "^4.0.0", + "npm-registry-fetch": "^4.0.0" + } + }, + "libnpmorg": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^2.0.0", + "figgy-pudding": "^3.4.1", + "get-stream": "^4.0.0", + "npm-registry-fetch": "^4.0.0" + } + }, + "libnpmpublish": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^2.0.0", + "figgy-pudding": "^3.5.1", + "get-stream": "^4.0.0", + "lodash.clonedeep": "^4.5.0", + "normalize-package-data": "^2.4.0", + "npm-package-arg": "^6.1.0", + "npm-registry-fetch": "^4.0.0", + "semver": "^5.5.1", + "ssri": "^6.0.1" + } + }, + "libnpmsearch": { + "version": "2.0.2", + "bundled": true, + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1", + "get-stream": "^4.0.0", + "npm-registry-fetch": "^4.0.0" + } + }, + "libnpmteam": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^2.0.0", + "figgy-pudding": "^3.4.1", + "get-stream": "^4.0.0", + "npm-registry-fetch": "^4.0.0" + } + }, + "libnpx": { + "version": "10.2.4", + "bundled": true, + "dev": true, + "requires": { + "dotenv": "^5.0.1", + "npm-package-arg": "^6.0.0", + "rimraf": "^2.6.2", + "safe-buffer": "^5.1.0", + "update-notifier": "^2.3.0", + "which": "^1.3.0", + "y18n": "^4.0.0", + "yargs": "^14.2.3" + } + }, + "lock-verify": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "npm-package-arg": "^6.1.0", + "semver": "^5.4.1" + } + }, + "lockfile": { + "version": "1.0.4", + "bundled": true, + "dev": true, + "requires": { + "signal-exit": "^3.0.2" + } + }, + "lodash._baseindexof": { + "version": "3.1.0", + "bundled": true, + "dev": true + }, + "lodash._baseuniq": { + "version": "4.6.0", + "bundled": true, + "dev": true, + "requires": { + "lodash._createset": "~4.0.0", + "lodash._root": "~3.0.0" + } + }, + "lodash._bindcallback": { + "version": "3.0.1", + "bundled": true, + "dev": true + }, + "lodash._cacheindexof": { + "version": "3.0.2", + "bundled": true, + "dev": true + }, + "lodash._createcache": { + "version": "3.1.2", + "bundled": true, + "dev": true, + "requires": { + "lodash._getnative": "^3.0.0" + } + }, + "lodash._createset": { + "version": "4.0.3", + "bundled": true, + "dev": true + }, + "lodash._getnative": { + "version": "3.9.1", + "bundled": true, + "dev": true + }, + "lodash._root": { + "version": "3.0.1", + "bundled": true, + "dev": true + }, + "lodash.clonedeep": { + "version": "4.5.0", + "bundled": true, + "dev": true + }, + "lodash.restparam": { + "version": "3.6.1", + "bundled": true, + "dev": true + }, + "lodash.union": { + "version": "4.6.0", + "bundled": true, + "dev": true + }, + "lodash.uniq": { + "version": "4.5.0", + "bundled": true, + "dev": true + }, + "lodash.without": { + "version": "4.4.0", + "bundled": true, + "dev": true + }, + "lowercase-keys": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "lru-cache": { + "version": "5.1.1", + "bundled": true, + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "make-dir": { + "version": "1.3.0", + "bundled": true, + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "make-fetch-happen": { + "version": "5.0.2", + "bundled": true, + "dev": true, + "requires": { + "agentkeepalive": "^3.4.1", + "cacache": "^12.0.0", + "http-cache-semantics": "^3.8.1", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "node-fetch-npm": "^2.0.2", + "promise-retry": "^1.1.1", + "socks-proxy-agent": "^4.0.0", + "ssri": "^6.0.0" + } + }, + "meant": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "mime-db": { + "version": "1.35.0", + "bundled": true, + "dev": true + }, + "mime-types": { + "version": "2.1.19", + "bundled": true, + "dev": true, + "requires": { + "mime-db": "~1.35.0" + } + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "bundled": true, + "dev": true + }, + "minizlib": { + "version": "1.3.3", + "bundled": true, + "dev": true, + "requires": { + "minipass": "^2.9.0" + }, + "dependencies": { + "minipass": { + "version": "2.9.0", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + } + } + }, + "mississippi": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mkdirp": { + "version": "0.5.5", + "bundled": true, + "dev": true, + "requires": { + "minimist": "^1.2.5" + }, + "dependencies": { + "minimist": { + "version": "1.2.5", + "bundled": true, + "dev": true + } + } + }, + "move-concurrently": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + }, + "dependencies": { + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true + } + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "mute-stream": { + "version": "0.0.7", + "bundled": true, + "dev": true + }, + "node-fetch-npm": { + "version": "2.0.2", + "bundled": true, + "dev": true, + "requires": { + "encoding": "^0.1.11", + "json-parse-better-errors": "^1.0.0", + "safe-buffer": "^5.1.1" + } + }, + "node-gyp": { + "version": "5.1.0", + "bundled": true, + "dev": true, + "requires": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.2", + "mkdirp": "^0.5.1", + "nopt": "^4.0.1", + "npmlog": "^4.1.2", + "request": "^2.88.0", + "rimraf": "^2.6.3", + "semver": "^5.7.1", + "tar": "^4.4.12", + "which": "^1.3.1" + } + }, + "nopt": { + "version": "4.0.3", + "bundled": true, + "dev": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "bundled": true, + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "resolve": { + "version": "1.10.0", + "bundled": true, + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + } + } + }, + "npm-audit-report": { + "version": "1.3.3", + "bundled": true, + "dev": true, + "requires": { + "cli-table3": "^0.5.0", + "console-control-strings": "^1.1.0" + } + }, + "npm-bundled": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-cache-filename": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "npm-install-checks": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "requires": { + "semver": "^2.3.0 || 3.x || 4 || 5" + } + }, + "npm-lifecycle": { + "version": "3.1.5", + "bundled": true, + "dev": true, + "requires": { + "byline": "^5.0.0", + "graceful-fs": "^4.1.15", + "node-gyp": "^5.0.2", + "resolve-from": "^4.0.0", + "slide": "^1.1.6", + "uid-number": "0.0.6", + "umask": "^1.1.0", + "which": "^1.3.1" + } + }, + "npm-logical-tree": { + "version": "1.2.1", + "bundled": true, + "dev": true + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "npm-package-arg": { + "version": "6.1.1", + "bundled": true, + "dev": true, + "requires": { + "hosted-git-info": "^2.7.1", + "osenv": "^0.1.5", + "semver": "^5.6.0", + "validate-npm-package-name": "^3.0.0" + } + }, + "npm-packlist": { + "version": "1.4.8", + "bundled": true, + "dev": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-pick-manifest": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1", + "npm-package-arg": "^6.0.0", + "semver": "^5.4.1" + } + }, + "npm-profile": { + "version": "4.0.4", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^1.1.2 || 2", + "figgy-pudding": "^3.4.1", + "npm-registry-fetch": "^4.0.0" + } + }, + "npm-registry-fetch": { + "version": "4.0.7", + "bundled": true, + "dev": true, + "requires": { + "JSONStream": "^1.3.4", + "bluebird": "^3.5.1", + "figgy-pudding": "^3.4.1", + "lru-cache": "^5.1.1", + "make-fetch-happen": "^5.0.0", + "npm-package-arg": "^6.1.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "bundled": true, + "dev": true + } + } + }, + "npm-run-path": { + "version": "2.0.2", + "bundled": true, + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "npm-user-validate": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true + }, + "object-keys": { + "version": "1.0.12", + "bundled": true, + "dev": true + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "bundled": true, + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" + } + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "opener": { + "version": "1.5.2", + "bundled": true, + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-finally": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "package-json": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "requires": { + "got": "^6.7.1", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" + } + }, + "pacote": { + "version": "9.5.12", + "bundled": true, + "dev": true, + "requires": { + "bluebird": "^3.5.3", + "cacache": "^12.0.2", + "chownr": "^1.1.2", + "figgy-pudding": "^3.5.1", + "get-stream": "^4.1.0", + "glob": "^7.1.3", + "infer-owner": "^1.0.4", + "lru-cache": "^5.1.1", + "make-fetch-happen": "^5.0.0", + "minimatch": "^3.0.4", + "minipass": "^2.3.5", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "normalize-package-data": "^2.4.0", + "npm-normalize-package-bin": "^1.0.0", + "npm-package-arg": "^6.1.0", + "npm-packlist": "^1.1.12", + "npm-pick-manifest": "^3.0.0", + "npm-registry-fetch": "^4.0.0", + "osenv": "^0.1.5", + "promise-inflight": "^1.0.1", + "promise-retry": "^1.1.1", + "protoduck": "^5.0.1", + "rimraf": "^2.6.2", + "safe-buffer": "^5.1.2", + "semver": "^5.6.0", + "ssri": "^6.0.1", + "tar": "^4.4.10", + "unique-filename": "^1.1.1", + "which": "^1.3.1" + }, + "dependencies": { + "minipass": { + "version": "2.9.0", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + } + } + }, + "parallel-transform": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "cyclist": "~0.2.2", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "path-exists": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "path-key": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "bundled": true, + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "bundled": true, + "dev": true + }, + "pify": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "bundled": true, + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "promise-inflight": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "promise-retry": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "err-code": "^1.0.0", + "retry": "^0.10.0" + }, + "dependencies": { + "retry": { + "version": "0.10.1", + "bundled": true, + "dev": true + } + } + }, + "promzard": { + "version": "0.3.0", + "bundled": true, + "dev": true, + "requires": { + "read": "1" + } + }, + "proto-list": { + "version": "1.2.4", + "bundled": true, + "dev": true + }, + "protoduck": { + "version": "5.0.1", + "bundled": true, + "dev": true, + "requires": { + "genfun": "^5.0.0" + } + }, + "prr": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "psl": { + "version": "1.1.29", + "bundled": true, + "dev": true + }, + "pump": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "bundled": true, + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "1.4.1", + "bundled": true, + "dev": true + }, + "qrcode-terminal": { + "version": "0.12.0", + "bundled": true, + "dev": true + }, + "qs": { + "version": "6.5.2", + "bundled": true, + "dev": true + }, + "query-string": { + "version": "6.8.2", + "bundled": true, + "dev": true, + "requires": { + "decode-uri-component": "^0.2.0", + "split-on-first": "^1.0.0", + "strict-uri-encode": "^2.0.0" + } + }, + "qw": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "read": { + "version": "1.0.7", + "bundled": true, + "dev": true, + "requires": { + "mute-stream": "~0.0.4" + } + }, + "read-cmd-shim": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "^4.1.2" + } + }, + "read-installed": { + "version": "4.0.3", + "bundled": true, + "dev": true, + "requires": { + "debuglog": "^1.0.1", + "graceful-fs": "^4.1.2", + "read-package-json": "^2.0.0", + "readdir-scoped-modules": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "slide": "~1.1.3", + "util-extend": "^1.0.1" + } + }, + "read-package-json": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "requires": { + "glob": "^7.1.1", + "graceful-fs": "^4.1.2", + "json-parse-better-errors": "^1.0.1", + "normalize-package-data": "^2.0.0", + "npm-normalize-package-bin": "^1.0.0" + } + }, + "read-package-tree": { + "version": "5.3.1", + "bundled": true, + "dev": true, + "requires": { + "read-package-json": "^2.0.0", + "readdir-scoped-modules": "^1.0.0", + "util-promisify": "^2.1.0" + } + }, + "readable-stream": { + "version": "3.6.0", + "bundled": true, + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdir-scoped-modules": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } + }, + "registry-auth-token": { + "version": "3.4.0", + "bundled": true, + "dev": true, + "requires": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "registry-url": { + "version": "3.1.0", + "bundled": true, + "dev": true, + "requires": { + "rc": "^1.0.1" + } + }, + "request": { + "version": "2.88.0", + "bundled": true, + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "require-directory": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "resolve-from": { + "version": "4.0.0", + "bundled": true, + "dev": true + }, + "retry": { + "version": "0.12.0", + "bundled": true, + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "bundled": true, + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "run-queue": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^1.1.1" + }, + "dependencies": { + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true + } + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true + }, + "semver": { + "version": "5.7.1", + "bundled": true, + "dev": true + }, + "semver-diff": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "semver": "^5.0.3" + } + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "sha": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "^4.1.2" + } + }, + "shebang-command": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true + }, + "slide": { + "version": "1.1.6", + "bundled": true, + "dev": true + }, + "smart-buffer": { + "version": "4.1.0", + "bundled": true, + "dev": true + }, + "socks": { + "version": "2.3.3", + "bundled": true, + "dev": true, + "requires": { + "ip": "1.1.5", + "smart-buffer": "^4.1.0" + } + }, + "socks-proxy-agent": { + "version": "4.0.2", + "bundled": true, + "dev": true, + "requires": { + "agent-base": "~4.2.1", + "socks": "~2.3.2" + }, + "dependencies": { + "agent-base": { + "version": "4.2.1", + "bundled": true, + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + } + } + }, + "sorted-object": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "sorted-union-stream": { + "version": "2.1.3", + "bundled": true, + "dev": true, + "requires": { + "from2": "^1.3.0", + "stream-iterate": "^1.1.0" + }, + "dependencies": { + "from2": { + "version": "1.3.0", + "bundled": true, + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "~1.1.10" + } + }, + "isarray": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "bundled": true, + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "bundled": true, + "dev": true + } + } + }, + "spdx-correct": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.1.0", + "bundled": true, + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "bundled": true, + "dev": true + }, + "split-on-first": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "sshpk": { + "version": "1.14.2", + "bundled": true, + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "ssri": { + "version": "6.0.1", + "bundled": true, + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "stream-each": { + "version": "1.2.2", + "bundled": true, + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-iterate": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "requires": { + "readable-stream": "^2.1.5", + "stream-shift": "^1.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "stream-shift": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "strict-uri-encode": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "string-width": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "string_decoder": { + "version": "1.3.0", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.0", + "bundled": true, + "dev": true + } + } + }, + "stringify-package": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "supports-color": { + "version": "5.4.0", + "bundled": true, + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "tar": { + "version": "4.4.13", + "bundled": true, + "dev": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + }, + "dependencies": { + "minipass": { + "version": "2.9.0", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + } + } + }, + "term-size": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "requires": { + "execa": "^0.7.0" + } + }, + "text-table": { + "version": "0.2.0", + "bundled": true, + "dev": true + }, + "through": { + "version": "2.3.8", + "bundled": true, + "dev": true + }, + "through2": { + "version": "2.0.3", + "bundled": true, + "dev": true, + "requires": { + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "timed-out": { + "version": "4.0.1", + "bundled": true, + "dev": true + }, + "tiny-relative-date": { + "version": "1.3.0", + "bundled": true, + "dev": true + }, + "tough-cookie": { + "version": "2.4.3", + "bundled": true, + "dev": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "bundled": true, + "dev": true, + "optional": true + }, + "typedarray": { + "version": "0.0.6", + "bundled": true, + "dev": true + }, + "uid-number": { + "version": "0.0.6", + "bundled": true, + "dev": true + }, + "umask": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "unique-filename": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unique-string": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "crypto-random-string": "^1.0.0" + } + }, + "unpipe": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "unzip-response": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "update-notifier": { + "version": "2.5.0", + "bundled": true, + "dev": true, + "requires": { + "boxen": "^1.2.1", + "chalk": "^2.0.1", + "configstore": "^3.0.0", + "import-lazy": "^2.1.0", + "is-ci": "^1.0.10", + "is-installed-globally": "^0.1.0", + "is-npm": "^1.0.0", + "latest-version": "^3.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" + } + }, + "uri-js": { + "version": "4.4.0", + "bundled": true, + "dev": true, + "requires": { + "punycode": "^2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "bundled": true, + "dev": true + } + } + }, + "url-parse-lax": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "prepend-http": "^1.0.1" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "util-extend": { + "version": "1.0.3", + "bundled": true, + "dev": true + }, + "util-promisify": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "uuid": { + "version": "3.3.3", + "bundled": true, + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "validate-npm-package-name": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "builtins": "^1.0.3" + } + }, + "verror": { + "version": "1.10.0", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "wcwidth": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "defaults": "^1.0.3" + } + }, + "which": { + "version": "1.3.1", + "bundled": true, + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "requires": { + "string-width": "^1.0.2" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "widest-line": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "string-width": "^2.1.1" + } + }, + "worker-farm": { + "version": "1.7.0", + "bundled": true, + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "bundled": true, + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "string-width": { + "version": "3.1.0", + "bundled": true, + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "write-file-atomic": { + "version": "2.4.3", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "xdg-basedir": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "xtend": { + "version": "4.0.1", + "bundled": true, + "dev": true + }, + "y18n": { + "version": "4.0.0", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "dev": true + }, + "yargs": { + "version": "14.2.3", + "bundled": true, + "dev": true, + "requires": { + "cliui": "^5.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.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": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^15.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "bundled": true, + "dev": true + }, + "find-up": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "locate-path": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "bundled": true, + "dev": true + }, + "string-width": { + "version": "3.1.0", + "bundled": true, + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "yargs-parser": { + "version": "15.0.1", + "bundled": true, + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "bundled": true, + "dev": true + } + } + } + } + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "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 + }, + "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" + } + }, + "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" + } + }, + "y18n": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", + "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", + "dev": true + }, + "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" + } + } + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "onigasm": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/onigasm/-/onigasm-2.2.5.tgz", + "integrity": "sha512-F+th54mPc0l1lp1ZcFMyL/jTs2Tlq4SqIHKIXGZOR/VkHkF9A7Fr5rRr5+ZG/lWeRsyrClLYRq7s/yFQ/XhWCA==", + "dev": true, + "requires": { + "lru-cache": "^5.1.1" + }, + "dependencies": { + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "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-each-series": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", + "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", + "dev": true + }, + "p-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", + "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", + "dev": true, + "requires": { + "p-map": "^2.0.0" + }, + "dependencies": { + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true + } + } + }, + "p-is-promise": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", + "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", + "dev": true + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-reduce": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz", + "integrity": "sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==", + "dev": true + }, + "p-retry": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.4.0.tgz", + "integrity": "sha512-gVB/tBsG+3AHI1SyDHRrX6n9ZL0Bcbifps9W9/Bgu3Oyu4/OrAh8SvDzDsvpP0oxfCt3oWNT+0fQ9LyUGwBTLg==", + "dev": true, + "requires": { + "@types/retry": "^0.12.0", + "retry": "^0.12.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" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "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 + }, + "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.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "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.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "pkg-conf": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", + "integrity": "sha1-ISZRTKbyq/69FoWW3xi6V4Z/AFg=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "load-json-file": "^4.0.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 + }, + "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 + } + } + }, + "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" + } + }, + "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 + }, + "prettier": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz", + "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "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 + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "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" + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, + "redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "requires": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + } + }, + "redeyed": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", + "integrity": "sha1-iYS1gV2ZyyIEacme7v/jiRPmzAs=", + "dev": true, + "requires": { + "esprima": "~4.0.0" + } + }, + "reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" + }, + "regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true + }, + "registry-auth-token": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", + "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", + "dev": true, + "requires": { + "rc": "^1.2.8" + } + }, + "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" + } + }, + "replace-json-property": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/replace-json-property/-/replace-json-property-1.6.3.tgz", + "integrity": "sha512-i4p43kXJaZyP6UUzsNKahpwo0eQRqxcpOm1GMaTAyJUyfh44T7xRO1IUt/p45PYmnl7CjD36ME6OY45vGaQHAw==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "commander": "^2.19.0", + "jsonfile": "^5.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" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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 + }, + "jsonfile": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-5.0.0.tgz", + "integrity": "sha512-NQRZ5CRo74MhMMC3/3r5g2k4fjodJ/wh8MxjFbCViWKFjxrnudWSY5vomh+23ZaXzAS7J3fBZIR2dV6WbmfM0w==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^0.1.2" + } + }, + "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" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + } + } + }, + "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-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "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": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "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" + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "semantic-release": { + "version": "17.4.2", + "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-17.4.2.tgz", + "integrity": "sha512-TPLWuoe2L2DmgnQEh+OLWW5V1T+ZAa1xWuHXsuPAWEko0BqSdLPl+5+BlQ+D5Bp27S5gDJ1//Y1tgbmvUhnOCw==", + "dev": true, + "requires": { + "@semantic-release/commit-analyzer": "^8.0.0", + "@semantic-release/error": "^2.2.0", + "@semantic-release/github": "^7.0.0", + "@semantic-release/npm": "^7.0.0", + "@semantic-release/release-notes-generator": "^9.0.0", + "aggregate-error": "^3.0.0", + "cosmiconfig": "^7.0.0", + "debug": "^4.0.0", + "env-ci": "^5.0.0", + "execa": "^5.0.0", + "figures": "^3.0.0", + "find-versions": "^4.0.0", + "get-stream": "^6.0.0", + "git-log-parser": "^1.2.0", + "hook-std": "^2.0.0", + "hosted-git-info": "^4.0.0", + "lodash": "^4.17.15", + "marked": "^2.0.0", + "marked-terminal": "^4.1.1", + "micromatch": "^4.0.2", + "p-each-series": "^2.1.0", + "p-reduce": "^2.0.0", + "read-pkg-up": "^7.0.0", + "resolve-from": "^5.0.0", + "semver": "^7.3.2", + "semver-diff": "^3.1.1", + "signale": "^1.2.1", + "yargs": "^16.2.0" + }, + "dependencies": { + "execa": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz", + "integrity": "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.0.tgz", + "integrity": "sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==", + "dev": true + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + } + } + }, + "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" + } + }, + "semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "dev": true, + "requires": { + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "semver-regex": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-3.1.2.tgz", + "integrity": "sha512-bXWyL6EAKOJa81XG1OZ/Yyuq+oT0b2YLlxx7c+mrdYPaPbnj6WgVULXhinMIeZGufuUBu/eVRqXEhiv4imfwxA==", + "dev": true + }, + "serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "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 + }, + "shelljs": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", + "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", + "dev": true, + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "shiki": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.9.3.tgz", + "integrity": "sha512-NEjg1mVbAUrzRv2eIcUt3TG7X9svX7l3n3F5/3OdFq+/BxUdmBOeKGiH4icZJBLHy354Shnj6sfBTemea2e7XA==", + "dev": true, + "requires": { + "onigasm": "^2.2.5", + "vscode-textmate": "^5.2.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 + }, + "signale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/signale/-/signale-1.4.0.tgz", + "integrity": "sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==", + "dev": true, + "requires": { + "chalk": "^2.3.2", + "figures": "^2.0.0", + "pkg-conf": "^2.1.0" + }, + "dependencies": { + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + } + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.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 + } + } + }, + "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 + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "spawn-error-forwarder": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz", + "integrity": "sha1-Gv2Uc46ZmwNG17n8NzvlXgdXcCk=", + "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" + } + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", + "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", + "dev": true + }, + "split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, + "requires": { + "through": "2" + } + }, + "split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "dev": true, + "requires": { + "readable-stream": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "stream-combiner2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", + "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", + "dev": true, + "requires": { + "duplexer2": "~0.1.0", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "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-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "requires": { + "min-indent": "^1.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "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" + } + }, + "supports-hyperlinks": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz", + "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==", + "dev": true, + "requires": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "table": { + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/table/-/table-6.0.7.tgz", + "integrity": "sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g==", + "dev": true, + "requires": { + "ajv": "^7.0.2", + "lodash": "^4.17.20", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0" + }, + "dependencies": { + "ajv": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-7.2.3.tgz", + "integrity": "sha512-idv5WZvKVXDqKralOImQgPM9v6WOdLNa0IY3B3doOjw/YxRGT8I+allIJ6kd7Uaj+SF1xZUSU+nPM5aDNBVtnw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + } + } + }, + "temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "dev": true + }, + "tempy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-1.0.1.tgz", + "integrity": "sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==", + "dev": true, + "requires": { + "del": "^6.0.0", + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.16.0", + "unique-string": "^2.0.0" + }, + "dependencies": { + "type-fest": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", + "dev": true + } + } + }, + "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-extensions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", + "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", + "dev": true + }, + "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 + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dev": true, + "requires": { + "readable-stream": "3" + } + }, + "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" + } + }, + "traverse": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", + "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=", + "dev": true + }, + "trim-newlines": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz", + "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==", + "dev": true + }, + "trim-off-newlines": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz", + "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=", + "dev": true + }, + "ts-node": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz", + "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==", + "dev": true, + "requires": { + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.17", + "yn": "3.1.1" + }, + "dependencies": { + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + } + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "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.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "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" + } + }, + "typedoc": { + "version": "0.20.33", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.20.33.tgz", + "integrity": "sha512-jzNdHmjZRQKwguhpXjIPuIjz+TpdgG2AVY8ta+qpAukv+3rBhTs4AAVd+mkonrHVYlC0EAbuAJ4urkfnn42Hwg==", + "dev": true, + "requires": { + "colors": "^1.4.0", + "fs-extra": "^9.1.0", + "handlebars": "^4.7.7", + "lodash": "^4.17.21", + "lunr": "^2.3.9", + "marked": "^2.0.1", + "minimatch": "^3.0.0", + "progress": "^2.0.3", + "shelljs": "^0.8.4", + "shiki": "^0.9.3", + "typedoc-default-themes": "^0.12.9" + }, + "dependencies": { + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true + } + } + }, + "typedoc-default-themes": { + "version": "0.12.9", + "resolved": "https://registry.npmjs.org/typedoc-default-themes/-/typedoc-default-themes-0.12.9.tgz", + "integrity": "sha512-Jd5fYTiqzinZdoIY382W7tQXTwAzWRdg8KbHfaxmb78m1/3jL9riXtk23oBOKwhi8GFVykCOdPzEJKY87/D0LQ==", + "dev": true + }, + "typescript": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz", + "integrity": "sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw==", + "dev": true + }, + "uglify-js": { + "version": "3.13.2", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.13.2.tgz", + "integrity": "sha512-SbMu4D2Vo95LMC/MetNaso1194M1htEA+JrqE9Hk+G2DhI+itfS9TRu9ZKeCahLDNa/J3n4MqUJ/fOHMzQpRWw==", + "dev": true, + "optional": true + }, + "unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dev": true, + "requires": { + "crypto-random-string": "^2.0.0" + } + }, + "universal-user-agent": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", + "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", + "dev": true + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": 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" + } + }, + "url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "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 + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "vscode-textmate": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.2.0.tgz", + "integrity": "sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "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 + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "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 + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "workerpool": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz", + "integrity": "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==", + "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" + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz", + "integrity": "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==", + "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 + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "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" + } + }, + "yargs-parser": { + "version": "20.2.7", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", + "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==", + "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 + }, + "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 + } + } + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..4730c16 --- /dev/null +++ b/package.json @@ -0,0 +1,109 @@ +{ + "name": "@klayver/poe-api-wrappers", + "version": "0.1.0", + "description": "Wrappers and utilities for official and third-party Path of Exile APIs.", + "scripts": { + "build": "tsc", + "build:docs": "typedoc", + "test": "dotenv -e .env mocha", + "test:ci": "mocha", + "test:coverage": "nyc --use-spawn-wrap npm run test", + "lint": "eslint --cache -f unix --ext .ts src/", + "lint:fix": "eslint --fix --cache -f unix --ext .ts src/", + "prettier": "prettier --write \"**/*.ts\"" + }, + "keywords": [ + "pathofexile", + "poe", + "api", + "wrapper" + ], + "author": { + "name": "Tobias Hoffmann", + "email": "tobiashoffmann7@gmail.com", + "url": "http://github.com/klayver" + }, + "main": "dist/index.js", + "files": [ + "dist/**" + ], + "publishConfig": { + "access": "public" + }, + "repository": "git://github.com/klayveR/poe-api-wrappers-test.git", + "license": "MIT", + "devDependencies": { + "@istanbuljs/nyc-config-typescript": "^1.0.1", + "@semantic-release/changelog": "^5.0.1", + "@semantic-release/commit-analyzer": "^8.0.1", + "@semantic-release/git": "^9.0.0", + "@semantic-release/npm": "^7.0.10", + "@semantic-release/release-notes-generator": "^9.0.2", + "@types/chai": "^4.2.15", + "@types/chai-as-promised": "^7.1.3", + "@types/glob": "^7.1.3", + "@types/mocha": "^8.2.1", + "@types/node": "^14.14.35", + "@typescript-eslint/eslint-plugin": "^4.18.0", + "@typescript-eslint/parser": "^4.18.0", + "chai": "^4.3.4", + "chai-as-promised": "^7.1.1", + "conventional-changelog-eslint": "^3.0.9", + "dotenv-cli": "^4.0.0", + "eslint": "^7.22.0", + "eslint-config-prettier": "^8.1.0", + "mocha": "^8.3.2", + "nyc": "^15.1.0", + "prettier": "^2.2.1", + "replace-json-property": "^1.6.3", + "semantic-release": "^17.4.2", + "source-map-support": "^0.5.19", + "ts-node": "^9.1.1", + "typedoc": "^0.20.33", + "typescript": "^4.2.3" + }, + "dependencies": { + "axios": "^0.21.1", + "class-transformer": "^0.4.0", + "reflect-metadata": "^0.1.13" + }, + "nyc": { + "all": true, + "extension": [ + ".ts" + ], + "include": [ + "src/**/*.ts" + ], + "exclude": [ + "**/*.d.ts" + ], + "reporter": [ + "text", + "lcov" + ], + "extends": "./nyc-config.js" + }, + "release": { + "branches": [ + "main", + "next" + ], + "plugins": [ + "@semantic-release/commit-analyzer", + "@semantic-release/changelog", + "@semantic-release/release-notes-generator", + "@semantic-release/npm", + [ + "@semantic-release/git", + { + "message": "Release <%= nextRelease.version %> [skip ci]", + "assets": [ + "package.json", + "CHANGELOG.md" + ] + } + ] + ] + } +} diff --git a/src/common/functions/buildUrl.ts b/src/common/functions/buildUrl.ts new file mode 100644 index 0000000..d4b3453 --- /dev/null +++ b/src/common/functions/buildUrl.ts @@ -0,0 +1,42 @@ +import { URL } from "url"; + +interface Parameters { + [key: string]: string; +} + +export function buildURL( + url: string, + optionalParameters?: T, + defaults?: T, + additionalParameters?: Parameters +): URL { + const urlObj: URL = new URL(url); + + if (optionalParameters && defaults) { + for (const key in defaults) { + if (optionalParameters[key] == null) { + optionalParameters[key] = defaults[key]; + } + } + } + + if (optionalParameters == null && defaults) { + optionalParameters = defaults; + } + + if (optionalParameters != null) { + for (const [key, value] of Object.entries(optionalParameters)) { + if (value != null) { + urlObj.searchParams.append(key, value); + } + } + } + + if (additionalParameters) { + for (const key in additionalParameters) { + urlObj.searchParams.append(key, additionalParameters[key]); + } + } + + return urlObj; +} diff --git a/src/common/functions/index.ts b/src/common/functions/index.ts new file mode 100644 index 0000000..6670cc7 --- /dev/null +++ b/src/common/functions/index.ts @@ -0,0 +1,2 @@ +export * from "./buildUrl"; +export * from "./request"; diff --git a/src/common/functions/request.ts b/src/common/functions/request.ts new file mode 100644 index 0000000..71f065a --- /dev/null +++ b/src/common/functions/request.ts @@ -0,0 +1,33 @@ +import axios, { AxiosRequestConfig, Method } from "axios"; + +/** + * @private + */ +export const request = async ( + url: URL, + headers: Record = {}, + method: Method = "get", + payload: unknown = {} +): Promise => { + const config: AxiosRequestConfig = { + url: url.toString(), + method: method, + headers: headers, + data: payload, + transformResponse: [ + (data: string): string => { + return data; + }, + ], + }; + + const response = await axios(config); + let data = response.data; + + // Strip UTF8 BOM + if (data.charCodeAt(0) === 0xfeff) { + data = data.slice(1); + } + + return data; +}; diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..17a6471 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,3 @@ +import "reflect-metadata"; + +export * as PathOfExile from "./poe"; diff --git a/src/mochaFixtures.ts b/src/mochaFixtures.ts new file mode 100644 index 0000000..2e0dd56 --- /dev/null +++ b/src/mochaFixtures.ts @@ -0,0 +1,11 @@ +import "reflect-metadata"; + +import chai from "chai"; +import chaiAsPromised from "chai-as-promised"; + +import * as PathOfExile from "./poe"; + +export function mochaGlobalSetup(): void { + chai.use(chaiAsPromised); + PathOfExile.Settings.userAgent = "klayveR/poe-api-wrappers"; +} diff --git a/src/poe/Settings.ts b/src/poe/Settings.ts new file mode 100644 index 0000000..5c8302d --- /dev/null +++ b/src/poe/Settings.ts @@ -0,0 +1,3 @@ +export class Settings { + public static userAgent: string; +} diff --git a/src/poe/apis/account/API.spec.ts b/src/poe/apis/account/API.spec.ts new file mode 100644 index 0000000..31ba6bd --- /dev/null +++ b/src/poe/apis/account/API.spec.ts @@ -0,0 +1,44 @@ +import "reflect-metadata"; +import "mocha"; + +import { expect } from "chai"; + +import * as API from "./API"; + +describe("Path of Exile - Account", function () { + this.timeout(10000); + + let sessionId: string; + + before(() => { + sessionId = process.env["POESESSID"] as string; + }); + + /** + * API Methods + */ + it("#getProfile(session) - should return account profile", async () => { + await expect(API.getProfile(sessionId)).to.be.fulfilled; + }); + + it("#getAvatars(session) - should return account avatars", async () => { + await expect(API.getAvatars(sessionId)).to.be.fulfilled; + }); + + it("#getNameByCharacter(character) - should return account name", async () => { + await expect(API.getNameByCharacter("klayCA")).to.be.fulfilled; + }); + + it("#getStash(account, league, tab, session) - should return stash tab items", async () => { + await expect(API.getStash("klayveR", "Standard", 0, sessionId, { tabs: 1 })).to.be + .fulfilled; + }); + + it("#getShowcasePins(account) - should return showcase pins", async () => { + await expect(API.getShowcasePins("Chris")).to.be.fulfilled; + }); + + it("#getMicrotransactions(account, session) - should return mtx owned by account", async () => { + await expect(API.getMicrotransactions("klayveR", sessionId)).to.be.fulfilled; + }); +}); diff --git a/src/poe/apis/account/API.ts b/src/poe/apis/account/API.ts new file mode 100644 index 0000000..919970d --- /dev/null +++ b/src/poe/apis/account/API.ts @@ -0,0 +1,124 @@ +import { buildURL } from "../../../common/functions"; +import { requestTransformed } from "../../functions"; +import * as Avatars from "./avatars"; +import { AvatarsOptions, ShowcasePinOptions, StashOptions } from "./models"; +import * as MTX from "./mtx"; +import { Name } from "./Name"; +import { Profile } from "./profile"; +import * as ShowcasePins from "./showcase-pins"; +import { Stash } from "./stash"; + +/** + * @endpoint https://api.pathofexile.com/profile + * @param sessionId + * @throws [[APIError]] + */ +export const getProfile = async (sessionId: string): Promise => { + const url = new URL(`https://api.pathofexile.com/profile`); + + return await requestTransformed(Profile, url, sessionId); +}; + +/** + * @endpoint https://api.pathofexile.com/account-avatar + * @param sessionId + * @param options + * @throws [[APIError]] + */ +export const getAvatars = async ( + sessionId: string, + options?: AvatarsOptions +): Promise => { + const url = buildURL(`https://api.pathofexile.com/account-avatar`, options, { + page: 1, + perPage: 16, + custom: false, + }); + + return await requestTransformed(Avatars.Collection, url, sessionId); +}; + +/** + * @remarks + * This data is available even if the profile of the account is set to private + * + * @endpoint https://api.pathofexile.com/account/showcase-pins + * @param accountName + * @param options + * @throws [[APIError]] + */ +export const getShowcasePins = async ( + accountName: string, + options?: ShowcasePinOptions +): Promise => { + const url = buildURL(`https://api.pathofexile.com/account/showcase-pins`, options, null, { + account: accountName, + }); + + return await requestTransformed(ShowcasePins.Collection, url); +}; + +/** + * @endpoint https://api.pathofexile.com/character-window/get-stash-items + * @param accountName + * @param league + * @param tabIndex + * @param sessionId + * @param options + * @throws [[APIError]] + */ +export const getStash = async ( + accountName: string, + league: string, + tabIndex: number, + sessionId?: string, + options?: StashOptions +): Promise => { + const url = buildURL( + `https://api.pathofexile.com/character-window/get-stash-items`, + options, + null, + { accountName, league, tabIndex: tabIndex.toString() } + ); + + return await requestTransformed(Stash, url, sessionId); +}; + +/** + * @endpoint https://api.pathofexile.com/character-window/get-account-name-by-character + * @param characterName + * @throws [[APIError]] + */ +export const getNameByCharacter = async (characterName: string): Promise => { + const url = buildURL( + `https://api.pathofexile.com/character-window/get-account-name-by-character`, + null, + null, + { character: characterName } + ); + + const account = await requestTransformed(Name, url); + return account.name; +}; + +/** + * @endpoint https://api.pathofexile.com/character-window/get-mtx-stash-items + * @param accountName + * @param sessionId + * @param options + * @throws [[APIError]] + */ +export const getMicrotransactions = async ( + accountName: string, + sessionId: string, + sortOrder: "category" | "theme" = "category" +): Promise => { + const url = buildURL(`https://api.pathofexile.com/character-window/get-mtx-stash-items`); + const payload = { + accountName, + sortOrder, + }; + + const response = await requestTransformed(MTX.Response, url, sessionId, "post", payload); + return response.groups; +}; diff --git a/src/poe/apis/account/Account.ts b/src/poe/apis/account/Account.ts new file mode 100644 index 0000000..9574118 --- /dev/null +++ b/src/poe/apis/account/Account.ts @@ -0,0 +1,31 @@ +import { Type } from "class-transformer"; + +import { Realm, RealmOptions } from "../../shared/models"; +import * as Characters from "../characters"; +import { Guild } from "../guild"; +import { Stream } from "../streams"; +import { Challenges } from "./models"; + +export class Account { + name!: string; + realm!: Realm; + challenges!: Challenges; + + @Type(/* istanbul ignore next */ () => Stream) + twitch?: Stream; + + @Type(/* istanbul ignore next */ () => Guild) + guild?: Guild; + + /** + * @remarks + * Trying to get characters when the profile or character tab is private will result in an error. + * + * @param options + * @returns A list of characters from this account + * @throws [[APIError]] + */ + public async getCharacters(options?: RealmOptions): Promise { + return await Characters.get(this.name, undefined, options); + } +} diff --git a/src/poe/apis/account/Name.ts b/src/poe/apis/account/Name.ts new file mode 100644 index 0000000..4addd26 --- /dev/null +++ b/src/poe/apis/account/Name.ts @@ -0,0 +1,12 @@ +import { Expose } from "class-transformer"; + +/** + * @hidden + */ +export class Name { + /** + * @overrides `accountName` + */ + @Expose({ name: "accountName" }) + name!: string; +} diff --git a/src/poe/apis/account/avatars/Avatar.ts b/src/poe/apis/account/avatars/Avatar.ts new file mode 100644 index 0000000..9ddc1e9 --- /dev/null +++ b/src/poe/apis/account/avatars/Avatar.ts @@ -0,0 +1,14 @@ +import { Expose } from "class-transformer"; + +export class Avatar { + custom!: boolean; + name?: string | null; + image!: string; + current!: boolean; + + /** + * @overrides `avatar_id` + */ + @Expose({ name: "avatar_id" }) + id!: number; +} diff --git a/src/poe/apis/account/avatars/Collection.ts b/src/poe/apis/account/avatars/Collection.ts new file mode 100644 index 0000000..e4171e9 --- /dev/null +++ b/src/poe/apis/account/avatars/Collection.ts @@ -0,0 +1,10 @@ +import { Type } from "class-transformer"; + +import { Avatar } from "./Avatar"; + +export class Collection { + @Type(/* istanbul ignore next */ () => Avatar) + collection!: Avatar[]; + + total!: number; +} diff --git a/src/poe/apis/account/avatars/index.ts b/src/poe/apis/account/avatars/index.ts new file mode 100644 index 0000000..2ee9b28 --- /dev/null +++ b/src/poe/apis/account/avatars/index.ts @@ -0,0 +1,2 @@ +export * from "./Avatar"; +export * from "./Collection"; diff --git a/src/poe/apis/account/index.ts b/src/poe/apis/account/index.ts new file mode 100644 index 0000000..c054e86 --- /dev/null +++ b/src/poe/apis/account/index.ts @@ -0,0 +1,9 @@ +export * from "./API"; +export * from "./Account"; +export * from "./Name"; +export * as Avatars from "./avatars"; +export * from "./models"; +export * as MTX from "./mtx"; +export * as Profile from "./profile"; +export * as ShowcasePins from "./showcase-pins"; +export * as Stash from "./stash"; diff --git a/src/poe/apis/account/models/Challenges.ts b/src/poe/apis/account/models/Challenges.ts new file mode 100644 index 0000000..5745d59 --- /dev/null +++ b/src/poe/apis/account/models/Challenges.ts @@ -0,0 +1,3 @@ +export interface Challenges { + total: number; +} diff --git a/src/poe/apis/account/models/Options.ts b/src/poe/apis/account/models/Options.ts new file mode 100644 index 0000000..2ac485a --- /dev/null +++ b/src/poe/apis/account/models/Options.ts @@ -0,0 +1,49 @@ +import { RealmOptions } from "../../../shared/models"; + +export interface StashOptions extends RealmOptions { + /** + * Whether or not to include a list of all stash tabs + * + * Default: `0` + */ + tabs?: 0 | 1; +} + +export interface ShowcasePinOptions extends RealmOptions { + /** + * Specifies the number of showcase pins to include. + * + * Default: `100` + */ + limit?: number; + + /** + * Specifies the offset to the showcase pin to include. + * + * Default: `0` + */ + offset?: number; +} + +export interface AvatarsOptions { + /** + * Page offset + * + * Default: `1` + */ + page?: number; + + /** + * Results per page + * + * Default: `16` (maximum) + */ + perPage?: number; + + /** + * When set to `true` only custom avatars (supporter avatars) of the account will be fetched + * + * Default: `false` + */ + custom?: boolean; +} diff --git a/src/poe/apis/account/models/index.ts b/src/poe/apis/account/models/index.ts new file mode 100644 index 0000000..31c760b --- /dev/null +++ b/src/poe/apis/account/models/index.ts @@ -0,0 +1,2 @@ +export * from "./Challenges"; +export * from "./Options"; diff --git a/src/poe/apis/account/mtx/Group.ts b/src/poe/apis/account/mtx/Group.ts new file mode 100644 index 0000000..0f13c0a --- /dev/null +++ b/src/poe/apis/account/mtx/Group.ts @@ -0,0 +1,15 @@ +import { Expose, Type } from "class-transformer"; + +import { Item } from "./Item"; + +export class Group { + group!: string; + groupName!: string; + + /** + * @overrides `MTXItems` + */ + @Expose({ name: "MTXItems" }) + @Type(/* istanbul ignore next */ () => Item) + items!: Item[]; +} diff --git a/src/poe/apis/account/mtx/Item.ts b/src/poe/apis/account/mtx/Item.ts new file mode 100644 index 0000000..1695842 --- /dev/null +++ b/src/poe/apis/account/mtx/Item.ts @@ -0,0 +1,21 @@ +import { Property } from "../../../shared/item"; + +export class Item { + slot!: null; + count!: number; + verified!: boolean; + w!: number; + h!: number; + icon!: string; + stackSize?: number; + maxStackSize?: number; + league!: string; + name!: string; + typeLine!: string; + identified!: boolean; + ilvl!: number; + properties?: Property[]; + explicitMods!: string[]; + frameType!: number; + descrText?: string; +} diff --git a/src/poe/apis/account/mtx/Response.ts b/src/poe/apis/account/mtx/Response.ts new file mode 100644 index 0000000..eabfef3 --- /dev/null +++ b/src/poe/apis/account/mtx/Response.ts @@ -0,0 +1,8 @@ +import { Type } from "class-transformer"; + +import { Group } from "./Group"; + +export class Response { + @Type(/* istanbul ignore next */ () => Group) + groups!: Group[]; +} diff --git a/src/poe/apis/account/mtx/index.ts b/src/poe/apis/account/mtx/index.ts new file mode 100644 index 0000000..08145e8 --- /dev/null +++ b/src/poe/apis/account/mtx/index.ts @@ -0,0 +1,3 @@ +export * from "./Response"; +export * from "./Group"; +export * from "./Item"; diff --git a/src/poe/apis/account/profile/Profile.ts b/src/poe/apis/account/profile/Profile.ts new file mode 100644 index 0000000..f6df58a --- /dev/null +++ b/src/poe/apis/account/profile/Profile.ts @@ -0,0 +1,14 @@ +import { Expose } from "class-transformer"; + +import { Account } from "../Account"; + +export class Profile extends Account { + /** + * @overrides `avatar_url` + */ + @Expose({ name: "avatar_url" }) + avatarUrl!: string; + + messages!: number; + badges!: unknown; +} diff --git a/src/poe/apis/account/profile/index.ts b/src/poe/apis/account/profile/index.ts new file mode 100644 index 0000000..b6f21ff --- /dev/null +++ b/src/poe/apis/account/profile/index.ts @@ -0,0 +1 @@ +export * from "./Profile"; diff --git a/src/poe/apis/account/showcase-pins/Collection.ts b/src/poe/apis/account/showcase-pins/Collection.ts new file mode 100644 index 0000000..4173b62 --- /dev/null +++ b/src/poe/apis/account/showcase-pins/Collection.ts @@ -0,0 +1,11 @@ +import { Type } from "class-transformer"; + +import { ShowcasePin } from "./ShowcasePin"; + +export class Collection { + total!: number; + account!: string; + + @Type(/* istanbul ignore next */ () => ShowcasePin) + entries!: ShowcasePin[]; +} diff --git a/src/poe/apis/account/showcase-pins/ShowcasePin.ts b/src/poe/apis/account/showcase-pins/ShowcasePin.ts new file mode 100644 index 0000000..3e7c7bd --- /dev/null +++ b/src/poe/apis/account/showcase-pins/ShowcasePin.ts @@ -0,0 +1,21 @@ +import { Expose } from "class-transformer"; + +export class ShowcasePin { + /** + * @overrides `character_id` + */ + @Expose({ name: "character_id" }) + characterId!: number | null; + + /** + * @overrides `foreign_id` + */ + @Expose({ name: "foreign_id" }) + foreignId!: string | null; + + position!: number; + type!: string; + label!: string; + id!: number; + icon!: string; +} diff --git a/src/poe/apis/account/showcase-pins/index.ts b/src/poe/apis/account/showcase-pins/index.ts new file mode 100644 index 0000000..e9b11b2 --- /dev/null +++ b/src/poe/apis/account/showcase-pins/index.ts @@ -0,0 +1,2 @@ +export * from "./Collection"; +export * from "./ShowcasePin"; diff --git a/src/poe/apis/account/stash/Stash.ts b/src/poe/apis/account/stash/Stash.ts new file mode 100644 index 0000000..fba0fb6 --- /dev/null +++ b/src/poe/apis/account/stash/Stash.ts @@ -0,0 +1,26 @@ +import { Type } from "class-transformer"; + +import { Item } from "../../../shared/item"; +import { DivinationLayout, Layout, Tab } from "./models"; + +/** + * @todo Add remaining stash layouts + */ +export class Stash { + numTabs!: number; + quadLayout?: boolean; + essenceLayout?: { [key: string]: Layout }; + currencyLayout?: { [key: string]: Layout }; + fragmentLayout?: { [key: string]: Layout }; + delveLayout?: { [key: string]: Layout }; + divinationLayout?: DivinationLayout; + + /** + * @remarks + * `tabs` must be set to `1` when making the request to receive this data + */ + tabs?: Tab[]; + + @Type(/* istanbul ignore next */ () => Item) + items?: Item[]; +} diff --git a/src/poe/apis/account/stash/index.ts b/src/poe/apis/account/stash/index.ts new file mode 100644 index 0000000..f9b07dd --- /dev/null +++ b/src/poe/apis/account/stash/index.ts @@ -0,0 +1,2 @@ +export * from "./Stash"; +export * from "./models"; diff --git a/src/poe/apis/account/stash/models/Colour.ts b/src/poe/apis/account/stash/models/Colour.ts new file mode 100644 index 0000000..7eb82ce --- /dev/null +++ b/src/poe/apis/account/stash/models/Colour.ts @@ -0,0 +1,5 @@ +export interface Colour { + r: number; + g: number; + b: number; +} diff --git a/src/poe/apis/account/stash/models/DivinationCard.ts b/src/poe/apis/account/stash/models/DivinationCard.ts new file mode 100644 index 0000000..ddc7e5a --- /dev/null +++ b/src/poe/apis/account/stash/models/DivinationCard.ts @@ -0,0 +1,3 @@ +export interface DivinationCard { + name: string; +} diff --git a/src/poe/apis/account/stash/models/DivinationLayout.ts b/src/poe/apis/account/stash/models/DivinationLayout.ts new file mode 100644 index 0000000..edfb3f7 --- /dev/null +++ b/src/poe/apis/account/stash/models/DivinationLayout.ts @@ -0,0 +1,10 @@ +import { DivinationCard } from "./DivinationCard"; + +export interface DivinationLayout { + cards: DivinationCard[]; + h: number; + w: number; + padx: number; + pady: number; + scale: number; +} diff --git a/src/poe/apis/account/stash/models/Layout.ts b/src/poe/apis/account/stash/models/Layout.ts new file mode 100644 index 0000000..42d311b --- /dev/null +++ b/src/poe/apis/account/stash/models/Layout.ts @@ -0,0 +1,7 @@ +export interface Layout { + x: number; + y: number; + w: number; + h: number; + scale?: number; +} diff --git a/src/poe/apis/account/stash/models/Tab.ts b/src/poe/apis/account/stash/models/Tab.ts new file mode 100644 index 0000000..1b7af57 --- /dev/null +++ b/src/poe/apis/account/stash/models/Tab.ts @@ -0,0 +1,14 @@ +import { StashType } from "../../../../shared"; +import { Colour } from "./Colour"; + +export interface Tab { + n: string; + i: number; + id: string; + type: StashType; + selected: boolean; + colour: Colour; + srcL: string; + srcC: string; + srcR: string; +} diff --git a/src/poe/apis/account/stash/models/index.ts b/src/poe/apis/account/stash/models/index.ts new file mode 100644 index 0000000..3fcfb19 --- /dev/null +++ b/src/poe/apis/account/stash/models/index.ts @@ -0,0 +1,5 @@ +export * from "./Colour"; +export * from "./DivinationCard"; +export * from "./DivinationLayout"; +export * from "./Layout"; +export * from "./Tab"; diff --git a/src/poe/apis/characters/API.spec.ts b/src/poe/apis/characters/API.spec.ts new file mode 100644 index 0000000..7c5b9d4 --- /dev/null +++ b/src/poe/apis/characters/API.spec.ts @@ -0,0 +1,48 @@ +import "reflect-metadata"; +import "mocha"; + +import { expect } from "chai"; +import { plainToClass } from "class-transformer"; + +import CachedCharacters from "../../resource/characters.json"; +import { Character } from "../characters"; +import * as API from "./API"; + +describe("Path of Exile - Character", function () { + this.timeout(10000); + + /** + * API Methods + */ + it("#get(account) - should return list of characters of account", async () => { + await expect(API.get("Mathil")).to.be.fulfilled; + }); + + it("#getItems(account, character) - should return character items", async () => { + await expect(API.getItems("Mathil", "Mathil")).to.be.fulfilled; + }); + + it("#getPassiveSkills(account, character) - should return character passive skill tree", async () => { + await expect(API.getPassiveSkills("Mathil", "Mathil")).to.be.fulfilled; + }); + + /** + * Class Methods + */ + describe("Classes", () => { + let characters: Character[]; + + before(() => { + characters = plainToClass(Character, CachedCharacters); + }); + + describe("Character", () => { + it("#levelProgression - should return level progression of the character", () => { + expect(characters[0].levelProgression).to.be.below(1); + expect(characters[1].levelProgression).to.be.above(1); + expect(characters[2].levelProgression).to.be.above(15); + expect(characters[23].levelProgression).to.equal(0); + }); + }); + }); +}); diff --git a/src/poe/apis/characters/API.ts b/src/poe/apis/characters/API.ts new file mode 100644 index 0000000..36c9c03 --- /dev/null +++ b/src/poe/apis/characters/API.ts @@ -0,0 +1,75 @@ +import { buildURL } from "../../../common/functions"; +import { requestTransformed, requestTransformedArray } from "../../functions"; +import { RealmOptions } from "../../shared/models"; +import { Character } from "./Character"; +import { Items } from "./Items"; +import { PassiveSkills } from "./PassiveSkills"; + +/** + * @endpoint https://api.pathofexile.com/character-window/get-characters + * @param accountName + * @param sessionId Necessary if profile or character tab is private + * @param options + * @returns A list of characters of an account + * @throws [[APIError]] + */ +export const get = async ( + accountName: string, + sessionId?: string, + options?: RealmOptions +): Promise => { + const url = buildURL( + `https://api.pathofexile.com/character-window/get-characters`, + options, + null, + { accountName } + ); + + return await requestTransformedArray(Character, url, sessionId); +}; + +/** + * @endpoint https://api.pathofexile.com/character-window/get-items + * @param accountName + * @param character + * @param sessionId Necessary if profile or character tab is private + * @param options + * @throws [[APIError]] + */ +export const getItems = async ( + accountName: string, + character: string, + sessionId?: string, + options?: RealmOptions +): Promise => { + const url = buildURL(`https://api.pathofexile.com/character-window/get-items`, options, null, { + accountName, + character, + }); + + return await requestTransformed(Items, url, sessionId); +}; + +/** + * @endpoint https://api.pathofexile.com/character-window/get-passive-skills + * @param accountName + * @param character + * @param sessionId Necessary if profile or character tab is private + * @param options + * @throws [[APIError]] + */ +export const getPassiveSkills = async ( + accountName: string, + character: string, + sessionId?: string, + options?: RealmOptions +): Promise => { + const url = buildURL( + `https://api.pathofexile.com/character-window/get-passive-skills`, + options, + null, + { accountName, character } + ); + + return await requestTransformed(PassiveSkills, url, sessionId); +}; diff --git a/src/poe/apis/characters/Character.ts b/src/poe/apis/characters/Character.ts new file mode 100644 index 0000000..2357ee7 --- /dev/null +++ b/src/poe/apis/characters/Character.ts @@ -0,0 +1,38 @@ +import { Expose } from "class-transformer"; + +import { Experience } from "../../shared/constants"; +import { Depth } from "./models"; + +export class Character { + name!: string; + level!: number; + class!: string; + classId?: number; + league?: number; + ascendancyClass?: number; + id?: string; + score?: number; + experience!: number; + depth?: Depth; + + /** + * Calculates the current level progression and returns it as a percentage value. + */ + @Expose() + get levelProgression(): number { + for (let i = 1; i <= Experience.length; i++) { + const nextExp = Experience[i]; + if (nextExp > this.experience) { + const prevExp = Experience[i - 1]; + + const remaining = nextExp - this.experience; + const max = nextExp - prevExp; + const value = max - remaining; + + return (value / max) * 100; + } + } + + return 0; + } +} diff --git a/src/poe/apis/characters/Items.ts b/src/poe/apis/characters/Items.ts new file mode 100644 index 0000000..e8a67ff --- /dev/null +++ b/src/poe/apis/characters/Items.ts @@ -0,0 +1,12 @@ +import { Type } from "class-transformer"; + +import { Item } from "../../shared/item"; +import { Character } from "./Character"; + +export class Items { + @Type(/* istanbul ignore next */ () => Item) + items!: Item[]; + + @Type(/* istanbul ignore next */ () => Character) + character!: Character; +} diff --git a/src/poe/apis/characters/PassiveSkills.ts b/src/poe/apis/characters/PassiveSkills.ts new file mode 100644 index 0000000..e97d9c4 --- /dev/null +++ b/src/poe/apis/characters/PassiveSkills.ts @@ -0,0 +1,24 @@ +import { Expose, Type } from "class-transformer"; + +import { Item } from "../../shared/item"; +import { Data } from "./skilltree/Data"; + +export class PassiveSkills { + hashes!: number[]; + + /** + * @overrides `visual_overrides` + */ + @Expose({ name: "visual_overrides" }) + visualOverrides!: Array>; + + @Type(/* istanbul ignore next */ () => Item) + items!: Item; + + /** + * @remarks + * `reqData` must be set to `1` when making the request to receive this data + */ + @Type(/* istanbul ignore next */ () => Data) + skillTreeData?: Data; +} diff --git a/src/poe/apis/characters/index.ts b/src/poe/apis/characters/index.ts new file mode 100644 index 0000000..717bf83 --- /dev/null +++ b/src/poe/apis/characters/index.ts @@ -0,0 +1,6 @@ +export * from "./API"; +export * from "./Character"; +export * from "./Items"; +export * from "./PassiveSkills"; +export * from "./models"; +export * as SkillTree from "./skilltree"; diff --git a/src/poe/apis/characters/models/Depth.ts b/src/poe/apis/characters/models/Depth.ts new file mode 100644 index 0000000..2537b83 --- /dev/null +++ b/src/poe/apis/characters/models/Depth.ts @@ -0,0 +1,4 @@ +export interface Depth { + default: number; + solo: number; +} diff --git a/src/poe/apis/characters/models/index.ts b/src/poe/apis/characters/models/index.ts new file mode 100644 index 0000000..241d981 --- /dev/null +++ b/src/poe/apis/characters/models/index.ts @@ -0,0 +1 @@ +export * from "./Depth"; diff --git a/src/poe/apis/characters/skilltree/Class.ts b/src/poe/apis/characters/skilltree/Class.ts new file mode 100644 index 0000000..5d47fcd --- /dev/null +++ b/src/poe/apis/characters/skilltree/Class.ts @@ -0,0 +1,26 @@ +import { Expose } from "class-transformer"; + +import { Ascendancy } from "./models"; + +export class Class { + name!: string; + ascendancies!: Ascendancy[]; + + /** + * @overrides `base_str` + */ + @Expose({ name: "base_str" }) + baseStr!: number; + + /** + * @overrides `base_dex` + */ + @Expose({ name: "base_dex" }) + baseDex!: number; + + /** + * @overrides `base_int` + */ + @Expose({ name: "base_int" }) + baseInt!: number; +} diff --git a/src/poe/apis/characters/skilltree/Data.ts b/src/poe/apis/characters/skilltree/Data.ts new file mode 100644 index 0000000..6b4bf0f --- /dev/null +++ b/src/poe/apis/characters/skilltree/Data.ts @@ -0,0 +1,42 @@ +import { Expose, Type } from "class-transformer"; + +import { Class } from "./Class"; +import { Constants, ExtraImage, Group, Node, SkillSprites } from "./models"; + +export class Data { + @Type(/* istanbul ignore next */ () => Class) + classes!: Class[]; + + /** + * @overrides `min_x` + */ + @Expose({ name: "min_x" }) + minX!: number; + + /** + * @overrides `min_y` + */ + @Expose({ name: "min_y" }) + minY!: number; + + /** + * @overrides `max_x` + */ + @Expose({ name: "max_x" }) + maxX!: number; + + /** + * @overrides `max_y` + */ + @Expose({ name: "max_y" }) + maxY!: number; + + imageZoomLevels!: number[]; + jewelSlots!: number[]; + groups!: { [key: string]: Group }; + nodes!: { [key: string]: Node }; + extraImages!: { [key: string]: ExtraImage }; + assets!: { [key: string]: { [key: string]: string } }; + constants!: Constants; + skillSprites!: SkillSprites; +} diff --git a/src/poe/apis/characters/skilltree/index.ts b/src/poe/apis/characters/skilltree/index.ts new file mode 100644 index 0000000..dec0e71 --- /dev/null +++ b/src/poe/apis/characters/skilltree/index.ts @@ -0,0 +1,3 @@ +export * from "./Class"; +export * from "./Data"; +export * from "./models"; diff --git a/src/poe/apis/characters/skilltree/models/Ascendancy.ts b/src/poe/apis/characters/skilltree/models/Ascendancy.ts new file mode 100644 index 0000000..2c4103d --- /dev/null +++ b/src/poe/apis/characters/skilltree/models/Ascendancy.ts @@ -0,0 +1,9 @@ +import { FlavourTextRect } from "./FlavourTextRect"; + +export interface Ascendancy { + id: string; + name: string; + flavourText?: string; + flavourTextColour?: string; + flavourTextRect?: FlavourTextRect; +} diff --git a/src/poe/apis/characters/skilltree/models/CharacterAttributes.ts b/src/poe/apis/characters/skilltree/models/CharacterAttributes.ts new file mode 100644 index 0000000..eeaebff --- /dev/null +++ b/src/poe/apis/characters/skilltree/models/CharacterAttributes.ts @@ -0,0 +1,5 @@ +export interface CharacterAttributes { + Strength: number; + Dexterity: number; + Intelligence: number; +} diff --git a/src/poe/apis/characters/skilltree/models/Classes.ts b/src/poe/apis/characters/skilltree/models/Classes.ts new file mode 100644 index 0000000..d2f5c89 --- /dev/null +++ b/src/poe/apis/characters/skilltree/models/Classes.ts @@ -0,0 +1,9 @@ +export interface Classes { + StrDexIntClass: number; + StrClass: number; + DexClass: number; + IntClass: number; + StrDexClass: number; + StrIntClass: number; + DexIntClass: number; +} diff --git a/src/poe/apis/characters/skilltree/models/Constants.ts b/src/poe/apis/characters/skilltree/models/Constants.ts new file mode 100644 index 0000000..b861ebc --- /dev/null +++ b/src/poe/apis/characters/skilltree/models/Constants.ts @@ -0,0 +1,10 @@ +import { CharacterAttributes } from "./CharacterAttributes"; +import { Classes } from "./Classes"; + +export interface Constants { + classes: Classes; + characterAttributes: CharacterAttributes; + PSSCentreInnerRadius: number; + skillsPerOrbit: number[]; + orbitRadii: number[]; +} diff --git a/src/poe/apis/characters/skilltree/models/Coord.ts b/src/poe/apis/characters/skilltree/models/Coord.ts new file mode 100644 index 0000000..19bd03e --- /dev/null +++ b/src/poe/apis/characters/skilltree/models/Coord.ts @@ -0,0 +1,6 @@ +export interface Coord { + x: number; + y: number; + w: number; + h: number; +} diff --git a/src/poe/apis/characters/skilltree/models/ExpansionJewel.ts b/src/poe/apis/characters/skilltree/models/ExpansionJewel.ts new file mode 100644 index 0000000..f63e347 --- /dev/null +++ b/src/poe/apis/characters/skilltree/models/ExpansionJewel.ts @@ -0,0 +1,6 @@ +export interface ExpansionJewel { + size: number; + index: number; + proxy: string; + parent?: string; +} diff --git a/src/poe/apis/characters/skilltree/models/ExtraImage.ts b/src/poe/apis/characters/skilltree/models/ExtraImage.ts new file mode 100644 index 0000000..0c4e89f --- /dev/null +++ b/src/poe/apis/characters/skilltree/models/ExtraImage.ts @@ -0,0 +1,5 @@ +export interface ExtraImage { + x: number; + y: number; + image: string; +} diff --git a/src/poe/apis/characters/skilltree/models/FlavourTextRect.ts b/src/poe/apis/characters/skilltree/models/FlavourTextRect.ts new file mode 100644 index 0000000..9fdcbfe --- /dev/null +++ b/src/poe/apis/characters/skilltree/models/FlavourTextRect.ts @@ -0,0 +1,6 @@ +export interface FlavourTextRect { + x: number; + y: number; + width: number; + height: number; +} diff --git a/src/poe/apis/characters/skilltree/models/Group.ts b/src/poe/apis/characters/skilltree/models/Group.ts new file mode 100644 index 0000000..5c03d51 --- /dev/null +++ b/src/poe/apis/characters/skilltree/models/Group.ts @@ -0,0 +1,7 @@ +export interface Group { + x: number; + y: number; + orbits: number[]; + nodes: string[]; + isProxy?: boolean; +} diff --git a/src/poe/apis/characters/skilltree/models/Node.ts b/src/poe/apis/characters/skilltree/models/Node.ts new file mode 100644 index 0000000..d80f50e --- /dev/null +++ b/src/poe/apis/characters/skilltree/models/Node.ts @@ -0,0 +1,32 @@ +import { ExpansionJewel } from "./ExpansionJewel"; + +export interface Node { + skill?: number; + name?: string; + icon?: string; + isNotable?: boolean; + recipe?: string[]; + stats?: string[]; + group?: number; + orbit?: number; + orbitIndex?: number; + out?: string[]; + in?: string[]; + reminderText?: string[]; + isMastery?: boolean; + grantedStrength?: number; + ascendancyName?: string; + grantedDexterity?: number; + isAscendancyStart?: boolean; + isMultipleChoice?: boolean; + grantedIntelligence?: number; + isJewelSocket?: boolean; + expansionJewel?: ExpansionJewel; + grantedPassivePoints?: number; + isKeystone?: boolean; + flavourText?: string[]; + isProxy?: boolean; + isMultipleChoiceOption?: boolean; + isBlighted?: boolean; + classStartIndex?: number; +} diff --git a/src/poe/apis/characters/skilltree/models/SkillSprite.ts b/src/poe/apis/characters/skilltree/models/SkillSprite.ts new file mode 100644 index 0000000..2ad5f9a --- /dev/null +++ b/src/poe/apis/characters/skilltree/models/SkillSprite.ts @@ -0,0 +1,6 @@ +import { Coord } from "./Coord"; + +export interface SkillSprite { + filename: string; + coords: { [key: string]: Coord }; +} diff --git a/src/poe/apis/characters/skilltree/models/SkillSprites.ts b/src/poe/apis/characters/skilltree/models/SkillSprites.ts new file mode 100644 index 0000000..38fcdd6 --- /dev/null +++ b/src/poe/apis/characters/skilltree/models/SkillSprites.ts @@ -0,0 +1,11 @@ +import { SkillSprite } from "./SkillSprite"; + +export interface SkillSprites { + normalActive: SkillSprite[]; + notableActive: SkillSprite[]; + keystoneActive: SkillSprite[]; + normalInactive: SkillSprite[]; + notableInactive: SkillSprite[]; + keystoneInactive: SkillSprite[]; + mastery: SkillSprite[]; +} diff --git a/src/poe/apis/characters/skilltree/models/index.ts b/src/poe/apis/characters/skilltree/models/index.ts new file mode 100644 index 0000000..81adb28 --- /dev/null +++ b/src/poe/apis/characters/skilltree/models/index.ts @@ -0,0 +1,12 @@ +export * from "./Ascendancy"; +export * from "./CharacterAttributes"; +export * from "./Classes"; +export * from "./Constants"; +export * from "./Coord"; +export * from "./ExpansionJewel"; +export * from "./ExtraImage"; +export * from "./FlavourTextRect"; +export * from "./Group"; +export * from "./Node"; +export * from "./SkillSprite"; +export * from "./SkillSprites"; diff --git a/src/poe/apis/guild/API.spec.ts b/src/poe/apis/guild/API.spec.ts new file mode 100644 index 0000000..53a7765 --- /dev/null +++ b/src/poe/apis/guild/API.spec.ts @@ -0,0 +1,35 @@ +import "reflect-metadata"; +import "mocha"; + +import { expect } from "chai"; + +import * as API from "./API"; + +describe("Path of Exile - Guild", function () { + this.timeout(10000); + + let sessionId: string; + + before(() => { + sessionId = process.env["POESESSID"] as string; + }); + + /** + * API Methods + */ + it("#get(session) - should return guild the account is in", async () => { + await expect(API.get(sessionId)).to.be.fulfilled; + }); + + it("#getStashHistory(session, guild) - should return the guild stash history", async () => { + await expect(API.getStashHistory("374", sessionId)).to.be.fulfilled; + }); + + it("#getPointTransactions(session) - should return the point transaction history of all guild members", async () => { + await expect(API.getPointTransactions(sessionId)).to.be.fulfilled; + }); + + it("#getAccountPointTransactions(session) - should return the point transaction history of the session account", async () => { + await expect(API.getAccountPointTransactions(sessionId)).to.be.fulfilled; + }); +}); diff --git a/src/poe/apis/guild/API.ts b/src/poe/apis/guild/API.ts new file mode 100644 index 0000000..8298c8a --- /dev/null +++ b/src/poe/apis/guild/API.ts @@ -0,0 +1,63 @@ +import { buildURL } from "../../../common/functions"; +import { requestTransformed } from "../../functions"; +import { Guild } from "./Guild"; +import { StashHistoryOptions } from "./models"; +import { PointTransactions } from "./PointTransactions"; +import { StashHistory } from "./StashHistory"; + +/** + * @endpoint https://api.pathofexile.com/guild + * @param sessionId + * @returns Guild data of the account the session ID belongs to + * @throws [[APIError]] + */ +export const get = async (sessionId: string): Promise => { + const url = new URL(`https://api.pathofexile.com/guild`); + return await requestTransformed(Guild, url, sessionId); +}; + +/** + * @endpoint https://api.pathofexile.com/guild/id/stash/history + * @param sessionId + * @param guildId Guild ID + * @param options + * @throws [[APIError]] + */ +export const getStashHistory = async ( + guildId: string, + sessionId: string, + options?: StashHistoryOptions +): Promise => { + const url = buildURL(`https://api.pathofexile.com/guild/${guildId}/stash/history`, options); + return await requestTransformed(StashHistory, url, sessionId); +}; + +/** + * @endpoint https://api.pathofexile.com/guild/point-transactions + * @param sessionId + * @param options + * @returns Point transactions for the guild the session ID belongs to + * @throws [[APIError]] + */ +export const getPointTransactions = async ( + sessionId: string, + options?: StashHistoryOptions +): Promise => { + const url = buildURL(`https://api.pathofexile.com/guild/point-transactions`, options); + return await requestTransformed(PointTransactions, url, sessionId); +}; + +/** + * @endpoint https://api.pathofexile.com/account/guild/point-transactions + * @param sessionId + * @param options + * @returns Point transactions the account the session ID belongs to has made to guilds + * @throws [[APIError]] + */ +export const getAccountPointTransactions = async ( + sessionId: string, + options?: StashHistoryOptions +): Promise => { + const url = buildURL(`https://api.pathofexile.com/account/guild/point-transactions`, options); + return await requestTransformed(PointTransactions, url, sessionId); +}; diff --git a/src/poe/apis/guild/Guild.ts b/src/poe/apis/guild/Guild.ts new file mode 100644 index 0000000..55b994e --- /dev/null +++ b/src/poe/apis/guild/Guild.ts @@ -0,0 +1,12 @@ +import { Type } from "class-transformer"; + +export class Guild { + id!: string; + name!: string; + tag!: string; + points!: number; + statusMessage!: string; + + @Type(/* istanbul ignore next */ () => Date) + createdAt!: Date; +} diff --git a/src/poe/apis/guild/PointTransaction.ts b/src/poe/apis/guild/PointTransaction.ts new file mode 100644 index 0000000..f243ab7 --- /dev/null +++ b/src/poe/apis/guild/PointTransaction.ts @@ -0,0 +1,21 @@ +import { Type } from "class-transformer"; + +import { Account } from "../account"; +import { Guild } from "./Guild"; + +export class PointTransaction { + id!: number; + points!: number; + status!: string; + notes!: string[]; + manual!: boolean; + + @Type(/* istanbul ignore next */ () => Guild) + guild!: Guild; + + @Type(/* istanbul ignore next */ () => Account) + account!: Account; + + @Type(/* istanbul ignore next */ () => Date) + createdAt!: Date; +} diff --git a/src/poe/apis/guild/PointTransactions.ts b/src/poe/apis/guild/PointTransactions.ts new file mode 100644 index 0000000..e1899f1 --- /dev/null +++ b/src/poe/apis/guild/PointTransactions.ts @@ -0,0 +1,10 @@ +import { Type } from "class-transformer"; + +import { PointTransaction } from "./PointTransaction"; + +export class PointTransactions { + total!: number; + + @Type(/* istanbul ignore next */ () => PointTransaction) + entries!: PointTransaction[]; +} diff --git a/src/poe/apis/guild/StashAction.ts b/src/poe/apis/guild/StashAction.ts new file mode 100644 index 0000000..0dfba45 --- /dev/null +++ b/src/poe/apis/guild/StashAction.ts @@ -0,0 +1,16 @@ +import { Transform, Type } from "class-transformer"; + +import { Account } from "../account"; + +export class StashAction { + id!: string; + league!: string; + item!: string; + action!: string; + + @Transform(({ value }) => new Date(value * 1000), { toClassOnly: true }) + time!: Date; + + @Type(/* istanbul ignore next */ () => Account) + account!: Account; +} diff --git a/src/poe/apis/guild/StashHistory.ts b/src/poe/apis/guild/StashHistory.ts new file mode 100644 index 0000000..4e0dc55 --- /dev/null +++ b/src/poe/apis/guild/StashHistory.ts @@ -0,0 +1,10 @@ +import { Type } from "class-transformer"; + +import { StashAction } from "./StashAction"; + +export class StashHistory { + truncated!: boolean; + + @Type(/* istanbul ignore next */ () => StashAction) + entries!: StashAction[]; +} diff --git a/src/poe/apis/guild/index.ts b/src/poe/apis/guild/index.ts new file mode 100644 index 0000000..2a923b9 --- /dev/null +++ b/src/poe/apis/guild/index.ts @@ -0,0 +1,7 @@ +export * from "./API"; +export * from "./Guild"; +export * from "./PointTransaction"; +export * from "./PointTransactions"; +export * from "./StashAction"; +export * from "./StashHistory"; +export * from "./models"; diff --git a/src/poe/apis/guild/models/Options.ts b/src/poe/apis/guild/models/Options.ts new file mode 100644 index 0000000..0e73b1c --- /dev/null +++ b/src/poe/apis/guild/models/Options.ts @@ -0,0 +1,29 @@ +export interface PointTransactionsOptions { + /** + * Specifies the number of point transaction entries to include. + * + * Default: `5` + * + * Max: `100` + */ + limit?: number; + + /** + * Specifies the offset to the first point transaction to include. + * + * Default: `0` + */ + offset?: number; +} + +export interface StashHistoryOptions { + /** + * Timestamp of the the action, from which the next entries should be fetched + */ + from?: string; + + /** + * ID of the the action, from which the next entries should be fetched + */ + fromid?: string; +} diff --git a/src/poe/apis/guild/models/index.ts b/src/poe/apis/guild/models/index.ts new file mode 100644 index 0000000..2cc2f89 --- /dev/null +++ b/src/poe/apis/guild/models/index.ts @@ -0,0 +1 @@ +export * from "./Options"; diff --git a/src/poe/apis/index.ts b/src/poe/apis/index.ts new file mode 100644 index 0000000..9abd0cb --- /dev/null +++ b/src/poe/apis/index.ts @@ -0,0 +1,12 @@ +export * as Characters from "./characters"; +export * as Ladders from "./ladders"; +export * as Leagues from "./leagues"; +export * as Streams from "./streams"; +export * as PVP from "./pvp"; +export * as Trade from "./trade"; +export * as PrivateLeagues from "./private-leagues"; +export * as Guild from "./guild"; +export * as Seasons from "./seasons"; +export * as Account from "./account"; +export * as MTX from "./mtx"; +export * as PublicStashTabs from "./public-stash-tabs"; diff --git a/src/poe/apis/ladders/API.spec.ts b/src/poe/apis/ladders/API.spec.ts new file mode 100644 index 0000000..768adca --- /dev/null +++ b/src/poe/apis/ladders/API.spec.ts @@ -0,0 +1,57 @@ +import "reflect-metadata"; +import "mocha"; + +import { expect } from "chai"; +import { plainToClass } from "class-transformer"; + +import CachedLadder from "../../resource/ladder.json"; +import * as API from "./API"; +import { Ladder } from "./Ladder"; + +describe("Path of Exile - Ladders", function () { + this.timeout(10000); + + /** + * API Methods + */ + it("#get(id) - should return ladder for a specific league", async () => { + await expect(API.get("Standard")).to.be.fulfilled; + }); + + /** + * Class Methods + */ + describe("Classes", () => { + let ladder: Ladder; + + before(() => { + ladder = plainToClass(Ladder, CachedLadder); + }); + + describe("Ladder", () => { + it("#filterByCharacter - should return all Scions", () => { + const occultists = ladder.filterByCharacter("class", "Scion"); + expect(occultists.length).to.equal(6); + }); + + it("#filterBy - should return all public entries", () => { + const publicEntries = ladder.filterBy("public", true); + expect(publicEntries.length).to.equal(9); + }); + }); + + describe("LadderEntry", () => { + it("#profileUrl - should return profile url", () => { + expect(ladder.entries[0].profileUrl).to.equal( + "https://www.pathofexile.com/account/view-profile/Jin_melike" + ); + }); + + it("#characterWindowUrl - should return character window url", () => { + expect(ladder.entries[0].characterWindowUrl).to.equal( + "https://www.pathofexile.com/account/view-profile/Jin_melike/characters?characterName=PenDora" + ); + }); + }); + }); +}); diff --git a/src/poe/apis/ladders/API.ts b/src/poe/apis/ladders/API.ts new file mode 100644 index 0000000..b92fb94 --- /dev/null +++ b/src/poe/apis/ladders/API.ts @@ -0,0 +1,32 @@ +import { buildURL } from "../../../common/functions"; +import { requestTransformed } from "../../functions"; +import { Ladder } from "./Ladder"; +import { Options } from "./models"; + +/** + * @remarks + * There is a restriction in place on the last ladder entry you are able to retrieve which is set to `15000`. + * + * @example + * Get the first 200 characters in the SSF Standard ladder. We also set `track: 1` to add a unique identifier to each character. + * + * ```typescript + * const ladder = await PathOfExile.Ladders.get("SSF Standard", { limit: 200, track: 1 }); + * ``` + * + * @endpoint https://api.pathofexile.com/ladders/id + * @param id + * @param options + * @throws [[APIError]] + */ +export const get = async (id: string, options?: Options): Promise => { + const url = buildURL(`https://api.pathofexile.com/ladders/${id}`, options); + const ladder = await requestTransformed(Ladder, url); + ladder.leagueId = id; + + if (options) { + ladder.options = options; + } + + return ladder; +}; diff --git a/src/poe/apis/ladders/Entry.ts b/src/poe/apis/ladders/Entry.ts new file mode 100644 index 0000000..7f5b578 --- /dev/null +++ b/src/poe/apis/ladders/Entry.ts @@ -0,0 +1,34 @@ +import { Expose, Type } from "class-transformer"; + +import { Account } from "../account"; +import { Character } from "../characters"; + +export class Entry { + rank!: number; + dead!: boolean; + retired?: boolean; + public?: boolean; + online!: boolean; + + @Type(/* istanbul ignore next */ () => Character) + character!: Character; + + @Type(/* istanbul ignore next */ () => Account) + account!: Account; + + /** + * @returns URL to the character window on the Path of Exile website + */ + @Expose() + get characterWindowUrl(): string { + return `https://www.pathofexile.com/account/view-profile/${this.account.name}/characters?characterName=${this.character.name}`; + } + + /** + * @returns URL to the account profile on the Path of Exile website + */ + @Expose() + get profileUrl(): string { + return `https://www.pathofexile.com/account/view-profile/${this.account.name}`; + } +} diff --git a/src/poe/apis/ladders/Ladder.ts b/src/poe/apis/ladders/Ladder.ts new file mode 100644 index 0000000..ac58dab --- /dev/null +++ b/src/poe/apis/ladders/Ladder.ts @@ -0,0 +1,107 @@ +import { Exclude, Expose, Type } from "class-transformer"; + +import { Character } from "../characters"; +import * as API from "./API"; +import { Entry } from "./Entry"; +import { Options } from "./models"; + +export class Ladder { + @Exclude() + private _options: Options = { + limit: 20, + offset: 0, + }; + + @Exclude() + private _leagueId = "Standard"; + + total!: number; + + /** + * @overrides `cached_since` + */ + @Type(/* istanbul ignore next */ () => Date) + @Expose({ name: "cached_since" }) + cachedSince!: Date; + + @Type(/* istanbul ignore next */ () => Entry) + entries!: Entry[]; + + @Exclude() + public set options(options: Options) { + this._options = { ...this._options, ...options }; + } + + @Exclude() + public set leagueId(id: string) { + this._leagueId = id; + } + + /** + * @remarks + * Uses the same [[LadderOptions]] that have been used getting this ladder. + * If you want to fetch an entire ladder, it is highly recommended to set the `limit` option to `200`. + * + * @param append Set to `true` if the next entries should be appended to this ladders entries + * @returns The next set of ladder entries, `null` when there are no more entries + */ + public async getNextEntries(append = true): Promise { + if (this._options.offset == null || this._options.limit == null) { + return null; + } + + const nextOffset = this._options.offset + this._options.limit; + if (nextOffset >= this.total) { + return null; + } + + // Make sure limit + offset isn't higher than total since that's considered an invalid query + if (nextOffset + this._options.limit >= this.total) { + this._options.limit = this.total - nextOffset; + } + + this._options.offset = nextOffset; + + const ladder = await API.get(this._leagueId, this._options); + + if (append) { + this.entries.push(...ladder.entries); + } + + return ladder.entries; + } + + /** + * @example + * Get all characters which have the Assassin ascendancy. + * + * ```typescript + * const assassins = ladder.filterByCharacter("class", "Assassin"); + * console.log(`${assassins.length} of the first 200 characters are Assassins.`); + * ``` + * + * @param property Name of a character property + * @param value Value of the property that should be filtered + * @returns A new list of characters matching the filter + */ + public filterByCharacter(property: K, value: Character[K]): Entry[] { + return this.entries.filter((entry) => entry.character[property] === value); + } + + /** + * @example + * Display online characters from the ladder. + * + * ```typescript + * const online = ladder.filterBy("online", true); + * console.log(`${online.length} of the first 200 characters are currently online.`); + * ``` + * + * @param property Name of a ladder entry property + * @param value Value of the property that should be filtered + * @returns A new list of characters matching the filter + */ + public filterBy(property: K, value: Entry[K]): Entry[] { + return this.entries.filter((entry) => entry[property] === value); + } +} diff --git a/src/poe/apis/ladders/index.ts b/src/poe/apis/ladders/index.ts new file mode 100644 index 0000000..4c2a48d --- /dev/null +++ b/src/poe/apis/ladders/index.ts @@ -0,0 +1,4 @@ +export * from "./API"; +export * from "./Entry"; +export * from "./Ladder"; +export * from "./models"; diff --git a/src/poe/apis/ladders/models/Options.ts b/src/poe/apis/ladders/models/Options.ts new file mode 100644 index 0000000..bf98d48 --- /dev/null +++ b/src/poe/apis/ladders/models/Options.ts @@ -0,0 +1,48 @@ +import { RealmOptions } from "../../../shared/models"; + +export interface Options extends RealmOptions { + /** + * Specifies the number of ladder entries to include. + * + * Default: `20` + * + * Max: `200` + */ + limit?: number; + + /** + * Specifies the offset to the first ladder entry to include. + * + * Default: `0` + */ + offset?: number; + + /** + * Specifies the type of ladder. + * + * Default: `league` + */ + type?: "league" | "pvp" | "labyrinth"; + + /** + * Adds unique IDs for each character returned. These can be used when name conflicts occur. + * + * Default: `0` + */ + track?: 0 | 1; + + /** + * Filters by account name within the first 15000 results, only available when `type=league`. + */ + accountName?: string; + + /** + * Difficulty of the labyrinth, only available when `type=labyrinth`. + */ + difficulty?: "Normal" | "Cruel" | "Merciless" | "Eternal" | 1 | 2 | 3 | 4; + + /** + * Only available when `type=labyrinth`. + */ + start?: string; +} diff --git a/src/poe/apis/ladders/models/index.ts b/src/poe/apis/ladders/models/index.ts new file mode 100644 index 0000000..2cc2f89 --- /dev/null +++ b/src/poe/apis/ladders/models/index.ts @@ -0,0 +1 @@ +export * from "./Options"; diff --git a/src/poe/apis/leagues/API.spec.ts b/src/poe/apis/leagues/API.spec.ts new file mode 100644 index 0000000..2c9d7d5 --- /dev/null +++ b/src/poe/apis/leagues/API.spec.ts @@ -0,0 +1,29 @@ +import "reflect-metadata"; +import "mocha"; + +import { expect } from "chai"; + +import * as API from "./API"; + +describe("Path of Exile - Leagues", function () { + this.timeout(10000); + + /** + * API Methods + */ + it("#get() - should return list of leagues", async () => { + await expect(API.get()).to.be.fulfilled; + }); + + it("#getById(id) - should return data for a league", async () => { + await expect(API.getById("Standard")).to.be.fulfilled; + }); + + it("#getRules() - should return all rules for leagues", async () => { + await expect(API.getRules()).to.be.fulfilled; + }); + + it("#getRuleById(id) - should return all rules for a specific league", async () => { + await expect(API.getRuleById("Hardcore")).to.be.fulfilled; + }); +}); diff --git a/src/poe/apis/leagues/API.ts b/src/poe/apis/leagues/API.ts new file mode 100644 index 0000000..d079cc9 --- /dev/null +++ b/src/poe/apis/leagues/API.ts @@ -0,0 +1,59 @@ +import { buildURL } from "../../../common/functions"; +import { requestTransformed, requestTransformedArray } from "../../functions"; +import { League } from "./League"; +import { LeagueOptions, ListOptions } from "./models"; +import { Rule } from "./Rule"; + +/** + * @example + * Get the list of the leagues that are currently active on the PlayStation realm. + * + * ```typescript + * const data = await PathOfExile.Leagues.get({ type: "main", realm: "sony" }); + * ``` + * + * @endpoint https://api.pathofexile.com/leagues + * @param options + * @throws [[APIError]] + */ +export const get = async (options?: ListOptions): Promise => { + const url = buildURL(`https://api.pathofexile.com/leagues`, options); + return await requestTransformedArray(League, url); +}; + +/** + * @example + * Get the data from the Metamorph league, including the first 100 entries of the ladder. + * + * ```typescript + * const data = await PathOfExile.Leagues.getById("Metamorph", { ladder: 1, limit: 100 }); + * ``` + * + * @endpoint https://api.pathofexile.com/leagues/id + * @param id + * @param options + * @throws [[APIError]] + */ +export const getById = async (id: string, options?: LeagueOptions): Promise => { + const url = buildURL(`https://api.pathofexile.com/leagues/${id}`, options); + return await requestTransformed(League, url); +}; + +/** + * @endpoint http://api.pathofexile.com/league-rules + * @throws [[APIException]] + */ +export const getRules = async (): Promise => { + const url = buildURL(`http://api.pathofexile.com/league-rules`); + return await requestTransformedArray(Rule, url); +}; + +/** + * @endpoint http://api.pathofexile.com/league-rules/id + * @param id + * @throws [[APIException]] + */ +export const getRuleById = async (id: string): Promise => { + const url = buildURL(`http://api.pathofexile.com/league-rules/${id}`); + return await requestTransformed(Rule, url); +}; diff --git a/src/poe/apis/leagues/League.ts b/src/poe/apis/leagues/League.ts new file mode 100644 index 0000000..9720630 --- /dev/null +++ b/src/poe/apis/leagues/League.ts @@ -0,0 +1,31 @@ +import { Type } from "class-transformer"; + +import { Realm } from "../../shared/models"; +import { Ladder } from "../ladders"; +import { Rule } from "./Rule"; + +export class League { + id!: string; + realm!: Realm; + url!: string; + delveEvent!: boolean; + + description?: string; + timedEvent?: boolean; + scoreEvent?: boolean; + + @Type(/* istanbul ignore next */ () => Date) + startAt!: Date; + + @Type(/* istanbul ignore next */ () => Date) + endAt!: Date | null; + + @Type(/* istanbul ignore next */ () => Date) + registerAt?: Date; + + @Type(/* istanbul ignore next */ () => Rule) + rules?: Rule[]; + + @Type(/* istanbul ignore next */ () => Ladder) + ladder?: Ladder; +} diff --git a/src/poe/apis/leagues/Rule.ts b/src/poe/apis/leagues/Rule.ts new file mode 100644 index 0000000..f4c9a42 --- /dev/null +++ b/src/poe/apis/leagues/Rule.ts @@ -0,0 +1,5 @@ +export class Rule { + id!: string; + name!: string; + description!: string; +} diff --git a/src/poe/apis/leagues/index.ts b/src/poe/apis/leagues/index.ts new file mode 100644 index 0000000..ee6e83a --- /dev/null +++ b/src/poe/apis/leagues/index.ts @@ -0,0 +1,4 @@ +export * from "./API"; +export * from "./League"; +export * from "./Rule"; +export * from "./models"; diff --git a/src/poe/apis/leagues/models/Options.ts b/src/poe/apis/leagues/models/Options.ts new file mode 100644 index 0000000..65131fa --- /dev/null +++ b/src/poe/apis/leagues/models/Options.ts @@ -0,0 +1,70 @@ +import { RealmOptions } from "../../../shared/models"; + +export interface ListOptions extends RealmOptions { + /** + * `0`: Displays the full info for leagues retrieved (will only retrieve a maximum of 50 leagues) (the default) + * + * `1`: Display compact info for leagues retrieved (will retrieve up to 230 leagues). + */ + compact?: 0 | 1; + + /** + * This specifies the number of league entries to include. By default this is the maximum, which depends on the setting above. + */ + limit?: number; + + /** + * This specifies the offset to the first league entry to include. + * + * Default: `0` + */ + offset?: number; + + /** + * `main`: Retrieves permanant and challenge leagues + * + * `event`: Retrieves event leagues + * + * `season`: Retrieves leagues in a particular season. + * + * Default: `main` + */ + type?: "main" | "event" | "season"; + + /** + * A particular season id. Required when `type=season`. + */ + season?: string; +} + +export interface LeagueOptions extends RealmOptions { + /** + * Set to `true` to include the ladder in the response. The ladder will be in included in the `ladder` key. + * Please note that the ladder can be retrieved using the ladder resource, and that retrieving it using the league API is just an optimization that can be used if you are requesting the league anyway. + * + * Default: `0` + */ + ladder?: 0 | 1; + + /** + * When including the ladder with `ladder=1`, this specifies the number of ladder entries to include. + * + * Default: `20` + * + * Max: `200` + */ + ladderLimit?: number; + /** + * When including the ladder with `ladder=1`, this specifies the offset to the first ladder entry to include. + * + * Default: `0` + */ + ladderOffset?: number; + + /** + * When including the ladder with `ladder=1`, this setting adds unique IDs for each character returned. These can be used when name conflicts occur. + * + * Default: `0` + */ + ladderTrack?: 0 | 1; +} diff --git a/src/poe/apis/leagues/models/index.ts b/src/poe/apis/leagues/models/index.ts new file mode 100644 index 0000000..2cc2f89 --- /dev/null +++ b/src/poe/apis/leagues/models/index.ts @@ -0,0 +1 @@ +export * from "./Options"; diff --git a/src/poe/apis/mtx/API.spec.ts b/src/poe/apis/mtx/API.spec.ts new file mode 100644 index 0000000..26069eb --- /dev/null +++ b/src/poe/apis/mtx/API.spec.ts @@ -0,0 +1,17 @@ +import "reflect-metadata"; +import "mocha"; + +import { expect } from "chai"; + +import * as API from "./API"; + +describe("Path of Exile - Microtransactions", function () { + this.timeout(10000); + + /** + * API Methods + */ + it("#getSpecials() - should return list of mtx specials", async () => { + await expect(API.getSpecials()).to.be.fulfilled; + }); +}); diff --git a/src/poe/apis/mtx/API.ts b/src/poe/apis/mtx/API.ts new file mode 100644 index 0000000..27e7712 --- /dev/null +++ b/src/poe/apis/mtx/API.ts @@ -0,0 +1,15 @@ +import { buildURL } from "../../../common/functions"; +import { requestTransformed } from "../../functions"; +import { Collection } from "./Collection"; +import { SpecialsOptions } from "./models"; + +/** + * @endpoint https://api.pathofexile.com/shop/microtransactions/specials + * @param options + * @throws [[APIError]] + */ +export const getSpecials = async (options?: SpecialsOptions): Promise => { + const url = buildURL(`https://api.pathofexile.com/shop/microtransactions/specials`, options); + + return await requestTransformed(Collection, url); +}; diff --git a/src/poe/apis/mtx/Collection.ts b/src/poe/apis/mtx/Collection.ts new file mode 100644 index 0000000..df8cba4 --- /dev/null +++ b/src/poe/apis/mtx/Collection.ts @@ -0,0 +1,6 @@ +import { Entry } from "./models"; + +export class Collection { + total!: number; + entries!: Entry[]; +} diff --git a/src/poe/apis/mtx/index.ts b/src/poe/apis/mtx/index.ts new file mode 100644 index 0000000..db05b9f --- /dev/null +++ b/src/poe/apis/mtx/index.ts @@ -0,0 +1,3 @@ +export * from "./API"; +export * from "./Collection"; +export * from "./models"; diff --git a/src/poe/apis/mtx/models/Entry.ts b/src/poe/apis/mtx/models/Entry.ts new file mode 100644 index 0000000..6302969 --- /dev/null +++ b/src/poe/apis/mtx/models/Entry.ts @@ -0,0 +1,18 @@ +import { Microtransaction } from "./Microtransaction"; + +export interface Entry { + id: number; + startAt: Date; + endAt: Date; + imageUrl: string; + url: string; + description: string; + specialType: string; + cost: number; + countdownSpecial: boolean; + countdownImage: null; + priority: number; + platform: null; + microtransaction: Microtransaction; + category: boolean; +} diff --git a/src/poe/apis/mtx/models/Microtransaction.ts b/src/poe/apis/mtx/models/Microtransaction.ts new file mode 100644 index 0000000..e5210cd --- /dev/null +++ b/src/poe/apis/mtx/models/Microtransaction.ts @@ -0,0 +1,7 @@ +export interface Microtransaction { + id: string; + name: string; + description: string; + cost: number; + guild: boolean; +} diff --git a/src/poe/apis/mtx/models/Options.ts b/src/poe/apis/mtx/models/Options.ts new file mode 100644 index 0000000..3e84243 --- /dev/null +++ b/src/poe/apis/mtx/models/Options.ts @@ -0,0 +1,8 @@ +export interface SpecialsOptions { + /** + * How many specials to include + */ + limit?: number; + + type?: "active"; +} diff --git a/src/poe/apis/mtx/models/index.ts b/src/poe/apis/mtx/models/index.ts new file mode 100644 index 0000000..7762d86 --- /dev/null +++ b/src/poe/apis/mtx/models/index.ts @@ -0,0 +1,3 @@ +export * from "./Entry"; +export * from "./Microtransaction"; +export * from "./Options"; diff --git a/src/poe/apis/private-leagues/API.spec.ts b/src/poe/apis/private-leagues/API.spec.ts new file mode 100644 index 0000000..d1e4f50 --- /dev/null +++ b/src/poe/apis/private-leagues/API.spec.ts @@ -0,0 +1,23 @@ +import "reflect-metadata"; +import "mocha"; + +import { expect } from "chai"; + +import * as API from "./API"; + +describe("Path of Exile - Private Leagues", function () { + this.timeout(10000); + + let sessionId: string; + + before(() => { + sessionId = process.env["POESESSID"] as string; + }); + + /** + * API Methods + */ + it("#getMembers() - should return list of private league members", async () => { + await expect(API.getMembers("7494", sessionId)).to.be.fulfilled; + }); +}); diff --git a/src/poe/apis/private-leagues/API.ts b/src/poe/apis/private-leagues/API.ts new file mode 100644 index 0000000..cf3098b --- /dev/null +++ b/src/poe/apis/private-leagues/API.ts @@ -0,0 +1,23 @@ +import { buildURL } from "../../../common/functions"; +import { requestTransformed } from "../../functions"; +import { Collection } from "./Collection"; +import { MembersOptions } from "./models"; + +/** + * @remarks + * The account tied to the provided session id must be part of the private league. + * + * @endpoint https://api.pathofexile.com/private-league-member/id + * @param id ID of the private league without `PL` prefix + * @param sessionId + * @param options + * @throws [[APIException]] + */ +export const getMembers = async ( + id: string, + sessionId: string, + options?: MembersOptions +): Promise => { + const url = buildURL(`https://api.pathofexile.com/private-league-member/${id}`, options); + return await requestTransformed(Collection, url, sessionId); +}; diff --git a/src/poe/apis/private-leagues/Collection.ts b/src/poe/apis/private-leagues/Collection.ts new file mode 100644 index 0000000..bc0f5a4 --- /dev/null +++ b/src/poe/apis/private-leagues/Collection.ts @@ -0,0 +1,24 @@ +import { Type } from "class-transformer"; + +import { Member } from "./Member"; +import { RoleElement, SortType } from "./models"; + +export class Collection { + editable!: boolean; + total!: number; + sort!: SortType; + roles!: RoleElement[]; + + /** + * @todo This isn't right + */ + invitation!: null; + + /** + * @todo This isn't right + */ + eligibleAccounts!: null; + + @Type(/* istanbul ignore next */ () => Member) + members!: Member[]; +} diff --git a/src/poe/apis/private-leagues/Member.ts b/src/poe/apis/private-leagues/Member.ts new file mode 100644 index 0000000..924f826 --- /dev/null +++ b/src/poe/apis/private-leagues/Member.ts @@ -0,0 +1,10 @@ +export class Member { + id!: number; + memberName!: string; + role!: string; + roleName!: string; + isAcceptable!: boolean; + isRemovable!: boolean; + makeOwner!: boolean; + promote!: boolean; +} diff --git a/src/poe/apis/private-leagues/index.ts b/src/poe/apis/private-leagues/index.ts new file mode 100644 index 0000000..c96d6bd --- /dev/null +++ b/src/poe/apis/private-leagues/index.ts @@ -0,0 +1,4 @@ +export * from "./API"; +export * from "./Collection"; +export * from "./Member"; +export * from "./models"; diff --git a/src/poe/apis/private-leagues/models/Options.ts b/src/poe/apis/private-leagues/models/Options.ts new file mode 100644 index 0000000..7a198df --- /dev/null +++ b/src/poe/apis/private-leagues/models/Options.ts @@ -0,0 +1,23 @@ +import { RealmOptions } from "../../../shared/models"; +import { SortType } from "./SortType"; + +export interface MembersOptions extends RealmOptions { + /** + * How the list should be sorted + */ + sort?: SortType; + + /** + * This specifies the number of members to include. + * + * Default: `20` + */ + limit?: number; + + /** + * This specifies the offset to the first member to include. + * + * Default: `0` + */ + offset?: number; +} diff --git a/src/poe/apis/private-leagues/models/RoleElement.ts b/src/poe/apis/private-leagues/models/RoleElement.ts new file mode 100644 index 0000000..9ee1ccc --- /dev/null +++ b/src/poe/apis/private-leagues/models/RoleElement.ts @@ -0,0 +1,4 @@ +export interface RoleElement { + key: string; + value: string; +} diff --git a/src/poe/apis/private-leagues/models/SortType.ts b/src/poe/apis/private-leagues/models/SortType.ts new file mode 100644 index 0000000..cf7f182 --- /dev/null +++ b/src/poe/apis/private-leagues/models/SortType.ts @@ -0,0 +1 @@ +export type SortType = "nameAsc" | "nameDesc" | "roleAsc" | "roleDesc"; diff --git a/src/poe/apis/private-leagues/models/index.ts b/src/poe/apis/private-leagues/models/index.ts new file mode 100644 index 0000000..d3b1436 --- /dev/null +++ b/src/poe/apis/private-leagues/models/index.ts @@ -0,0 +1,3 @@ +export * from "./Options"; +export * from "./RoleElement"; +export * from "./SortType"; diff --git a/src/poe/apis/public-stash-tabs/API.spec.ts b/src/poe/apis/public-stash-tabs/API.spec.ts new file mode 100644 index 0000000..8a7fcb0 --- /dev/null +++ b/src/poe/apis/public-stash-tabs/API.spec.ts @@ -0,0 +1,21 @@ +import "reflect-metadata"; +import "mocha"; + +import { expect } from "chai"; + +import * as API from "./API"; + +describe("Path of Exile - Public stash tabs", function () { + this.timeout(30000); + + /** + * API Methods + */ + it("#getChunk() - should return public stash tab chunk", async () => { + await expect(API.getChunk()).to.be.fulfilled; + }); + + it("#getChunk(id) - should return public stash tab chunk with specific change id", async () => { + await expect(API.getChunk("2949-5227-4536-5439-1849")).to.be.fulfilled; + }); +}); diff --git a/src/poe/apis/public-stash-tabs/API.ts b/src/poe/apis/public-stash-tabs/API.ts new file mode 100644 index 0000000..792cd68 --- /dev/null +++ b/src/poe/apis/public-stash-tabs/API.ts @@ -0,0 +1,18 @@ +import { requestTransformed } from "../../functions"; +import { Chunk } from "./Chunk"; + +/** + * @endpoint http://api.pathofexile.com/public-stash-tabs + * @param nextChangeId The next change ID you received from previously fetching changes + * @throws [[APIError]] + */ +export const getChunk = async (nextChangeId?: string): Promise => { + let urlString = `http://api.pathofexile.com/public-stash-tabs`; + + if (nextChangeId) { + urlString += `/${nextChangeId}`; + } + + const url = new URL(urlString); + return await requestTransformed(Chunk, url); +}; diff --git a/src/poe/apis/public-stash-tabs/Chunk.ts b/src/poe/apis/public-stash-tabs/Chunk.ts new file mode 100644 index 0000000..8c21134 --- /dev/null +++ b/src/poe/apis/public-stash-tabs/Chunk.ts @@ -0,0 +1,23 @@ +import { Expose, Type } from "class-transformer"; + +import * as API from "./API"; +import { Stash } from "./Stash"; + +export class Chunk { + /** + * @overrides `next_change_id` + */ + @Type(/* istanbul ignore next */ () => String) + @Expose({ name: "next_change_id" }) + nextChangeId!: string; + + @Type(/* istanbul ignore next */ () => Stash) + stashes!: Stash[]; + + /** + * @throws [[APIError]] + */ + public async getNext(): Promise { + return await API.getChunk(this.nextChangeId); + } +} diff --git a/src/poe/apis/public-stash-tabs/Stash.ts b/src/poe/apis/public-stash-tabs/Stash.ts new file mode 100644 index 0000000..fbf1fdb --- /dev/null +++ b/src/poe/apis/public-stash-tabs/Stash.ts @@ -0,0 +1,17 @@ +import { Type } from "class-transformer"; + +import { Item } from "../../shared/item"; +import { StashType } from "../../shared/models"; + +export class Stash { + id!: string; + public!: boolean; + accountName!: string | null; + lastCharacterName!: string | null; + stash!: string | null; + stashType!: StashType; + league!: string | null; + + @Type(/* istanbul ignore next */ () => Item) + items!: Item[]; +} diff --git a/src/poe/apis/public-stash-tabs/index.ts b/src/poe/apis/public-stash-tabs/index.ts new file mode 100644 index 0000000..1721b25 --- /dev/null +++ b/src/poe/apis/public-stash-tabs/index.ts @@ -0,0 +1,3 @@ +export * from "./API"; +export * from "./Chunk"; +export * from "./Stash"; diff --git a/src/poe/apis/pvp/API.spec.ts b/src/poe/apis/pvp/API.spec.ts new file mode 100644 index 0000000..7b6cb92 --- /dev/null +++ b/src/poe/apis/pvp/API.spec.ts @@ -0,0 +1,17 @@ +import "reflect-metadata"; +import "mocha"; + +import { expect } from "chai"; + +import * as API from "./API"; + +describe("Path of Exile - PVP", function () { + this.timeout(10000); + + /** + * API Methods + */ + it("#getMatches() - should return list of PVP matches", async () => { + await expect(API.getMatches()).to.be.fulfilled; + }); +}); diff --git a/src/poe/apis/pvp/API.ts b/src/poe/apis/pvp/API.ts new file mode 100644 index 0000000..62aad82 --- /dev/null +++ b/src/poe/apis/pvp/API.ts @@ -0,0 +1,14 @@ +import { buildURL } from "../../../common/functions"; +import { requestTransformedArray } from "../../functions"; +import { Match } from "./Match"; +import { MatchOptions } from "./models"; + +/** + * @endpoint https://api.pathofexile.com/pvp-matches + * @param options + * @throws [[APIError]] + */ +export const getMatches = async (options?: MatchOptions): Promise => { + const url = buildURL(`https://api.pathofexile.com/pvp-matches`, options); + return await requestTransformedArray(Match, url); +}; diff --git a/src/poe/apis/pvp/Match.ts b/src/poe/apis/pvp/Match.ts new file mode 100644 index 0000000..ae11232 --- /dev/null +++ b/src/poe/apis/pvp/Match.ts @@ -0,0 +1,22 @@ +import { Type } from "class-transformer"; + +import { Realm } from "../../shared/models"; + +export class Match { + id!: string; + realm!: Realm; + url!: string; + description!: string; + glickoRatings!: boolean; + pvp!: boolean; + style!: string; + + @Type(/* istanbul ignore next */ () => Date) + startAt!: Date; + + @Type(/* istanbul ignore next */ () => Date) + endAt!: Date; + + @Type(/* istanbul ignore next */ () => Date) + registerAt!: Date; +} diff --git a/src/poe/apis/pvp/index.ts b/src/poe/apis/pvp/index.ts new file mode 100644 index 0000000..c0b1e77 --- /dev/null +++ b/src/poe/apis/pvp/index.ts @@ -0,0 +1,2 @@ +export * from "./API"; +export * from "./Match"; diff --git a/src/poe/apis/pvp/models/Options.ts b/src/poe/apis/pvp/models/Options.ts new file mode 100644 index 0000000..f05d520 --- /dev/null +++ b/src/poe/apis/pvp/models/Options.ts @@ -0,0 +1,8 @@ +import { RealmOptions } from "../../../shared/models"; + +export interface MatchOptions extends RealmOptions { + /** + * Set this to get PvP matches for a particular season. Leave this unset to retrieve all upcoming PvP matches. + */ + seasonId?: string; +} diff --git a/src/poe/apis/pvp/models/index.ts b/src/poe/apis/pvp/models/index.ts new file mode 100644 index 0000000..2cc2f89 --- /dev/null +++ b/src/poe/apis/pvp/models/index.ts @@ -0,0 +1 @@ +export * from "./Options"; diff --git a/src/poe/apis/seasons/API.spec.ts b/src/poe/apis/seasons/API.spec.ts new file mode 100644 index 0000000..3609b7a --- /dev/null +++ b/src/poe/apis/seasons/API.spec.ts @@ -0,0 +1,21 @@ +import "reflect-metadata"; +import "mocha"; + +import { expect } from "chai"; + +import * as API from "./API"; + +describe("Path of Exile - Seasons", function () { + this.timeout(10000); + + /** + * API Methods + */ + it("#get() - should return list of seasons", async () => { + await expect(API.get()).to.be.fulfilled; + }); + + it("#getPlayerHistory(id, account) - should return season player history", async () => { + await expect(API.getPlayerHistory("Race Season One", "Chris")).to.be.fulfilled; + }); +}); diff --git a/src/poe/apis/seasons/API.ts b/src/poe/apis/seasons/API.ts new file mode 100644 index 0000000..220e765 --- /dev/null +++ b/src/poe/apis/seasons/API.ts @@ -0,0 +1,37 @@ +import { buildURL } from "../../../common/functions"; +import { requestTransformed, requestTransformedArray } from "../../functions"; +import { PlayerHistoryOptions } from "./models"; +import { PlayerHistory } from "./PlayerHistory"; +import { Season } from "./Season"; + +/** + * @endpoint https://api.pathofexile.com/seasons + * @returns A list of all seasons + * @throws [[APIError]] + */ +export const get = async (): Promise => { + const url = new URL(`https://api.pathofexile.com/seasons`); + return await requestTransformedArray(Season, url); +}; + +/** + * @remarks + * This data is available even if the profile of the account is set to private + * + * @endpoint https://api.pathofexile.com/season-player-history + * @param seasonId + * @param accountName + * @param options + * @throws [[APIError]] + */ +export const getPlayerHistory = async ( + seasonId: string, + accountName: string, + options?: PlayerHistoryOptions +): Promise => { + const url = buildURL(`https://api.pathofexile.com/season-player-history`, options, null, { + seasonId, + id: accountName, + }); + return await requestTransformed(PlayerHistory, url); +}; diff --git a/src/poe/apis/seasons/PlayerHistory.ts b/src/poe/apis/seasons/PlayerHistory.ts new file mode 100644 index 0000000..d9a9e8a --- /dev/null +++ b/src/poe/apis/seasons/PlayerHistory.ts @@ -0,0 +1,10 @@ +import { Type } from "class-transformer"; + +import { PlayerResult } from "./PlayerResult"; + +export class PlayerHistory { + total!: number; + + @Type(/* istanbul ignore next */ () => PlayerResult) + entries!: PlayerResult[]; +} diff --git a/src/poe/apis/seasons/PlayerResult.ts b/src/poe/apis/seasons/PlayerResult.ts new file mode 100644 index 0000000..35bc4d2 --- /dev/null +++ b/src/poe/apis/seasons/PlayerResult.ts @@ -0,0 +1,19 @@ +import { Expose } from "class-transformer"; + +import { Trophy } from "./models"; + +export class PlayerResult { + leagueId!: string; + leagueName!: string; + points!: number; + pvp!: boolean; + rank!: number; + + /** + * @overrides `accountid` + */ + @Expose({ name: "accountid" }) + accountId!: string; + + trophies!: Trophy[]; +} diff --git a/src/poe/apis/seasons/Reward.ts b/src/poe/apis/seasons/Reward.ts new file mode 100644 index 0000000..dba2bbd --- /dev/null +++ b/src/poe/apis/seasons/Reward.ts @@ -0,0 +1,12 @@ +import { Type } from "class-transformer"; + +import { Item } from "../../shared/item"; + +export class Reward { + requiredPoints!: number; + itemOffsetY!: number | null; + itemOffsetX!: number | null; + + @Type(/* istanbul ignore next */ () => Item) + item!: Item; +} diff --git a/src/poe/apis/seasons/Season.ts b/src/poe/apis/seasons/Season.ts new file mode 100644 index 0000000..0fb317a --- /dev/null +++ b/src/poe/apis/seasons/Season.ts @@ -0,0 +1,22 @@ +import { Type } from "class-transformer"; + +import { Reward } from "./Reward"; + +export class Season { + id!: string; + htmlId!: string; + htmlContent!: string | null; + signatureRaces!: string | null; + numericId!: number; + pvp!: boolean; + configEditorId!: string | null; + + @Type(/* istanbul ignore next */ () => Date) + startAt!: Date; + + @Type(/* istanbul ignore next */ () => Date) + endAt!: Date; + + @Type(/* istanbul ignore next */ () => Reward) + rewards!: Reward[]; +} diff --git a/src/poe/apis/seasons/index.ts b/src/poe/apis/seasons/index.ts new file mode 100644 index 0000000..999103d --- /dev/null +++ b/src/poe/apis/seasons/index.ts @@ -0,0 +1,6 @@ +export * from "./API"; +export * from "./PlayerHistory"; +export * from "./PlayerResult"; +export * from "./Reward"; +export * from "./Season"; +export * from "./models"; diff --git a/src/poe/apis/seasons/models/Options.ts b/src/poe/apis/seasons/models/Options.ts new file mode 100644 index 0000000..1b37b60 --- /dev/null +++ b/src/poe/apis/seasons/models/Options.ts @@ -0,0 +1,17 @@ +import { RealmOptions } from "../../../shared/models"; + +export interface PlayerHistoryOptions extends RealmOptions { + /** + * Page offset + * + * Default: `1` + */ + page?: number; + + /** + * Results per page, but rather than the amount of entries, this value specifies the amount of trophies which should be fetched + * + * Default: `5` + */ + perPage?: number; +} diff --git a/src/poe/apis/seasons/models/Trophy.ts b/src/poe/apis/seasons/models/Trophy.ts new file mode 100644 index 0000000..58c5a1d --- /dev/null +++ b/src/poe/apis/seasons/models/Trophy.ts @@ -0,0 +1,4 @@ +export interface Trophy { + description: string; + points: number; +} diff --git a/src/poe/apis/seasons/models/index.ts b/src/poe/apis/seasons/models/index.ts new file mode 100644 index 0000000..d8b02c1 --- /dev/null +++ b/src/poe/apis/seasons/models/index.ts @@ -0,0 +1,2 @@ +export * from "./Options"; +export * from "./Trophy"; diff --git a/src/poe/apis/streams/API.spec.ts b/src/poe/apis/streams/API.spec.ts new file mode 100644 index 0000000..991f6bc --- /dev/null +++ b/src/poe/apis/streams/API.spec.ts @@ -0,0 +1,36 @@ +import "reflect-metadata"; +import "mocha"; + +import { expect } from "chai"; +import { plainToClass } from "class-transformer"; + +import CachedTwitchStreams from "../../resource/twitch_streams.json"; +import * as API from "./API"; +import { Response } from "./Response"; + +describe("Path of Exile - Streams", function () { + this.timeout(10000); + + /** + * API Methods + */ + it("#get() - should return list twitch streams", async () => { + await expect(API.get()).to.be.fulfilled; + }); + + /** + * Class Methods + */ + describe("Class - TwitchStream", () => { + let response: Response; + + before(() => { + response = plainToClass(Response, CachedTwitchStreams); + }); + + it("#url - should return profile url", () => { + expect(response.streams[0].url).to.equal("https://twitch.tv/zizaran"); + expect(response.streams[1].url).to.equal("https://twitch.tv/raizqt"); + }); + }); +}); diff --git a/src/poe/apis/streams/API.ts b/src/poe/apis/streams/API.ts new file mode 100644 index 0000000..38f85e4 --- /dev/null +++ b/src/poe/apis/streams/API.ts @@ -0,0 +1,14 @@ +import { requestTransformed } from "../../functions"; +import { Response } from "./Response"; +import { Stream } from "./Stream"; + +/** + * @endpoint https://api.pathofexile.com/streams + * @returns A list of all streams displayed on the official Path of Exile home page + * @throws [[APIError]] + */ +export const get = async (): Promise => { + const url = new URL(`https://api.pathofexile.com/streams`); + const response = await requestTransformed(Response, url); + return response.streams; +}; diff --git a/src/poe/apis/streams/Response.ts b/src/poe/apis/streams/Response.ts new file mode 100644 index 0000000..5c9ceaa --- /dev/null +++ b/src/poe/apis/streams/Response.ts @@ -0,0 +1,11 @@ +import { Type } from "class-transformer"; + +import { Stream } from "./Stream"; + +/** + * @hidden + */ +export class Response { + @Type(/* istanbul ignore next */ () => Stream) + streams!: Stream[]; +} diff --git a/src/poe/apis/streams/Stream.ts b/src/poe/apis/streams/Stream.ts new file mode 100644 index 0000000..ef6fda1 --- /dev/null +++ b/src/poe/apis/streams/Stream.ts @@ -0,0 +1,14 @@ +import { Expose } from "class-transformer"; + +export class Stream { + name!: string; + image?: string; + status?: string; + viewers?: number; + id?: string; + + @Expose({ name: "url" }) + get url(): string { + return `https://twitch.tv/${this.name.toLowerCase()}`; + } +} diff --git a/src/poe/apis/streams/index.ts b/src/poe/apis/streams/index.ts new file mode 100644 index 0000000..bc7779d --- /dev/null +++ b/src/poe/apis/streams/index.ts @@ -0,0 +1,3 @@ +export * from "./API"; +export * from "./Response"; +export * from "./Stream"; diff --git a/src/poe/apis/trade/API.spec.ts b/src/poe/apis/trade/API.spec.ts new file mode 100644 index 0000000..2e7365b --- /dev/null +++ b/src/poe/apis/trade/API.spec.ts @@ -0,0 +1,66 @@ +import "reflect-metadata"; +import "mocha"; + +import { expect } from "chai"; + +import * as API from "./API"; + +describe("Path of Exile - Trade", function () { + this.timeout(10000); + + let sessionId: string; + + before(() => { + sessionId = process.env["POESESSID"] as string; + }); + + /** + * API Methods + */ + it("#getLeagues() - should return list of trade leagues", async () => { + await expect(API.getLeagues()).to.be.fulfilled; + }); + + it("#getItems() - should return list of trade items", async () => { + await expect(API.getItems()).to.be.fulfilled; + }); + + it("#getStats() - should return list of trade stats", async () => { + await expect(API.getStats()).to.be.fulfilled; + }); + + it("#getStatic() - should return list of trade static items", async () => { + await expect(API.getStatic()).to.be.fulfilled; + }); + + it("#search() - should return search results", async () => { + const query = { + query: { status: { option: "online" }, stats: [{ type: "and", filters: [] }] }, + sort: { price: "asc" }, + }; + + await expect(API.search("Standard", query, sessionId)).to.be.fulfilled; + }); + + it("#exchange() - should return exchange results", async () => { + const query = { + exchange: { + status: { option: "any" }, + have: ["ancient-orb"], + want: ["mirror", "delirium-orb"], + }, + }; + + await expect(API.exchange("Standard", query, sessionId)).to.be.fulfilled; + }); + + it("#getFromHashes() - should return search results", async () => { + const hashes = ["77ca9a932eb8c2dd078fd301d37cb872b54a862ee6a1467fdfd243334ac0a889"]; + + await expect(API.getFromHashes(hashes)).to.be.fulfilled; + }); + + it("#getIgnoredAccounts() - should return list of ignored accounts", async () => { + await expect(API.getIgnoredAccounts(sessionId)).to.be.fulfilled; + }); +}); diff --git a/src/poe/apis/trade/API.ts b/src/poe/apis/trade/API.ts new file mode 100644 index 0000000..6265d64 --- /dev/null +++ b/src/poe/apis/trade/API.ts @@ -0,0 +1,133 @@ +import { buildURL } from "../../../common/functions"; +import { requestTransformed } from "../../functions"; +import * as Fetch from "./fetch"; +import * as Ignore from "./ignore"; +import * as Items from "./items"; +import * as Leagues from "./leagues"; +import * as Search from "./search"; +import * as Static from "./static"; +import * as Stats from "./stats"; + +/** + * @endpoint https://api.pathofexile.com/trade/data/leagues + * @throws [[APIError]] + */ +export const getLeagues = async (): Promise => { + const url = new URL(`https://api.pathofexile.com/trade/data/leagues`); + const response = await requestTransformed(Leagues.Response, url); + return response.result; +}; + +/** + * @endpoint https://api.pathofexile.com/trade/data/items + * @throws [[APIError]] + */ +export const getItems = async (): Promise => { + const url = new URL(`https://api.pathofexile.com/trade/data/items`); + const response = await requestTransformed(Items.Response, url); + return response.result; +}; + +/** + * @endpoint https://api.pathofexile.com/trade/data/stats + * @throws [[APIError]] + */ +export const getStats = async (): Promise => { + const url = new URL(`https://api.pathofexile.com/trade/data/stats`); + const response = await requestTransformed(Stats.Response, url); + return response.result; +}; + +/** + * @endpoint https://api.pathofexile.com/trade/data/static + * @throws [[APIError]] + */ +export const getStatic = async (): Promise => { + const url = new URL(`https://api.pathofexile.com/trade/data/static`); + const response = await requestTransformed(Static.Response, url); + return response.result; +}; + +/** + * @endpoint https://api.pathofexile.com/trade/ignore + * @param sessionId + * @param page Between `1` and `10`, will default to `1` if out of range + * @returns A list of up to 50 ignored accounts + * @throws [[APIError]] + */ +export const getIgnoredAccounts = async ( + sessionId: string, + page = 1 +): Promise => { + const url = buildURL(`https://api.pathofexile.com/trade/ignore`, null, null, { + page: page.toString(), + }); + return await requestTransformed(Ignore.Collection, url, sessionId); +}; + +/** + * @throws [[APIError]] + */ +const getSearchResult = async ( + league: string, + endpoint: string, + query: Search.QueryContainer, + sessionId?: string +): Promise => { + const url = new URL(`https://www.pathofexile.com/api/trade/${endpoint}/${league}`); + + const result = await requestTransformed(Search.Result, url, sessionId, "post", query); + result.sessionId = sessionId; + + return result; +}; + +/** + * Execute a search query + * + * @endpoint https://www.pathofexile.com/api/trade/search/league + * @param league + * @param query + * @param sessionId + * @throws [[APIError]] + */ +export const search = async ( + league: string, + query: Search.SearchQueryContainer, + sessionId?: string +): Promise => { + return await getSearchResult(league, "search", query, sessionId); +}; + +/** + * Execute an exchange query + * + * @endpoint https://www.pathofexile.com/api/trade/exchange/league + * @param league + * @param query + * @param sessionId + * @throws [[APIError]] + */ +export const exchange = async ( + league: string, + query: Search.ExchangeQueryContainer, + sessionId?: string +): Promise => { + return await getSearchResult(league, "exchange", query, sessionId); +}; + +/** + * @endpoint https://api.pathofexile.com/trade/fetch + * @param hashes + * @param sessionId + * @throws [[APIError]] + */ +export const getFromHashes = async ( + hashes: string[], + sessionId?: string +): Promise => { + const hashString = hashes.join(","); + const url = new URL(`https://api.pathofexile.com/trade/fetch/${hashString}`); + const response = await requestTransformed(Fetch.Response, url, sessionId); + return response.result; +}; diff --git a/src/poe/apis/trade/fetch/Listing.ts b/src/poe/apis/trade/fetch/Listing.ts new file mode 100644 index 0000000..4c147c5 --- /dev/null +++ b/src/poe/apis/trade/fetch/Listing.ts @@ -0,0 +1,16 @@ +import { Type } from "class-transformer"; + +import { Account } from "../../account"; +import { Price } from "./models/Price"; +import { Stash } from "./models/Stash"; + +export class Listing { + method!: string; + stash!: Stash; + whisper!: string; + account!: Account; + price!: Price; + + @Type(/* istanbul ignore next */ () => Date) + indexed!: Date; +} diff --git a/src/poe/apis/trade/fetch/Response.ts b/src/poe/apis/trade/fetch/Response.ts new file mode 100644 index 0000000..bfed0b1 --- /dev/null +++ b/src/poe/apis/trade/fetch/Response.ts @@ -0,0 +1,11 @@ +import { Type } from "class-transformer"; + +import { Result } from "./Result"; + +/** + * @hidden + */ +export class Response { + @Type(/* istanbul ignore next */ () => Result) + result!: Result[]; +} diff --git a/src/poe/apis/trade/fetch/Result.ts b/src/poe/apis/trade/fetch/Result.ts new file mode 100644 index 0000000..05d18ee --- /dev/null +++ b/src/poe/apis/trade/fetch/Result.ts @@ -0,0 +1,14 @@ +import { Type } from "class-transformer"; + +import { Item } from "../../../shared/item"; +import { Listing } from "./Listing"; + +export class Result { + id!: string; + + @Type(/* istanbul ignore next */ () => Item) + item!: Item; + + @Type(/* istanbul ignore next */ () => Listing) + listing!: Listing; +} diff --git a/src/poe/apis/trade/fetch/index.ts b/src/poe/apis/trade/fetch/index.ts new file mode 100644 index 0000000..c3def62 --- /dev/null +++ b/src/poe/apis/trade/fetch/index.ts @@ -0,0 +1,4 @@ +export * from "./Result"; +export * from "./Listing"; +export * from "./Response"; +export * from "./models"; diff --git a/src/poe/apis/trade/fetch/models/Account.ts b/src/poe/apis/trade/fetch/models/Account.ts new file mode 100644 index 0000000..d901fd5 --- /dev/null +++ b/src/poe/apis/trade/fetch/models/Account.ts @@ -0,0 +1,11 @@ +export interface Account { + name: string; + lastCharacterName: string; + online: Online | null; + language: string; +} + +export interface Online { + league: string; + status?: string; +} diff --git a/src/poe/apis/trade/fetch/models/Price.ts b/src/poe/apis/trade/fetch/models/Price.ts new file mode 100644 index 0000000..5d2f0b3 --- /dev/null +++ b/src/poe/apis/trade/fetch/models/Price.ts @@ -0,0 +1,19 @@ +export interface Price { + type?: string; + amount?: number; + currency?: string; + exchange?: Exchange; + item?: Item; +} + +export interface Exchange { + currency: string; + amount: number; +} + +export interface Item { + currency: string; + amount: number; + stock: number; + id: string; +} diff --git a/src/poe/apis/trade/fetch/models/Stash.ts b/src/poe/apis/trade/fetch/models/Stash.ts new file mode 100644 index 0000000..0800e8f --- /dev/null +++ b/src/poe/apis/trade/fetch/models/Stash.ts @@ -0,0 +1,5 @@ +export interface Stash { + name: string; + x: number; + y: number; +} diff --git a/src/poe/apis/trade/fetch/models/index.ts b/src/poe/apis/trade/fetch/models/index.ts new file mode 100644 index 0000000..4cdffa6 --- /dev/null +++ b/src/poe/apis/trade/fetch/models/index.ts @@ -0,0 +1,3 @@ +export * from "./Account"; +export * from "./Price"; +export * from "./Stash"; diff --git a/src/poe/apis/trade/ignore/Collection.ts b/src/poe/apis/trade/ignore/Collection.ts new file mode 100644 index 0000000..9654847 --- /dev/null +++ b/src/poe/apis/trade/ignore/Collection.ts @@ -0,0 +1,14 @@ +import { Expose } from "class-transformer"; + +import { Account } from "./models/Account"; +import { Pagination } from "./models/Pagination"; + +export class Collection { + pagination!: Pagination; + + /** + * @overrides `result` + */ + @Expose({ name: "result" }) + accounts!: Account[]; +} diff --git a/src/poe/apis/trade/ignore/index.ts b/src/poe/apis/trade/ignore/index.ts new file mode 100644 index 0000000..35818c2 --- /dev/null +++ b/src/poe/apis/trade/ignore/index.ts @@ -0,0 +1,2 @@ +export * from "./Collection"; +export * from "./models"; diff --git a/src/poe/apis/trade/ignore/models/Account.ts b/src/poe/apis/trade/ignore/models/Account.ts new file mode 100644 index 0000000..7e416c2 --- /dev/null +++ b/src/poe/apis/trade/ignore/models/Account.ts @@ -0,0 +1,3 @@ +export interface Account { + name: string; +} diff --git a/src/poe/apis/trade/ignore/models/Pagination.ts b/src/poe/apis/trade/ignore/models/Pagination.ts new file mode 100644 index 0000000..74e1842 --- /dev/null +++ b/src/poe/apis/trade/ignore/models/Pagination.ts @@ -0,0 +1,5 @@ +export interface Pagination { + page: number; + per_page: number; + total: number; +} diff --git a/src/poe/apis/trade/ignore/models/index.ts b/src/poe/apis/trade/ignore/models/index.ts new file mode 100644 index 0000000..1979303 --- /dev/null +++ b/src/poe/apis/trade/ignore/models/index.ts @@ -0,0 +1,2 @@ +export * from "./Account"; +export * from "./Pagination"; diff --git a/src/poe/apis/trade/index.ts b/src/poe/apis/trade/index.ts new file mode 100644 index 0000000..f2c97ed --- /dev/null +++ b/src/poe/apis/trade/index.ts @@ -0,0 +1,8 @@ +export * as Leagues from "./leagues"; +export * as Items from "./items"; +export * as Stats from "./stats"; +export * as Static from "./static"; +export * as Search from "./search"; +export * as Fetch from "./fetch"; +export * as Ignore from "./ignore"; +export * from "./API"; diff --git a/src/poe/apis/trade/items/Group.ts b/src/poe/apis/trade/items/Group.ts new file mode 100644 index 0000000..ca1ac3e --- /dev/null +++ b/src/poe/apis/trade/items/Group.ts @@ -0,0 +1,10 @@ +import { Type } from "class-transformer"; + +import { Item } from "./Item"; + +export class Group { + label!: string; + + @Type(/* istanbul ignore next */ () => Group) + entries!: Item[]; +} diff --git a/src/poe/apis/trade/items/Item.ts b/src/poe/apis/trade/items/Item.ts new file mode 100644 index 0000000..abcc55e --- /dev/null +++ b/src/poe/apis/trade/items/Item.ts @@ -0,0 +1,9 @@ +import { Flags } from "./models/Flags"; + +export interface Item { + name?: string; + type: string; + text: string; + flags?: Flags; + disc?: string; +} diff --git a/src/poe/apis/trade/items/Response.ts b/src/poe/apis/trade/items/Response.ts new file mode 100644 index 0000000..1d61bbd --- /dev/null +++ b/src/poe/apis/trade/items/Response.ts @@ -0,0 +1,11 @@ +import { Type } from "class-transformer"; + +import { Group } from "./Group"; + +/** + * @hidden + */ +export class Response { + @Type(/* istanbul ignore next */ () => Group) + result!: Group[]; +} diff --git a/src/poe/apis/trade/items/index.ts b/src/poe/apis/trade/items/index.ts new file mode 100644 index 0000000..47f3649 --- /dev/null +++ b/src/poe/apis/trade/items/index.ts @@ -0,0 +1,4 @@ +export * from "./Response"; +export * from "./Group"; +export * from "./Item"; +export * from "./models"; diff --git a/src/poe/apis/trade/items/models/Flags.ts b/src/poe/apis/trade/items/models/Flags.ts new file mode 100644 index 0000000..1cd487d --- /dev/null +++ b/src/poe/apis/trade/items/models/Flags.ts @@ -0,0 +1,4 @@ +export interface Flags { + unique?: boolean; + prophecy?: boolean; +} diff --git a/src/poe/apis/trade/items/models/index.ts b/src/poe/apis/trade/items/models/index.ts new file mode 100644 index 0000000..679e066 --- /dev/null +++ b/src/poe/apis/trade/items/models/index.ts @@ -0,0 +1 @@ +export * from "./Flags"; diff --git a/src/poe/apis/trade/leagues/League.ts b/src/poe/apis/trade/leagues/League.ts new file mode 100644 index 0000000..9138db7 --- /dev/null +++ b/src/poe/apis/trade/leagues/League.ts @@ -0,0 +1,4 @@ +export class League { + id!: string; + text!: string; +} diff --git a/src/poe/apis/trade/leagues/Response.ts b/src/poe/apis/trade/leagues/Response.ts new file mode 100644 index 0000000..70527d7 --- /dev/null +++ b/src/poe/apis/trade/leagues/Response.ts @@ -0,0 +1,11 @@ +import { Type } from "class-transformer"; + +import { League } from "./League"; + +/** + * @hidden + */ +export class Response { + @Type(/* istanbul ignore next */ () => League) + result!: League[]; +} diff --git a/src/poe/apis/trade/leagues/index.ts b/src/poe/apis/trade/leagues/index.ts new file mode 100644 index 0000000..215cdd4 --- /dev/null +++ b/src/poe/apis/trade/leagues/index.ts @@ -0,0 +1,2 @@ +export * from "./League"; +export * from "./Response"; diff --git a/src/poe/apis/trade/search/Result.ts b/src/poe/apis/trade/search/Result.ts new file mode 100644 index 0000000..7a603a8 --- /dev/null +++ b/src/poe/apis/trade/search/Result.ts @@ -0,0 +1,47 @@ +import { Exclude, Expose } from "class-transformer"; + +import { Fetch } from "../"; +import * as API from "../API"; + +export class Result { + @Exclude() + private offset = 0; + + @Exclude() + private _sessionId: string | undefined; + + id!: string; + complexity!: number | null; + total!: number; + inexact?: boolean; + + /** + * @overrides `result` + */ + @Expose({ name: "result" }) + hashes!: string[]; + + /** + * @remarks + * Uses the session ID supplied when getting the hashes. + * Items are fetched in sets of 10. + * + * @returns A list of item listings, `null` when there are no more listings to fetch + * @throws [[APIError]] + */ + public async getNextItems(): Promise { + if (this.offset >= this.hashes.length) { + return null; + } + + const hashes = this.hashes.slice(this.offset, this.offset + 10); + this.offset += 10; + + return await API.getFromHashes(hashes, this._sessionId); + } + + @Exclude() + public set sessionId(sessionId: string | undefined) { + this._sessionId = sessionId; + } +} diff --git a/src/poe/apis/trade/search/index.ts b/src/poe/apis/trade/search/index.ts new file mode 100644 index 0000000..08aaaf1 --- /dev/null +++ b/src/poe/apis/trade/search/index.ts @@ -0,0 +1,2 @@ +export * from "./Result"; +export * from "./models"; diff --git a/src/poe/apis/trade/search/models/Query.ts b/src/poe/apis/trade/search/models/Query.ts new file mode 100644 index 0000000..59f16bb --- /dev/null +++ b/src/poe/apis/trade/search/models/Query.ts @@ -0,0 +1,232 @@ +export type QueryContainer = SearchQueryContainer | ExchangeQueryContainer; + +export interface SearchQueryContainer { + query: SearchQuery; + sort?: Sort | StatSort; +} + +export interface SearchQuery { + status?: Option; + name?: string; + type?: string; + stats?: StatFilter[]; + filters?: QueryFilters; + term?: string; +} + +export interface ExchangeQueryContainer { + exchange: ExchangeQuery; +} + +export interface ExchangeQuery { + status: Option; + have: string[]; + want: string[]; + minimum?: number; + account?: string; + fulfillable?: null; +} + +export interface Range { + min?: number; + max?: number; +} + +export interface Price extends Range { + option: string; +} + +export interface Sort { + price?: string; + indexed?: string; +} + +export interface StatSort { + [stat: string]: string; +} + +export interface Option { + option: string; +} + +export interface BooleanOption { + option: boolean; +} + +export interface QueryFilters { + type_filters?: TypeFiltersContainer; + weapon_filters?: WeaponFiltersContainer; + armour_filters?: ArmourFiltersContainer; + socket_filters?: SocketFiltersContainer; + req_filters?: ReqFiltersContainer; + map_filters?: MapFiltersContainer; + heist_filters?: HeistFiltersContainer; + misc_filters?: MiscFiltersContainer; + trade_filters?: TradeFiltersContainer; +} + +export interface ArmourFiltersContainer { + disabled: boolean; + filters: ArmourFilters; +} + +export interface ArmourFilters { + ar?: Range; + es?: Range; + ev?: Range; + block?: Range; +} + +export interface HeistFiltersContainer { + disabled: boolean; + filters: HeistFilters; +} + +export interface HeistFilters { + heist_wings?: Range; + heist_escape_routes?: Range; + heist_reward_rooms?: Range; + heist_lockpicking?: Range; + heist_perception?: Range; + heist_counter_thaumaturgy?: Range; + heist_agility?: Range; + heist_engineering?: Range; + heist_deception?: Range; + heist_trap_disarmament?: Range; + heist_demolition?: Range; + heist_brute_force?: Range; + area_level?: Range; + heist_max_reward_rooms?: Range; + heist_max_escape_routes?: Range; + heist_max_wings?: Range; + heist_objective_value?: Option; +} + +export interface MapFiltersContainer { + disabled: boolean; + filters: MapFilters; +} + +export interface MapFilters { + map_tier?: Range; + map_iiq?: Range; + map_packsize?: Range; + map_iir?: Range; + map_shaped?: BooleanOption | Option; + map_blighted?: BooleanOption | Option; + map_elder?: BooleanOption | Option; + map_region?: BooleanOption | Option; + map_series?: Option; +} + +export interface MiscFiltersContainer { + disabled: boolean; + filters: MiscFilters; +} + +export interface MiscFilters { + quality?: Range; + gem_level?: Range; + gem_level_progress?: Range; + ilvl?: Range; + gem_alternate_quality?: Option; + shaper_item?: BooleanOption | Option; + crusader_item?: BooleanOption | Option; + hunter_item?: BooleanOption | Option; + elder_item?: BooleanOption | Option; + redeemer_item?: BooleanOption | Option; + warlord_item?: BooleanOption | Option; + synthesised_item?: BooleanOption | Option; + identified?: BooleanOption | Option; + mirrored?: BooleanOption | Option; + veiled?: BooleanOption | Option; + fractured_item?: BooleanOption | Option; + alternate_art?: BooleanOption | Option; + corrupted?: BooleanOption | Option; + crafted?: BooleanOption | Option; + enchanted?: BooleanOption | Option; + stored_experience?: Range; + stack_size?: Range; + talisman_tier?: Range; +} + +export interface ReqFiltersContainer { + disabled: boolean; + filters: ReqFilters; +} + +export interface ReqFilters { + lvl?: Range; + dex?: Range; + int?: Range; + str?: Range; +} + +export interface SocketFiltersContainer { + disabled: boolean; + filters: SocketFilters; +} + +export interface SocketFilters { + sockets?: Sockets; + links?: Sockets; +} + +export interface Sockets { + r?: number; + g?: number; + b?: number; + w?: number; + min?: number; + max?: number; +} + +export interface TradeFiltersContainer { + disabled: boolean; + filters: TradeFilters; +} + +export interface TradeFilters { + account?: { + input: string; + }; + indexed?: Option; + price?: Price; +} + +export interface TypeFiltersContainer { + disabled: boolean; + filters: TypeFilters; +} + +export interface TypeFilters { + category: Option; + rarity: Option; +} + +export interface WeaponFiltersContainer { + disabled: boolean; + filters: WeaponFilters; +} + +export interface WeaponFilters { + damage: Range; + aps: Range; + dps: Range; + edps: Range; + pdps: Range; + crit: Range; +} + +export interface StatFilter { + type: string; + filters: Stat[]; + value?: Range; + disabled?: boolean; +} + +export interface Stat { + id: string; + value: Range; + disabled: boolean; +} diff --git a/src/poe/apis/trade/search/models/index.ts b/src/poe/apis/trade/search/models/index.ts new file mode 100644 index 0000000..dc1a957 --- /dev/null +++ b/src/poe/apis/trade/search/models/index.ts @@ -0,0 +1 @@ +export * from "./Query"; diff --git a/src/poe/apis/trade/static/Group.ts b/src/poe/apis/trade/static/Group.ts new file mode 100644 index 0000000..1d14679 --- /dev/null +++ b/src/poe/apis/trade/static/Group.ts @@ -0,0 +1,7 @@ +import { Item } from "./models/Item"; + +export class Group { + id!: string; + label!: null | string; + entries!: Item[]; +} diff --git a/src/poe/apis/trade/static/Response.ts b/src/poe/apis/trade/static/Response.ts new file mode 100644 index 0000000..1d61bbd --- /dev/null +++ b/src/poe/apis/trade/static/Response.ts @@ -0,0 +1,11 @@ +import { Type } from "class-transformer"; + +import { Group } from "./Group"; + +/** + * @hidden + */ +export class Response { + @Type(/* istanbul ignore next */ () => Group) + result!: Group[]; +} diff --git a/src/poe/apis/trade/static/index.ts b/src/poe/apis/trade/static/index.ts new file mode 100644 index 0000000..8ef71f4 --- /dev/null +++ b/src/poe/apis/trade/static/index.ts @@ -0,0 +1,3 @@ +export * from "./Response"; +export * from "./Group"; +export * from "./models"; diff --git a/src/poe/apis/trade/static/models/Item.ts b/src/poe/apis/trade/static/models/Item.ts new file mode 100644 index 0000000..ccbf8f2 --- /dev/null +++ b/src/poe/apis/trade/static/models/Item.ts @@ -0,0 +1,5 @@ +export interface Item { + id: string; + text: string; + image?: string; +} diff --git a/src/poe/apis/trade/static/models/index.ts b/src/poe/apis/trade/static/models/index.ts new file mode 100644 index 0000000..aecb82d --- /dev/null +++ b/src/poe/apis/trade/static/models/index.ts @@ -0,0 +1 @@ +export * from "./Item"; diff --git a/src/poe/apis/trade/stats/Group.ts b/src/poe/apis/trade/stats/Group.ts new file mode 100644 index 0000000..4bbfe19 --- /dev/null +++ b/src/poe/apis/trade/stats/Group.ts @@ -0,0 +1,10 @@ +import { Type } from "class-transformer"; + +import { Stat } from "./Stat"; + +export class Group { + label!: string; + + @Type(/* istanbul ignore next */ () => Group) + entries!: Stat[]; +} diff --git a/src/poe/apis/trade/stats/Response.ts b/src/poe/apis/trade/stats/Response.ts new file mode 100644 index 0000000..1d61bbd --- /dev/null +++ b/src/poe/apis/trade/stats/Response.ts @@ -0,0 +1,11 @@ +import { Type } from "class-transformer"; + +import { Group } from "./Group"; + +/** + * @hidden + */ +export class Response { + @Type(/* istanbul ignore next */ () => Group) + result!: Group[]; +} diff --git a/src/poe/apis/trade/stats/Stat.ts b/src/poe/apis/trade/stats/Stat.ts new file mode 100644 index 0000000..b45b504 --- /dev/null +++ b/src/poe/apis/trade/stats/Stat.ts @@ -0,0 +1,11 @@ +import { Option } from "./models"; +import { Type } from "./models/Type"; + +export class Stat { + id!: string; + text!: string; + type!: Type; + option?: { + options: Option[]; + }; +} diff --git a/src/poe/apis/trade/stats/index.ts b/src/poe/apis/trade/stats/index.ts new file mode 100644 index 0000000..4b4052d --- /dev/null +++ b/src/poe/apis/trade/stats/index.ts @@ -0,0 +1,4 @@ +export * from "./Response"; +export * from "./Group"; +export * from "./Stat"; +export * from "./models"; diff --git a/src/poe/apis/trade/stats/models/Option.ts b/src/poe/apis/trade/stats/models/Option.ts new file mode 100644 index 0000000..116d0d3 --- /dev/null +++ b/src/poe/apis/trade/stats/models/Option.ts @@ -0,0 +1,4 @@ +export interface Option { + id: number | string; + text: string; +} diff --git a/src/poe/apis/trade/stats/models/Type.ts b/src/poe/apis/trade/stats/models/Type.ts new file mode 100644 index 0000000..b058a6d --- /dev/null +++ b/src/poe/apis/trade/stats/models/Type.ts @@ -0,0 +1,10 @@ +export type Type = + | "crafted" + | "delve" + | "enchant" + | "explicit" + | "fractured" + | "implicit" + | "monster" + | "pseudo" + | "veiled"; diff --git a/src/poe/apis/trade/stats/models/index.ts b/src/poe/apis/trade/stats/models/index.ts new file mode 100644 index 0000000..33c0eaf --- /dev/null +++ b/src/poe/apis/trade/stats/models/index.ts @@ -0,0 +1,2 @@ +export * from "./Option"; +export * from "./Type"; diff --git a/src/poe/errors/APIError.ts b/src/poe/errors/APIError.ts new file mode 100644 index 0000000..d05226b --- /dev/null +++ b/src/poe/errors/APIError.ts @@ -0,0 +1,12 @@ +import { ExternalAPIError } from "./models/ExternalAPIError"; + +export class APIError extends Error { + public code = 0; + + constructor(error: ExternalAPIError) { + super(error.error.message); + Object.setPrototypeOf(this, APIError.prototype); + + this.code = error.error.code; + } +} diff --git a/src/poe/errors/index.ts b/src/poe/errors/index.ts new file mode 100644 index 0000000..481ae88 --- /dev/null +++ b/src/poe/errors/index.ts @@ -0,0 +1,2 @@ +export * from "./APIError"; +export * from "./models"; diff --git a/src/poe/errors/models/ExternalAPIError.ts b/src/poe/errors/models/ExternalAPIError.ts new file mode 100644 index 0000000..4fe8ea3 --- /dev/null +++ b/src/poe/errors/models/ExternalAPIError.ts @@ -0,0 +1,9 @@ +/** + * @hidden + */ +export interface ExternalAPIError { + error: { + code: number; + message: string; + }; +} diff --git a/src/poe/errors/models/index.ts b/src/poe/errors/models/index.ts new file mode 100644 index 0000000..2bd76ad --- /dev/null +++ b/src/poe/errors/models/index.ts @@ -0,0 +1 @@ +export * from "./ExternalAPIError"; diff --git a/src/poe/functions/buildHeaders.ts b/src/poe/functions/buildHeaders.ts new file mode 100644 index 0000000..07324f9 --- /dev/null +++ b/src/poe/functions/buildHeaders.ts @@ -0,0 +1,13 @@ +export const buildHeaders = (sessionId?: string, userAgent?: string): Record => { + const headers: Record = {}; + + if (sessionId != null) { + headers.Cookie = `POESESSID=${sessionId}`; + } + + if (userAgent != null) { + headers["User-Agent"] = userAgent; + } + + return headers; +}; diff --git a/src/poe/functions/index.ts b/src/poe/functions/index.ts new file mode 100644 index 0000000..638bf07 --- /dev/null +++ b/src/poe/functions/index.ts @@ -0,0 +1,2 @@ +export * from "./buildHeaders"; +export * from "./requestTransformed"; diff --git a/src/poe/functions/requestTransformed.ts b/src/poe/functions/requestTransformed.ts new file mode 100644 index 0000000..45aa651 --- /dev/null +++ b/src/poe/functions/requestTransformed.ts @@ -0,0 +1,54 @@ +import axios, { Method } from "axios"; +import { plainToClass } from "class-transformer"; + +import { request } from "../../common/functions"; +import { APIError } from "../errors/APIError"; +import { ExternalAPIError } from "../errors/models"; +import { Settings } from "../Settings"; +import { buildHeaders } from "./buildHeaders"; + +export const requestWithError = async ( + url: URL, + headers: Record = {}, + method: Method = "get", + payload: unknown = {} +): Promise => { + try { + return await request(url, headers, method, payload); + } catch (error: unknown) { + if (axios.isAxiosError(error) && error.response) { + const data = JSON.parse(error.response.data); + throw new APIError(data); + } + + throw error; + } +}; + +export const requestTransformed = async ( + cls: new () => T, + url: URL, + sessionId?: string, + method: Method = "get", + payload: unknown = {} +): Promise => { + const headers = buildHeaders(sessionId, Settings.userAgent); + const response = await requestWithError(url, headers, method, payload); + const obj = JSON.parse(response); + + return plainToClass(cls, obj); +}; + +export const requestTransformedArray = async ( + cls: new () => T, + url: URL, + sessionId?: string, + method: Method = "get", + payload: unknown = {} +): Promise => { + const headers = buildHeaders(sessionId, Settings.userAgent); + const response = await requestWithError(url, headers, method, payload); + const obj = JSON.parse(response); + + return plainToClass(cls, obj); +}; diff --git a/src/poe/index.ts b/src/poe/index.ts new file mode 100644 index 0000000..b61d720 --- /dev/null +++ b/src/poe/index.ts @@ -0,0 +1,4 @@ +export { Settings } from "./Settings"; +export * from "./errors"; +export * from "./apis"; +export * as Shared from "./shared"; diff --git a/src/poe/resource/characters.json b/src/poe/resource/characters.json new file mode 100644 index 0000000..82d96d5 --- /dev/null +++ b/src/poe/resource/characters.json @@ -0,0 +1,219 @@ +[ + { + "name": "Caithelin", + "league": "Standard", + "classId": 0, + "ascendancyClass": 0, + "class": "Scion", + "level": 85, + "experience": 1291529569 + }, + { + "name": "klaaayveR", + "league": "Standard", + "classId": 3, + "ascendancyClass": 0, + "class": "Witch", + "level": 87, + "experience": 1521429088 + }, + { + "name": "klayball", + "league": "Standard", + "classId": 5, + "ascendancyClass": 2, + "class": "Hierophant", + "level": 94, + "experience": 2691648571 + }, + { + "name": "KlayBolt", + "league": "Ritual", + "classId": 2, + "ascendancyClass": 2, + "class": "Deadeye", + "level": 95, + "experience": 3032143131 + }, + { + "name": "klayCA", + "league": "Standard", + "classId": 6, + "ascendancyClass": 1, + "class": "Assassin", + "level": 95, + "experience": 3010377699 + }, + { + "name": "klayFurry", + "league": "Standard", + "classId": 6, + "ascendancyClass": 1, + "class": "Assassin", + "level": 84, + "experience": 1228104724 + }, + { + "name": "klayGC", + "league": "Standard", + "classId": 6, + "ascendancyClass": 1, + "class": "Assassin", + "level": 91, + "experience": 2096895178 + }, + { + "name": "klayKB", + "league": "Standard", + "classId": 2, + "ascendancyClass": 2, + "class": "Deadeye", + "level": 89, + "experience": 1795054031 + }, + { + "name": "klayRage", + "league": "Standard", + "classId": 3, + "ascendancyClass": 3, + "class": "Necromancer", + "level": 91, + "experience": 2094914923 + }, + { + "name": "klayShaper", + "league": "Standard", + "classId": 6, + "ascendancyClass": 1, + "class": "Assassin", + "level": 91, + "experience": 2097514810 + }, + { + "name": "klayveR", + "league": "Standard", + "classId": 5, + "ascendancyClass": 0, + "class": "Templar", + "level": 79, + "experience": 786612664 + }, + { + "name": "klayveRAZZ", + "league": "Standard", + "classId": 4, + "ascendancyClass": 1, + "class": "Slayer", + "level": 94, + "experience": 2662647739 + }, + { + "name": "klayveREX", + "league": "Standard", + "classId": 3, + "ascendancyClass": 3, + "class": "Necromancer", + "level": 93, + "experience": 2456605363 + }, + { + "name": "klayveRIP", + "league": "Standard", + "classId": 4, + "ascendancyClass": 1, + "class": "Slayer", + "level": 82, + "experience": 1091513181 + }, + { + "name": "klayveRIZE", + "league": "Standard", + "classId": 2, + "ascendancyClass": 1, + "class": "Raider", + "level": 90, + "experience": 1976003717 + }, + { + "name": "Klayverooo", + "league": "Standard", + "classId": 6, + "ascendancyClass": 3, + "class": "Saboteur", + "level": 94, + "experience": 2658074992 + }, + { + "name": "klayverSWIFT", + "league": "Standard", + "classId": 5, + "ascendancyClass": 1, + "class": "Inquisitor", + "level": 77, + "experience": 708778276 + }, + { + "name": "Klayxon", + "league": "Standard", + "classId": 3, + "ascendancyClass": 0, + "class": "Witch", + "level": 83, + "experience": 1108577730 + }, + { + "name": "klayZAPZAP", + "league": "Standard", + "classId": 6, + "ascendancyClass": 1, + "class": "Assassin", + "level": 94, + "experience": 2658074992 + }, + { + "name": "Klayzzard", + "league": "Standard", + "classId": 2, + "ascendancyClass": 0, + "class": "Ranger", + "level": 79, + "experience": 814250126 + }, + { + "name": "LootGoblinKlay", + "league": "Ritual", + "classId": 4, + "ascendancyClass": 1, + "class": "Slayer", + "level": 94, + "experience": 2663280992, + "lastActive": true + }, + { + "name": "PureKlay", + "league": "Standard", + "classId": 5, + "ascendancyClass": 1, + "class": "Inquisitor", + "level": 90, + "experience": 2005024460 + }, + { + "name": "Siverenthe", + "league": "Standard", + "classId": 5, + "ascendancyClass": 0, + "class": "Templar", + "level": 88, + "experience": 1647029655 + }, + { + "name": "XenonKlay", + "league": "Standard", + "classId": 3, + "ascendancyClass": 1, + "class": "Occultist", + "level": 100, + "experience": 4250334444 + } +] diff --git a/src/poe/resource/guild_stash_history.json b/src/poe/resource/guild_stash_history.json new file mode 100644 index 0000000..0f33fdd --- /dev/null +++ b/src/poe/resource/guild_stash_history.json @@ -0,0 +1,418 @@ +{ + "entries": [ + { + "id": "810998529", + "time": 1612727738, + "league": "Ritual", + "item": "Sol Salvation Battle Lamellar", + "action": "removed", + "account": { + "name": "MichiShoX", + "realm": "pc", + "guild": { "id": "374", "name": "Devastation", "tag": "DVSTN" }, + "challenges": { "total": 11 } + } + }, + { + "id": "810998507", + "time": 1612727737, + "league": "Ritual", + "item": "Fate Volley Thicket Bow", + "action": "added", + "account": { + "name": "MichiShoX", + "realm": "pc", + "guild": { "id": "374", "name": "Devastation", "tag": "DVSTN" }, + "challenges": { "total": 11 } + } + }, + { + "id": "810998485", + "time": 1612727736, + "league": "Ritual", + "item": "Fate Volley Thicket Bow", + "action": "removed", + "account": { + "name": "MichiShoX", + "realm": "pc", + "guild": { "id": "374", "name": "Devastation", "tag": "DVSTN" }, + "challenges": { "total": 11 } + } + }, + { + "id": "810998437", + "time": 1612727734, + "league": "Ritual", + "item": "Doomfletch Royal Bow", + "action": "removed", + "account": { + "name": "MichiShoX", + "realm": "pc", + "guild": { "id": "374", "name": "Devastation", "tag": "DVSTN" }, + "challenges": { "total": 11 } + } + }, + { + "id": "804398227", + "time": 1612298798, + "league": "Ritual", + "item": "Belly of the Beast Full Wyrmscale", + "action": "removed", + "account": { + "name": "FiiirsT", + "realm": "pc", + "guild": { "id": "374", "name": "Devastation", "tag": "DVSTN" }, + "challenges": { "total": 7 }, + "twitch": { "name": "yoshirl" } + } + }, + { + "id": "804371106", + "time": 1612297576, + "league": "Ritual", + "item": "Belly of the Beast Full Wyrmscale", + "action": "added", + "account": { + "name": "MichiShoX", + "realm": "pc", + "guild": { "id": "374", "name": "Devastation", "tag": "DVSTN" }, + "challenges": { "total": 11 } + } + }, + { + "id": "804348729", + "time": 1612296502, + "league": "Ritual", + "item": "Spirit Touch Murder Mitts", + "action": "removed", + "account": { + "name": "FiiirsT", + "realm": "pc", + "guild": { "id": "374", "name": "Devastation", "tag": "DVSTN" }, + "challenges": { "total": 7 }, + "twitch": { "name": "yoshirl" } + } + }, + { + "id": "804346434", + "time": 1612296396, + "league": "Ritual", + "item": "Spirit Touch Murder Mitts", + "action": "added", + "account": { + "name": "MichiShoX", + "realm": "pc", + "guild": { "id": "374", "name": "Devastation", "tag": "DVSTN" }, + "challenges": { "total": 11 } + } + }, + { + "id": "802925331", + "time": 1612208183, + "league": "Ritual", + "item": "Sol Salvation Battle Lamellar", + "action": "added", + "account": { + "name": "MichiShoX", + "realm": "pc", + "guild": { "id": "374", "name": "Devastation", "tag": "DVSTN" }, + "challenges": { "total": 11 } + } + }, + { + "id": "800927749", + "time": 1612100909, + "league": "Ritual", + "item": "Cataclysm Circle Iron Ring", + "action": "removed", + "account": { + "name": "FiiirsT", + "realm": "pc", + "guild": { "id": "374", "name": "Devastation", "tag": "DVSTN" }, + "challenges": { "total": 7 }, + "twitch": { "name": "yoshirl" } + } + }, + { + "id": "792075619", + "time": 1611616636, + "league": "Ritual", + "item": "Precinct Map (T8)", + "action": "removed", + "account": { + "name": "tomyee", + "realm": "pc", + "guild": { "id": "374", "name": "Devastation", "tag": "DVSTN" }, + "challenges": { "total": 8 }, + "twitch": { "name": "tomyee" } + } + }, + { + "id": "792075584", + "time": 1611616635, + "league": "Ritual", + "item": "Precinct Map (T8)", + "action": "added", + "account": { + "name": "klayveR", + "realm": "pc", + "guild": { "id": "374", "name": "Devastation", "tag": "DVSTN" }, + "challenges": { "total": 24 }, + "twitch": { "name": "klayverize" } + } + }, + { + "id": "792053125", + "time": 1611615640, + "league": "Ritual", + "item": "Gift to the Goddess", + "action": "removed", + "account": { + "name": "tomyee", + "realm": "pc", + "guild": { "id": "374", "name": "Devastation", "tag": "DVSTN" }, + "challenges": { "total": 8 }, + "twitch": { "name": "tomyee" } + } + }, + { + "id": "792052935", + "time": 1611615632, + "league": "Ritual", + "item": "Gift to the Goddess", + "action": "added", + "account": { + "name": "klayveR", + "realm": "pc", + "guild": { "id": "374", "name": "Devastation", "tag": "DVSTN" }, + "challenges": { "total": 24 }, + "twitch": { "name": "klayverize" } + } + }, + { + "id": "792047459", + "time": 1611615426, + "league": "Ritual", + "item": "Tribute to the Goddess", + "action": "removed", + "account": { + "name": "tomyee", + "realm": "pc", + "guild": { "id": "374", "name": "Devastation", "tag": "DVSTN" }, + "challenges": { "total": 8 }, + "twitch": { "name": "tomyee" } + } + }, + { + "id": "792047419", + "time": 1611615424, + "league": "Ritual", + "item": "Tribute to the Goddess", + "action": "added", + "account": { + "name": "klayveR", + "realm": "pc", + "guild": { "id": "374", "name": "Devastation", "tag": "DVSTN" }, + "challenges": { "total": 24 }, + "twitch": { "name": "klayverize" } + } + }, + { + "id": "791965279", + "time": 1611612037, + "league": "Ritual", + "item": "Chaos Orb", + "action": "removed", + "account": { + "name": "klayveR", + "realm": "pc", + "guild": { "id": "374", "name": "Devastation", "tag": "DVSTN" }, + "challenges": { "total": 24 }, + "twitch": { "name": "klayverize" } + } + }, + { + "id": "791965239", + "time": 1611612035, + "league": "Ritual", + "item": "Divine Orb", + "action": "removed", + "account": { + "name": "tomyee", + "realm": "pc", + "guild": { "id": "374", "name": "Devastation", "tag": "DVSTN" }, + "challenges": { "total": 8 }, + "twitch": { "name": "tomyee" } + } + }, + { + "id": "791965222", + "time": 1611612035, + "league": "Ritual", + "item": "Chaos Orb", + "action": "added", + "account": { + "name": "tomyee", + "realm": "pc", + "guild": { "id": "374", "name": "Devastation", "tag": "DVSTN" }, + "challenges": { "total": 8 }, + "twitch": { "name": "tomyee" } + } + }, + { + "id": "791965189", + "time": 1611612033, + "league": "Ritual", + "item": "Divine Orb", + "action": "added", + "account": { + "name": "klayveR", + "realm": "pc", + "guild": { "id": "374", "name": "Devastation", "tag": "DVSTN" }, + "challenges": { "total": 24 }, + "twitch": { "name": "klayverize" } + } + }, + { + "id": "791962955", + "time": 1611611933, + "league": "Ritual", + "item": "Carcass Jack Varnished Coat", + "action": "removed", + "account": { + "name": "tomyee", + "realm": "pc", + "guild": { "id": "374", "name": "Devastation", "tag": "DVSTN" }, + "challenges": { "total": 8 }, + "twitch": { "name": "tomyee" } + } + }, + { + "id": "791962052", + "time": 1611611893, + "league": "Ritual", + "item": "Carcass Jack Varnished Coat", + "action": "added", + "account": { + "name": "klayveR", + "realm": "pc", + "guild": { "id": "374", "name": "Devastation", "tag": "DVSTN" }, + "challenges": { "total": 24 }, + "twitch": { "name": "klayverize" } + } + }, + { + "id": "791961532", + "time": 1611611871, + "league": "Ritual", + "item": "Carcass Jack Varnished Coat", + "action": "removed", + "account": { + "name": "klayveR", + "realm": "pc", + "guild": { "id": "374", "name": "Devastation", "tag": "DVSTN" }, + "challenges": { "total": 24 }, + "twitch": { "name": "klayverize" } + } + }, + { + "id": "791961037", + "time": 1611611852, + "league": "Ritual", + "item": "Carcass Jack Varnished Coat", + "action": "added", + "account": { + "name": "tomyee", + "realm": "pc", + "guild": { "id": "374", "name": "Devastation", "tag": "DVSTN" }, + "challenges": { "total": 8 }, + "twitch": { "name": "tomyee" } + } + }, + { + "id": "791914817", + "time": 1611610008, + "league": "Ritual", + "item": "Damnation Loop Diamond Ring", + "action": "removed", + "account": { + "name": "tomyee", + "realm": "pc", + "guild": { "id": "374", "name": "Devastation", "tag": "DVSTN" }, + "challenges": { "total": 8 }, + "twitch": { "name": "tomyee" } + } + }, + { + "id": "791914783", + "time": 1611610007, + "league": "Ritual", + "item": "Damnation Loop Diamond Ring", + "action": "added", + "account": { + "name": "klayveR", + "realm": "pc", + "guild": { "id": "374", "name": "Devastation", "tag": "DVSTN" }, + "challenges": { "total": 24 }, + "twitch": { "name": "klayverize" } + } + }, + { + "id": "791913625", + "time": 1611609959, + "league": "Ritual", + "item": "Damnation Loop Diamond Ring", + "action": "removed", + "account": { + "name": "klayveR", + "realm": "pc", + "guild": { "id": "374", "name": "Devastation", "tag": "DVSTN" }, + "challenges": { "total": 24 }, + "twitch": { "name": "klayverize" } + } + }, + { + "id": "791901427", + "time": 1611609511, + "league": "Ritual", + "item": "Damnation Loop Diamond Ring", + "action": "added", + "account": { + "name": "tomyee", + "realm": "pc", + "guild": { "id": "374", "name": "Devastation", "tag": "DVSTN" }, + "challenges": { "total": 8 }, + "twitch": { "name": "tomyee" } + } + }, + { + "id": "791878539", + "time": 1611608626, + "league": "Ritual", + "item": "Exalted Orb", + "action": "removed", + "account": { + "name": "klayveR", + "realm": "pc", + "guild": { "id": "374", "name": "Devastation", "tag": "DVSTN" }, + "challenges": { "total": 24 }, + "twitch": { "name": "klayverize" } + } + }, + { + "id": "791876949", + "time": 1611608559, + "league": "Ritual", + "item": "Exalted Orb", + "action": "added", + "account": { + "name": "tomyee", + "realm": "pc", + "guild": { "id": "374", "name": "Devastation", "tag": "DVSTN" }, + "challenges": { "total": 8 }, + "twitch": { "name": "tomyee" } + } + } + ], + "truncated": false +} diff --git a/src/poe/resource/ladder.json b/src/poe/resource/ladder.json new file mode 100644 index 0000000..89de7e2 --- /dev/null +++ b/src/poe/resource/ladder.json @@ -0,0 +1,326 @@ +{ + "total": 15000, + "cached_since": "2021-03-18T17:16:03+00:00", + "entries": [ + { + "rank": 1, + "dead": false, + "online": false, + "character": { + "id": "cc248e0d23c849d71b40379d82dfc19b200bdb7b8ac63322f06de6483aaca5ea", + "name": "PenDora", + "level": 100, + "class": "Scion", + "score": 63328, + "experience": 4250334444 + }, + "account": { "name": "Jin_melike", "realm": "pc", "challenges": { "total": 0 } } + }, + { + "rank": 2, + "dead": false, + "online": true, + "public": true, + "character": { + "id": "b23f488245ffebc87616c9acf76fbbb3d534e0490a8b30a9be48f8fcc3941be0", + "name": "TaylorSwiftVEVO", + "level": 100, + "class": "Scion", + "score": 65425, + "experience": 4250334444 + }, + "account": { + "name": "PeakingDuck", + "realm": "pc", + "challenges": { "total": 35 }, + "twitch": { "name": "peakingduck" } + } + }, + { + "rank": 3, + "dead": false, + "online": false, + "character": { + "id": "41240e2f9f7a56ebb409d6060619a14ffba154c61a84ef769bc9758361351ae8", + "name": "Dear_Santa_UA", + "level": 100, + "class": "Occultist", + "experience": 4250334444 + }, + "account": { "name": "Valerchik", "realm": "pc", "challenges": { "total": 0 } } + }, + { + "rank": 4, + "dead": false, + "online": false, + "public": true, + "character": { + "id": "7580516c6997a4401ea0363a0cca9e83ae50e475fe437fedc51848f322c98b6a", + "name": "VaalMulliSpark", + "level": 100, + "class": "Scion", + "score": 65425, + "experience": 4250334444 + }, + "account": { + "name": "spinzter", + "realm": "pc", + "challenges": { "total": 36 }, + "twitch": { "name": "gourangaa" } + } + }, + { + "rank": 5, + "dead": false, + "online": false, + "public": true, + "character": { + "id": "f73e30b470c74d3a4ebd3e3ee4e4410ac9164f95f7c1876d32e2c74a5f861a6c", + "name": "Sliqs", + "level": 100, + "class": "Ranger", + "score": 65425, + "experience": 4250334444 + }, + "account": { + "name": "Redhill", + "realm": "pc", + "challenges": { "total": 12 }, + "twitch": { "name": "sliqs_" } + } + }, + { + "rank": 6, + "dead": false, + "online": false, + "character": { + "id": "b96614016b65e349212a77a9996edc34faa3c164529141064a2cef24ca132277", + "name": "xVisco", + "level": 100, + "class": "Templar", + "score": 65425, + "experience": 4250334444 + }, + "account": { "name": "xVisco", "realm": "pc", "challenges": { "total": 0 } } + }, + { + "rank": 7, + "dead": false, + "online": false, + "character": { + "id": "3fd75b1d62ed688b6fe6facf824a2bc95cf3546eeeb961ab45e3d32f8cb2bba8", + "name": "xdukanx", + "level": 100, + "class": "Chieftain", + "experience": 4250334444 + }, + "account": { "name": "danieldukan", "realm": "pc", "challenges": { "total": 0 } } + }, + { + "rank": 8, + "dead": false, + "online": false, + "character": { + "id": "c894d59151e36fdf72651efc5ea306dda3b64dbe4d686b05c73dfce8eeb7f9ba", + "name": "Gigaways", + "level": 100, + "class": "Ranger", + "score": 63328, + "experience": 4250334444 + }, + "account": { "name": "gigawayss", "realm": "pc", "challenges": { "total": 0 } } + }, + { + "rank": 9, + "dead": false, + "online": false, + "public": true, + "character": { + "id": "c93359f2d95bbdbf14ad0adf3f54868fb08a98bba6a40dd0c7bf7c17216cecdb", + "name": "SasusiaTesusia", + "level": 100, + "class": "Pathfinder", + "experience": 4250334444 + }, + "account": { + "name": "zeldzioszka", + "realm": "pc", + "challenges": { "total": 37 }, + "twitch": { "name": "lanc1980" } + } + }, + { + "rank": 10, + "dead": false, + "online": true, + "public": true, + "character": { + "id": "40cc6c38083852a86f5f9f7cc6c3a52aacb792221e09ea70a6994a55f8e3b342", + "name": "Dollarmaker", + "level": 100, + "class": "Raider", + "experience": 4250334444 + }, + "account": { + "name": "Juhazzz", + "realm": "pc", + "challenges": { "total": 36 }, + "twitch": { "name": "jonjonnz" } + } + }, + { + "rank": 11, + "dead": false, + "online": false, + "character": { + "id": "0c617da80d97e447c81d828bb326fa421dfce722954431c4fcd0d222bbbb5cc9", + "name": "Ghiaurul", + "level": 100, + "class": "Inquisitor", + "score": 63327, + "experience": 4250334444 + }, + "account": { "name": "Runner84", "realm": "pc", "challenges": { "total": 0 } } + }, + { + "rank": 12, + "dead": false, + "online": false, + "character": { + "id": "2ea3fb2faa289f2d3ce6a9d28f6f1870cc00664ac2a8b3a6ce686a1f2028b2f3", + "name": "ShavronnesBastard", + "level": 100, + "class": "Witch", + "score": 65425, + "experience": 4250334444 + }, + "account": { "name": "Nurgus", "realm": "pc", "challenges": { "total": 0 } } + }, + { + "rank": 13, + "dead": false, + "online": false, + "public": true, + "character": { + "id": "646568362606e049e328d7155fa602525448d82e67ad400a58fc2d3764566db2", + "name": "Flammenausbreitung", + "level": 100, + "class": "Assassin", + "score": 63335, + "experience": 4250334444 + }, + "account": { + "name": "bluegray", + "realm": "pc", + "challenges": { "total": 14 }, + "twitch": { "name": "macjamesb" } + } + }, + { + "rank": 14, + "dead": false, + "online": false, + "public": true, + "character": { + "id": "e4aeeb67a18364b79e91540c6cd51f378ccda3efbf99e700b29a0bc21474bdde", + "name": "MiningForAWin", + "level": 100, + "class": "Necromancer", + "score": 63327, + "experience": 4250334444 + }, + "account": { + "name": "Mohun", + "realm": "pc", + "challenges": { "total": 21 }, + "twitch": { "name": "wolfsgaming" } + } + }, + { + "rank": 15, + "dead": false, + "online": false, + "public": true, + "character": { + "id": "5f24b37af8e2daf00afb6f6fd275b92e958b42e2d5c43585751b51fc5085737e", + "name": "___Feanor___", + "level": 100, + "class": "Trickster", + "score": 63335, + "experience": 4250334444 + }, + "account": { "name": "MagicalPowers", "realm": "pc", "challenges": { "total": 0 } } + }, + { + "rank": 16, + "dead": false, + "online": false, + "character": { + "id": "0791844bae0e89de2bf4af7068d36d5e67c9ae8b1a0d199666ace678aef9652e", + "name": "BLASTINE", + "level": 100, + "class": "Witch", + "score": 65425, + "experience": 4250334444 + }, + "account": { "name": "fireballz", "realm": "pc", "challenges": { "total": 0 } } + }, + { + "rank": 17, + "dead": false, + "online": false, + "character": { + "id": "dc0ee8fe807ec26fcf166803e8af6d524c13b19ce8106f4a5cd3ce48344cb10c", + "name": "MrsBBQ", + "level": 100, + "class": "Scion", + "score": 65425, + "experience": 4250334444 + }, + "account": { "name": "ywsandcj", "realm": "pc", "challenges": { "total": 0 } } + }, + { + "rank": 18, + "dead": false, + "online": false, + "character": { + "id": "8d7a83626224d7039adbd23fe9247e5d170760139e9d58d848a10b2a6d5c8bca", + "name": "StickyTick", + "level": 100, + "class": "Scion", + "score": 65425, + "experience": 4250334444 + }, + "account": { "name": "Japichin", "realm": "pc", "challenges": { "total": 0 } } + }, + { + "rank": 19, + "dead": false, + "online": false, + "public": true, + "character": { + "id": "c25f23a7aeb3a5c752cb71bf545cbc3971925cd8df32637c0fdcf58f6d7f86d9", + "name": "Aelurora", + "level": 100, + "class": "Scion", + "score": 65425, + "experience": 4250334444 + }, + "account": { "name": "thanatanthrope", "realm": "pc", "challenges": { "total": 0 } } + }, + { + "rank": 20, + "dead": false, + "online": false, + "character": { + "id": "11eb46dc8ae775764e86509c76ddb419c53dcd602019d5080a9264915eb1a90e", + "name": "Circe_Roc", + "level": 100, + "class": "Witch", + "score": 65425, + "experience": 4250334444 + }, + "account": { "name": "r5g6h3s7", "realm": "pc", "challenges": { "total": 0 } } + } + ] +} diff --git a/src/poe/resource/twitch_streams.json b/src/poe/resource/twitch_streams.json new file mode 100644 index 0000000..fc2e659 --- /dev/null +++ b/src/poe/resource/twitch_streams.json @@ -0,0 +1,27 @@ +{ + "streams": [ + { + "name": "Zizaran", + "image": "https://static-cdn.jtvnw.net/previews-ttv/live_user_zizaran-320x180.jpg", + "status": "Ziz - Bow gamer redefining Gauntlet! !Youtube !Ama | Merch shop.zizaran.com", + "viewers": 2548, + "id": "36483360" + }, + { + "name": "RaizQT", + "image": "https://static-cdn.jtvnw.net/previews-ttv/live_user_raizqt-320x180.jpg", + "status": "\ud83d\udd34 !gauntlet Rerolling cold dot cause i cant get SRS jewels !nord", + "viewers": 1930, + "id": "36259794", + "url": "https://twitch.tv/raizqt" + }, + { + "name": "Karvarousku", + "image": "https://static-cdn.jtvnw.net/previews-ttv/live_user_karvarousku-320x180.jpg", + "status": "!Gauntlet CI ED, either Sirus or I die today - !nexus !BFBB !build", + "viewers": 184, + "id": "38654003", + "url": "https://twitch.tv/karvarousku" + } + ] +} diff --git a/src/poe/shared/constants/Experience.ts b/src/poe/shared/constants/Experience.ts new file mode 100644 index 0000000..a70976f --- /dev/null +++ b/src/poe/shared/constants/Experience.ts @@ -0,0 +1,103 @@ +/* istanbul ignore next */ +export const Experience = [ + 0, + 525, + 1760, + 3781, + 7184, + 12186, + 19324, + 29377, + 43181, + 61693, + 85990, + 117506, + 157384, + 207736, + 269997, + 346462, + 439268, + 551295, + 685171, + 843709, + 1030734, + 1249629, + 1504995, + 1800847, + 2142652, + 2535122, + 2984677, + 3496798, + 4080655, + 4742836, + 5490247, + 6334393, + 7283446, + 8384398, + 9541110, + 10874351, + 12361842, + 14018289, + 15859432, + 17905634, + 20171471, + 22679999, + 25456123, + 28517857, + 31897771, + 35621447, + 39721017, + 44225461, + 49176560, + 54607467, + 60565335, + 67094245, + 74247659, + 82075627, + 90631041, + 99984974, + 110197515, + 121340161, + 133497202, + 146749362, + 161191120, + 176922628, + 194049893, + 212684946, + 232956711, + 255001620, + 278952403, + 304972236, + 333233648, + 363906163, + 397194041, + 433312945, + 472476370, + 514937180, + 560961898, + 610815862, + 664824416, + 723298169, + 786612664, + 855129128, + 929261318, + 1009443795, + 1096169525, + 1189918242, + 1291270350, + 1400795257, + 1519130326, + 1646943474, + 1784977296, + 1934009687, + 2094900291, + 2268549086, + 2455921256, + 2658074992, + 2876116901, + 3111280300, + 3364828162, + 3638186694, + 3932818530, + 4250334444, +]; diff --git a/src/poe/shared/constants/index.ts b/src/poe/shared/constants/index.ts new file mode 100644 index 0000000..66e71dd --- /dev/null +++ b/src/poe/shared/constants/index.ts @@ -0,0 +1 @@ +export * from "./Experience"; diff --git a/src/poe/shared/index.ts b/src/poe/shared/index.ts new file mode 100644 index 0000000..11be421 --- /dev/null +++ b/src/poe/shared/index.ts @@ -0,0 +1,3 @@ +export * from "./constants"; +export * as Item from "./item"; +export * from "./models"; diff --git a/src/poe/shared/item/Item.ts b/src/poe/shared/item/Item.ts new file mode 100644 index 0000000..c0d2613 --- /dev/null +++ b/src/poe/shared/item/Item.ts @@ -0,0 +1,39 @@ +import { Type } from "class-transformer"; + +import { ItemBase } from "./ItemBase"; +import { IncubatedItem, Influences, Property, Socket } from "./models"; +import { SocketedItem } from "./SocketedItem"; + +export class Item extends ItemBase { + sockets?: Socket[]; + properties?: Property[]; + flavourText?: string[]; + x!: number; + y!: number; + inventoryId!: string; + craftedMods?: string[]; + descrText?: string; + enchantMods?: string[]; + itemLevel?: number; + prophecyText?: string; + utilityMods?: string[]; + artFilename?: string; + note?: string; + talismanTier?: number; + influences?: Influences; + elder?: boolean; + shaper?: boolean; + incubatedItem?: IncubatedItem; + delve?: boolean; + veiledMods?: string[]; + veiled?: boolean; + duplicated?: boolean; + isRelic?: boolean; + cosmeticMods?: string[]; + stackSizeText?: string; + replica?: boolean; + cisRaceReward?: boolean; + + @Type(/* istanbul ignore next */ () => SocketedItem) + socketedItems?: SocketedItem[]; +} diff --git a/src/poe/shared/item/ItemBase.ts b/src/poe/shared/item/ItemBase.ts new file mode 100644 index 0000000..cbf4309 --- /dev/null +++ b/src/poe/shared/item/ItemBase.ts @@ -0,0 +1,34 @@ +import { AdditionalProperty, Extended, Hybrid, Property } from "./models"; + +/*** + * @hidden + */ +export class ItemBase { + verified!: boolean; + w!: number; + h!: number; + name!: string; + icon!: string; + league!: string; + id!: string; + typeLine!: string; + identified!: boolean; + ilvl!: number; + requirements?: Property[]; + explicitMods?: string[]; + frameType!: number; + extended!: Extended; + support?: boolean; + corrupted?: boolean; + additionalProperties?: AdditionalProperty[]; + secDescrText?: string; + hybrid?: Hybrid; + nextLevelRequirements?: Property[]; + abyssJewel?: boolean; + fractured?: boolean; + fracturedMods?: string[]; + synthesised?: boolean; + implicitMods?: string[]; + stackSize?: number; + maxStackSize?: number; +} diff --git a/src/poe/shared/item/SocketedItem.ts b/src/poe/shared/item/SocketedItem.ts new file mode 100644 index 0000000..cc267fe --- /dev/null +++ b/src/poe/shared/item/SocketedItem.ts @@ -0,0 +1,9 @@ +import { ItemBase } from "./ItemBase"; +import { Property, SocketColour } from "./models"; + +export class SocketedItem extends ItemBase { + properties!: Property[]; + descrText!: string; + socket!: number; + colour!: SocketColour | null; +} diff --git a/src/poe/shared/item/index.ts b/src/poe/shared/item/index.ts new file mode 100644 index 0000000..bc7113a --- /dev/null +++ b/src/poe/shared/item/index.ts @@ -0,0 +1,4 @@ +export * from "./Item"; +export * from "./ItemBase"; +export * from "./SocketedItem"; +export * from "./models"; diff --git a/src/poe/shared/item/models/AdditionalProperty.ts b/src/poe/shared/item/models/AdditionalProperty.ts new file mode 100644 index 0000000..933690f --- /dev/null +++ b/src/poe/shared/item/models/AdditionalProperty.ts @@ -0,0 +1,7 @@ +export interface AdditionalProperty { + name: string; + values: Array>; + displayMode: number; + progress: number; + type: number; +} diff --git a/src/poe/shared/item/models/Attribute.ts b/src/poe/shared/item/models/Attribute.ts new file mode 100644 index 0000000..03dfc9e --- /dev/null +++ b/src/poe/shared/item/models/Attribute.ts @@ -0,0 +1 @@ +export type Attribute = "A" | "D" | "DV" | "G" | "I" | "S"; diff --git a/src/poe/shared/item/models/Extended.ts b/src/poe/shared/item/models/Extended.ts new file mode 100644 index 0000000..200e08d --- /dev/null +++ b/src/poe/shared/item/models/Extended.ts @@ -0,0 +1,7 @@ +export interface Extended { + category: string; + subcategories?: string[]; + baseType: string; + prefixes?: number; + suffixes?: number; +} diff --git a/src/poe/shared/item/models/Hybrid.ts b/src/poe/shared/item/models/Hybrid.ts new file mode 100644 index 0000000..03b134b --- /dev/null +++ b/src/poe/shared/item/models/Hybrid.ts @@ -0,0 +1,9 @@ +import { Property } from "./Property"; + +export interface Hybrid { + isVaalGem?: boolean; + baseTypeName: string; + properties: Property[]; + explicitMods?: string[]; + secDescrText: string; +} diff --git a/src/poe/shared/item/models/IncubatedItem.ts b/src/poe/shared/item/models/IncubatedItem.ts new file mode 100644 index 0000000..664d60b --- /dev/null +++ b/src/poe/shared/item/models/IncubatedItem.ts @@ -0,0 +1,6 @@ +export interface IncubatedItem { + name: string; + level: number; + progress: number; + total: number; +} diff --git a/src/poe/shared/item/models/Influences.ts b/src/poe/shared/item/models/Influences.ts new file mode 100644 index 0000000..6302d71 --- /dev/null +++ b/src/poe/shared/item/models/Influences.ts @@ -0,0 +1,8 @@ +export interface Influences { + elder?: boolean; + shaper?: boolean; + hunter?: boolean; + redeemer?: boolean; + warlord?: boolean; + crusader?: boolean; +} diff --git a/src/poe/shared/item/models/Property.ts b/src/poe/shared/item/models/Property.ts new file mode 100644 index 0000000..7a26f3e --- /dev/null +++ b/src/poe/shared/item/models/Property.ts @@ -0,0 +1,7 @@ +export interface Property { + name: string; + values: Array>; + displayMode: number; + type?: number; + suffix?: string; +} diff --git a/src/poe/shared/item/models/Socket.ts b/src/poe/shared/item/models/Socket.ts new file mode 100644 index 0000000..3cec046 --- /dev/null +++ b/src/poe/shared/item/models/Socket.ts @@ -0,0 +1,8 @@ +import { Attribute } from "./Attribute"; +import { SocketColour } from "./SocketColour"; + +export interface Socket { + group: number; + attr: Attribute | string; + sColour: SocketColour | string; +} diff --git a/src/poe/shared/item/models/SocketColour.ts b/src/poe/shared/item/models/SocketColour.ts new file mode 100644 index 0000000..cdbf246 --- /dev/null +++ b/src/poe/shared/item/models/SocketColour.ts @@ -0,0 +1 @@ +export type SocketColour = "A" | "B" | "DV" | "G" | "R" | "W"; diff --git a/src/poe/shared/item/models/index.ts b/src/poe/shared/item/models/index.ts new file mode 100644 index 0000000..6cfcfd5 --- /dev/null +++ b/src/poe/shared/item/models/index.ts @@ -0,0 +1,9 @@ +export * from "./AdditionalProperty"; +export * from "./Attribute"; +export * from "./Extended"; +export * from "./Hybrid"; +export * from "./IncubatedItem"; +export * from "./Influences"; +export * from "./Property"; +export * from "./Socket"; +export * from "./SocketColour"; diff --git a/src/poe/shared/models/Realm.ts b/src/poe/shared/models/Realm.ts new file mode 100644 index 0000000..57cef2a --- /dev/null +++ b/src/poe/shared/models/Realm.ts @@ -0,0 +1 @@ +export type Realm = "pc" | "xbox" | "sony"; diff --git a/src/poe/shared/models/RealmOptions.ts b/src/poe/shared/models/RealmOptions.ts new file mode 100644 index 0000000..4dc51fc --- /dev/null +++ b/src/poe/shared/models/RealmOptions.ts @@ -0,0 +1,10 @@ +import { Realm } from "./Realm"; + +export interface RealmOptions { + /** + * The realm of the requested entity + * + * Default: `pc` + */ + realm?: Realm; +} diff --git a/src/poe/shared/models/StashType.ts b/src/poe/shared/models/StashType.ts new file mode 100644 index 0000000..5f4ff71 --- /dev/null +++ b/src/poe/shared/models/StashType.ts @@ -0,0 +1,13 @@ +export type StashType = + | "BlightStash" + | "CurrencyStash" + | "DeliriumStash" + | "DelveStash" + | "DivinationCardStash" + | "EssenceStash" + | "FragmentStash" + | "MapStash" + | "MetamorphStash" + | "PremiumStash" + | "QuadStash" + | "UniqueStash"; diff --git a/src/poe/shared/models/index.ts b/src/poe/shared/models/index.ts new file mode 100644 index 0000000..c3ee9f4 --- /dev/null +++ b/src/poe/shared/models/index.ts @@ -0,0 +1,3 @@ +export * from "./Realm"; +export * from "./RealmOptions"; +export * from "./StashType"; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..f480efe --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "baseUrl": "./", + "rootDir": "./src", + "outDir": "./dist", + "allowJs": true, + "module": "commonjs", + "target": "es6", + "declaration": true, + "experimentalDecorators": true, + "resolveJsonModule": true, + "strict": true, + "moduleResolution": "node", + "esModuleInterop": true + }, + "exclude": [ + "docs", + "test", + "node_modules", + "dist", + "src/mochaFixtures.ts", + "src/playground.ts" + ], + "include": ["src/**/*.ts"] +} diff --git a/typedoc.json b/typedoc.json new file mode 100644 index 0000000..6e32ac0 --- /dev/null +++ b/typedoc.json @@ -0,0 +1,8 @@ +{ + "entryPoints": ["./src/index.ts"], + "exclude": ["**/*+(.spec|.e2e).ts"], + "out": "docs", + "tsconfig": "tsconfig.json", + "excludePrivate": true, + "disableSources": true +}