pax_global_header 0000666 0000000 0000000 00000000064 14177263367 0014532 g ustar 00root root 0000000 0000000 52 comment=1b2933d7e3790dd88ae3deb09598c016d52c3ed8
nock-13.2.4/ 0000775 0000000 0000000 00000000000 14177263367 0012553 5 ustar 00root root 0000000 0000000 nock-13.2.4/.all-contributorsrc 0000664 0000000 0000000 00000007035 14177263367 0016411 0 ustar 00root root 0000000 0000000 {
"projectName": "nock",
"projectOwner": "nock",
"repoType": "github",
"repoHost": "https://github.com",
"files": [
"README.md"
],
"imageSize": 100,
"commit": false,
"contributors": [
{
"login": "pgte",
"name": "Pedro Teixeira",
"avatar_url": "https://avatars1.githubusercontent.com/u/47910?v=4",
"profile": "http://pgte.me",
"contributions": [
"code",
"maintenance"
]
},
{
"login": "n30n0v",
"name": "n30n0v",
"avatar_url": "https://avatars3.githubusercontent.com/u/10771967?v=4",
"profile": "https://github.com/n30n0v",
"contributions": [
"code"
]
},
{
"login": "RichardLitt",
"name": "Richard Littauer",
"avatar_url": "https://avatars3.githubusercontent.com/u/910753?v=4",
"profile": "https://burntfen.com",
"contributions": [
"maintenance",
"code",
"blog"
]
},
{
"login": "ianwsperber",
"name": "Ian Walker-Sperber",
"avatar_url": "https://avatars1.githubusercontent.com/u/3731165?v=4",
"profile": "http://ianwsperber.com",
"contributions": [
"code"
]
},
{
"login": "ierceg",
"name": "Ivan Erceg",
"avatar_url": "https://avatars2.githubusercontent.com/u/1505203?v=4",
"profile": "http://ilovacha.com",
"contributions": [
"code",
"maintenance"
]
},
{
"login": "paulmelnikow",
"name": "Paul Melnikow",
"avatar_url": "https://avatars2.githubusercontent.com/u/1487036?v=4",
"profile": "https://twitter.com/paulmelnikow",
"contributions": [
"code",
"maintenance"
]
},
{
"login": "gr2m",
"name": "Gregor Martynus",
"avatar_url": "https://avatars3.githubusercontent.com/u/39992?v=4",
"profile": "https://twitter.com/gr2m",
"contributions": [
"code",
"maintenance",
"business",
"financial",
"blog"
]
},
{
"login": "hutson",
"name": "Hutson Betts",
"avatar_url": "https://avatars1.githubusercontent.com/u/6701030?v=4",
"profile": "https://gitlab.com/hutson",
"contributions": [
"financial"
]
},
{
"login": "jlilja",
"name": "Jonas Lilja",
"avatar_url": "https://avatars2.githubusercontent.com/u/6105119?v=4",
"profile": "http://lilja.io",
"contributions": [
"financial",
"code"
]
},
{
"login": "benrki",
"name": "Benjamin Ki",
"avatar_url": "https://avatars0.githubusercontent.com/u/4446950?v=4",
"profile": "https://github.com/benrki",
"contributions": [
"financial"
]
},
{
"login": "chadfawcett",
"name": "Chad Fawcett",
"avatar_url": "https://avatars2.githubusercontent.com/u/3250463?v=4",
"profile": "http://chadf.ca",
"contributions": [
"financial"
]
},
{
"login": "laurence-myers",
"name": "Laurence Dougal Myers",
"avatar_url": "https://avatars.githubusercontent.com/u/6336048?v=4",
"profile": "http://www.laurencemyers.com.au",
"contributions": [
"code"
]
},
{
"login": "Beretta1979",
"name": "Sébastien Van Bruaene",
"avatar_url": "https://avatars.githubusercontent.com/u/10073962?v=4",
"profile": "https://github.com/Beretta1979",
"contributions": [
"code",
"test"
]
}
],
"contributorsPerLine": 7,
"skipCi": true
}
nock-13.2.4/.eslintignore 0000664 0000000 0000000 00000000105 14177263367 0015252 0 ustar 00root root 0000000 0000000 /coverage
/tests/browserify-public/browserify-bundle.js
node_modules
nock-13.2.4/.eslintrc.yml 0000664 0000000 0000000 00000002017 14177263367 0015177 0 ustar 00root root 0000000 0000000 env:
node: true
parserOptions:
ecmaVersion: 9
# Override eslint-config-standard, which incorrectly sets this to "module",
# though that setting is only for ES6 modules, not CommonJS modules.
sourceType: 'script'
extends:
- 'eslint:recommended'
- standard
- prettier
plugins:
- mocha
overrides:
- files:
- 'tests/**/*.js'
env:
mocha: true
rules:
mocha/no-exclusive-tests: 'error'
rules:
# TODO These are included in standard and should be cleaned up and turned on.
n/no-deprecated-api: 'off' # we still make heavy use of url.parse
# Nock additions.
strict: ['error', 'safe']
no-console: 'error'
no-loop-func: 'error'
no-var: 'error'
prefer-const: 'error'
object-shorthand: ['error', 'properties']
prefer-template: 'error'
arrow-body-style: ['error', 'as-needed']
prefer-destructuring:
[
'error',
{
'VariableDeclarator': { 'array': false, 'object': true },
'AssignmentExpression': { 'array': false, 'object': false },
},
]
nock-13.2.4/.github/ 0000775 0000000 0000000 00000000000 14177263367 0014113 5 ustar 00root root 0000000 0000000 nock-13.2.4/.github/ISSUE_TEMPLATE/ 0000775 0000000 0000000 00000000000 14177263367 0016276 5 ustar 00root root 0000000 0000000 nock-13.2.4/.github/ISSUE_TEMPLATE/01_bug_report.yml 0000664 0000000 0000000 00000004701 14177263367 0021473 0 ustar 00root root 0000000 0000000 ---
name: '🐛 Bug Report'
description: "Something isn't working as expected 🤔"
labels:
- bug
body:
- type: checkboxes
id: search
attributes:
label: Please avoid duplicates
options:
- label: I checked [all open bugs](https://github.com/nock/nock.js/issues?q=is%3Aissue+is%3Aopen+label%3Abug) and none of them matched my problem.
required: true
- type: input
id: testcase
attributes:
label: Reproducible test case
description: |
If possible, please create a minimal test case that reproduces your problem and share the URL.
For code-related issues, please create a RunKit Notebook ([example](https://runkit.com/gr2m/nock-nock-1076)).
For TypeScript-only problems, you can create TypeScript playground ([example](https://www.typescriptlang.org/play?#code/JYWwDg9gTgLgBAOwgYwNZwGZQiOByJNPAKGOQgQGd5LywBTOAXkRVQAo8ALGGMSgFwB6IQEMwwAHQBzYDC4BXAEaTyIPAEpicODPoxOQqPUiUxMHOcsAbYMnpV6m7buNhrAT3YAmAAy+AGjgAbxcdW3tHARCwnThUeg9ovBA5PADYnQRREHpkgFkASQAVOAAZOwdKJwy4uMowABMADwB9YEaCkvTMuAUoa2SePkERcSlZeWVVG0rHM1SYHrqsiEb6ds78fIARZAA2YoBxawArAC0AdQBWAC9z4oBRW+W4gF9auDetYhE4AAEYJQALT0ZoMZAwUFQbBQYi0CAMSSNCD0SgAOQgMEezWA1HYWiAA)).
validations:
required: true
- type: input
id: nock_version
attributes:
label: Nock Version
description: |
Please share the version of nock you are using.
You can find out using `npm ls nock`
validations:
required: true
- type: input
id: node_version
attributes:
label: Node Version
description: |
Please share the version of Node you are using.
You can find out using `node --version`
validations:
required: true
- type: textarea
id: typescript_info
attributes:
label: TypeScript Version
description: If this is a TypeScript version, please share the version and configuration you are using.
- type: textarea
id: summary
attributes:
label: What happened?
description: Please share any other relevant information not mentioned above. What did you expect to happen? What do you think the problem might be?
- type: checkboxes
id: contributor
attributes:
label: Would you be interested in contributing a fix?
description: |
If you haven't send a pull request before that is okay. We are happy to walk you through the process, just let us know that you will need help.
options:
- label: 'yes'
nock-13.2.4/.github/ISSUE_TEMPLATE/02_feature_request.yml 0000664 0000000 0000000 00000002301 14177263367 0022521 0 ustar 00root root 0000000 0000000 ---
name: '🚀 Feature request'
description: 'Let us know if you have a feature request 💡'
labels:
- feature
body:
- type: checkboxes
id: search
attributes:
label: Please avoid duplicates
options:
- label: I checked [all open feature requests](https://github.com/nock/nock.js/issues?q=is%3Aissue+is%3Aopen+label%3Afeature) and none of them matched my request.
required: true
- type: textarea
id: context
attributes:
label: Context
description: What are you trying to do and how would you want to do it differently? Is it something you currently you cannot do? Is this related to an issue/problem?
- type: textarea
id: alternatives
attributes:
label: Alternatives
description: Can you achieve the same result doing it in an alternative way? Is the alternative considerable?
- type: checkboxes
id: contributor
attributes:
label: If the feature request is accepted, would you be willing to submit a PR?
description: |
If you haven't send a pull request before that is okay. We are happy to walk you through the process, just let us know that you will need help.
options:
- label: 'yes'
nock-13.2.4/.github/ISSUE_TEMPLATE/config.yml 0000664 0000000 0000000 00000000261 14177263367 0020265 0 ustar 00root root 0000000 0000000 blank_issues_enabled: false
contact_links:
- name: Support
url: https://github.com/nock/nock/discussions/new?category=q-a
about: Please ask and answer questions here.
nock-13.2.4/.github/dependabot.yml 0000664 0000000 0000000 00000000427 14177263367 0016746 0 ustar 00root root 0000000 0000000 version: 2
updates:
- package-ecosystem: 'github-actions'
directory: '/'
schedule:
interval: 'monthly'
- package-ecosystem: 'npm'
# Look for `package.json` and `lock` files in the `root` directory
directory: '/'
schedule:
interval: 'monthly'
nock-13.2.4/.github/lock.yml 0000664 0000000 0000000 00000001350 14177263367 0015565 0 ustar 00root root 0000000 0000000 # Configuration for lock-threads - https://github.com/dessant/lock-threads
# Number of days of inactivity before a closed issue or pull request is locked
daysUntilLock: 14
# Issues and pull requests with these labels will not be locked. Set to `[]` to disable
exemptLabels: []
# Label to add before locking, such as `outdated`. Set to `false` to disable
lockLabel: false
# Comment to post before locking. Set to `false` to disable
lockComment: >
This thread has been automatically locked since there has not been
any recent activity after it was closed. Please open a new issue and
add a reference to this one if it’s related. Thank you!
# Assign `resolved` as the reason for locking. Set to `false` to disable
setLockReason: true
nock-13.2.4/.github/stale.yml 0000664 0000000 0000000 00000002002 14177263367 0015740 0 ustar 00root root 0000000 0000000 # Configuration for probot-stale - https://github.com/probot/stale
# Number of days of inactivity before an Issue or Pull Request becomes stale
daysUntilStale: 90
# Number of days of inactivity before an Issue or Pull Request with the stale label is closed.
# Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale.
daysUntilClose: 7
# Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable
exemptLabels:
- pinned
# Label to use when marking as stale
staleLabel: stale
# Comment to post when marking as stale. Set to `false` to disable
markComment: >
This issue has been automatically marked as stale because it has not had
recent activity. It will be closed if no further activity occurs. We try to
do our best, but nock is maintained by volunteers and there is only so much
we can do at a time. Thank you for your contributions.
# Limit the number of actions per hour, from 1-30. Default is 30
limitPerRun: 30
nock-13.2.4/.github/toc.yml 0000664 0000000 0000000 00000000015 14177263367 0015417 0 ustar 00root root 0000000 0000000 bullets: '-'
nock-13.2.4/.github/workflows/ 0000775 0000000 0000000 00000000000 14177263367 0016150 5 ustar 00root root 0000000 0000000 nock-13.2.4/.github/workflows/continuous-delivery.yaml 0000664 0000000 0000000 00000001267 14177263367 0023071 0 ustar 00root root 0000000 0000000 name: Continuous Delivery
'on':
push:
branches:
- '*.x'
- main
- beta
- next
jobs:
build:
name: Release
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
with:
persist-credentials: false
- name: Setup Node.js
uses: actions/setup-node@v2
with:
node-version: 16
cache: 'npm'
- name: Install dependencies
run: npm ci --ignore-scripts --no-audit --no-progress --prefer-offline
- env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
name: Release
run: npx semantic-release
nock-13.2.4/.github/workflows/continuous-integration.yaml 0000664 0000000 0000000 00000004374 14177263367 0023573 0 ustar 00root root 0000000 0000000 name: Continuous Integration
'on':
pull_request:
types:
- opened
- synchronize
push:
branches:
- main
jobs:
format:
name: Format
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
with:
persist-credentials: false
- name: Setup Node.js
uses: actions/setup-node@v2
with:
node-version: 16
cache: 'npm'
- name: Install dependencies
run: npm ci --ignore-scripts --no-audit --no-progress --prefer-offline
- name: Format
run: npm run format
lint-javascript:
name: Lint JavaScript
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
with:
persist-credentials: false
- name: Setup Node.js
uses: actions/setup-node@v2
with:
node-version: 16
cache: 'npm'
- name: Install dependencies
run: npm ci --ignore-scripts --no-audit --no-progress --prefer-offline
- name: Lint
run: npm run lint:js
lint-typescript:
name: Lint TypeScript declaration files
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
with:
persist-credentials: false
- name: Setup Node.js
uses: actions/setup-node@v2
with:
node-version: 16
cache: 'npm'
- name: Install dependencies
run: npm ci --ignore-scripts --no-audit --no-progress --prefer-offline
- name: Lint
run: |
npm run lint:ts
test:
name: Test
runs-on: ${{ matrix.os }}
steps:
- name: Checkout
uses: actions/checkout@v2
with:
persist-credentials: false
- name: Setup Node.js
uses: actions/setup-node@v2
with:
node-version: ${{ matrix.node-version }}
cache: 'npm'
- name: Install dependencies
run: npm ci --ignore-scripts --no-audit --no-progress --prefer-offline
- name: Test
run: npm run test
strategy:
fail-fast: false
matrix:
node-version:
- 10
- 12
- 14
- 16
os:
- macos-latest
- ubuntu-latest
- windows-latest
nock-13.2.4/.github/workflows/fix-formatting.yaml 0000664 0000000 0000000 00000001704 14177263367 0021774 0 ustar 00root root 0000000 0000000 name: Fix formatting
'on':
push:
branches:
- dependabot/npm_and_yarn/prettier-*
- dependabot/npm_and_yarn/eslint-*
workflow_dispatch: {}
jobs:
fixFormatting:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
persist-credentials: true
ref: ${{ github.head_ref }}
- uses: actions/setup-node@v2
with:
node-version: 16
cache: npm
- name: Install dependencies
run: npm ci --ignore-scripts --no-audit --no-progress --prefer-offline
- name: Format
run: npm run format:fix
- name: Commit
run: >
git config user.email "github-actions@github.com"
git config user.name "github-actions"
git add .
git commit -m "style: format files with Prettier" | true # ignore error if there are no changes to commit
git push origin HEAD:${{ github.head_ref }}
nock-13.2.4/.gitignore 0000664 0000000 0000000 00000000162 14177263367 0014542 0 ustar 00root root 0000000 0000000 .cache
.idea
.nyc_output
.vscode
coverage
node_modules
npm-debug.log
tests/browserify-public/browserify-bundle.js
nock-13.2.4/.mocharc.js 0000664 0000000 0000000 00000000105 14177263367 0014577 0 ustar 00root root 0000000 0000000 module.exports = {
checkLeaks: true,
file: ['tests/setup.js'],
}
nock-13.2.4/.npmignore 0000664 0000000 0000000 00000000103 14177263367 0014544 0 ustar 00root root 0000000 0000000 node_modules
.gitignore
coverage
.nyc_output
tests
CONTRIBUTORS.md
nock-13.2.4/.nycrc.yml 0000664 0000000 0000000 00000000161 14177263367 0014470 0 ustar 00root root 0000000 0000000 all: true
check-coverage: true
branches: 100
lines: 100
include:
- lib
reporters:
- lcov
- text-summary
nock-13.2.4/.prettierignore 0000664 0000000 0000000 00000000144 14177263367 0015615 0 ustar 00root root 0000000 0000000 package.json
package-lock.json
/.nyc_output
/coverage
/tests/browserify-public/browserify-bundle.js
nock-13.2.4/.prettierrc.yml 0000664 0000000 0000000 00000000110 14177263367 0015527 0 ustar 00root root 0000000 0000000 semi: false
singleQuote: true
bracketSpacing: true
arrowParens: 'avoid'
nock-13.2.4/CHANGELOG.md 0000664 0000000 0000000 00000000764 14177263367 0014373 0 ustar 00root root 0000000 0000000 # Changelog
Nock’s changelog can be found directly in the [GitHub release notes](https://github.com/nock/nock/releases).
These are automatically created by [semantic-release](https://github.com/semantic-release/semantic-release) based on their [commit message conventions](https://semantic-release.gitbook.io/semantic-release#commit-message-format).
Migration guides are available for major versions in the [migration guides directory](https://github.com/nock/nock/tree/main/migration_guides).
nock-13.2.4/CODE_OF_CONDUCT.md 0000664 0000000 0000000 00000006254 14177263367 0015361 0 ustar 00root root 0000000 0000000 # Contributor Covenant Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment include:
- Using welcoming and inclusive language
- Being respectful of differing viewpoints and experiences
- Gracefully accepting constructive criticism
- Focusing on what is best for the community
- Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
- The use of sexualized language or imagery and unwelcome sexual attention or advances
- Trolling, insulting/derogatory comments, and personal or political attacks
- Public or private harassment
- Publishing others' private information, such as a physical or electronic address, without explicit permission
- Other conduct which could reasonably be considered inappropriate in a professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at nock+coc@martynus.net or coc+nock@maintainer.io. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
[homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/
nock-13.2.4/CONTRIBUTING.md 0000664 0000000 0000000 00000026243 14177263367 0015013 0 ustar 00root root 0000000 0000000 # Contribute
👋 Thanks for thinking about contributing to nock! We, the maintainers, are glad you're here and will be excited to help you get started if you have any questions. For now, here are some basic instructions for how we manage this project.
Please note that this project is released with a [Contributor Code of Conduct](./CODE_OF_CONDUCT.md). By participating in this project you agree to abide by its terms.
**Table of Contents**
- [Branching](#branching)
- [Backport a fix / feature to a previous version](#backport-a-fix--feature-to-a-previous-version)
- [Submit a Beta / Next release](#submit-a-beta--next-release)
- [Formatting & linting](#formatting--linting)
- [Commit Message conventions](#commit-message-conventions)
- [Generate README TOC](#generate-readme-toc)
- [Running tests](#running-tests)
- [Running only a single test](#running-only-a-single-test)
- [Release Process](#release-process)
- [GitHub Apps](#github-apps)
- [Becoming a maintainer](#becoming-a-maintainer)
- [Who is funding work on Nock?](#who-is-funding-work-on-nock)
- [Priority Support](#priority-support)
- [Is there a chat where I can talk to other maintainers and users?](#is-there-a-chat-where-i-can-talk-to-other-maintainers-and-users)
## Branching
**TLDR: Most pull requests should be opened against the `beta` branch.**
We use [semantic-release](https://github.com/semantic-release/semantic-release) to automate the release of new versions based on semantic commit messages as described above. Depending on the branch that a new pull request is merged into, it is published to different versions using different [npm dist-tags](https://docs.npmjs.com/cli/dist-tag).
- `main`: Publish with `@latest`, or if the commits have been merged into `next` branch before, update the `@latest` dist-tag to point at the new version
- `next`: Publish with `@next`
- `beta`: Publish to `X.0.0-beta.Y`, where `X` is the next breaking version and `Y` is number that gets increased with each release.
- `[Version].x`: For example `10.x`, where `10` is the major release number. No breaking changes are allowed on this branch. Publishes fix/feature versions to `[Version]` using a `@release-@[version].x` release tag
### Backport a fix / feature to a previous version
If you want to **backport a fix** to version 10, and the last version released on version 10 is `10.0.4`, then you have to follow these steps
1. Create the `[Version].x` branch unless it already exists. If you don’t have write access, ask one of the maintainers to do it for you. In this example, the command is `git checkout -b 10.x v10.0.4`.
2. Push the branch to GitHub: `git push -u origin $(git symbolic-ref --short HEAD)`
3. Create a new branch based on `10.x`
4. Make your changes
5. Submit the pull request against the `10.x` branch
### Submit a Beta / Next release
Create a new branch based off `beta` or `next`, depending on what you want. Make your changes and submit them to the same branches. If either `beta` or `next` is outdated, ask a maintainer to re-create them from `main`
## Formatting & linting
This project formats its source code using Prettier. The most enjoyable way to
use Prettier is to let it format code for you when you save. You can [integrate
it into your editor][integrate prettier].
[integrate prettier]: https://prettier.io/docs/en/editors.html
If you don't want to integrate with your editor, you can run `npm run prettier`
instead.
Semantic issues are checked with ESLint via `npm run lint`.
## Commit Message conventions
`nock` releases are automated using [semantic-release](https://github.com/semantic-release/semantic-release).
To automatically calculate the correct version number as well as changelogs,
three commit message conventions need to be followed
- Commit bug fixes with `fix: ...` or `fix(scope): ...` prefix in commit subject
- Commit new features with `feat: ...` or `feat(scope): ...` prefix in commit subject
- Commit breaking changes by adding `BREAKING CHANGE:` in the commit body
(not the subject line)
Other helpful conventions are
- Commit test files with `test: ...` or `test(scope): ...` prefix
- Commit changes to `package.json`, `.gitignore` and other meta files with
`chore(filename-without-ext): ...`
- Commit changes to README files or comments with `docs: ...`
- Code style changes with `style: standard`
Don't stress this; if necessary the maintainers can fix commit message(s) of a pull request using the `squash & merge` button.
## Generate README TOC
Make sure to update the README's table of contents whenever you update the README using the following npm script.
```
$ npm run toc
```
## Running tests
All of the tests work offline. None of them should hit the network.
```
$ npm test
```
### Running only a single test
When you're writing a test for a specific purpose, it may be useful to only run that test. In order to do this, you can pass a `only` option as the second argument to the [`tap`](https://www.node-tap.org/) testrunner. For instance in `tests/example.js`, like so:
```js
test('description', { only: true }, t => {
// ...
})
```
And then:
```sh
$ tap --only tests/example_file.js
```
## Release Process
All of our releases are automated using [semantic-release](https://github.com/semantic-release/semantic-release). The commit messages pushed to the main branch trigger new releases. Semantic-release requires that commits follow certain conventions, [described above](#commit-message-conventions). semantic-release creates a GitHub release, adds release notes and publishes the new version to npm. This is why we do not store release notes in the [`CHANGELOG`](CHANGELOG.md) file - they're already on GitHub.
We use @nockbot as a separate account for releases, because npm tokens cannot be scoped to a single package. This improves our security model in case of a data breach involving npm tokens. @nockbot's credentials were set up by @gr2m; contact him if for any reason you need to change this in the future.
## GitHub Apps
We use several GitHub apps to help maintain this repository. While we would like to address every issue and while we would like to be on hand to support every person, Nock is pretty much entirely volunteer run, and we simply don't have the time to do everything. Please don't be offended if an automated app posts in your issue! We're doing what we can with with we have.
Currently, we use the [Stale](https://github.com/apps/stale) and [Lock](https://github.com/apps/lock) apps to mark old issues as stale, and to lock issues which have been closed to stop drive-by comments. You can see the configuration files for these in [.github/](.github).
## Becoming a maintainer
So you want to do more than file a bug or submit a PR? Awesome!
Nock is actively interested in having more maintainers. That means that we would love to have you (yes, you) get more involved if you want to! We don't have strict tests that you need to pass to become a maintainer. Instead, all we want is to find people who are frequent contributors, understand what Nock does, and are eager to help make this tool better.
Here are some things you can do today to actively show the Nock team that you're interested in helping out in the long term:
- **Triage issues!** We have more issues than we have bandwidth to deal with. For some of these issues, there are no labels, no comments suggesting how the issue could be resolved, and no follow-up after months or years of silence. It would be great if the issues actively reflected the state of the project. Go through old issues and suggesting labels in comments, ask for more information, and generally help out with the resolution process. This would be a great help!
- **Review PRs.** We have a lot of open PRs! Some of these are probably ready to merge, and some of them probably need more work. Any extra eyes on PRs are encouraged. Comment on code patterns you think need work, suggest extra tests, and let us know if a PR 'LGTM' ("looks good to me"). The more reviewers we have, the faster we can merge issues, the better this project becomes.
- **Help out!** If someone files a bug and no one has responded yet, see if you can resolve it! Suggest PRs, or file them yourself. While most contributors are going to only be interested in their own bugs, great maintainers help out with other people's bugs. This is one of the best ways to become an expert at Nock (and Node.js, JavaScript, or pretty much any project) - helping others.
- **Write docs.** Are our docs missing something important? Are they not clear? Could they be better? Open a PR!
- **Suggest examples.** Right now, we have a few examples, but we could always have more. Submit small example files and tutorials. At some point, we'll have to work on a better way to display these - for now, it's great to show others how to solve difficult mocking problems easily with Nock.
- **Refactor.** This is one of the hardest things to do, but one of the most useful. Go through the code, and find examples where it could be written better - with better variable names, more useful abstractions, and more elegant patterns. Taking away ten lines of code that are unnecessary is more valuable than submitting a hundred new lines, sometimes. Open a PR or a comment and defend your position; ask for feedback.
Once you've been around for a bit, ask a current Maintainer - one of [the team members](https://github.com/orgs/nock/people) - whether you can be elevated to Maintainer status and given permissions to close issues and merge PRs. We're interested in how well you know what Nock is about, and how involved you are in the community - not where you're from, how good your English is, or whether or not you can pass a whiteboard test blindfolded. If you think that you've been helpful, let us know. We're friendly, promise. :)
## Who is funding work on Nock?
Nock is entirely self-funded by [our Open Collective](https://opencollective.com/nock). Open Collective allows us to get contributions from users and companies, without giving away our open source IP. Think of it like a kickstarter, or an old-fashioned system of art patrons.
If you'd like to give money to support Nock, please do go to our profile and check it out.
## Priority Support
As part of backing on Open Collective, we tag some issues as a priority if the user who opens them is also a backer, using the [Open Collective Bot](https://github.com/marketplace/open-collective-bot). In general, as maintainers we will give priority to support people who are working on these issues. The money in the Open Collective goes to the entire project, however, and maintainers are volunteers.
## Is there a chat where I can talk to other maintainers and users?
We don't have a chat for a variety of reasons - mainly, because our maintainers' time is limited, and we don't want to be on the hook for enforcing codes of conduct or for checking in every day. However, we encourage you to open issues about anything related to Nock! Issues really are the best way to keep the conversation focused on development.
We often have video calls to pair program or to hack together on Nock. Join us! Look at the issues for a notification about these, and, if there isn't one planned, open an issue and suggest one.
On that note, thanks for reading this far. Go mock some tests now, there's nothing left to read here. :)
nock-13.2.4/CONTRIBUTORS.md 0000664 0000000 0000000 00000143374 14177263367 0015046 0 ustar 00root root 0000000 0000000 # Contributors
This list has been generated to thank everyone here for their contribution. Nock wouldn't be what it is without the individuals who've given their time to it. In alphabetical order, here is a list of people who the maintainers think are worthy of being thanked publicly and permanently here.
Aalhad Saraf @saraf https://github.com/saraf
Aaron D Borden @adborden https://github.com/adborden
Aaron Greenwald @aarongreenwald https://github.com/aarongreenwald
Abdul Alkhatib @abdulito https://github.com/abdulito
Abdullah Ali @AbdullahAli https://github.com/AbdullahAli
Abhijeet Singh @abhijeetps https://github.com/abhijeetps
Abimbola Idowu @hisabimbola https://github.com/hisabimbola
Adam @snowmac https://github.com/snowmac
Adam Bretz @arb https://github.com/arb
Adam Cofer @acofer https://github.com/acofer
Adam Ever-Hadani @adamhadani https://github.com/adamhadani
Adam LaFave @lafave https://github.com/lafave
Adam Tyler @AdamTyler https://github.com/AdamTyler
Adam Voss @adamvoss https://github.com/adamvoss
Adara @adarrra https://github.com/adarrra
Aditya Bhardwaj @purezen https://github.com/purezen
Aditya Gupta @aditya1315 https://github.com/aditya1315
Adrian Mejia @amejiarosario https://github.com/amejiarosario
Adrian Perez @blackxored https://github.com/blackxored
Aidan Feldman @afeld https://github.com/afeld
Akshaya Kumar Sharma @lordakshaya https://github.com/lordakshaya
Alan Clarke @alanclarke https://github.com/alanclarke
Alan Lee @mralanlee https://github.com/mralanlee
Alastair Brunton @pyrat https://github.com/pyrat
Alberto Gasparin @albertogasparin https://github.com/albertogasparin
Alberto Pose @pose https://github.com/pose
Aleksander Barszczewski @alekbarszczewski https://github.com/alekbarszczewski
Aleksandr Gidenko @aleksgidenko https://github.com/aleksgidenko
Aleksi Pekkala @epiphone https://github.com/epiphone
Alex Banks @MoonTahoe https://github.com/MoonTahoe
Alex Dunn @dunn https://github.com/dunn
Alex Gilleran @AlexGilleran https://github.com/AlexGilleran
Alex Layton @awlayton https://github.com/awlayton
Alex Olson @alexkolson https://github.com/alexkolson
Alex Panov @alexpanov https://github.com/alexpanov
Alex Pavlov @macscripter https://github.com/macscripter
Alex Voitau @voitau https://github.com/voitau
Alex Zylman @azylman https://github.com/azylman
Alexander Christiansson @alexanderchr https://github.com/alexanderchr
Alexander Rusakov @arusakov https://github.com/arusakov
Alexander Simmerl @xla https://github.com/xla
Alexander Tesfamichael @alextes https://github.com/alextes
Alexandru Vlăduţu @alessioalex https://github.com/alessioalex
Alexey @akaguny https://github.com/akaguny
Alexey @i4got10 https://github.com/i4got10
Alexis Metaireau @almet https://github.com/almet
Ali Abu Ras @aliaburas80 https://github.com/aliaburas80
Ali Chen @ali322 https://github.com/ali322
Alison Kohl @alisonkohl https://github.com/alisonkohl
Alixe Bhagooa @alixeb https://github.com/alixeb
Allan Stewart @allan-stewart https://github.com/allan-stewart
Allen Luce @allenluce https://github.com/allenluce
Ami44 @ami44 https://github.com/ami44
Amru E @amrue https://github.com/amrue
Anders D. Johnson @AndersDJohnson https://github.com/AndersDJohnson
Anderson S. Otuka @anderson-otuka-dextra https://github.com/anderson-otuka-dextra
Andras @andrasq https://github.com/andrasq
Andrea Gariboldi @aaaristo https://github.com/aaaristo
Andrea Passaglia @gurghet https://github.com/gurghet
Andrea Reginato @andreareginato https://github.com/andreareginato
Andreas Pålsson @apals https://github.com/apals
Andrei Rusu @beatfactor https://github.com/beatfactor
Andres Gariglio @andresgariglio https://github.com/andresgariglio
Andrew Chilton @chilts https://github.com/chilts
Andrew Krespanis @andrewk https://github.com/andrewk
Andrew Luetgers @andrewluetgers https://github.com/andrewluetgers
Andrew Luhring @andrew-luhring https://github.com/andrew-luhring
Andrew Matteson @aromatt https://github.com/aromatt
Andrew T. Poe @andrewtpoe https://github.com/andrewtpoe
Andri Möll @moll https://github.com/moll
André Cruz @satazor https://github.com/satazor
André Gaul @andrenarchy https://github.com/andrenarchy
André Rodrigues @andrerod https://github.com/andrerod
Andy Fowler @andyfowler https://github.com/andyfowler
Andy Kramolisch @andykram https://github.com/andykram
Ankur Oberoi @aoberoi https://github.com/aoberoi
Ankush Sharma @darxtrix https://github.com/darxtrix
Anny He @annyh https://github.com/annyh
Anshuman Verma @anshumanv https://github.com/anshumanv
Anthony BARRE @abarre https://github.com/abarre
Anthony Hildoer @ahildoer https://github.com/ahildoer
Antoine Le Taxin @ModuloM https://github.com/ModuloM
Antoine R. Dumont @ardumont https://github.com/ardumont
Antoine Rey @antoinerey https://github.com/antoinerey
Anton @z-vr https://github.com/z-vr
Anton Samper Rivaya @antonsamper https://github.com/antonsamper
Aria Stewart @aredridel https://github.com/aredridel
Arjan Frans @arjanfrans https://github.com/arjanfrans
Arnau González @arnaugm https://github.com/arnaugm
Aron Woost @aronwoost https://github.com/aronwoost
Artem Zakharchenko @blackrabbit99 https://github.com/blackrabbit99
Artur Mkrtchyan @arturmkrtchyan https://github.com/arturmkrtchyan
Asaf Mesika @asafm https://github.com/asafm
Ashik Vetrivelu @ashik94vc https://github.com/ashik94vc
Assaf Arkin @assaf https://github.com/assaf
Atishay Jain @atishay https://github.com/atishay
Attila Incze @atimb https://github.com/atimb
Aurélien Thieriot @athieriot https://github.com/athieriot
Austin Birch @austinbirch https://github.com/austinbirch
Austin Mao @austinmao https://github.com/austinmao
Avi (Ananya) Das @avidas https://github.com/avidas
Avi Deitcher @deitch https://github.com/deitch
Aviad Moreshet @CodeJjang https://github.com/CodeJjang
Balazs Nagy @balnagy https://github.com/balnagy
Bartek Szopka @bartaz https://github.com/bartaz
Bay @yamikuronue https://github.com/yamikuronue
Beilan Wang @beilanwang https://github.com/beilanwang
Ben Buckman @benbuckman https://github.com/benbuckman
Ben Feigin @bfeigin https://github.com/bfeigin
Ben Gilman @BenMGilman https://github.com/BenMGilman
Ben Stokoe @benstokoe https://github.com/benstokoe
Benjamin E. Coe @bcoe https://github.com/bcoe
Benjamin Urban @benurb https://github.com/benurb
Benny Neugebauer @bennyn https://github.com/bennyn
Bharath Raja @bigomega https://github.com/bigomega
Bin Chang @BinChang https://github.com/BinChang
Boris Serebrov @serebrov https://github.com/serebrov
Boubker Boulahdid @bboulahdid https://github.com/bboulahdid
Bradley Bridges @bbridges https://github.com/bbridges
Brandon Keepers @bkeepers https://github.com/bkeepers
Branko Zivanovic @zivanovicb1 https://github.com/zivanovicb1
Brent Van Minnen @Bjvanminnen https://github.com/Bjvanminnen
Brett Porter @brettporter https://github.com/brettporter
Brian Beck @exogen https://github.com/exogen
Brian Dentino @bdentino https://github.com/bdentino
Brian Hann @c0bra https://github.com/c0bra
Brian J Brennan @brianloveswords https://github.com/brianloveswords
Brian M. Jemilo II @JemiloII https://github.com/JemiloII
Brian Mann @brian-mann https://github.com/brian-mann
Brian Mortenson @bgmort https://github.com/bgmort
Bruno Quaresma @BrunoQuaresma https://github.com/BrunoQuaresma
Bryan Joseph @bj97301 https://github.com/bj97301
Byron Bai @happybai https://github.com/happybai
C. T. Lin @chentsulin https://github.com/chentsulin
Cache Hamm @CacheControl https://github.com/CacheControl
Cacie Prins @cacieprins https://github.com/cacieprins
Cade Ward @cadebward https://github.com/cadebward
Cameron Lakenen @lakenen https://github.com/lakenen
Cameron Roe @cameronroe https://github.com/cameronroe
Cameron Sutter @cameronsutter https://github.com/cameronsutter
Carl Ansley @carlansley https://github.com/carlansley
Carl Napier-Cook @carlnc https://github.com/carlnc
Carlos Guerrero @guerrerocarlos https://github.com/guerrerocarlos
Carlos Villuendas Zambrana @carlosvillu https://github.com/carlosvillu
Celestino Ferreira Gomes @tinogomes https://github.com/tinogomes
Charles Lindsay @chazomaticus https://github.com/chazomaticus
Charles Phillips @doublerebel https://github.com/doublerebel
Charlie Briggs @Limess https://github.com/Limess
Charlie Robbins @indexzero https://github.com/indexzero
Charlie Rudolph @charlierudolph https://github.com/charlierudolph
Chase Wilson @jiggliemon https://github.com/jiggliemon
Chevdor @chevdor https://github.com/chevdor
Chris Cuellar @ChrisC https://github.com/ChrisC
Chris Jamieson @jamiesoncj https://github.com/jamiesoncj
Chris Keen @zedd45 https://github.com/zedd45
Chris Salvato @csalvato https://github.com/csalvato
Chris Thompson @cjthompson https://github.com/cjthompson
Chris Ward @cw6365 https://github.com/cw6365
Christoph Neuroth @c089 https://github.com/c089
Christoph Wagner @PandaWhisperer https://github.com/PandaWhisperer
Christopher Stone @ctstone https://github.com/ctstone
Claudio Petrini @claudiopetrini https://github.com/claudiopetrini
Claudius Coenen @ccoenen https://github.com/ccoenen
Cody A. Taylor @CodeMan99 https://github.com/CodeMan99
Cody Greene @cody-greene https://github.com/cody-greene
Cole Turner @coleturner https://github.com/coleturner
Cory Reed @swashcap https://github.com/swashcap
Cosmo Wolfe @cozmo https://github.com/cozmo
Coveralls @coveralls https://github.com/coveralls
Craig Freeman @CFreeAtEbsco https://github.com/CFreeAtEbsco
Craig Morris @morrislaptop https://github.com/morrislaptop
Cristian Cialli @ciccia https://github.com/ciccia
Cristian Szwarc @cristianszwarc https://github.com/cristianszwarc
Csaba Palfi @csabapalfi https://github.com/csabapalfi
Cyril Auburtin @caub https://github.com/caub
DONGKEON KIM @shallwefootball https://github.com/shallwefootball
Dallon Feldner @dallonf https://github.com/dallonf
Damian Janowski @djanowski https://github.com/djanowski
Damian Kaczmarek @Rush https://github.com/Rush
Damian Krzeminski @pirxpilot https://github.com/pirxpilot
Dan @danpantry https://github.com/danpantry
Dan Jenkins @danjenkins https://github.com/danjenkins
Dan Ristea @danrr https://github.com/danrr
Dan Riti @danriti https://github.com/danriti
Daniel Bretoi @danielb2 https://github.com/danielb2
Daniel Fenton @dmfenton https://github.com/dmfenton
Daniel Pupius @dpup https://github.com/dpup
Daniel Upton @elkelk https://github.com/elkelk
Daniil Zavyalov @daniilzav123 https://github.com/daniilzav123
Daniël Illouz @danillouz https://github.com/danillouz
Dank @dannyid https://github.com/dannyid
Danny Andrews @danny-andrews https://github.com/danny-andrews
Dario Spadoni @dariospadoni https://github.com/dariospadoni
Dave Cadwallader @geekdave https://github.com/geekdave
Dave Jensen @djensen47 https://github.com/djensen47
Dave Meehan @dmeehan1968 https://github.com/dmeehan1968
Dave Schinkel @dschinkel https://github.com/dschinkel
David Björklund @kesla https://github.com/kesla
David Braun @NodeGuy https://github.com/NodeGuy
David Chambers @davidchambers https://github.com/davidchambers
David Chase @davidchase https://github.com/davidchase
David Cho-Lerat @david-cho-lerat-HL2 https://github.com/david-cho-lerat-HL2
David Judik @judikdavid https://github.com/judikdavid
David M. Lee @leedm777 https://github.com/leedm777
David Pate @DavidTPate https://github.com/DavidTPate
David Rissato Cruz @davidrissato https://github.com/davidrissato
David Rousselie @dax https://github.com/dax
David Schoen @neerolyte https://github.com/neerolyte
David Stone @dcstone09 https://github.com/dcstone09
David Tanner @DavidTanner https://github.com/DavidTanner
David Wong @sirdavidwong https://github.com/sirdavidwong
Davit Ohanyan @OhDavit https://github.com/OhDavit
Dawid Ciężarkiewicz @dpc https://github.com/dpc
Deepti Agrawal @deeptiagrawa https://github.com/deeptiagrawa
Dennis Johnson @songawee https://github.com/songawee
Devanshu Gupta @devanshug https://github.com/devanshug
Devin Jett @djett41 https://github.com/djett41
Devon Wesley @devonwesley https://github.com/devonwesley
Diana Ionita @DianaIonita https://github.com/DianaIonita
Diana Thayer @garbados https://github.com/garbados
Diego Aguilar Aguilar @diegoaguilar https://github.com/diegoaguilar
Diego José Molina González @kaizenberg https://github.com/kaizenberg
Diego Rani Mazine @dmazine https://github.com/dmazine
Dimitri Rosenberg @rosendi https://github.com/rosendi
Dimitris Halatsis @mitsos1os https://github.com/mitsos1os
Dipun Mistry @dipunm https://github.com/dipunm
Dmitrii Sorin @1999 https://github.com/1999
Dmitry Polushkin @dmitry https://github.com/dmitry
Dmytro Semenov @dimichgh https://github.com/dimichgh
Doan Nguyen @nguyendinhdoan https://github.com/nguyendinhdoan
Domenic Denicola @domenic https://github.com/domenic
Dominic Barnes @dominicbarnes https://github.com/dominicbarnes
Dominykas Blyžė @dominykas https://github.com/dominykas
Douglas Eggleton @douglaseggleton https://github.com/douglaseggleton
Duke Jones @dukejones https://github.com/dukejones
Dustin Deus @StarpTech https://github.com/StarpTech
Dustin J. Mitchell @djmitche https://github.com/djmitche
Dylan Millikin @PommeVerte https://github.com/PommeVerte
Dávid Szakállas @dszakallas https://github.com/dszakallas
E W @walshe https://github.com/walshe
E. Itah @eitah https://github.com/eitah
Ed @anotheredward https://github.com/anotheredward
Ed Moore @eddiemoore https://github.com/eddiemoore
Edan Schwartz @eschwartz https://github.com/eschwartz
Eddie Antonio Santos @eddieantonio https://github.com/eddieantonio
Edo Rivai @edorivai https://github.com/edorivai
Eduard Bondarenko @eduardbcom https://github.com/eduardbcom
Elnur Abdurrakhimov @elnur https://github.com/elnur
Emelia Smith @ThisIsMissEm https://github.com/ThisIsMissEm
Emily M Coco @emilycoco https://github.com/emilycoco
Enzo Hernan NIcolorich @dkenzox https://github.com/dkenzox
Eric @calidion https://github.com/calidion
Eric Adamski @ericadamski https://github.com/ericadamski
Eric Hulburd @erichulburd https://github.com/erichulburd
Eric Saboia @ericsaboia https://github.com/ericsaboia
Eric Skogen @audionerd https://github.com/audionerd
Erik Rothwell @bacchusrx https://github.com/bacchusrx
Erik W @technicallyerik https://github.com/technicallyerik
Erol Akarsu @eakarsu https://github.com/eakarsu
Esa-Matti Suuronen @epeli https://github.com/epeli
Espen Hovlandsdal @rexxars https://github.com/rexxars
Esteban @invernizzie https://github.com/invernizzie
Ethan Arrowood @Ethan-Arrowood https://github.com/Ethan-Arrowood
Ethan Garofolo @juanpaco https://github.com/juanpaco
Eugene Krevenets @hyzhak https://github.com/hyzhak
Evan Davis @evandavis https://github.com/evandavis
Evan Faulk @faulke https://github.com/faulke
Evan Siroky @evansiroky https://github.com/evansiroky
Evgenii Ponomarev @Elergy https://github.com/Elergy
Evgeny Zislis @kesor https://github.com/kesor
Eyo O. E. @maziey93 https://github.com/maziey93
Fabiano França @fabiano https://github.com/fabiano
Facundo Olano @facundoolano https://github.com/facundoolano
Faiq Raza @faiq https://github.com/faiq
Farid Nouri Neshat @alFReD-NSH https://github.com/alFReD-NSH
Felipe Dornelas @felipead https://github.com/felipead
Felipe Rocha @felipellrocha https://github.com/felipellrocha
Ferriel Melarpis @FerrielMelarpis https://github.com/FerrielMelarpis
Filip Skokan @panva https://github.com/panva
Filipe Deschamps @filipedeschamps https://github.com/filipedeschamps
Francesc Rosas @frosas https://github.com/frosas
Francesco Negri @dhinus https://github.com/dhinus
Francis Gulotta @reconbot https://github.com/reconbot
Francis Zabala @franciszabala https://github.com/franciszabala
Frank @yeahoffline https://github.com/yeahoffline
Frank Jakop @fjakop https://github.com/fjakop
Fred Mameri @CodeFred https://github.com/CodeFred
Frederic Hemberger @fhemberger https://github.com/fhemberger
Fábio Santos @fabiosantoscode https://github.com/fabiosantoscode
G Kiran Kumar Reddy @norules4kiran https://github.com/norules4kiran
Gabe Gorelick @gabegorelick https://github.com/gabegorelick
Gabe Isman @GabeIsman https://github.com/GabeIsman
Gabriel Birke @gbirke https://github.com/gbirke
Gabriel Falkenberg @gabrielf https://github.com/gabrielf
Gabriel Nyante @heregoes https://github.com/heregoes
Gabriel Théron @GabeAtWork https://github.com/GabeAtWork
Gabriel Wicke @gwicke https://github.com/gwicke
Gajus Kuizinas @gajus https://github.com/gajus
Garry Polley @garrypolley https://github.com/garrypolley
Gary Cheng @yra99ary https://github.com/yra99ary
Gastón Avila @avilaton https://github.com/avilaton
Gastón Jorquera @gjorquera https://github.com/gjorquera
Gavin Mogan @halkeye https://github.com/halkeye
George Kalpakas @gkalpak https://github.com/gkalpak
George Katsanos @gkatsanos https://github.com/gkatsanos
George Maddocks @gwpmad https://github.com/gwpmad
George Miroshnykov @laggyluke https://github.com/laggyluke
George Ornbo @shapeshed https://github.com/shapeshed
Gergo Barcza @barczaG https://github.com/barczaG
Gio d'Amelio @giodamelio https://github.com/giodamelio
Girish Ramakrishnan @gramakri https://github.com/gramakri
Golo Roden @goloroden https://github.com/goloroden
Goran Gajic @gorangajic https://github.com/gorangajic
Greg Leppert @leppert https://github.com/leppert
Gregor Martynus @gr2m https://github.com/gr2m
Gregory Cowan @KrekkieD https://github.com/KrekkieD
Gurpreet Atwal @gurpreetatwal https://github.com/gurpreetatwal
Gustavo Henke @gustavohenke https://github.com/gustavohenke
Gustavo Jiménez @gustavjf https://github.com/gustavjf
Haider MA @hayderma https://github.com/hayderma
Hal Carleton @halcarleton https://github.com/halcarleton
Hari Prasetyo @hapr05 https://github.com/hapr05
Harlan T Wood @harlantwood https://github.com/harlantwood
Harry Hedger @hedgerh https://github.com/hedgerh
Harry Moreno @morenoh149 https://github.com/morenoh149
Haz @diegohaz https://github.com/diegohaz
Hector Guillermo Parra Alvarez (HGPA) @hparra https://github.com/hparra
Hendrik Cech @hendrikcech https://github.com/hendrikcech
Hendrik Liebau @KingHenne https://github.com/KingHenne
Herman @hermansb https://github.com/hermansb
Hidenari Nozaki @ghiden https://github.com/ghiden
Hirad Yazdanpanah @hiradyazdan https://github.com/hiradyazdan
Hugo Durães @hugoduraes https://github.com/hugoduraes
Hutson Betts @hbetts https://github.com/hbetts
Huu Da Tran @danosaure https://github.com/danosaure
Hyunju Choi @blackpost38 https://github.com/blackpost38
Ian Walker-Sperber @ianwsperber https://github.com/ianwsperber
Ian Young @iangreenleaf https://github.com/iangreenleaf
Igor Galić @igalic https://github.com/igalic
Igor Pelekhan @ipelekhan https://github.com/ipelekhan
Ihor Poplavskyi @Poplava https://github.com/Poplava
Ilya Antipenko @aivus https://github.com/aivus
Ilya Sotov @ilsotov https://github.com/ilsotov
Imran Chaudhry @imran-uk https://github.com/imran-uk
Ingwar Wirjawan @rawgni https://github.com/rawgni
Ioan Lucut @ioanlucut https://github.com/ioanlucut
Ioannis Poulakas @giannisp https://github.com/giannisp
Islam Sharabash @ibash https://github.com/ibash
Ivan Erceg @ierceg https://github.com/ierceg
Ivan Poluyanov @poluyanov https://github.com/poluyanov
Izaak Rogan @izaakrogan https://github.com/izaakrogan
Izik Lisbon @izikl https://github.com/izikl
Jack Franklin @jackfranklin https://github.com/jackfranklin
Jack Stevens @jpstevens https://github.com/jpstevens
Jacob Wejendorp @wejendorp https://github.com/wejendorp
Jake @samouri https://github.com/samouri
Jake Craige @jakecraige https://github.com/jakecraige
Jake Pruitt @jakepruitt https://github.com/jakepruitt
Jakub Holy @jakubholynet https://github.com/jakubholynet
James Filtness @jamesfiltness https://github.com/jamesfiltness
James Harrison Fisher @jameshfisher https://github.com/jameshfisher
James Herdman @jherdman https://github.com/jherdman
James Pace @pacey https://github.com/pacey
James Talmage @jamestalmage https://github.com/jamestalmage
Jamie Jennings @jamiemjennings https://github.com/jamiemjennings
Jamison Dance @jergason https://github.com/jergason
Jan Lehnardt @janl https://github.com/janl
Jan Potoms @Janpot https://github.com/Janpot
Jane Nguyen @piichimochi https://github.com/piichimochi
Jared Klopper @optical https://github.com/optical
Jarid Margolin @jaridmargolin https://github.com/jaridmargolin
Jason Avinger @jasonav https://github.com/jasonav
Jason Fischl @jfischl https://github.com/jfischl
Jason Galea @lecstor https://github.com/lecstor
Jason Kuhrt @jasonkuhrt https://github.com/jasonkuhrt
Jason Plumb @breedx2 https://github.com/breedx2
Jasper Kuperus @jasperkuperus https://github.com/jasperkuperus
Jay Chae @chaekit https://github.com/chaekit
Jeff @visualjeff https://github.com/visualjeff
Jeff Burn @jeffora https://github.com/jeffora
Jeff Dickey @jdxcode https://github.com/jdxcode
Jeff Lee @jeffomatic https://github.com/jeffomatic
Jeffrey Charles @jeffcharles https://github.com/jeffcharles
Jeffrey Jagoda @jagoda https://github.com/jagoda
Jehan @jtremback https://github.com/jtremback
Jens Claes @entropitor https://github.com/entropitor
Jens Peter Secher @jpsecher https://github.com/jpsecher
JeongHoon Byun (aka Outsider) @outsideris https://github.com/outsideris
Jeremiah Lee @jeremiahlee https://github.com/jeremiahlee
Jeremy Sik @jeremysik https://github.com/jeremysik
Jerome Gravel-Niquet @jeromegn https://github.com/jeromegn
Jesús Leganés-Combarro @piranna https://github.com/piranna
Jezeniel Zapanta @jezeniel https://github.com/jezeniel
Jhuliano Skittberg Moreno @jhuliano https://github.com/jhuliano
Jianzhong Chen @cjzcpsyx https://github.com/cjzcpsyx
Jiayi Hu @jiayihu https://github.com/jiayihu
Jim Brusstar @jimbru https://github.com/jimbru
Jinwoo Lee @jinwoo https://github.com/jinwoo
Jiri Spac @capaj https://github.com/capaj
Joaquim Serafim @joaquimserafim https://github.com/joaquimserafim
Joe Becher @drazisil https://github.com/drazisil
Joe Kent @itsjoekent https://github.com/itsjoekent
Joe Norman @joseph-norman https://github.com/joseph-norman
Joe Smith @Yasumoto https://github.com/Yasumoto
Johan Borestad @borestad https://github.com/borestad
Johan Nordberg @jnordberg https://github.com/jnordberg
Johannes Jörg Schmidt @jo https://github.com/jo
Johannes Zellner @nebulade https://github.com/nebulade
John @jhnlsn https://github.com/jhnlsn
John Duhamel @jjduhamel https://github.com/jjduhamel
John Dzak @jdzak https://github.com/jdzak
John Mathis @JohnDMathis https://github.com/JohnDMathis
John T @digitaltsai https://github.com/digitaltsai
John-David Dalton @jdalton https://github.com/jdalton
Jon B @PizzaAficionado https://github.com/PizzaAficionado
Jon Jaques @jonjaques https://github.com/jonjaques
Jon Skulski @jskulski https://github.com/jskulski
Jonas Lilja @jlilja https://github.com/jlilja
Jonas Scheffner @jscheffner https://github.com/jscheffner
Jonathan Bergknoff @jbergknoff https://github.com/jbergknoff
Jonathan Glock @glockjt https://github.com/glockjt
Jonathan Lau @jonahlau https://github.com/jonahlau
Jonathan Otto @jotto https://github.com/jotto
Jonathan Petitcolas @jpetitcolas https://github.com/jpetitcolas
Jonathan Rainey @Tivoli https://github.com/Tivoli
Jonathon Herbert @jonathonherbert https://github.com/jonathonherbert
Joni Salmi @josalmi https://github.com/josalmi
Jordan Harband @ljharb https://github.com/ljharb
Joseph Callaars @bcallaars https://github.com/bcallaars
Josh Crowther @jshcrowthe https://github.com/jshcrowthe
Josh Marchello @jmarchello https://github.com/jmarchello
Josh McMillan @mcmillan https://github.com/mcmillan
Joshua Acheson @joshacheson https://github.com/joshacheson
Joshua Holbrook @jfhbrook https://github.com/jfhbrook
Josip Delic @delijati https://github.com/delijati
José F. Romaniello @jfromaniello https://github.com/jfromaniello
João Ferreira @jmnsf https://github.com/jmnsf
Juan Cruz Viotti @jviotti https://github.com/jviotti
Julian Hille @julianhille https://github.com/julianhille
Juraci de Lima Vieira Neto @Juraci https://github.com/Juraci
Justin @justincy https://github.com/justincy
Justin Helmer @justinhelmer https://github.com/justinhelmer
Justin Marrington @HowlingEverett https://github.com/HowlingEverett
Jérôme Avoustin @rehia https://github.com/rehia
Jörg Henning @joerx https://github.com/joerx
Kafo @hyalkaf https://github.com/hyalkaf
Kai Schwarz @papakai https://github.com/papakai
Kaiwalya Kher @knkher https://github.com/knkher
Kalashnikov Igor @silentroach https://github.com/silentroach
Kamal Marhubi @kamalmarhubi https://github.com/kamalmarhubi
Karina Jain @sacredMonster https://github.com/sacredMonster
Karl Atkinson @karlatkinson https://github.com/karlatkinson
Karol Janyst @LKay https://github.com/LKay
Ke Zhu @shawnzhu https://github.com/shawnzhu
Keith Laban @kelaban https://github.com/kelaban
Kelly @kellyrmilligan https://github.com/kellyrmilligan
Ken Ding @choonkending https://github.com/choonkending
Ken Sheedlo @ksheedlo https://github.com/ksheedlo
Kevin Bloch (@codingthat) @codingthat https://github.com/codingthat
Kevin Burke @kevinburke https://github.com/kevinburke
Kevin Burke @kevinburkeshyp https://github.com/kevinburkeshyp
Kevin Hodges @kevinhodges https://github.com/kevinhodges
Kevin Ingersoll @holic https://github.com/holic
Kevin Locke @kevinoid https://github.com/kevinoid
Kevin McDermott @bigkevmcd https://github.com/bigkevmcd
Kevin Smith @ksmith97 https://github.com/ksmith97
Kevin Whitaker @kwhitaker https://github.com/kwhitaker
Kevin Woo @kevinawoo https://github.com/kevinawoo
Keyvan Fatehi @kfatehi https://github.com/kfatehi
Khizar @khizar https://github.com/khizar
Kilian Ciuffolo @kilianc https://github.com/kilianc
Kimmo Brunfeldt @kimmobrunfeldt https://github.com/kimmobrunfeldt
Kirill Enykeev @enykeev https://github.com/enykeev
Komran Rashidov @krashidov https://github.com/krashidov
Konstantin Koss @KonstantinKo https://github.com/KonstantinKo
Kostas @vrinek https://github.com/vrinek
Krishna Rajendran @blazzy https://github.com/blazzy
Kun Yan @kunyan https://github.com/kunyan
Kyle White @chainlink https://github.com/chainlink
Kévin Bernard-Allies @BAKFR https://github.com/BAKFR
LAU Thierry @lauterry https://github.com/lauterry
Lars Haßler @LarsHassler https://github.com/LarsHassler
Lars Nyström @larsnystrom https://github.com/larsnystrom
Leo Iannacone @LeoIannacone https://github.com/LeoIannacone
Leo Liang @aleung https://github.com/aleung
Leo Soto @leosoto https://github.com/leosoto
Leon Rinkel @leonrinkel https://github.com/leonrinkel
Leonardo Couto @wallacyyy https://github.com/wallacyyy
Leonid Blinov @lblinovs https://github.com/lblinovs
Levi Wheatcroft @leviwheatcroft https://github.com/leviwheatcroft
Liam Morley @carpeliam https://github.com/carpeliam
Linus Unnebäck @LinusU https://github.com/LinusU
Lior Brauer @liorbrauer https://github.com/liorbrauer
Little Gnome @LittleGnome https://github.com/LittleGnome
Logan Allred @redbugz https://github.com/redbugz
Logan Tegman @ltegman https://github.com/ltegman
Lohann Paterno Coutinho Ferreira @Lohann https://github.com/Lohann
Loïc Mahieu @LoicMahieu https://github.com/LoicMahieu
Luan Nico @luanpotter https://github.com/luanpotter
Lucas Feliciano @lucasfeliciano https://github.com/lucasfeliciano
Lucas Lago @lucaslago https://github.com/lucaslago
Luigi Pinca @lpinca https://github.com/lpinca
Luis Del Águila @delaguilaluis https://github.com/delaguilaluis
Luke Childs @lukechilds https://github.com/lukechilds
Luke Nimtz @protometa https://github.com/protometa
Luu Ninh @ninhxuanluu https://github.com/ninhxuanluu
MJ @maheshjag https://github.com/maheshjag
Mac Angell @mac- https://github.com/mac-
Maciek Sakrejda @uhoh-itsmaciek https://github.com/uhoh-itsmaciek
Madan Raj @manmadan03 https://github.com/manmadan03
Malcolm Rebughini @malcolmrebughini https://github.com/malcolmrebughini
Manan Jadhav @CurosMJ https://github.com/CurosMJ
Maor Hayoun @maorhayoun https://github.com/maorhayoun
Marc Boscher @marcboscher https://github.com/marcboscher
Marco @marco-c https://github.com/marco-c
Marco Nascimento (Coi) @Coooi https://github.com/Coooi
Mario Mendes @hyprstack https://github.com/hyprstack
Mario Mol @mariohmol https://github.com/mariohmol
Mario Pareja @mpareja https://github.com/mpareja
Mark Meyer @mark-meyer https://github.com/mark-meyer
Mark van Cuijk @phedny https://github.com/phedny
Martin Charles @0xcaff https://github.com/0xcaff
Martin Dimitrov @clicktravel-martindimitrov https://github.com/clicktravel-martindimitrov
Martin Kuba @martinkuba https://github.com/martinkuba
Martin Wawrusch @mwawrusch https://github.com/mwawrusch
Martin Štekl @stekycz https://github.com/stekycz
Matan Hershberg @matanh-tzmedical https://github.com/matanh-tzmedical
Mathew Joe Thomas @disrupticons https://github.com/disrupticons
Mathias Schreck @lo1tuma https://github.com/lo1tuma
Mathieu Derelle @MathieuDerelle https://github.com/MathieuDerelle
Matias Singers @matiassingers https://github.com/matiassingers
Matija Marohnić @silvenon https://github.com/silvenon
Matt Dell @mattdell https://github.com/mattdell
Matt Ferrante @ferrants https://github.com/ferrants
Matt Kantor @mkantor https://github.com/mkantor
Matt Knight @abstractvector https://github.com/abstractvector
Matt Lavin @mdlavin https://github.com/mdlavin
Matt Oakes @matt-oakes https://github.com/matt-oakes
Matt Olson @mlolson https://github.com/mlolson
Matt Robenolt @mattrobenolt https://github.com/mattrobenolt
Matt Tortolani @doodlemoonch https://github.com/doodlemoonch
Matt Travi @travi https://github.com/travi
Matteo Contrini @matteocontrini https://github.com/matteocontrini
Matteo Mazzarolo @mmazzarolo https://github.com/mmazzarolo
Matthew Mirande @busticated https://github.com/busticated
Matthew Oaxaca @moaxaca https://github.com/moaxaca
Matthew Robben @mfrobben https://github.com/mfrobben
Matthew Turney @pho3nixf1re https://github.com/pho3nixf1re
Mattia Asti @mtt87 https://github.com/mtt87
Max Brosnahan @gingermusketeer https://github.com/gingermusketeer
Max Greenblatt @maxGreenblatt https://github.com/maxGreenblatt
Mayank Badola @mbad0la https://github.com/mbad0la
Mayur Awaghade @mayurva https://github.com/mayurva
Michael Diep @MADiep https://github.com/MADiep
Michael Ford @mtford90 https://github.com/mtford90
Michael Graf @MaerF0x0 https://github.com/MaerF0x0
Michael J. Abraham @mjabraham47 https://github.com/mjabraham47
Michael K @0815fox https://github.com/0815fox
Michael Lippens @mlippens https://github.com/mlippens
Michael Nisi @michaelnisi https://github.com/michaelnisi
Michael Pardue @mpardue https://github.com/mpardue
Michael Pratt @Urthen https://github.com/Urthen
Michael Seidel @mjseidel https://github.com/mjseidel
Michael Vogt @neophob https://github.com/neophob
Michael Walker @cmswalker https://github.com/cmswalker
Michael Weibel @mweibel https://github.com/mweibel
Michał Wadas @Ginden https://github.com/Ginden
Michele Spina @mikspi https://github.com/mikspi
Michiel Helvensteijn @mhelvens https://github.com/mhelvens
Mickaël Tricot @mickaeltr https://github.com/mickaeltr
Miguel Espinoza @purefan https://github.com/purefan
Miguel Isidoro @misidoro https://github.com/misidoro
Miha Rebernik @mihar https://github.com/mihar
Mikael Arneborn @marneborn https://github.com/marneborn
Mike Chen @mhchen https://github.com/mhchen
Mike Emery @MikeEmery https://github.com/MikeEmery
Mike James @export-mike https://github.com/export-mike
Mike Reinstein @mreinstein https://github.com/mreinstein
Mikela @glassresistor https://github.com/glassresistor
Mikey Powers @mvpowers https://github.com/mvpowers
Mikko Koponen @mtkopone https://github.com/mtkopone
Minh Son Nguyen @nguymin4 https://github.com/nguymin4
Mohammad Salim @MSaIim https://github.com/MSaIim
MooYeol Prescott Lee @mooyoul https://github.com/mooyoul
Naga Pavan Kumar Kunisetty @nagapavan https://github.com/nagapavan
Nate Wang @supnate https://github.com/supnate
Nathan @naw https://github.com/naw
Nathan Friedly @nfriedly https://github.com/nfriedly
Nathan Houle @ndhoule https://github.com/ndhoule
Nathan Richards @LAD500 https://github.com/LAD500
Neeraj @smurfpandey https://github.com/smurfpandey
Nic Haynes @nicinabox https://github.com/nicinabox
Nicholas Calugar @SocalNick https://github.com/SocalNick
Nick Howes @halfninja https://github.com/halfninja
Nick Stefan @NickStefan https://github.com/NickStefan
Nicky Jay @niksajanjic https://github.com/niksajanjic
Nico Schlömer @nschloe https://github.com/nschloe
Nicolas Del Valle @ndelvalle https://github.com/ndelvalle
Nicolas Froidure @nfroidure https://github.com/nfroidure
Nicolas Lacasse @nlacasse https://github.com/nlacasse
Nicolás Bevacqua @bevacqua https://github.com/bevacqua
Niels Krijger @nielskrijger https://github.com/nielskrijger
Nikita Vasilevskiy @Nigrimmist https://github.com/Nigrimmist
Nikolaus Piccolotto @prayerslayer https://github.com/prayerslayer
Nils Bunger @nilsbunger https://github.com/nilsbunger
Nils Knappmeier @nknapp https://github.com/nknapp
Nock Bot @nockbot https://github.com/nockbot
Nordes Ménard-Lamarre @Nordes https://github.com/Nordes
Nuno Job @dscape https://github.com/dscape
Nuno Sousa @nunofgs https://github.com/nunofgs
Oleg @omakoleg https://github.com/omakoleg
Oliver Wong @owiber https://github.com/owiber
Olivier Louvignes @mgcrea https://github.com/mgcrea
Olivier Tassinari @oliviertassinari https://github.com/oliviertassinari
Omar Khan @omarkhan https://github.com/omarkhan
Ondřej Ždych @zdychacek https://github.com/zdychacek
Operations Research Engineering Software+ @ORESoftware https://github.com/ORESoftware
Owen Evans @buildmaster https://github.com/buildmaster
Pablo Lacerda de Miranda @pablolmiranda https://github.com/pablolmiranda
Pascal Lalancette @okcompute https://github.com/okcompute
Patrick Williams @pwmckenna https://github.com/pwmckenna
Paul Dechov @dechov https://github.com/dechov
Paul Fox @gibbitz https://github.com/gibbitz
Paul Jaworski @paulwithap https://github.com/paulwithap
Paul Lunow @lunow https://github.com/lunow
Paul Melnikow @paulmelnikow https://github.com/paulmelnikow
Pauli Price @marfarma https://github.com/marfarma
Pavel @PavelPolyakov https://github.com/PavelPolyakov
Pavel Teshchin @satispunk https://github.com/satispunk
Pedro Costa Neves @persocon https://github.com/persocon
Pedro Pinho @donbitto https://github.com/donbitto
Pedro Teixeira @pgte https://github.com/pgte
Petar Dodev @dodev https://github.com/dodev
Peter A. Bigot @pabigot https://github.com/pabigot
Peter Berg @peteratticusberg https://github.com/peteratticusberg
Peter Chanthamynavong @peterkc https://github.com/peterkc
Peter Conerly @pconerly https://github.com/pconerly
Peter Czibik @peteyycz https://github.com/peteyycz
Peter Lyons @focusaurus https://github.com/focusaurus
Peter Strøiman @stroiman https://github.com/stroiman
Petr Joachim @petrjoachim https://github.com/petrjoachim
Phaninder Pasupula @pasupulaphani https://github.com/pasupulaphani
Phil Wells @thephilwells https://github.com/thephilwells
Philip Kobernik @philipkobernik https://github.com/philipkobernik
Philipp Kretzschmar @k0pernikus https://github.com/k0pernikus
Philipp Kyeck @pkyeck https://github.com/pkyeck
Pierre Voisin @pvoisin https://github.com/pvoisin
Prabir Shrestha @prabirshrestha https://github.com/prabirshrestha
Prodigy @surya12badrinath https://github.com/surya12badrinath
Prokop Simek @prokopsimek https://github.com/prokopsimek
Puneet Gupta @puneetguptanitj https://github.com/puneetguptanitj
Rachel H @rainyday https://github.com/rainyday
Rafael @rgarcia https://github.com/rgarcia
Rahul Chaudhary @rash805115 https://github.com/rash805115
Raine Virta @raine https://github.com/raine
Raphael Luciano de Pontes @raphael-luciano https://github.com/raphael-luciano
Raquel Vélez @rockbot https://github.com/rockbot
Rashid Omar @rashthedude https://github.com/rashthedude
Ray Tung @raytung https://github.com/raytung
Reda @redben https://github.com/redben
Rhys Evans @wheresrhys https://github.com/wheresrhys
Ricard Fredin @Cordazar https://github.com/Cordazar
Ricardo Bordon @rjbordon https://github.com/rjbordon
Ricardo Gama @ricardogama https://github.com/ricardogama
Richard Harrington @FuzzySockets https://github.com/FuzzySockets
Richard Lay @richardlay https://github.com/richardlay
Richard Littauer @RichardLitt https://github.com/RichardLitt
Richard Meijer @richmeij https://github.com/richmeij
Richard Scarrott @richardscarrott https://github.com/richardscarrott
Richard Watkins @RichardWatkins1 https://github.com/RichardWatkins1
Rico Sta. Cruz @rstacruz https://github.com/rstacruz
Rob Ballou @robballou https://github.com/robballou
Rob Calcroft @robcalcroft https://github.com/robcalcroft
Rob Forsythe @robforsythe https://github.com/robforsythe
Rob Stevenson @thisdotrob https://github.com/thisdotrob
Rob Wu @Rob--W https://github.com/Rob--W
Robert Hurst @RobertWHurst https://github.com/RobertWHurst
Robert Simpson @rsimp https://github.com/rsimp
Robin Bobbitt @robinbobbitt https://github.com/robinbobbitt
Roch Devost @rochdev https://github.com/rochdev
Rocky Assad @CodisRedding https://github.com/CodisRedding
Rod Howard @rodhoward https://github.com/rodhoward
Rodrigo Gomes da Silva @rodrigogs https://github.com/rodrigogs
Rohit Kalkur @rovolution https://github.com/rovolution
Rolf Strijdhorst @rolfst https://github.com/rolfst
Romain @rprieto https://github.com/rprieto
Roman @moltar https://github.com/moltar
Roman Hotsiy @RomanGotsiy https://github.com/RomanGotsiy
Roman Pearah @neverfox https://github.com/neverfox
Roman Shtylman @defunctzombie https://github.com/defunctzombie
Ronan Jouchet @ronjouch https://github.com/ronjouch
Ronen Amiel @ronami https://github.com/ronami
Rong Sen Ng @motss https://github.com/motss
Rory Dent @Thebigbignooby https://github.com/Thebigbignooby
Roy Choo @roychoo https://github.com/roychoo
Ruben Verborgh @RubenVerborgh https://github.com/RubenVerborgh
Rudy Jahchan @rudyjahchan https://github.com/rudyjahchan
Rui Marinho @ruimarinho https://github.com/ruimarinho
Rui Quelhas @ruiquelhas https://github.com/ruiquelhas
Ruimou Xu @noperative https://github.com/noperative
Russell Dempsey @SgtPooki https://github.com/SgtPooki
Ryan Juve @ryanjuve-porch https://github.com/ryanjuve-porch
Ryan Lewis @ryanmurakami https://github.com/ryanmurakami
Ryan Zander @Exide https://github.com/Exide
Ryan Zec @ryanzec https://github.com/ryanzec
Ryunosuke Sato @tricknotes https://github.com/tricknotes
Rémi Bèges @Overdrivr https://github.com/Overdrivr
Rémi Jarasson @ArTiSTiX https://github.com/ArTiSTiX
Rémy Boulanouar @DblK https://github.com/DblK
Rémy HUBSCHER @Natim https://github.com/Natim
SARUNYHOT SUVANNACHOTI @chenka https://github.com/chenka
Sahat Yalkabov @sahat https://github.com/sahat
Sam Saccone @samccone https://github.com/samccone
Sam Vloeberghs @samvloeberghs https://github.com/samvloeberghs
Samuel Roldan @sam3k https://github.com/sam3k
Samuel Thompson @samuelt1 https://github.com/samuelt1
Sarah Hayman @serahhh https://github.com/serahhh
Sarah Vessels @cheshire137 https://github.com/cheshire137
Saran Siriphantnon @deoxen0n2 https://github.com/deoxen0n2
Sascha Drews @perfusorius https://github.com/perfusorius
Saïd Tayebi @SaidTayebi https://github.com/SaidTayebi
Scott Tesoriere @scottkf https://github.com/scottkf
Sean @seanmcintyre https://github.com/seanmcintyre
Sean Massa @EndangeredMassa https://github.com/EndangeredMassa
Sean McLellan @Oceanswave https://github.com/Oceanswave
Sebastian Durandeu @sdurandeu https://github.com/sdurandeu
Sebastian Thiel @Byron-TW https://github.com/Byron-TW
Seth Miller @four43 https://github.com/four43
Seth Westphal @westy92 https://github.com/westy92
Sethen Maleno @sethen https://github.com/sethen
Seán Hayes @SeanHayes https://github.com/SeanHayes
Shahar Talmi @shahata https://github.com/shahata
Shai @shai32 https://github.com/shai32
Sharikov Vladislav @sharikovvladislav https://github.com/sharikovvladislav
Shota @shotaK https://github.com/shotaK
Shrey @shreychaturvedi123 https://github.com/shreychaturvedi123
Shu Pengfei @stormslowly https://github.com/stormslowly
Shuan Wang @swang https://github.com/swang
Siddhartha Dabral @sidabs https://github.com/sidabs
Silvio Rainoldi @ianaz https://github.com/ianaz
Simen Bekkhus @SimenB https://github.com/SimenB
Simon Brewster @ssbrewster https://github.com/ssbrewster
Simon Elvery @drzax https://github.com/drzax
Simon Legg @leggsimon https://github.com/leggsimon
Simon Taylor @s-taylor https://github.com/s-taylor
Simon Turvey @serenitus https://github.com/serenitus
Sindre Sorhus @sindresorhus https://github.com/sindresorhus
Soroush Pour @soroushjp https://github.com/soroushjp
Spencer @spalger https://github.com/spalger
Srdjan Cengic @srkimir https://github.com/srkimir
Stas Slesarev @ceoworks https://github.com/ceoworks
Stephen Cresswell @cressie176 https://github.com/cressie176
Stephen Matthew Davies @stevematdavies https://github.com/stevematdavies
Stephen Solka @trashhalo https://github.com/trashhalo
Stephen Sugden @grncdr https://github.com/grncdr
Stephen Woods @saw https://github.com/saw
Steve Gentile @sgentile https://github.com/sgentile
Steve Oliveira @soliveira-nascent https://github.com/soliveira-nascent
Steven Olsen @solsend2l https://github.com/solsend2l
Steven Oxley @xonev https://github.com/xonev
Steven Vachon @stevenvachon https://github.com/stevenvachon
Stian Grytøyr @stiang https://github.com/stiang
Stuart Dotson @sdotson https://github.com/sdotson
Sunil Lulla @sunil-lulla https://github.com/sunil-lulla
Suraj Byanju @surajbyanju https://github.com/surajbyanju
Sushant @sushantdhiman https://github.com/sushantdhiman
Sven Lito @svnlto https://github.com/svnlto
Swift @theycallmeswift https://github.com/theycallmeswift
Szymon Przybylski @sprzybylski https://github.com/sprzybylski
Tanner \tanman\ Hoisington @THoisington https://github.com/THoisington
Taylor Bockman @angrygoats https://github.com/angrygoats
Taylor Dawson @taylorjdawson https://github.com/taylorjdawson
Taylor Everding @taylor1791 https://github.com/taylor1791
Tedde Lundgren @tedeh https://github.com/tedeh
Terin Stock @terinjokes https://github.com/terinjokes
TheFive @TheFive https://github.com/TheFive
Theo Gravity @theogravity https://github.com/theogravity
Thiebaud Thomas @thomasthiebaud https://github.com/thomasthiebaud
Thierry Schellenbach @tschellenbach https://github.com/tschellenbach
Thomas Alexander @tomalex0 https://github.com/tomalex0
Thomas Heymann @cyberthom https://github.com/cyberthom
Thomas Lahr @tjlahr https://github.com/tjlahr
Thomas Parisot @oncletom https://github.com/oncletom
Thomas Rix @rixth https://github.com/rixth
Thomas Shafer @trshafer https://github.com/trshafer
Thomas Watson @watson https://github.com/watson
Tiago @tiagocpontesp https://github.com/tiagocpontesp
Tiago Ribeiro @fixe https://github.com/fixe
Tiagojsag @tiagojsag https://github.com/tiagojsag
Tim Jonischkat @timjonischkat https://github.com/timjonischkat
Tim Kindberg @timkindberg https://github.com/timkindberg
Tim Perry @pimterry https://github.com/pimterry
Tim Robinson @timjrobinson https://github.com/timjrobinson
Tim Rogers @timrogers https://github.com/timrogers
Tim Savery @timsavery https://github.com/timsavery
Tim Yager @creativetim https://github.com/creativetim
Tim Zaitsev @tzaitsev https://github.com/tzaitsev
Tobias Kaupat @Niondir https://github.com/Niondir
Tom @tconroy https://github.com/tconroy
Tom @traverse https://github.com/traverse
Tom Beddard @subblue https://github.com/subblue
Tom Dunlap @motevets https://github.com/motevets
Tom Spencer @fiznool https://github.com/fiznool
Tomasz Janczuk @tjanczuk https://github.com/tjanczuk
Trevor L @landau https://github.com/landau
Trevor Livingston @tlivings https://github.com/tlivings
Trevor Muraro @TrevorMuraro https://github.com/TrevorMuraro
Trym Skaar @trym https://github.com/trym
Tudor Gergely @tudorgergely https://github.com/tudorgergely
Tushar Mathur @tusharmath https://github.com/tusharmath
Tyler @tyrw https://github.com/tyrw
Tyler Benziger @tybenz https://github.com/tybenz
Tyler Childs @tylerchilds https://github.com/tylerchilds
Tyler Renelle @lefnire https://github.com/lefnire
Vahe Hovhannisyan @vhpoet https://github.com/vhpoet
Vasiliy Yorkin @vyorkin https://github.com/vyorkin
Venkat @Venkat-18 https://github.com/Venkat-18
Vincent Quigley @vquigley https://github.com/vquigley
Vincent Voyer @vvo https://github.com/vvo
Vinh Bachsy @vinh0604 https://github.com/vinh0604
Vitalii Honcharenko @vithonch https://github.com/vithonch
Vitalij Kudresov @kudresov https://github.com/kudresov
Vitor Arins @vitorarins https://github.com/vitorarins
Vojtech Novak @vonovak https://github.com/vonovak
Vsevolod Strukchinsky @floatdrop https://github.com/floatdrop
Wes Johnson @sterlingwes https://github.com/sterlingwes
Will Myers @griffinmyers https://github.com/griffinmyers
Will Prater @wprater https://github.com/wprater
Will Simons @bigredwill https://github.com/bigredwill
Willson Mock @fay-jai https://github.com/fay-jai
Winson Tsang @winsontsang https://github.com/winsontsang
Xavier Zhou @xavierchou https://github.com/xavierchou
Yann Odeyer @yodeyer https://github.com/yodeyer
Yaroslav @mrself https://github.com/mrself
Yin Rong @yinrong https://github.com/yinrong
Yves Richard @whyvez https://github.com/whyvez
Zbyszek Tenerowicz @naugtur https://github.com/naugtur
Zeke Sikelianos @zeke https://github.com/zeke
Zhanzhao (Deo) Liang @DeoLeung https://github.com/DeoLeung
Zlatko @zladuric https://github.com/zladuric
Zoli Kahan @Zolmeister https://github.com/Zolmeister
Zuri Pabón @zuripabon https://github.com/zuripabon
chad king @kingchad https://github.com/kingchad
chen @koroshi https://github.com/koroshi
cjroebuck @cjroebuck https://github.com/cjroebuck
cv @carolynnvu https://github.com/carolynnvu
edA-qa mort-ora-y @em-cliqz https://github.com/em-cliqz
eddie.chen @chenghung https://github.com/chenghung
hems.io @hems https://github.com/hems
huanghaiyang @huanghaiyang https://github.com/huanghaiyang
jerishi @qqcloud https://github.com/qqcloud
jess @monkeywithacupcake https://github.com/monkeywithacupcake
marco @ayxos https://github.com/ayxos
mscdex @mscdex https://github.com/mscdex
n30n0v @n30n0v https://github.com/n30n0v
narendra @reddynr https://github.com/reddynr
@4no0p https://github.com/4no0p
@Alex0007 https://github.com/Alex0007
@AlexRRR https://github.com/AlexRRR
@AndersAstrand https://github.com/AndersAstrand
@Hyjaz https://github.com/Hyjaz
@JuHwon https://github.com/JuHwon
@MarshallRJ https://github.com/MarshallRJ
@NRaf https://github.com/NRaf
@Nagarjuna-S https://github.com/Nagarjuna-S
@Niggler https://github.com/Niggler
@Nohbidy https://github.com/Nohbidy
@Nutelac https://github.com/Nutelac
@PatSmuk360 https://github.com/PatSmuk360
@UndeadBaneGitHub https://github.com/UndeadBaneGitHub
@abhishekk-optimus https://github.com/abhishekk-optimus
@acooper-accusoft https://github.com/acooper-accusoft
@alexscheelmeyer https://github.com/alexscheelmeyer
@andremrodrigues https://github.com/andremrodrigues
@andrewaustin https://github.com/andrewaustin
@apptous-seb https://github.com/apptous-seb
@ashishblr2k https://github.com/ashishblr2k
@bhar629 https://github.com/bhar629
@bialesdaniel https://github.com/bialesdaniel
@bitgal https://github.com/bitgal
@blumus https://github.com/blumus
@brian-poncho https://github.com/brian-poncho
@chitsuhein https://github.com/chitsuhein
@clydehunt76 https://github.com/clydehunt76
@congdcit https://github.com/congdcit
@craigcosmo https://github.com/craigcosmo
@ddragosd https://github.com/ddragosd
@deepaktiwari-1987 https://github.com/deepaktiwari-1987
@devang-kredx https://github.com/devang-kredx
@divo-ie https://github.com/divo-ie
@dragoplut https://github.com/dragoplut
@dunse https://github.com/dunse
@dynamitesushi https://github.com/dynamitesushi
@esatterwhite https://github.com/esatterwhite
@ewoutmeyns https://github.com/ewoutmeyns
@fent https://github.com/fent
@flushentitypacket https://github.com/flushentitypacket
@galenus https://github.com/galenus
@getlittletech https://github.com/getlittletech
@gmatroskin https://github.com/gmatroskin
@handane123 https://github.com/handane123
@hellboy81 https://github.com/hellboy81
@hermano360 https://github.com/hermano360
@ianmacl https://github.com/ianmacl
@ikokostya https://github.com/ikokostya
@initialize https://github.com/initialize
@j-brown https://github.com/j-brown
@jeffsmale90 https://github.com/jeffsmale90
@jimkang https://github.com/jimkang
@karlismelderis https://github.com/karlismelderis
@keenaudio https://github.com/keenaudio
@kgividen https://github.com/kgividen
@kharandziuk https://github.com/kharandziuk
@kjona https://github.com/kjona
@krzysztofslonka https://github.com/krzysztofslonka
@lblazecki https://github.com/lblazecki
@leslc https://github.com/leslc
@liorur https://github.com/liorur
@loahou04 https://github.com/loahou04
@lock null
@louib https://github.com/louib
@lukas-gitl https://github.com/lukas-gitl
@madhavan020985 https://github.com/madhavan020985
@massimocode https://github.com/massimocode
@miazoom https://github.com/miazoom
@michaelmosher https://github.com/michaelmosher
@mijamo https://github.com/mijamo
@mlchai https://github.com/mlchai
@mren https://github.com/mren
@mrkam https://github.com/mrkam
@mrooths https://github.com/mrooths
@nandums https://github.com/nandums
@nateholmes3 https://github.com/nateholmes3
@nicolasprade https://github.com/nicolasprade
@npetevn https://github.com/npetevn
@oroodie https://github.com/oroodie
@pierscowburn https://github.com/pierscowburn
@plynchnlm https://github.com/plynchnlm
@pnsrinivasreddy https://github.com/pnsrinivasreddy
@prakashchandrabarnwal https://github.com/prakashchandrabarnwal
@pramodpr316 https://github.com/pramodpr316
@raghavgujjar https://github.com/raghavgujjar
@rajdeepmatharu https://github.com/rajdeepmatharu
@rublev https://github.com/rublev
@sagarmandakki-trialrun https://github.com/sagarmandakki-trialrun
@scott-cornwell https://github.com/scott-cornwell
@sebarys https://github.com/sebarys
@shlomihaver https://github.com/shlomihaver
@simlu https://github.com/simlu
@solankipriti https://github.com/solankipriti
@sondretj https://github.com/sondretj
@stale null
@stevenp https://github.com/stevenp
@stubar https://github.com/stubar
@tinder-dyakobian https://github.com/tinder-dyakobian
@tobias-khs https://github.com/tobias-khs
@tonyskn https://github.com/tonyskn
@vinaykkaimal https://github.com/vinaykkaimal
@weekly-digest null
@xuwanwanTT https://github.com/xuwanwanTT
@yaozw https://github.com/yaozw
@yogananth https://github.com/yogananth
@zacharyscott https://github.com/zacharyscott
@zeevl https://github.com/zeevl
psixdev @PsiXdev https://github.com/PsiXdev
t\_\_hos @TomHoss https://github.com/TomHoss
taevas @zyvas https://github.com/zyvas
taven @taven-liu https://github.com/taven-liu
wang yu @wayoo https://github.com/wayoo
xavier @xavierchow https://github.com/xavierchow
Łukasz Pluszczewski @Lukasz-pluszczewski https://github.com/Lukasz-pluszczewski
刘智猷 @EasyHard https://github.com/EasyHard
刘贝 @finderL https://github.com/finderL
전현준 (Jello) @guswnsxodlf https://github.com/guswnsxodlf
nock-13.2.4/LICENSE 0000664 0000000 0000000 00000002113 14177263367 0013555 0 ustar 00root root 0000000 0000000 MIT License
Copyright (c) 2011-2019 Pedro Teixeira and other contributors
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.
nock-13.2.4/README.md 0000664 0000000 0000000 00000155033 14177263367 0014041 0 ustar 00root root 0000000 0000000 # Nock
[][npmjs]
[][build]

[](#backers)
[](#sponsors)
[npmjs]: https://www.npmjs.com/package/nock
[build]: https://travis-ci.org/nock/nock
HTTP server mocking and expectations library for Node.js
Nock can be used to test modules that perform HTTP requests in isolation.
For instance, if a module performs HTTP requests to a CouchDB server or makes HTTP requests to the Amazon API, you can test that module in isolation.
**Table of Contents**
- [How does it work?](#how-does-it-work)
- [Install](#install)
- [Node version support](#node-version-support)
- [Usage](#usage)
- [READ THIS! - About interceptors](#read-this---about-interceptors)
- [Specifying hostname](#specifying-hostname)
- [Specifying path](#specifying-path)
- [Specifying request body](#specifying-request-body)
- [Specifying request query string](#specifying-request-query-string)
- [Specifying replies](#specifying-replies)
- [Access original request and headers](#access-original-request-and-headers)
- [Replying with errors](#replying-with-errors)
- [Specifying headers](#specifying-headers)
- [Header field names are case-insensitive](#header-field-names-are-case-insensitive)
- [Specifying Request Headers](#specifying-request-headers)
- [Specifying Reply Headers](#specifying-reply-headers)
- [Default Reply Headers](#default-reply-headers)
- [Including Content-Length Header Automatically](#including-content-length-header-automatically)
- [Including Date Header Automatically](#including-date-header-automatically)
- [HTTP Verbs](#http-verbs)
- [Support for HTTP and HTTPS](#support-for-http-and-https)
- [Non-standard ports](#non-standard-ports)
- [Repeat response n times](#repeat-response-n-times)
- [Delay the response](#delay-the-response)
- [Delay the connection](#delay-the-connection)
- [Technical Details](#technical-details)
- [Delay the response body](#delay-the-response-body)
- [Technical Details](#technical-details-1)
- [Chaining](#chaining)
- [Scope filtering](#scope-filtering)
- [Conditional scope filtering](#conditional-scope-filtering)
- [Path filtering](#path-filtering)
- [Request Body filtering](#request-body-filtering)
- [Request Headers Matching](#request-headers-matching)
- [Optional Requests](#optional-requests)
- [Allow **unmocked** requests on a mocked hostname](#allow-unmocked-requests-on-a-mocked-hostname)
- [Expectations](#expectations)
- [.isDone()](#isdone)
- [.cleanAll()](#cleanall)
- [.abortPendingRequests()](#abortpendingrequests)
- [.persist()](#persist)
- [.pendingMocks()](#pendingmocks)
- [.activeMocks()](#activemocks)
- [.isActive()](#isactive)
- [Restoring](#restoring)
- [Activating](#activating)
- [Turning Nock Off (experimental!)](#turning-nock-off-experimental)
- [Enable/Disable real HTTP requests](#enabledisable-real-http-requests)
- [Disabling requests](#disabling-requests)
- [Enabling requests](#enabling-requests)
- [Resetting NetConnect](#resetting-netconnect)
- [Recording](#recording)
- [`dont_print` option](#dont_print-option)
- [`output_objects` option](#output_objects-option)
- [`enable_reqheaders_recording` option](#enable_reqheaders_recording-option)
- [`logging` option](#logging-option)
- [`use_separator` option](#use_separator-option)
- [.removeInterceptor()](#removeinterceptor)
- [Events](#events)
- [Global no match event](#global-no-match-event)
- [Nock Back](#nock-back)
- [Setup](#setup)
- [Options](#options)
- [Usage](#usage-1)
- [Options](#options-1)
- [Example](#example)
- [Modes](#modes)
- [Common issues](#common-issues)
- [Axios](#axios)
- [Memory issues with Jest](#memory-issues-with-jest)
- [Debugging](#debugging)
- [Contributing](#contributing)
- [Contributors](#contributors)
- [Sponsors](#sponsors)
- [License](#license)
## How does it work?
Nock works by overriding Node's `http.request` function. Also, it overrides `http.ClientRequest` too to cover for modules that use it directly.
## Install
```sh
$ npm install --save-dev nock
```
### Node version support
The latest version of nock supports all currently maintained Node versions, see [Node Release Schedule](https://github.com/nodejs/Release#release-schedule)
Here is a list of past nock versions with respective node version support
| node | nock |
| ---- | ---------- |
| 0.10 | up to 8.x |
| 0.11 | up to 8.x |
| 0.12 | up to 8.x |
| 4 | up to 9.x |
| 5 | up to 8.x |
| 6 | up to 10.x |
| 7 | up to 9.x |
| 8 | up to 11.x |
| 9 | up to 9.x |
## Usage
On your test, you can setup your mocking object like this:
```js
const nock = require('nock')
const scope = nock('https://api.github.com')
.get('/repos/atom/atom/license')
.reply(200, {
license: {
key: 'mit',
name: 'MIT License',
spdx_id: 'MIT',
url: 'https://api.github.com/licenses/mit',
node_id: 'MDc6TGljZW5zZTEz',
},
})
```
This setup says that we will intercept every HTTP call to `https://api.github.com`.
It will intercept an HTTPS GET request to `/repos/atom/atom/license`, reply with
a status 200, and the body will contain a (partial) response in JSON.
### READ THIS! - About interceptors
When you setup an interceptor for a URL and that interceptor is used, it is removed from the interceptor list.
This means that you can intercept 2 or more calls to the same URL and return different things on each of them.
It also means that you must setup one interceptor for each request you are going to have, otherwise nock will throw an error because that URL was not present in the interceptor list.
If you don’t want interceptors to be removed as they are used, you can use the [.persist()](#persist) method.
### Specifying hostname
The request hostname can be a string or a RegExp.
```js
const scope = nock('http://www.example.com')
.get('/resource')
.reply(200, 'domain matched')
```
```js
const scope = nock(/example\.com/)
.get('/resource')
.reply(200, 'domain regex matched')
```
> Note: You can choose to include or not the protocol in the hostname matching.
### Specifying path
The request path can be a string, a RegExp or a filter function and you can use any [HTTP verb](#http-verbs).
Using a string:
```js
const scope = nock('http://www.example.com')
.get('/resource')
.reply(200, 'path matched')
```
Using a regular expression:
```js
const scope = nock('http://www.example.com')
.get(/source$/)
.reply(200, 'path using regex matched')
```
Using a function:
```js
const scope = nock('http://www.example.com')
.get(uri => uri.includes('cats'))
.reply(200, 'path using function matched')
```
### Specifying request body
You can specify the request body to be matched as the second argument to the `get`, `post`, `put` or `delete` specifications. There are five types of second argument allowed:
**String**: nock will exact match the stringified request body with the provided string
```js
nock('http://www.example.com')
.post('/login', 'username=pgte&password=123456')
.reply(200, { id: '123ABC' })
```
**Buffer**: nock will exact match the stringified request body with the provided buffer
```js
nock('http://www.example.com')
.post('/login', Buffer.from([0xff, 0x11]))
.reply(200, { id: '123ABC' })
```
**RegExp**: nock will test the stringified request body against the provided RegExp
```js
nock('http://www.example.com')
.post('/login', /username=\w+/gi)
.reply(200, { id: '123ABC' })
```
**JSON object**: nock will exact match the request body with the provided object. In order to increase flexibility, nock also supports RegExp as an attribute value for the keys:
```js
nock('http://www.example.com')
.post('/login', { username: 'pgte', password: /.+/i })
.reply(200, { id: '123ABC' })
```
**Function**: nock will evaluate the function providing the request body object as first argument. Return true if it should be considered a match:
```js
nock('http://www.example.com')
.post('/login', body => body.username && body.password)
.reply(200, { id: '123ABC' })
```
In case you need to perform a partial matching on a complex, nested request body you should have a look at libraries like [lodash.matches](https://lodash.com/docs/#matches). Indeed, partial matching can be achieved as:
```js
nock('http://www.example.com')
.post('/user', _.matches({ address: { country: 'US' } }))
.reply(200, { id: '123ABC' })
```
### Specifying request query string
Nock understands query strings. Search parameters can be included as part of the path:
```js
nock('http://example.com').get('/users?foo=bar').reply(200)
```
Instead of placing the entire URL, you can specify the query part as an object:
```js
nock('http://example.com')
.get('/users')
.query({ name: 'pedro', surname: 'teixeira' })
.reply(200, { results: [{ id: 'pgte' }] })
```
Nock supports array-style/object-style query parameters. The encoding format matches with request module.
```js
nock('http://example.com')
.get('/users')
.query({
names: ['alice', 'bob'],
tags: {
alice: ['admin', 'tester'],
bob: ['tester'],
},
})
.reply(200, { results: [{ id: 'pgte' }] })
```
A `URLSearchParams` instance can be provided.
```js
const params = new URLSearchParams({ foo: 'bar' })
nock('http://example.com').get('/').query(params).reply(200)
```
Nock supports passing a function to query. The function determines if the actual query matches or not.
```js
nock('http://example.com')
.get('/users')
.query(actualQueryObject => {
// do some compare with the actual Query Object
// return true for matched
// return false for not matched
return true
})
.reply(200, { results: [{ id: 'pgte' }] })
```
To mock the entire url regardless of the passed query string:
```js
nock('http://example.com')
.get('/users')
.query(true)
.reply(200, { results: [{ id: 'pgte' }] })
```
A query string that is already [URL encoded](https://en.wikipedia.org/wiki/Percent-encoding) can be
matched by passing the `encodedQueryParams` flag in the options when creating the Scope.
```js
nock('http://example.com', { encodedQueryParams: true })
.get('/users')
.query('foo%5Bbar%5D%3Dhello%20world%21')
.reply(200, { results: [{ id: 'pgte' }] })
```
### Specifying replies
You can specify the return status code for a path on the first argument of reply like this:
```js
const scope = nock('http://myapp.iriscouch.com').get('/users/1').reply(404)
```
You can also specify the reply body as a string:
```js
const scope = nock('http://www.google.com')
.get('/')
.reply(200, 'Hello from Google!')
```
or as a JSON-encoded object:
```js
const scope = nock('http://myapp.iriscouch.com').get('/').reply(200, {
username: 'pgte',
email: 'pedro.teixeira@gmail.com',
_id: '4324243fsd',
})
```
or even as a file:
```js
const scope = nock('http://myapp.iriscouch.com')
.get('/')
.replyWithFile(200, __dirname + '/replies/user.json', {
'Content-Type': 'application/json',
})
```
Instead of an object or a buffer you can also pass in a callback to be evaluated for the value of the response body:
```js
const scope = nock('http://www.google.com')
.post('/echo')
.reply(201, (uri, requestBody) => requestBody)
```
In Nock 11.x it was possible to invoke `.reply()` with a status code and a
function that returns an array containing a status code and body. (The status
code from the array would take precedence over the one passed directly to
reply.) This is no longer allowed. In Nock 12 and later, either call `.reply()` with a
status code and a function that returns the body, or call it with a single
argument: a function that returns an array containing both the status code and
body.
An asynchronous function that gets an error-first callback as its last argument also works:
```js
const scope = nock('http://www.google.com')
.post('/echo')
.reply(201, (uri, requestBody, cb) => {
fs.readFile('cat-poems.txt', cb) // Error-first callback
})
```
In Nock 11 and later, if an error is passed to the callback, Nock will rethrow it as a programmer error.
In Nock 10 and earlier, the error was sent in the response body, with a 500 HTTP response status code.
You can also return the status code and body using just one function:
```js
const scope = nock('http://www.google.com')
.post('/echo')
.reply((uri, requestBody) => {
return [
201,
'THIS IS THE REPLY BODY',
{ header: 'value' }, // optional headers
]
})
```
or, use an error-first callback that also gets the status code:
```js
const scope = nock('http://www.google.com')
.post('/echo')
.reply((uri, requestBody, cb) => {
setTimeout(() => cb(null, [201, 'THIS IS THE REPLY BODY']), 1000)
})
```
A Stream works too:
```js
const scope = nock('http://www.google.com')
.get('/cat-poems')
.reply(200, (uri, requestBody) => {
return fs.createReadStream('cat-poems.txt')
})
```
#### Access original request and headers
If you're using the reply callback style, you can access the original client request using `this.req` like this:
```js
const scope = nock('http://www.google.com')
.get('/cat-poems')
.reply(function (uri, requestBody) {
console.log('path:', this.req.path)
console.log('headers:', this.req.headers)
// ...
})
```
> Note: Remember to use normal `function` in that case, as arrow functions are using enclosing scope for `this` binding.
#### Replying with errors
You can reply with an error like this:
```js
nock('http://www.google.com')
.get('/cat-poems')
.replyWithError('something awful happened')
```
JSON error responses are allowed too:
```js
nock('http://www.google.com').get('/cat-poems').replyWithError({
message: 'something awful happened',
code: 'AWFUL_ERROR',
})
```
> Note: This will emit an `error` event on the `request` object, not the reply.
### Specifying headers
#### Header field names are case-insensitive
Per [HTTP/1.1 4.2 Message Headers](http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2) specification, all message headers are case insensitive and thus internally Nock uses lower-case for all field names even if some other combination of cases was specified either in mocking specification or in mocked requests themselves.
#### Specifying Request Headers
You can specify the request headers like this:
```js
const scope = nock('http://www.example.com', {
reqheaders: {
authorization: 'Basic Auth',
},
})
.get('/')
.reply(200)
```
Or you can use a regular expression or function to check the header values. The
function will be passed the header value.
```js
const scope = nock('http://www.example.com', {
reqheaders: {
'X-My-Headers': headerValue => headerValue.includes('cats'),
'X-My-Awesome-Header': /Awesome/i,
},
})
.get('/')
.reply(200)
```
If `reqheaders` is not specified or if `host` is not part of it, Nock will automatically add `host` value to request header.
If no request headers are specified for mocking then Nock will automatically skip matching of request headers. Since the `host` header is a special case which may get automatically inserted by Nock, its matching is skipped unless it was _also_ specified in the request being mocked.
You can also have Nock fail the request if certain headers are present:
```js
const scope = nock('http://www.example.com', {
badheaders: ['cookie', 'x-forwarded-for'],
})
.get('/')
.reply(200)
```
When invoked with this option, Nock will not match the request if any of the `badheaders` are present.
Basic authentication can be specified as follows:
```js
const scope = nock('http://www.example.com')
.get('/')
.basicAuth({ user: 'john', pass: 'doe' })
.reply(200)
```
#### Specifying Reply Headers
You can specify the reply headers like this:
```js
const scope = nock('https://api.github.com')
.get('/repos/atom/atom/license')
.reply(200, { license: 'MIT' }, { 'X-RateLimit-Remaining': 4999 })
```
Or you can use a function to generate the headers values. The function will be
passed the request, response, and response body (if available). The body will
be either a buffer, a stream, or undefined.
```js
const scope = nock('http://www.headdy.com')
.get('/')
.reply(200, 'Hello World!', {
'Content-Length': (req, res, body) => body.length,
ETag: () => `${Date.now()}`,
})
```
#### Default Reply Headers
You can also specify default reply headers for all responses like this:
```js
const scope = nock('http://www.headdy.com')
.defaultReplyHeaders({
'X-Powered-By': 'Rails',
'Content-Type': 'application/json',
})
.get('/')
.reply(200, 'The default headers should come too')
```
Or you can use a function to generate the default headers values:
```js
const scope = nock('http://www.headdy.com')
.defaultReplyHeaders({
'Content-Length': (req, res, body) => body.length,
})
.get('/')
.reply(200, 'The default headers should come too')
```
#### Including Content-Length Header Automatically
When using `interceptor.reply()` to set a response body manually, you can have the
`Content-Length` header calculated automatically.
```js
const scope = nock('http://www.headdy.com')
.replyContentLength()
.get('/')
.reply(200, { hello: 'world' })
```
**NOTE:** this does not work with streams or other advanced means of specifying
the reply body.
#### Including Date Header Automatically
You can automatically append a `Date` header to your mock reply:
```js
const scope = nock('http://www.headdy.com')
.replyDate()
.get('/')
.reply(200, { hello: 'world' })
```
Or provide your own `Date` object:
```js
const scope = nock('http://www.headdy.com')
.replyDate(new Date(2015, 0, 1))
.get('/')
.reply(200, { hello: 'world' })
```
### HTTP Verbs
Nock supports any HTTP verb, and it has convenience methods for the GET, POST, PUT, HEAD, DELETE, PATCH, OPTIONS and MERGE HTTP verbs.
You can intercept any HTTP verb using `.intercept(path, verb [, requestBody [, options]])`:
```js
const scope = nock('http://my.domain.com')
.intercept('/path', 'PATCH')
.reply(304)
```
### Support for HTTP and HTTPS
By default nock assumes HTTP. If you need to use HTTPS you can specify the `https://` prefix like this:
```js
const scope = nock('https://secure.my.server.com')
// ...
```
### Non-standard ports
You are able to specify a non-standard port like this:
```js
const scope = nock('http://my.server.com:8081')
```
### Repeat response n times
You are able to specify the number of times to repeat the same response.
**NOTE:** When request times is more than the number you specified, you will get an error before cleaning this interceptor.
```js
nock('http://zombo.com').get('/').times(4).reply(200, 'Ok')
http.get('http://zombo.com/') // respond body "Ok"
http.get('http://zombo.com/') // respond body "Ok"
http.get('http://zombo.com/') // respond body "Ok"
http.get('http://zombo.com/') // respond body "Ok"
// This code will get an error with message:
// Nock: No match for request
http.get('http://zombo.com/')
// clean your interceptor
nock.cleanAll()
http.get('http://zombo.com/') // real respond with zombo.com result
```
Sugar syntax
```js
nock('http://zombo.com').get('/').once().reply(200, 'Ok')
nock('http://zombo.com').get('/').twice().reply(200, 'Ok')
nock('http://zombo.com').get('/').thrice().reply(200, 'Ok')
```
To repeat this response for as long as nock is active, use [.persist()](#persist).
### Delay the response
Nock can simulate response latency to allow you to test timeouts, race conditions, an other timing related scenarios.
You are able to specify the number of milliseconds that your reply should be delayed.
```js
nock('http://my.server.com')
.get('/')
.delay(2000) // 2 seconds delay will be applied to the response header.
.reply(200, '')
```
`delay(1000)` is an alias for `delayConnection(1000).delayBody(0)`
`delay({ head: 1000, body: 2000 })` is an alias for `delayConnection(1000).delayBody(2000)`
Both of which are covered in detail below.
#### Delay the connection
You are able to specify the number of milliseconds that your connection should be idle before it starts to receive the response.
To simulate a socket timeout, provide a larger value than the timeout setting on the request.
```js
nock('http://my.server.com')
.get('/')
.delayConnection(2000) // 2 seconds
.reply(200, '')
req = http.request('http://my.server.com', { timeout: 1000 })
```
Nock emits timeout events almost immediately by comparing the requested connection delay to the timeout parameter passed to `http.request()` or `http.ClientRequest#setTimeout()`.
This allows you to test timeouts without using fake timers or slowing down your tests.
If the client chooses to _not_ take an action (e.g. abort the request), the request and response will continue on as normal, after real clock time has passed.
##### Technical Details
Following the `'finish'` event being emitted by `ClientRequest`, Nock will wait for the next event loop iteration before checking if the request has been aborted.
At this point, any connection delay value is compared against any request timeout setting and a [`'timeout'`](https://nodejs.org/api/http.html#http_event_timeout) is emitted when appropriate from the socket and the request objects.
A Node timeout timer is then registered with any connection delay value to delay real time before checking again if the request has been aborted and the [`'response'`](http://nodejs.org/api/http.html#http_event_response) is emitted by the request.
A similar method, `.socketDelay()` was removed in version 13. It was thought that having two methods so subtlety similar was confusing.
The discussion can be found at https://github.com/nock/nock/pull/1974.
#### Delay the response body
You are able to specify the number of milliseconds that the response body should be delayed.
This is the time between the headers being received and the body starting to be received.
```js
nock('http://my.server.com')
.get('/')
.delayBody(2000) // 2 seconds
.reply(200, '')
```
##### Technical Details
Following the [`'response'`](http://nodejs.org/api/http.html#http_event_response) being emitted by `ClientRequest`,
Nock will register a timeout timer with the body delay value to delay real time before the [IncomingMessage](http://nodejs.org/api/http.html#http_http_incomingmessage) emits its first `'data'` or the `'end'` event.
### Chaining
You can chain behaviour like this:
```js
const scope = nock('http://myapp.iriscouch.com')
.get('/users/1')
.reply(404)
.post('/users', {
username: 'pgte',
email: 'pedro.teixeira@gmail.com',
})
.reply(201, {
ok: true,
id: '123ABC',
rev: '946B7D1C',
})
.get('/users/123ABC')
.reply(200, {
_id: '123ABC',
_rev: '946B7D1C',
username: 'pgte',
email: 'pedro.teixeira@gmail.com',
})
```
### Scope filtering
You can filter the scope (protocol, domain or port) of nock through a function. The filtering function is accepted at the `filteringScope` field of the `options` argument.
This can be useful if you have a node module that randomly changes subdomains to which it sends requests, e.g., the Dropbox node module behaves like this.
```js
const scope = nock('https://api.dropbox.com', {
filteringScope: scope => /^https:\/\/api[0-9]*.dropbox.com/.test(scope),
})
.get('/1/metadata/auto/Photos?include_deleted=false&list=true')
.reply(200)
```
### Conditional scope filtering
You can also choose to filter out a scope based on your system environment (or any external factor). The filtering function is accepted at the `conditionally` field of the `options` argument.
This can be useful if you only want certain scopes to apply depending on how your tests are executed.
```js
const scope = nock('https://api.myservice.com', {
conditionally: () => true,
})
```
### Path filtering
You can also filter the URLs based on a function.
This can be useful, for instance, if you have random or time-dependent data in your URL.
You can use a regexp for replacement, just like String.prototype.replace:
```js
const scope = nock('http://api.myservice.com')
.filteringPath(/password=[^&]*/g, 'password=XXX')
.get('/users/1?password=XXX')
.reply(200, 'user')
```
Or you can use a function:
```js
const scope = nock('http://api.myservice.com')
.filteringPath(path => '/ABC')
.get('/ABC')
.reply(200, 'user')
```
Note that `scope.filteringPath` is not cumulative: it should only be used once per scope.
### Request Body filtering
You can also filter the request body based on a function.
This can be useful, for instance, if you have random or time-dependent data in your request body.
You can use a regexp for replacement, just like String.prototype.replace:
```js
const scope = nock('http://api.myservice.com')
.filteringRequestBody(/password=[^&]*/g, 'password=XXX')
.post('/users/1', 'data=ABC&password=XXX')
.reply(201, 'OK')
```
Or you can use a function to transform the body:
```js
const scope = nock('http://api.myservice.com')
.filteringRequestBody(body => 'ABC')
.post('/', 'ABC')
.reply(201, 'OK')
```
If you don't want to match the request body you should omit the `body` argument from the method function:
```js
const scope = nock('http://api.myservice.com')
.post('/some_uri') // no body argument
.reply(200, 'OK')
```
### Request Headers Matching
If you need to match requests only if certain request headers match, you can.
```js
const scope = nock('http://api.myservice.com')
.matchHeader('accept', 'application/json')
.get('/')
.reply(200, {
data: 'hello world',
})
```
You can also use a regexp for the header body.
```js
const scope = nock('http://api.myservice.com')
.matchHeader('User-Agent', /Mozilla\/.*/)
.get('/')
.reply(200, {
data: 'hello world',
})
```
You can also use a function for the header body.
```js
const scope = nock('http://api.myservice.com')
.matchHeader('content-length', val => val >= 1000)
.get('/')
.reply(200, {
data: 'hello world',
})
```
### Optional Requests
By default every mocked request is expected to be made exactly once, and until it is it'll appear in `scope.pendingMocks()`, and `scope.isDone()` will return false (see [expectations](#expectations)). In many cases this is fine, but in some (especially cross-test setup code) it's useful to be able to mock a request that may or may not happen. You can do this with `optionally()`. Optional requests are consumed just like normal ones once matched, but they do not appear in `pendingMocks()`, and `isDone()` will return true for scopes with only optional requests pending.
```js
const example = nock('http://example.com')
example.pendingMocks() // []
example.get('/pathA').reply(200)
example.pendingMocks() // ["GET http://example.com:80/path"]
// ...After a request to example.com/pathA:
example.pendingMocks() // []
example.get('/pathB').optionally().reply(200)
example.pendingMocks() // []
// You can also pass a boolean argument to `optionally()`. This
// is useful if you want to conditionally make a mocked request
// optional.
const getMock = optional =>
example.get('/pathC').optionally(optional).reply(200)
getMock(true)
example.pendingMocks() // []
getMock(false)
example.pendingMocks() // ["GET http://example.com:80/pathC"]
```
### Allow **unmocked** requests on a mocked hostname
If you need some request on the same host name to be mocked and some others to **really** go through the HTTP stack, you can use the `allowUnmocked` option like this:
```js
const scope = nock('http://my.existing.service.com', { allowUnmocked: true })
.get('/my/url')
.reply(200, 'OK!')
// GET /my/url => goes through nock
// GET /other/url => actually makes request to the server
```
> Note: When applying `{allowUnmocked: true}`, if the request is made to the real server, no interceptor is removed.
## Expectations
Every time an HTTP request is performed for a scope that is mocked, Nock expects to find a handler for it. If it doesn't, it will throw an error.
Calls to nock() return a scope which you can assert by calling `scope.done()`. This will assert that all specified calls on that scope were performed.
Example:
```js
const scope = nock('http://google.com')
.get('/')
.reply(200, 'Hello from Google!')
// do some stuff
setTimeout(() => {
// Will throw an assertion error if meanwhile a "GET http://google.com" was
// not performed.
scope.done()
}, 5000)
```
### .isDone()
You can call `isDone()` on a single expectation to determine if the expectation was met:
```js
const scope = nock('http://google.com').get('/').reply(200)
scope.isDone() // will return false
```
It is also available in the global scope, which will determine if all expectations have been met:
```js
nock.isDone()
```
### .cleanAll()
You can cleanup all the prepared mocks (could be useful to cleanup some state after a failed test) like this:
```js
nock.cleanAll()
```
### .abortPendingRequests()
You can abort all current pending request like this:
```js
nock.abortPendingRequests()
```
### .persist()
You can make all the interceptors for a scope persist by calling `.persist()` on it:
```js
const scope = nock('http://example.com')
.persist()
.get('/')
.reply(200, 'Persisting all the way')
```
Note that while a persisted scope will always intercept the requests, it is considered "done" after the first interception.
If you want to stop persisting an individual persisted mock you can call `persist(false)`:
```js
const scope = nock('http://example.com').persist().get('/').reply(200, 'ok')
// Do some tests ...
scope.persist(false)
```
You can also use `nock.cleanAll()` which removes all mocks, including persistent mocks.
To specify an exact number of times that nock should repeat the response, use [.times()](#repeat-response-n-times).
### .pendingMocks()
If a scope is not done, you can inspect the scope to infer which ones are still pending using the `scope.pendingMocks()` function:
```js
if (!scope.isDone()) {
console.error('pending mocks: %j', scope.pendingMocks())
}
```
It is also available in the global scope:
```js
console.error('pending mocks: %j', nock.pendingMocks())
```
### .activeMocks()
You can see every mock that is currently active (i.e. might potentially reply to requests) in a scope using `scope.activeMocks()`. A mock is active if it is pending, optional but not yet completed, or persisted. Mocks that have intercepted their requests and are no longer doing anything are the only mocks which won't appear here.
You probably don't need to use this - it mainly exists as a mechanism to recreate the previous (now-changed) behavior of `pendingMocks()`.
```js
console.error('active mocks: %j', scope.activeMocks())
```
It is also available in the global scope:
```js
console.error('active mocks: %j', nock.activeMocks())
```
### .isActive()
Your tests may sometimes want to deactivate the nock interceptor.
Once deactivated, nock needs to be re-activated to work.
You can check if nock interceptor is active or not by using `nock.isActive()`.
Sample:
```js
if (!nock.isActive()) {
nock.activate()
}
```
## Restoring
You can restore the HTTP interceptor to the normal unmocked behaviour by calling:
```js
nock.restore()
```
**note 1**: restore does not clear the interceptor list. Use [nock.cleanAll()](#cleanall) if you expect the interceptor list to be empty.
**note 2**: restore will also remove the http interceptor itself. You need to run [nock.activate()](#activating) to re-activate the http interceptor. Without re-activation, nock will not intercept any calls.
## Activating
Only for cases where nock has been deactivated using [nock.restore()](#restoring), you can reactivate the HTTP interceptor to start intercepting HTTP calls using:
```js
nock.activate()
```
**note**: To check if nock HTTP interceptor is active or inactive, use [nock.isActive()](#isactive).
## Turning Nock Off (experimental!)
You can bypass Nock completely by setting the `NOCK_OFF` environment variable to `"true"`.
This way you can have your tests hit the real servers just by switching on this environment variable.
```shell script
$ NOCK_OFF=true node my_test.js
```
## Enable/Disable real HTTP requests
By default, any requests made to a host that is not mocked will be executed normally. If you want to block these requests, nock allows you to do so.
### Disabling requests
For disabling real http requests.
```js
nock.disableNetConnect()
```
So, if you try to request any host not 'nocked', it will throw a `NetConnectNotAllowedError`.
```js
nock.disableNetConnect()
const req = http.get('http://google.com/')
req.on('error', err => {
console.log(err)
})
// The returned `http.ClientRequest` will emit an error event (or throw if you're not listening for it)
// This code will log a NetConnectNotAllowedError with message:
// Nock: Disallowed net connect for "google.com:80"
```
### Enabling requests
For enabling any real HTTP requests (the default behavior):
```js
nock.enableNetConnect()
```
You could allow real HTTP requests for certain host names by providing a string or a regular expression for the hostname, or a function that accepts the hostname and returns true or false:
```js
// Using a string
nock.enableNetConnect('amazon.com')
// Or a RegExp
nock.enableNetConnect(/(amazon|github)\.com/)
// Or a Function
nock.enableNetConnect(
host => host.includes('amazon.com') || host.includes('github.com')
)
http.get('http://www.amazon.com/')
http.get('http://github.com/')
http.get('http://google.com/')
// This will throw NetConnectNotAllowedError with message:
// Nock: Disallowed net connect for "google.com:80"
```
A common use case when testing local endpoints would be to disable all but localhost, then add in additional nocks for external requests:
```js
nock.disableNetConnect()
// Allow localhost connections so we can test local routes and mock servers.
nock.enableNetConnect('127.0.0.1')
```
### Resetting NetConnect
When you're done with the test, you probably want to set everything back to normal:
```js
nock.cleanAll()
nock.enableNetConnect()
```
## Recording
This is a cool feature:
Guessing what the HTTP calls are is a mess, especially if you are introducing nock on your already-coded tests.
For these cases where you want to mock an existing live system you can record and playback the HTTP calls like this:
```js
nock.recorder.rec()
// Some HTTP calls happen and the nock code necessary to mock
// those calls will be outputted to console
```
Recording relies on intercepting real requests and responses and then persisting them for later use.
In order to stop recording you should call `nock.restore()` and recording will stop.
**ATTENTION!:** when recording is enabled, nock does no validation, nor will any mocks be enabled. Please be sure to turn off recording before attempting to use any mocks in your tests.
### `dont_print` option
If you just want to capture the generated code into a var as an array you can use:
```js
nock.recorder.rec({
dont_print: true,
})
// ... some HTTP calls
const nockCalls = nock.recorder.play()
```
The `nockCalls` var will contain an array of strings representing the generated code you need.
Copy and paste that code into your tests, customize at will, and you're done! You can call `nock.recorder.clear()` to remove already recorded calls from the array that `nock.recorder.play()` returns.
(Remember that you should do this one test at a time).
### `output_objects` option
In case you want to generate the code yourself or use the test data in some other way, you can pass the `output_objects` option to `rec`:
```js
nock.recorder.rec({
output_objects: true,
})
// ... some HTTP calls
const nockCallObjects = nock.recorder.play()
```
The returned call objects have the following properties:
- `scope` - the scope of the call including the protocol and non-standard ports (e.g. `'https://github.com:12345'`)
- `method` - the HTTP verb of the call (e.g. `'GET'`)
- `path` - the path of the call (e.g. `'/pgte/nock'`)
- `body` - the body of the call, if any
- `status` - the HTTP status of the reply (e.g. `200`)
- `response` - the body of the reply which can be a JSON, string, hex string representing binary buffers or an array of such hex strings (when handling `content-encoded` in reply header)
- `headers` - the headers of the reply
- `reqheader` - the headers of the request
If you save this as a JSON file, you can load them directly through `nock.load(path)`. Then you can post-process them before using them in the tests. For example, to add request body filtering (shown here fixing timestamps to match the ones captured during recording):
```js
nocks = nock.load(pathToJson)
nocks.forEach(function (nock) {
nock.filteringRequestBody = (body, aRecordedBody) => {
if (typeof body !== 'string' || typeof aRecordedBody !== 'string') {
return body
}
const recordedBodyResult = /timestamp:([0-9]+)/.exec(aRecordedBody)
if (recordedBodyResult) {
const recordedTimestamp = recordedBodyResult[1]
return body.replace(
/(timestamp):([0-9]+)/g,
function (match, key, value) {
return key + ':' + recordedTimestamp
}
)
} else {
return body
}
}
})
```
Alternatively, if you need to pre-process the captured nock definitions before
using them (e.g. to add scope filtering) then you can use `nock.loadDefs(path)`
and `nock.define(nockDefs)`. Shown here is scope filtering for Dropbox node
module which constantly changes the subdomain to which it sends the requests:
```js
// Pre-process the nock definitions as scope filtering has to be defined before the nocks are defined (due to its very hacky nature).
const nockDefs = nock.loadDefs(pathToJson)
nockDefs.forEach(def => {
// Do something with the definition object e.g. scope filtering.
def.options = {
...def.options,
filteringScope: scope => /^https:\/\/api[0-9]*.dropbox.com/.test(scope),
}
})
// Load the nocks from pre-processed definitions.
const nocks = nock.define(nockDefs)
```
### `enable_reqheaders_recording` option
Recording request headers by default is deemed more trouble than it's worth as some of them depend on the timestamp or other values that may change after the tests have been recorded thus leading to complex postprocessing of recorded tests. Thus by default the request headers are not recorded.
The genuine use cases for recording request headers (e.g. checking authorization) can be handled manually or by using `enable_reqheaders_recording` in `recorder.rec()` options.
```js
nock.recorder.rec({
dont_print: true,
output_objects: true,
enable_reqheaders_recording: true,
})
```
Note that even when request headers recording is enabled Nock will never record `user-agent` headers. `user-agent` values change with the version of Node and underlying operating system and are thus useless for matching as all that they can indicate is that the user agent isn't the one that was used to record the tests.
### `logging` option
Nock will print using `console.log` by default (assuming that `dont_print` is `false`). If a different function is passed into `logging`, nock will send the log string (or object, when using `output_objects`) to that function. Here's a basic example.
```js
const appendLogToFile = content => {
fs.appendFile('record.txt', content)
}
nock.recorder.rec({
logging: appendLogToFile,
})
```
### `use_separator` option
By default, nock will wrap its output with the separator string `<<<<<<-- cut here -->>>>>>` before and after anything it prints, whether to the console or a custom log function given with the `logging` option.
To disable this, set `use_separator` to false.
```js
nock.recorder.rec({
use_separator: false,
})
```
### .removeInterceptor()
This allows removing a specific interceptor. This can be either an interceptor instance or options for a url. It's useful when there's a list of common interceptors shared between tests, where an individual test requires one of the shared interceptors to behave differently.
Examples:
```js
nock.removeInterceptor({
hostname: 'localhost',
path: '/mockedResource',
})
```
```js
nock.removeInterceptor({
hostname: 'localhost',
path: '/login',
method: 'POST',
proto: 'https',
})
```
```js
const interceptor = nock('http://example.org').get('somePath')
nock.removeInterceptor(interceptor)
```
**Note** `.reply(...)` method returns Scope, not Interceptor, and so it is not a valid argument for `nock.removeInterceptor`. So if your method chain ends with `.reply` to be used with `nock.removeInterceptor` the chain need to be break in between:
```js
// this will NOT work
const interceptor = nock('http://example.org').get('somePath').reply(200, 'OK')
nock.removeInterceptor(interceptor)
// this is how it should be
const interceptor = nock('http://example.org').get('somePath')
interceptor.reply(200, 'OK')
nock.removeInterceptor(interceptor)
```
## Events
A scope emits the following events:
- `emit('request', function(req, interceptor, body))`
- `emit('replied', function(req, interceptor))`
### Global no match event
You can also listen for no match events like this:
```js
nock.emitter.on('no match', req => {})
```
## Nock Back
Fixture recording support and playback.
### Setup
You must specify a fixture directory before using, for example:
In your test helper
```js
const nockBack = require('nock').back
nockBack.fixtures = '/path/to/fixtures/'
nockBack.setMode('record')
```
#### Options
- `nockBack.fixtures` : path to fixture directory
- `nockBack.setMode()` : the mode to use
### Usage
By default if the fixture doesn't exist, a `nockBack` will create a new fixture and save the recorded output
for you. The next time you run the test, if the fixture exists, it will be loaded in.
The `this` context of the callback function will have a property `scopes` to access all of the loaded
nock scopes.
```js
const nockBack = require('nock').back
const request = require('request')
nockBack.setMode('record')
nockBack.fixtures = __dirname + '/nockFixtures' //this only needs to be set once in your test helper
// recording of the fixture
nockBack('zomboFixture.json', nockDone => {
request.get('http://zombo.com', (err, res, body) => {
nockDone()
// usage of the created fixture
nockBack('zomboFixture.json', function (nockDone) {
http.get('http://zombo.com/').end() // respond body "Ok"
this.assertScopesFinished() //throws an exception if all nocks in fixture were not satisfied
http.get('http://zombo.com/').end() // throws exception because someFixture.json only had one call
nockDone() //never gets here
})
})
})
```
If your tests are using promises then use `nockBack` like this:
```js
return nockBack('promisedFixture.json').then(({ nockDone, context }) => {
// do your tests returning a promise and chain it with
// `.then(nockDone)`
})
```
Or, with async/await:
```js
const { nockDone, context } = await nockBack('promisedFixture.json')
// your test code
nockDone()
```
#### Options
As an optional second parameter you can pass the following options
- `before`: a preprocessing function, gets called before nock.define
- `after`: a postprocessing function, gets called after nock.define
- `afterRecord`: a postprocessing function, gets called after recording. Is passed the array of scopes recorded and should return the intact array, a modified version of the array, or if custom formatting is desired, a stringified version of the array to save to the fixture
- `recorder`: custom options to pass to the recorder
##### Example
```js
function prepareScope(scope) {
scope.filteringRequestBody = (body, aRecordedBody) => {
if (typeof body !== 'string' || typeof aRecordedBody !== 'string') {
return body
}
const recordedBodyResult = /timestamp:([0-9]+)/.exec(aRecordedBody)
if (recordedBodyResult) {
const recordedTimestamp = recordedBodyResult[1]
return body.replace(
/(timestamp):([0-9]+)/g,
(match, key, value) => `${key}:${recordedTimestamp}`
)
} else {
return body
}
}
}
nockBack('exampleFixture.json', { before: prepareScope }, nockDone => {
request.get('http://example.com', function (err, res, body) {
// do your tests
nockDone()
})
})
```
### Modes
To set the mode call `nockBack.setMode(mode)` or run the tests with the `NOCK_BACK_MODE` environment variable set before loading nock. If the mode needs to be changed programmatically, the following is valid: `nockBack.setMode(nockBack.currentMode)`
- wild: all requests go out to the internet, don't replay anything, doesn't record anything
- dryrun: The default, use recorded nocks, allow http calls, doesn't record anything, useful for writing new tests
- record: use recorded nocks, record new nocks
- update: remove recorded nocks, record nocks
- lockdown: use recorded nocks, disables all http calls even when not nocked, doesn't record
## Common issues
**"No match for response" when using got with error responses**
[Got][] automatically retries failed requests twice. That means if you have a
test which mocks a 4xx or 5xx response, got will immediately reissue it. At
that point, the mock will have been consumed and the second request will error
out with **Nock: No match for request**.
The same is true for `.replyWithError()`.
Adding `{ retry: 0 }` to the `got` invocations will disable retrying, e.g.:
```js
await got('http://example.test/', { retry: 0 })
```
If you need to do this in all your tests, you can create a module
`got_client.js` which exports a custom got instance:
```js
const got = require('got')
module.exports = got.extend({ retry: 0 })
```
This is how it's handled in Nock itself (see [#1523][]).
[got]: https://github.com/sindresorhus/got
[#1523]: https://github.com/nock/nock/issues/1523
### Axios
To use Nock with [Axios][], you may need to configure Axios to use the Node
adapter as in the example below:
```js
import axios from 'axios'
import nock from 'nock'
import test from 'ava' // You can use any test framework.
// If you are using jsdom, axios will default to using the XHR adapter which
// can't be intercepted by nock. So, configure axios to use the node adapter.
//
// References:
// https://github.com/nock/nock/issues/699#issuecomment-272708264
// https://github.com/axios/axios/issues/305
axios.defaults.adapter = require('axios/lib/adapters/http')
test('can fetch test response', async t => {
// Set up the mock request.
const scope = nock('http://localhost')
.get('/test')
.reply(200, 'test response')
// Make the request. Note that the hostname must match exactly what is passed
// to `nock()`. Alternatively you can set `axios.defaults.host = 'http://localhost'`
// and run `axios.get('/test')`.
await axios.get('http://localhost/test')
// Assert that the expected request was made.
scope.done()
})
```
[axios]: https://github.com/axios/axios
### Memory issues with Jest
Memory issues can be avoided by calling [`nock.restore()`](#restoring) after each test suite.
One of the core principles of [Jest](https://jestjs.io/) is that it runs tests in isolation.
It does this by manipulating the modules cache of Node in a way that conflicts with how Nock monkey patches the builtin `http` and `https` modules.
[Related issue with more details](https://github.com/nock/nock/issues/1817).
## Debugging
Nock uses [`debug`](https://github.com/visionmedia/debug), so just run with environmental variable `DEBUG` set to `nock.*`.
```console
user@local$ DEBUG=nock.* node my_test.js
```
Each step in the matching process is logged this way and can be useful when determining why a request was not intercepted by Nock.
For example the following shows that matching failed because the request had an extra search parameter.
```js
nock('http://example.com').get('/').query({ foo: 'bar' }).reply()
await got('http://example.com/?foo=bar&baz=foz')
```
```console
user@local$ DEBUG=nock.scope:example.com node my_test.js
...
nock.scope:example.com Interceptor queries: {"foo":"bar"} +1ms
nock.scope:example.com Request queries: {"foo":"bar","baz":"foz"} +0ms
nock.scope:example.com query matching failed +0ms
```
## Contributing
Thanks for wanting to contribute! Take a look at our [Contributing Guide](CONTRIBUTING.md) for notes on our commit message conventions and how to run tests.
Please note that this project is released with a [Contributor Code of Conduct](CODE_OF_CONDUCT.md).
By participating in this project you agree to abide by its terms.
## Contributors
Thanks goes to these wonderful people ([emoji key](https://github.com/all-contributors/all-contributors#emoji-key)):
This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!
## Sponsors
Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [[Become a sponsor](https://opencollective.com/nock#sponsor)]
## License
[MIT](LICENSE)
Copyright (c) 2011–2019 [Pedro Teixeira](http://about.me/pedroteixeira) and other [contributors](https://github.com/nock/nock/graphs/contributors).
nock-13.2.4/examples/ 0000775 0000000 0000000 00000000000 14177263367 0014371 5 ustar 00root root 0000000 0000000 nock-13.2.4/examples/.eslintrc.yml 0000664 0000000 0000000 00000000053 14177263367 0017013 0 ustar 00root root 0000000 0000000 rules:
no-console: 'off'
strict: 'off'
nock-13.2.4/examples/_log.js 0000664 0000000 0000000 00000000427 14177263367 0015652 0 ustar 00root root 0000000 0000000 module.exports = log
const start = Date.now()
function log(emitter, name) {
return function (event) {
emitter.on(event, function () {
const lag = `${Math.round((Date.now() - start) / 100) / 10} sec`
console.log('[%s] %s => %s', lag, name, event)
})
}
}
nock-13.2.4/examples/binary-reply.js 0000664 0000000 0000000 00000001553 14177263367 0017350 0 ustar 00root root 0000000 0000000 const http = require('http')
const fs = require('fs')
const path = require('path')
const nock = require('../')
const readFile = function () {
return fs.readFileSync(
path.resolve(__dirname, '../tests/assets/reply_file_2.txt.gz')
)
}
nock('http://binary.com').get('/binary').reply(200, readFile(), {
'content-type': 'application/octet-stream',
'content-length': readFile().length,
'content-disposition': 'attachment; filename=reply_file_2.tar.gz',
})
http.get('http://binary.com/binary', function (res) {
const data = []
res.on('data', function (chunk) {
// try this
// chunk[0] = 1;
// chunk[1] = 1;
data.push(chunk)
})
res.on('end', function () {
const buffer = Buffer.concat(data)
console.log(
Buffer.compare(readFile(), buffer) === 0
? 'Received the file.'
: 'Received something else.'
)
})
})
nock-13.2.4/examples/delay-connection.js 0000664 0000000 0000000 00000000565 14177263367 0020170 0 ustar 00root root 0000000 0000000 const http = require('http')
const nock = require('../')
const log = require('./_log')
const events = ['socket', 'response', 'end', 'data']
nock('http://delayconnection.com')
.get('/')
.delayConnection(1000)
.reply(200, 'hey')
const req = http.get('http://delayconnection.com', function (res) {
events.forEach(log(res, 'res'))
})
events.forEach(log(req, 'req'))
nock-13.2.4/examples/delay-response.js 0000664 0000000 0000000 00000000542 14177263367 0017662 0 ustar 00root root 0000000 0000000 const http = require('http')
const nock = require('../')
const log = require('./_log')
const events = ['socket', 'response', 'end', 'data']
nock('http://delayconnection.com').get('/').delay(1000).reply(200, 'hey')
const req = http.get('http://delayconnection.com', function (res) {
events.forEach(log(res, 'res'))
})
events.forEach(log(req, 'req'))
nock-13.2.4/examples/net-connect-default-no-mock.js 0000664 0000000 0000000 00000000664 14177263367 0022135 0 ustar 00root root 0000000 0000000 /*
Default net connect.
No mock.
Result: Nock allows request to proceed.
*/
const log = require('./_log')
const events = ['socket', 'response', 'end', 'data', 'error']
const http = require('http')
console.log('making request...')
const req = http.get('http://www.google.com/', function (res) {
console.log('request result: res.statusCode = %j', res.statusCode)
events.forEach(log(res, 'res'))
})
events.forEach(log(req, 'req'))
nock-13.2.4/examples/net-connect-default-other-mock.js 0000664 0000000 0000000 00000001013 14177263367 0022627 0 ustar 00root root 0000000 0000000 /*
Default net connect.
Mock the different hostname:port.
Result: Nock allows request to proceed.
*/
const log = require('./_log')
const events = ['socket', 'response', 'end', 'data', 'error']
const nock = require('../')
nock('http://someotherservice.com').get('/').reply(200, 'whaaa')
const http = require('http')
const req = http.get('http://www.google.com/', function (res) {
console.log('request result: res.statusCode = %j', res.statusCode)
events.forEach(log(res, 'res'))
})
events.forEach(log(req, 'req'))
nock-13.2.4/examples/net-connect-disabled-different-host.js 0000664 0000000 0000000 00000000763 14177263367 0023636 0 ustar 00root root 0000000 0000000 /*
Disabled net connect.
Mock the different hostname:port.
Result: Nock does not allow request to proceed.
*/
const log = require('./_log')
const events = ['socket', 'response', 'end', 'data', 'error']
const nock = require('../')
nock.disableNetConnect()
nock('http://someotherservice.com').get('/').reply(200, 'whaaa')
const http = require('http')
const req = http.get('http://www.google.com/')
req.once('error', function (err) {
console.log(err.stack)
})
events.forEach(log(req, 'req'))
nock-13.2.4/examples/net-connect-mock-same-host-different-path.js 0000664 0000000 0000000 00000000745 14177263367 0024675 0 ustar 00root root 0000000 0000000 /*
Default net connect.
Mock the same hostname:port, different path.
Result: Nock does not allow request to proceed.
*/
const log = require('./_log')
const events = ['socket', 'response', 'end', 'data', 'error']
const nock = require('../')
nock('http://example.com').get('/path').reply(200, 'whaaa')
const http = require('http')
const req = http.get('http://example.com/other-path')
req.once('error', function (err) {
console.log(err.stack)
})
events.forEach(log(req, 'req'))
nock-13.2.4/examples/socket-delay-abort.js 0000664 0000000 0000000 00000000661 14177263367 0020423 0 ustar 00root root 0000000 0000000 const http = require('http')
const nock = require('../')
const log = require('./_log')
const events = ['socket', 'response', 'end', 'data', 'timeout', 'error']
nock('http://delayconnection.com').get('/').socketDelay(2000).reply(200, 'hey')
const req = http.get('http://delayconnection.com', function (res) {
events.forEach(log(res, 'res'))
})
req.setTimeout(1000, function () {
req.abort()
})
events.forEach(log(req, 'req'))
nock-13.2.4/examples/socket-delay-no-abort.js 0000664 0000000 0000000 00000000574 14177263367 0021040 0 ustar 00root root 0000000 0000000 const http = require('http')
const nock = require('../')
const log = require('./_log')
const events = ['socket', 'response', 'end', 'data', 'timeout', 'error']
nock('http://delayconnection.com').get('/').socketDelay(2000).reply(200, 'hey')
const req = http.get('http://delayconnection.com', function (res) {
events.forEach(log(res, 'res'))
})
events.forEach(log(req, 'req'))
nock-13.2.4/index.js 0000664 0000000 0000000 00000002363 14177263367 0014224 0 ustar 00root root 0000000 0000000 'use strict'
const back = require('./lib/back')
const emitter = require('./lib/global_emitter')
const {
activate,
isActive,
isDone,
isOn,
pendingMocks,
activeMocks,
removeInterceptor,
disableNetConnect,
enableNetConnect,
removeAll,
abortPendingRequests,
} = require('./lib/intercept')
const recorder = require('./lib/recorder')
const { Scope, load, loadDefs, define } = require('./lib/scope')
module.exports = (basePath, options) => new Scope(basePath, options)
Object.assign(module.exports, {
activate,
isActive,
isDone,
pendingMocks,
activeMocks,
removeInterceptor,
disableNetConnect,
enableNetConnect,
cleanAll: removeAll,
abortPendingRequests,
load,
loadDefs,
define,
emitter,
recorder: {
rec: recorder.record,
clear: recorder.clear,
play: recorder.outputs,
},
restore: recorder.restore,
back,
})
// We always activate Nock on import, overriding the globals.
// Setting the Back mode "activates" Nock by overriding the global entries in the `http/s` modules.
// If Nock Back is configured, we need to honor that setting for backward compatibility,
// otherwise we rely on Nock Back's default initializing side effect.
if (isOn()) {
back.setMode(process.env.NOCK_BACK_MODE || 'dryrun')
}
nock-13.2.4/lib/ 0000775 0000000 0000000 00000000000 14177263367 0013321 5 ustar 00root root 0000000 0000000 nock-13.2.4/lib/back.js 0000664 0000000 0000000 00000017653 14177263367 0014573 0 ustar 00root root 0000000 0000000 'use strict'
const assert = require('assert')
const recorder = require('./recorder')
const {
activate,
disableNetConnect,
enableNetConnect,
removeAll: cleanAll,
} = require('./intercept')
const { loadDefs, define } = require('./scope')
const { format } = require('util')
const path = require('path')
const debug = require('debug')('nock.back')
let _mode = null
let fs
try {
fs = require('fs')
} catch (err) {
// do nothing, probably in browser
}
/**
* nock the current function with the fixture given
*
* @param {string} fixtureName - the name of the fixture, e.x. 'foo.json'
* @param {object} options - [optional] extra options for nock with, e.x. `{ assert: true }`
* @param {function} nockedFn - [optional] callback function to be executed with the given fixture being loaded;
* if defined the function will be called with context `{ scopes: loaded_nocks || [] }`
* set as `this` and `nockDone` callback function as first and only parameter;
* if not defined a promise resolving to `{nockDone, context}` where `context` is
* aforementioned `{ scopes: loaded_nocks || [] }`
*
* List of options:
*
* @param {function} before - a preprocessing function, gets called before nock.define
* @param {function} after - a postprocessing function, gets called after nock.define
* @param {function} afterRecord - a postprocessing function, gets called after recording. Is passed the array
* of scopes recorded and should return the array scopes to save to the fixture
* @param {function} recorder - custom options to pass to the recorder
*
*/
function Back(fixtureName, options, nockedFn) {
if (!Back.fixtures) {
throw new Error(
'Back requires nock.back.fixtures to be set\n' +
'Ex:\n' +
"\trequire(nock).back.fixtures = '/path/to/fixtures/'"
)
}
if (typeof fixtureName !== 'string') {
throw new Error('Parameter fixtureName must be a string')
}
if (arguments.length === 1) {
options = {}
} else if (arguments.length === 2) {
// If 2nd parameter is a function then `options` has been omitted
// otherwise `options` haven't been omitted but `nockedFn` was.
if (typeof options === 'function') {
nockedFn = options
options = {}
}
}
_mode.setup()
const fixture = path.join(Back.fixtures, fixtureName)
const context = _mode.start(fixture, options)
const nockDone = function () {
_mode.finish(fixture, options, context)
}
debug('context:', context)
// If nockedFn is a function then invoke it, otherwise return a promise resolving to nockDone.
if (typeof nockedFn === 'function') {
nockedFn.call(context, nockDone)
} else {
return Promise.resolve({ nockDone, context })
}
}
/*******************************************************************************
* Modes *
*******************************************************************************/
const wild = {
setup: function () {
cleanAll()
recorder.restore()
activate()
enableNetConnect()
},
start: function () {
return load() // don't load anything but get correct context
},
finish: function () {
// nothing to do
},
}
const dryrun = {
setup: function () {
recorder.restore()
cleanAll()
activate()
// We have to explicitly enable net connectivity as by default it's off.
enableNetConnect()
},
start: function (fixture, options) {
const contexts = load(fixture, options)
enableNetConnect()
return contexts
},
finish: function () {
// nothing to do
},
}
const record = {
setup: function () {
recorder.restore()
recorder.clear()
cleanAll()
activate()
disableNetConnect()
},
start: function (fixture, options) {
if (!fs) {
throw new Error('no fs')
}
const context = load(fixture, options)
if (!context.isLoaded) {
recorder.record({
dont_print: true,
output_objects: true,
...options.recorder,
})
context.isRecording = true
}
return context
},
finish: function (fixture, options, context) {
if (context.isRecording) {
let outputs = recorder.outputs()
if (typeof options.afterRecord === 'function') {
outputs = options.afterRecord(outputs)
}
outputs =
typeof outputs === 'string' ? outputs : JSON.stringify(outputs, null, 4)
debug('recorder outputs:', outputs)
fs.mkdirSync(path.dirname(fixture), { recursive: true })
fs.writeFileSync(fixture, outputs)
}
},
}
const update = {
setup: function () {
recorder.restore()
recorder.clear()
cleanAll()
activate()
disableNetConnect()
},
start: function (fixture, options) {
if (!fs) {
throw new Error('no fs')
}
const context = removeFixture(fixture)
recorder.record({
dont_print: true,
output_objects: true,
...options.recorder,
})
context.isRecording = true
return context
},
finish: function (fixture, options, context) {
let outputs = recorder.outputs()
if (typeof options.afterRecord === 'function') {
outputs = options.afterRecord(outputs)
}
outputs =
typeof outputs === 'string' ? outputs : JSON.stringify(outputs, null, 4)
debug('recorder outputs:', outputs)
fs.mkdirSync(path.dirname(fixture), { recursive: true })
fs.writeFileSync(fixture, outputs)
},
}
const lockdown = {
setup: function () {
recorder.restore()
recorder.clear()
cleanAll()
activate()
disableNetConnect()
},
start: function (fixture, options) {
return load(fixture, options)
},
finish: function () {
// nothing to do
},
}
function load(fixture, options) {
const context = {
scopes: [],
assertScopesFinished: function () {
assertScopes(this.scopes, fixture)
},
}
if (fixture && fixtureExists(fixture)) {
let scopes = loadDefs(fixture)
applyHook(scopes, options.before)
scopes = define(scopes)
applyHook(scopes, options.after)
context.scopes = scopes
context.isLoaded = true
}
return context
}
function removeFixture(fixture, options) {
const context = {
scopes: [],
assertScopesFinished: function () {},
}
if (fixture && fixtureExists(fixture)) {
/* istanbul ignore next - fs.unlinkSync is for node 10 support */
fs.rmSync ? fs.rmSync(fixture) : fs.unlinkSync(fixture)
}
context.isLoaded = false
return context
}
function applyHook(scopes, fn) {
if (!fn) {
return
}
if (typeof fn !== 'function') {
throw new Error('processing hooks must be a function')
}
scopes.forEach(fn)
}
function fixtureExists(fixture) {
if (!fs) {
throw new Error('no fs')
}
return fs.existsSync(fixture)
}
function assertScopes(scopes, fixture) {
const pending = scopes
.filter(scope => !scope.isDone())
.map(scope => scope.pendingMocks())
if (pending.length) {
assert.fail(
format(
'%j was not used, consider removing %s to rerecord fixture',
[].concat(...pending),
fixture
)
)
}
}
const Modes = {
wild, // all requests go out to the internet, dont replay anything, doesnt record anything
dryrun, // use recorded nocks, allow http calls, doesnt record anything, useful for writing new tests (default)
record, // use recorded nocks, record new nocks
update, // allow http calls, record all nocks, don't use recorded nocks
lockdown, // use recorded nocks, disables all http calls even when not nocked, doesnt record
}
Back.setMode = function (mode) {
if (!(mode in Modes)) {
throw new Error(`Unknown mode: ${mode}`)
}
Back.currentMode = mode
debug('New nock back mode:', Back.currentMode)
_mode = Modes[mode]
_mode.setup()
}
Back.fixtures = null
Back.currentMode = null
module.exports = Back
nock-13.2.4/lib/common.js 0000664 0000000 0000000 00000053521 14177263367 0015155 0 ustar 00root root 0000000 0000000 'use strict'
const debug = require('debug')('nock.common')
const set = require('lodash.set')
const timers = require('timers')
const url = require('url')
const util = require('util')
/**
* Normalizes the request options so that it always has `host` property.
*
* @param {Object} options - a parsed options object of the request
*/
function normalizeRequestOptions(options) {
options.proto = options.proto || 'http'
options.port = options.port || (options.proto === 'http' ? 80 : 443)
if (options.host) {
debug('options.host:', options.host)
if (!options.hostname) {
if (options.host.split(':').length === 2) {
options.hostname = options.host.split(':')[0]
} else {
options.hostname = options.host
}
}
}
debug('options.hostname in the end: %j', options.hostname)
options.host = `${options.hostname || 'localhost'}:${options.port}`
debug('options.host in the end: %j', options.host)
/// lowercase host names
;['hostname', 'host'].forEach(function (attr) {
if (options[attr]) {
options[attr] = options[attr].toLowerCase()
}
})
return options
}
/**
* Returns true if the data contained in buffer can be reconstructed
* from its utf8 representation.
*
* @param {Object} buffer - a Buffer object
* @returns {boolean}
*/
function isUtf8Representable(buffer) {
const utfEncodedBuffer = buffer.toString('utf8')
const reconstructedBuffer = Buffer.from(utfEncodedBuffer, 'utf8')
return reconstructedBuffer.equals(buffer)
}
// Array where all information about all the overridden requests are held.
let requestOverrides = {}
/**
* Overrides the current `request` function of `http` and `https` modules with
* our own version which intercepts issues HTTP/HTTPS requests and forwards them
* to the given `newRequest` function.
*
* @param {Function} newRequest - a function handling requests; it accepts four arguments:
* - proto - a string with the overridden module's protocol name (either `http` or `https`)
* - overriddenRequest - the overridden module's request function already bound to module's object
* - options - the options of the issued request
* - callback - the callback of the issued request
*/
function overrideRequests(newRequest) {
debug('overriding requests')
;['http', 'https'].forEach(function (proto) {
debug('- overriding request for', proto)
const moduleName = proto // 1 to 1 match of protocol and module is fortunate :)
const module = {
http: require('http'),
https: require('https'),
}[moduleName]
const overriddenRequest = module.request
const overriddenGet = module.get
if (requestOverrides[moduleName]) {
throw new Error(
`Module's request already overridden for ${moduleName} protocol.`
)
}
// Store the properties of the overridden request so that it can be restored later on.
requestOverrides[moduleName] = {
module,
request: overriddenRequest,
get: overriddenGet,
}
// https://nodejs.org/api/http.html#http_http_request_url_options_callback
module.request = function (input, options, callback) {
return newRequest(proto, overriddenRequest.bind(module), [
input,
options,
callback,
])
}
// https://nodejs.org/api/http.html#http_http_get_options_callback
module.get = function (input, options, callback) {
const req = newRequest(proto, overriddenGet.bind(module), [
input,
options,
callback,
])
req.end()
return req
}
debug('- overridden request for', proto)
})
}
/**
* Restores `request` function of `http` and `https` modules to values they
* held before they were overridden by us.
*/
function restoreOverriddenRequests() {
debug('restoring requests')
Object.entries(requestOverrides).forEach(
([proto, { module, request, get }]) => {
debug('- restoring request for', proto)
module.request = request
module.get = get
debug('- restored request for', proto)
}
)
requestOverrides = {}
}
/**
* In WHATWG URL vernacular, this returns the origin portion of a URL.
* However, the port is not included if it's standard and not already present on the host.
*/
function normalizeOrigin(proto, host, port) {
const hostHasPort = host.includes(':')
const portIsStandard =
(proto === 'http' && (port === 80 || port === '80')) ||
(proto === 'https' && (port === 443 || port === '443'))
const portStr = hostHasPort || portIsStandard ? '' : `:${port}`
return `${proto}://${host}${portStr}`
}
/**
* Get high level information about request as string
* @param {Object} options
* @param {string} options.method
* @param {number|string} options.port
* @param {string} options.proto Set internally. always http or https
* @param {string} options.hostname
* @param {string} options.path
* @param {Object} options.headers
* @param {string} body
* @return {string}
*/
function stringifyRequest(options, body) {
const { method = 'GET', path = '', port } = options
const origin = normalizeOrigin(options.proto, options.hostname, port)
const log = {
method,
url: `${origin}${path}`,
headers: options.headers,
}
if (body) {
log.body = body
}
return JSON.stringify(log, null, 2)
}
function isContentEncoded(headers) {
const contentEncoding = headers['content-encoding']
return typeof contentEncoding === 'string' && contentEncoding !== ''
}
function contentEncoding(headers, encoder) {
const contentEncoding = headers['content-encoding']
return contentEncoding !== undefined && contentEncoding.toString() === encoder
}
function isJSONContent(headers) {
// https://tools.ietf.org/html/rfc8259
const contentType = String(headers['content-type'] || '').toLowerCase()
return contentType.startsWith('application/json')
}
/**
* Return a new object with all field names of the headers lower-cased.
*
* Duplicates throw an error.
*/
function headersFieldNamesToLowerCase(headers, throwOnDuplicate) {
if (!isPlainObject(headers)) {
throw Error('Headers must be provided as an object')
}
const lowerCaseHeaders = {}
Object.entries(headers).forEach(([fieldName, fieldValue]) => {
const key = fieldName.toLowerCase()
if (lowerCaseHeaders[key] !== undefined) {
if (throwOnDuplicate) {
throw Error(
`Failed to convert header keys to lower case due to field name conflict: ${key}`
)
} else {
debug(
`Duplicate header provided in request: ${key}. Only the last value can be matched.`
)
}
}
lowerCaseHeaders[key] = fieldValue
})
return lowerCaseHeaders
}
const headersFieldsArrayToLowerCase = headers => [
...new Set(headers.map(fieldName => fieldName.toLowerCase())),
]
/**
* Converts the various accepted formats of headers into a flat array representing "raw headers".
*
* Nock allows headers to be provided as a raw array, a plain object, or a Map.
*
* While all the header names are expected to be strings, the values are left intact as they can
* be functions, strings, or arrays of strings.
*
* https://nodejs.org/api/http.html#http_message_rawheaders
*/
function headersInputToRawArray(headers) {
if (headers === undefined) {
return []
}
if (Array.isArray(headers)) {
// If the input is an array, assume it's already in the raw format and simply return a copy
// but throw an error if there aren't an even number of items in the array
if (headers.length % 2) {
throw new Error(
`Raw headers must be provided as an array with an even number of items. [fieldName, value, ...]`
)
}
return [...headers]
}
// [].concat(...) is used instead of Array.flat until v11 is the minimum Node version
if (util.types.isMap(headers)) {
return [].concat(...Array.from(headers, ([k, v]) => [k.toString(), v]))
}
if (isPlainObject(headers)) {
return [].concat(...Object.entries(headers))
}
throw new Error(
`Headers must be provided as an array of raw values, a Map, or a plain Object. ${headers}`
)
}
/**
* Converts an array of raw headers to an object, using the same rules as Nodes `http.IncomingMessage.headers`.
*
* Header names/keys are lower-cased.
*/
function headersArrayToObject(rawHeaders) {
if (!Array.isArray(rawHeaders)) {
throw Error('Expected a header array')
}
const accumulator = {}
forEachHeader(rawHeaders, (value, fieldName) => {
addHeaderLine(accumulator, fieldName, value)
})
return accumulator
}
const noDuplicatesHeaders = new Set([
'age',
'authorization',
'content-length',
'content-type',
'etag',
'expires',
'from',
'host',
'if-modified-since',
'if-unmodified-since',
'last-modified',
'location',
'max-forwards',
'proxy-authorization',
'referer',
'retry-after',
'user-agent',
])
/**
* Set key/value data in accordance with Node's logic for folding duplicate headers.
*
* The `value` param should be a function, string, or array of strings.
*
* Node's docs and source:
* https://nodejs.org/api/http.html#http_message_headers
* https://github.com/nodejs/node/blob/908292cf1f551c614a733d858528ffb13fb3a524/lib/_http_incoming.js#L245
*
* Header names are lower-cased.
* Duplicates in raw headers are handled in the following ways, depending on the header name:
* - Duplicates of field names listed in `noDuplicatesHeaders` (above) are discarded.
* - `set-cookie` is always an array. Duplicates are added to the array.
* - For duplicate `cookie` headers, the values are joined together with '; '.
* - For all other headers, the values are joined together with ', '.
*
* Node's implementation is larger because it highly optimizes for not having to call `toLowerCase()`.
* We've opted to always call `toLowerCase` in exchange for a more concise function.
*
* While Node has the luxury of knowing `value` is always a string, we do an extra step of coercion at the top.
*/
function addHeaderLine(headers, name, value) {
let values // code below expects `values` to be an array of strings
if (typeof value === 'function') {
// Function values are evaluated towards the end of the response, before that we use a placeholder
// string just to designate that the header exists. Useful when `Content-Type` is set with a function.
values = [value.name]
} else if (Array.isArray(value)) {
values = value.map(String)
} else {
values = [String(value)]
}
const key = name.toLowerCase()
if (key === 'set-cookie') {
// Array header -- only Set-Cookie at the moment
if (headers['set-cookie'] === undefined) {
headers['set-cookie'] = values
} else {
headers['set-cookie'].push(...values)
}
} else if (noDuplicatesHeaders.has(key)) {
if (headers[key] === undefined) {
// Drop duplicates
headers[key] = values[0]
}
} else {
if (headers[key] !== undefined) {
values = [headers[key], ...values]
}
const separator = key === 'cookie' ? '; ' : ', '
headers[key] = values.join(separator)
}
}
/**
* Deletes the given `fieldName` property from `headers` object by performing
* case-insensitive search through keys.
*
* @headers {Object} headers - object of header field names and values
* @fieldName {String} field name - string with the case-insensitive field name
*/
function deleteHeadersField(headers, fieldNameToDelete) {
if (!isPlainObject(headers)) {
throw Error('headers must be an object')
}
if (typeof fieldNameToDelete !== 'string') {
throw Error('field name must be a string')
}
const lowerCaseFieldNameToDelete = fieldNameToDelete.toLowerCase()
// Search through the headers and delete all values whose field name matches the given field name.
Object.keys(headers)
.filter(fieldName => fieldName.toLowerCase() === lowerCaseFieldNameToDelete)
.forEach(fieldName => delete headers[fieldName])
}
/**
* Utility for iterating over a raw headers array.
*
* The callback is called with:
* - The header value. string, array of strings, or a function
* - The header field name. string
* - Index of the header field in the raw header array.
*/
function forEachHeader(rawHeaders, callback) {
for (let i = 0; i < rawHeaders.length; i += 2) {
callback(rawHeaders[i + 1], rawHeaders[i], i)
}
}
function percentDecode(str) {
try {
return decodeURIComponent(str.replace(/\+/g, ' '))
} catch (e) {
return str
}
}
/**
* URI encode the provided string, stringently adhering to RFC 3986.
*
* RFC 3986 reserves !, ', (, ), and * but encodeURIComponent does not encode them so we do it manually.
*
* https://tools.ietf.org/html/rfc3986
* https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent
*/
function percentEncode(str) {
return encodeURIComponent(str).replace(/[!'()*]/g, function (c) {
return `%${c.charCodeAt(0).toString(16).toUpperCase()}`
})
}
function matchStringOrRegexp(target, pattern) {
const targetStr =
target === undefined || target === null ? '' : String(target)
if (pattern instanceof RegExp) {
// if the regexp happens to have a global flag, we want to ensure we test the entire target
pattern.lastIndex = 0
return pattern.test(targetStr)
}
return targetStr === String(pattern)
}
/**
* Formats a query parameter.
*
* @param key The key of the query parameter to format.
* @param value The value of the query parameter to format.
* @param stringFormattingFn The function used to format string values. Can
* be used to encode or decode the query value.
*
* @returns *[] the formatted [key, value] pair.
*/
function formatQueryValue(key, value, stringFormattingFn) {
// TODO: Probably refactor code to replace `switch(true)` with `if`/`else`.
switch (true) {
case typeof value === 'number': // fall-through
case typeof value === 'boolean':
value = value.toString()
break
case value === null:
case value === undefined:
value = ''
break
case typeof value === 'string':
if (stringFormattingFn) {
value = stringFormattingFn(value)
}
break
case value instanceof RegExp:
break
case Array.isArray(value): {
value = value.map(function (val, idx) {
return formatQueryValue(idx, val, stringFormattingFn)[1]
})
break
}
case typeof value === 'object': {
value = Object.entries(value).reduce(function (acc, [subKey, subVal]) {
const subPair = formatQueryValue(subKey, subVal, stringFormattingFn)
acc[subPair[0]] = subPair[1]
return acc
}, {})
break
}
}
if (stringFormattingFn) key = stringFormattingFn(key)
return [key, value]
}
function isStream(obj) {
return (
obj &&
typeof obj !== 'string' &&
!Buffer.isBuffer(obj) &&
typeof obj.setEncoding === 'function'
)
}
/**
* Converts the arguments from the various signatures of http[s].request into a standard
* options object and an optional callback function.
*
* https://nodejs.org/api/http.html#http_http_request_url_options_callback
*
* Taken from the beginning of the native `ClientRequest`.
* https://github.com/nodejs/node/blob/908292cf1f551c614a733d858528ffb13fb3a524/lib/_http_client.js#L68
*/
function normalizeClientRequestArgs(input, options, cb) {
if (typeof input === 'string') {
input = urlToOptions(new url.URL(input))
} else if (input instanceof url.URL) {
input = urlToOptions(input)
} else {
cb = options
options = input
input = null
}
if (typeof options === 'function') {
cb = options
options = input || {}
} else {
options = Object.assign(input || {}, options)
}
return { options, callback: cb }
}
/**
* Utility function that converts a URL object into an ordinary
* options object as expected by the http.request and https.request APIs.
*
* This was copied from Node's source
* https://github.com/nodejs/node/blob/908292cf1f551c614a733d858528ffb13fb3a524/lib/internal/url.js#L1257
*/
function urlToOptions(url) {
const options = {
protocol: url.protocol,
hostname:
typeof url.hostname === 'string' && url.hostname.startsWith('[')
? url.hostname.slice(1, -1)
: url.hostname,
hash: url.hash,
search: url.search,
pathname: url.pathname,
path: `${url.pathname}${url.search || ''}`,
href: url.href,
}
if (url.port !== '') {
options.port = Number(url.port)
}
if (url.username || url.password) {
options.auth = `${url.username}:${url.password}`
}
return options
}
/**
* Determines if request data matches the expected schema.
*
* Used for comparing decoded search parameters, request body JSON objects,
* and URL decoded request form bodies.
*
* Performs a general recursive strict comparison with two caveats:
* - The expected data can use regexp to compare values
* - JSON path notation and nested objects are considered equal
*/
const dataEqual = (expected, actual) => {
if (isPlainObject(expected)) {
expected = expand(expected)
}
if (isPlainObject(actual)) {
actual = expand(actual)
}
return deepEqual(expected, actual)
}
/**
* Converts flat objects whose keys use JSON path notation to nested objects.
*
* The input object is not mutated.
*
* @example
* { 'foo[bar][0]': 'baz' } -> { foo: { bar: [ 'baz' ] } }
*/
const expand = input =>
Object.entries(input).reduce((acc, [k, v]) => set(acc, k, v), {})
/**
* Performs a recursive strict comparison between two values.
*
* Expected values or leaf nodes of expected object values that are RegExp use test() for comparison.
*/
function deepEqual(expected, actual) {
debug('deepEqual comparing', typeof expected, expected, typeof actual, actual)
if (expected instanceof RegExp) {
return expected.test(actual)
}
if (Array.isArray(expected) && Array.isArray(actual)) {
if (expected.length !== actual.length) {
return false
}
return expected.every((expVal, idx) => deepEqual(expVal, actual[idx]))
}
if (isPlainObject(expected) && isPlainObject(actual)) {
const allKeys = Array.from(
new Set(Object.keys(expected).concat(Object.keys(actual)))
)
return allKeys.every(key => deepEqual(expected[key], actual[key]))
}
return expected === actual
}
/**
* Checks if `value` is a plain object, that is, an object created by the
* `Object` constructor or one with a `[[Prototype]]` of `null`.
* https://github.com/lodash/lodash/blob/588bf3e20db0ae039a822a14a8fa238c5b298e65/isPlainObject.js
*
* @param {*} value The value to check.
* @return {boolean}
*/
function isPlainObject(value) {
const isObjectLike = typeof value === 'object' && value !== null
const tag = Object.prototype.toString.call(value)
if (!isObjectLike || tag !== '[object Object]') {
return false
}
if (Object.getPrototypeOf(value) === null) {
return true
}
let proto = value
while (Object.getPrototypeOf(proto) !== null) {
proto = Object.getPrototypeOf(proto)
}
return Object.getPrototypeOf(value) === proto
}
/**
* Creates an object with the same keys as `object` and values generated
* by running each own enumerable string keyed property of `object` thru
* `iteratee`. (iteration order is not guaranteed)
* The iteratee is invoked with three arguments: (value, key, object).
* https://github.com/lodash/lodash/blob/588bf3e20db0ae039a822a14a8fa238c5b298e65/mapValue.js
*
* @param {Object} object The object to iterate over.
* @param {Function} iteratee The function invoked per iteration.
* @returns {Object} Returns the new mapped object.
*/
function mapValue(object, iteratee) {
object = Object(object)
const result = {}
Object.keys(object).forEach(key => {
result[key] = iteratee(object[key], key, object)
})
return result
}
const timeouts = []
const intervals = []
const immediates = []
const wrapTimer =
(timer, ids) =>
(...args) => {
const id = timer(...args)
ids.push(id)
return id
}
const setTimeout = wrapTimer(timers.setTimeout, timeouts)
const setInterval = wrapTimer(timers.setInterval, intervals)
const setImmediate = wrapTimer(timers.setImmediate, immediates)
function clearTimer(clear, ids) {
while (ids.length) {
clear(ids.shift())
}
}
function removeAllTimers() {
clearTimer(clearTimeout, timeouts)
clearTimer(clearInterval, intervals)
clearTimer(clearImmediate, immediates)
}
/**
* Check if the Client Request has been cancelled.
*
* Until Node 14 is the minimum, we need to look at both flags to see if the request has been cancelled.
* The two flags have the same purpose, but the Node maintainers are migrating from `abort(ed)` to
* `destroy(ed)` terminology, to be more consistent with `stream.Writable`.
* In Node 14.x+, Calling `abort()` will set both `aborted` and `destroyed` to true, however,
* calling `destroy()` will only set `destroyed` to true.
* Falling back on checking if the socket is destroyed to cover the case of Node <14.x where
* `destroy()` is called, but `destroyed` is undefined.
*
* Node Client Request history:
* - `request.abort()`: Added in: v0.3.8, Deprecated since: v14.1.0, v13.14.0
* - `request.aborted`: Added in: v0.11.14, Became a boolean instead of a timestamp: v11.0.0, Not deprecated (yet)
* - `request.destroy()`: Added in: v0.3.0
* - `request.destroyed`: Added in: v14.1.0, v13.14.0
*
* @param {ClientRequest} req
* @returns {boolean}
*/
function isRequestDestroyed(req) {
return !!(
req.destroyed === true ||
req.aborted ||
(req.socket && req.socket.destroyed)
)
}
module.exports = {
contentEncoding,
dataEqual,
deleteHeadersField,
forEachHeader,
formatQueryValue,
headersArrayToObject,
headersFieldNamesToLowerCase,
headersFieldsArrayToLowerCase,
headersInputToRawArray,
isContentEncoded,
isJSONContent,
isPlainObject,
isRequestDestroyed,
isStream,
isUtf8Representable,
mapValue,
matchStringOrRegexp,
normalizeClientRequestArgs,
normalizeOrigin,
normalizeRequestOptions,
overrideRequests,
percentDecode,
percentEncode,
removeAllTimers,
restoreOverriddenRequests,
setImmediate,
setInterval,
setTimeout,
stringifyRequest,
}
nock-13.2.4/lib/global_emitter.js 0000664 0000000 0000000 00000000136 14177263367 0016650 0 ustar 00root root 0000000 0000000 'use strict'
const { EventEmitter } = require('events')
module.exports = new EventEmitter()
nock-13.2.4/lib/intercept.js 0000664 0000000 0000000 00000032762 14177263367 0015666 0 ustar 00root root 0000000 0000000 'use strict'
/**
* @module nock/intercept
*/
const { InterceptedRequestRouter } = require('./intercepted_request_router')
const common = require('./common')
const { inherits } = require('util')
const http = require('http')
const debug = require('debug')('nock.intercept')
const globalEmitter = require('./global_emitter')
/**
* @name NetConnectNotAllowedError
* @private
* @desc Error trying to make a connection when disabled external access.
* @class
* @example
* nock.disableNetConnect();
* http.get('http://zombo.com');
* // throw NetConnectNotAllowedError
*/
function NetConnectNotAllowedError(host, path) {
Error.call(this)
this.name = 'NetConnectNotAllowedError'
this.code = 'ENETUNREACH'
this.message = `Nock: Disallowed net connect for "${host}${path}"`
Error.captureStackTrace(this, this.constructor)
}
inherits(NetConnectNotAllowedError, Error)
let allInterceptors = {}
let allowNetConnect
/**
* Enabled real request.
* @public
* @param {String|RegExp} matcher=RegExp.new('.*') Expression to match
* @example
* // Enables all real requests
* nock.enableNetConnect();
* @example
* // Enables real requests for url that matches google
* nock.enableNetConnect('google');
* @example
* // Enables real requests for url that matches google and amazon
* nock.enableNetConnect(/(google|amazon)/);
* @example
* // Enables real requests for url that includes google
* nock.enableNetConnect(host => host.includes('google'));
*/
function enableNetConnect(matcher) {
if (typeof matcher === 'string') {
allowNetConnect = new RegExp(matcher)
} else if (matcher instanceof RegExp) {
allowNetConnect = matcher
} else if (typeof matcher === 'function') {
allowNetConnect = { test: matcher }
} else {
allowNetConnect = /.*/
}
}
function isEnabledForNetConnect(options) {
common.normalizeRequestOptions(options)
const enabled = allowNetConnect && allowNetConnect.test(options.host)
debug('Net connect', enabled ? '' : 'not', 'enabled for', options.host)
return enabled
}
/**
* Disable all real requests.
* @public
* @example
* nock.disableNetConnect();
*/
function disableNetConnect() {
allowNetConnect = undefined
}
function isOn() {
return !isOff()
}
function isOff() {
return process.env.NOCK_OFF === 'true'
}
function addInterceptor(key, interceptor, scope, scopeOptions, host) {
if (!(key in allInterceptors)) {
allInterceptors[key] = { key, interceptors: [] }
}
interceptor.__nock_scope = scope
// We need scope's key and scope options for scope filtering function (if defined)
interceptor.__nock_scopeKey = key
interceptor.__nock_scopeOptions = scopeOptions
// We need scope's host for setting correct request headers for filtered scopes.
interceptor.__nock_scopeHost = host
interceptor.interceptionCounter = 0
if (scopeOptions.allowUnmocked) allInterceptors[key].allowUnmocked = true
allInterceptors[key].interceptors.push(interceptor)
}
function remove(interceptor) {
if (interceptor.__nock_scope.shouldPersist() || --interceptor.counter > 0) {
return
}
const { basePath } = interceptor
const interceptors =
(allInterceptors[basePath] && allInterceptors[basePath].interceptors) || []
// TODO: There is a clearer way to write that we want to delete the first
// matching instance. I'm also not sure why we couldn't delete _all_
// matching instances.
interceptors.some(function (thisInterceptor, i) {
return thisInterceptor === interceptor ? interceptors.splice(i, 1) : false
})
}
function removeAll() {
Object.keys(allInterceptors).forEach(function (key) {
allInterceptors[key].interceptors.forEach(function (interceptor) {
interceptor.scope.keyedInterceptors = {}
})
})
allInterceptors = {}
}
/**
* Return all the Interceptors whose Scopes match against the base path of the provided options.
*
* @returns {Interceptor[]}
*/
function interceptorsFor(options) {
common.normalizeRequestOptions(options)
debug('interceptors for %j', options.host)
const basePath = `${options.proto}://${options.host}`
debug('filtering interceptors for basepath', basePath)
// First try to use filteringScope if any of the interceptors has it defined.
for (const { key, interceptors, allowUnmocked } of Object.values(
allInterceptors
)) {
for (const interceptor of interceptors) {
const { filteringScope } = interceptor.__nock_scopeOptions
// If scope filtering function is defined and returns a truthy value then
// we have to treat this as a match.
if (filteringScope && filteringScope(basePath)) {
interceptor.scope.logger('found matching scope interceptor')
// Keep the filtered scope (its key) to signal the rest of the module
// that this wasn't an exact but filtered match.
interceptors.forEach(ic => {
ic.__nock_filteredScope = ic.__nock_scopeKey
})
return interceptors
}
}
if (common.matchStringOrRegexp(basePath, key)) {
if (allowUnmocked && interceptors.length === 0) {
debug('matched base path with allowUnmocked (no matching interceptors)')
return [
{
options: { allowUnmocked: true },
matchOrigin() {
return false
},
},
]
} else {
debug(
`matched base path (${interceptors.length} interceptor${
interceptors.length > 1 ? 's' : ''
})`
)
return interceptors
}
}
}
return undefined
}
function removeInterceptor(options) {
// Lazily import to avoid circular imports.
const Interceptor = require('./interceptor')
let baseUrl, key, method, proto
if (options instanceof Interceptor) {
baseUrl = options.basePath
key = options._key
} else {
proto = options.proto ? options.proto : 'http'
common.normalizeRequestOptions(options)
baseUrl = `${proto}://${options.host}`
method = (options.method && options.method.toUpperCase()) || 'GET'
key = `${method} ${baseUrl}${options.path || '/'}`
}
if (
allInterceptors[baseUrl] &&
allInterceptors[baseUrl].interceptors.length > 0
) {
for (let i = 0; i < allInterceptors[baseUrl].interceptors.length; i++) {
const interceptor = allInterceptors[baseUrl].interceptors[i]
if (interceptor._key === key) {
allInterceptors[baseUrl].interceptors.splice(i, 1)
interceptor.scope.remove(key, interceptor)
break
}
}
return true
}
return false
}
// Variable where we keep the ClientRequest we have overridden
// (which might or might not be node's original http.ClientRequest)
let originalClientRequest
function ErroringClientRequest(error) {
http.OutgoingMessage.call(this)
process.nextTick(
function () {
this.emit('error', error)
}.bind(this)
)
}
inherits(ErroringClientRequest, http.ClientRequest)
function overrideClientRequest() {
// Here's some background discussion about overriding ClientRequest:
// - https://github.com/nodejitsu/mock-request/issues/4
// - https://github.com/nock/nock/issues/26
// It would be good to add a comment that explains this more clearly.
debug('Overriding ClientRequest')
// ----- Extending http.ClientRequest
// Define the overriding client request that nock uses internally.
function OverriddenClientRequest(...args) {
const { options, callback } = common.normalizeClientRequestArgs(...args)
if (Object.keys(options).length === 0) {
// As weird as it is, it's possible to call `http.request` without
// options, and it makes a request to localhost or somesuch. We should
// support it too, for parity. However it doesn't work today, and fixing
// it seems low priority. Giving an explicit error is nicer than
// crashing with a weird stack trace. `http[s].request()`, nock's other
// client-facing entry point, makes a similar check.
// https://github.com/nock/nock/pull/1386
// https://github.com/nock/nock/pull/1440
throw Error(
'Creating a ClientRequest with empty `options` is not supported in Nock'
)
}
http.OutgoingMessage.call(this)
// Filter the interceptors per request options.
const interceptors = interceptorsFor(options)
if (isOn() && interceptors) {
debug('using', interceptors.length, 'interceptors')
// Use filtered interceptors to intercept requests.
// TODO: this shouldn't be a class anymore
// the overrider explicitly overrides methods and attrs on the request so the `assign` below should be removed.
const overrider = new InterceptedRequestRouter({
req: this,
options,
interceptors,
})
Object.assign(this, overrider)
if (callback) {
this.once('response', callback)
}
} else {
debug('falling back to original ClientRequest')
// Fallback to original ClientRequest if nock is off or the net connection is enabled.
if (isOff() || isEnabledForNetConnect(options)) {
originalClientRequest.apply(this, arguments)
} else {
common.setImmediate(
function () {
const error = new NetConnectNotAllowedError(
options.host,
options.path
)
this.emit('error', error)
}.bind(this)
)
}
}
}
inherits(OverriddenClientRequest, http.ClientRequest)
// Override the http module's request but keep the original so that we can use it and later restore it.
// NOTE: We only override http.ClientRequest as https module also uses it.
originalClientRequest = http.ClientRequest
http.ClientRequest = OverriddenClientRequest
debug('ClientRequest overridden')
}
function restoreOverriddenClientRequest() {
debug('restoring overridden ClientRequest')
// Restore the ClientRequest we have overridden.
if (!originalClientRequest) {
debug('- ClientRequest was not overridden')
} else {
http.ClientRequest = originalClientRequest
originalClientRequest = undefined
debug('- ClientRequest restored')
}
}
function isActive() {
// If ClientRequest has been overwritten by Nock then originalClientRequest is not undefined.
// This means that Nock has been activated.
return originalClientRequest !== undefined
}
function interceptorScopes() {
const nestedInterceptors = Object.values(allInterceptors).map(
i => i.interceptors
)
return [].concat(...nestedInterceptors).map(i => i.scope)
}
function isDone() {
return interceptorScopes().every(scope => scope.isDone())
}
function pendingMocks() {
return [].concat(...interceptorScopes().map(scope => scope.pendingMocks()))
}
function activeMocks() {
return [].concat(...interceptorScopes().map(scope => scope.activeMocks()))
}
function activate() {
if (originalClientRequest) {
throw new Error('Nock already active')
}
overrideClientRequest()
// ----- Overriding http.request and https.request:
common.overrideRequests(function (proto, overriddenRequest, args) {
// NOTE: overriddenRequest is already bound to its module.
const { options, callback } = common.normalizeClientRequestArgs(...args)
if (Object.keys(options).length === 0) {
// As weird as it is, it's possible to call `http.request` without
// options, and it makes a request to localhost or somesuch. We should
// support it too, for parity. However it doesn't work today, and fixing
// it seems low priority. Giving an explicit error is nicer than
// crashing with a weird stack trace. `new ClientRequest()`, nock's
// other client-facing entry point, makes a similar check.
// https://github.com/nock/nock/pull/1386
// https://github.com/nock/nock/pull/1440
throw Error(
'Making a request with empty `options` is not supported in Nock'
)
}
// The option per the docs is `protocol`. Its unclear if this line is meant to override that and is misspelled or if
// the intend is to explicitly keep track of which module was called using a separate name.
// Either way, `proto` is used as the source of truth from here on out.
options.proto = proto
const interceptors = interceptorsFor(options)
if (isOn() && interceptors) {
const matches = interceptors.some(interceptor =>
interceptor.matchOrigin(options)
)
const allowUnmocked = interceptors.some(
interceptor => interceptor.options.allowUnmocked
)
if (!matches && allowUnmocked) {
let req
if (proto === 'https') {
const { ClientRequest } = http
http.ClientRequest = originalClientRequest
req = overriddenRequest(options, callback)
http.ClientRequest = ClientRequest
} else {
req = overriddenRequest(options, callback)
}
globalEmitter.emit('no match', req)
return req
}
// NOTE: Since we already overrode the http.ClientRequest we are in fact constructing
// our own OverriddenClientRequest.
return new http.ClientRequest(options, callback)
} else {
globalEmitter.emit('no match', options)
if (isOff() || isEnabledForNetConnect(options)) {
return overriddenRequest(options, callback)
} else {
const error = new NetConnectNotAllowedError(options.host, options.path)
return new ErroringClientRequest(error)
}
}
})
}
module.exports = {
addInterceptor,
remove,
removeAll,
removeInterceptor,
isOn,
activate,
isActive,
isDone,
pendingMocks,
activeMocks,
enableNetConnect,
disableNetConnect,
restoreOverriddenClientRequest,
abortPendingRequests: common.removeAllTimers,
}
nock-13.2.4/lib/intercepted_request_router.js 0000664 0000000 0000000 00000025622 14177263367 0021344 0 ustar 00root root 0000000 0000000 'use strict'
const debug = require('debug')('nock.request_overrider')
const {
IncomingMessage,
ClientRequest,
request: originalHttpRequest,
} = require('http')
const { request: originalHttpsRequest } = require('https')
const propagate = require('propagate')
const common = require('./common')
const globalEmitter = require('./global_emitter')
const Socket = require('./socket')
const { playbackInterceptor } = require('./playback_interceptor')
function socketOnClose(req) {
debug('socket close')
if (!req.res && !req.socket._hadError) {
// If we don't have a response then we know that the socket
// ended prematurely and we need to emit an error on the request.
req.socket._hadError = true
const err = new Error('socket hang up')
err.code = 'ECONNRESET'
req.emit('error', err)
}
req.emit('close')
}
/**
* Given a group of interceptors, appropriately route an outgoing request.
* Identify which interceptor ought to respond, if any, then delegate to
* `playbackInterceptor()` to consume the request itself.
*/
class InterceptedRequestRouter {
constructor({ req, options, interceptors }) {
this.req = req
this.options = {
// We may be changing the options object and we don't want those changes
// affecting the user so we use a clone of the object.
...options,
// We use lower-case header field names throughout Nock.
headers: common.headersFieldNamesToLowerCase(
options.headers || {},
false
),
}
this.interceptors = interceptors
this.socket = new Socket(options)
// support setting `timeout` using request `options`
// https://nodejs.org/docs/latest-v12.x/api/http.html#http_http_request_url_options_callback
// any timeout in the request options override any timeout in the agent options.
// per https://github.com/nodejs/node/pull/21204
const timeout =
options.timeout ||
(options.agent && options.agent.options && options.agent.options.timeout)
if (timeout) {
this.socket.setTimeout(timeout)
}
this.response = new IncomingMessage(this.socket)
this.requestBodyBuffers = []
this.playbackStarted = false
// For parity with Node, it's important the socket event is emitted before we begin playback.
// This flag is set when playback is triggered if we haven't yet gotten the
// socket event to indicate that playback should start as soon as it comes in.
this.readyToStartPlaybackOnSocketEvent = false
this.attachToReq()
// Emit a fake socket event on the next tick to mimic what would happen on a real request.
// Some clients listen for a 'socket' event to be emitted before calling end(),
// which causes Nock to hang.
process.nextTick(() => this.connectSocket())
}
attachToReq() {
const { req, options } = this
for (const [name, val] of Object.entries(options.headers)) {
req.setHeader(name.toLowerCase(), val)
}
if (options.auth && !options.headers.authorization) {
req.setHeader(
// We use lower-case header field names throughout Nock.
'authorization',
`Basic ${Buffer.from(options.auth).toString('base64')}`
)
}
req.path = options.path
req.method = options.method
req.write = (...args) => this.handleWrite(...args)
req.end = (...args) => this.handleEnd(...args)
req.flushHeaders = (...args) => this.handleFlushHeaders(...args)
// https://github.com/nock/nock/issues/256
if (options.headers.expect === '100-continue') {
common.setImmediate(() => {
debug('continue')
req.emit('continue')
})
}
}
connectSocket() {
const { req, socket } = this
if (common.isRequestDestroyed(req)) {
return
}
// ClientRequest.connection is an alias for ClientRequest.socket
// https://nodejs.org/api/http.html#http_request_socket
// https://github.com/nodejs/node/blob/b0f75818f39ed4e6bd80eb7c4010c1daf5823ef7/lib/_http_client.js#L640-L641
// The same Socket is shared between the request and response to mimic native behavior.
req.socket = req.connection = socket
propagate(['error', 'timeout'], socket, req)
socket.on('close', () => socketOnClose(req))
socket.connecting = false
req.emit('socket', socket)
// https://nodejs.org/api/net.html#net_event_connect
socket.emit('connect')
// https://nodejs.org/api/tls.html#tls_event_secureconnect
if (socket.authorized) {
socket.emit('secureConnect')
}
if (this.readyToStartPlaybackOnSocketEvent) {
this.maybeStartPlayback()
}
}
// from docs: When write function is called with empty string or buffer, it does nothing and waits for more input.
// However, actually implementation checks the state of finished and aborted before checking if the first arg is empty.
handleWrite(buffer, encoding, callback) {
debug('request write')
const { req } = this
if (req.finished) {
const err = new Error('write after end')
err.code = 'ERR_STREAM_WRITE_AFTER_END'
process.nextTick(() => req.emit('error', err))
// It seems odd to return `true` here, not sure why you'd want to have
// the stream potentially written to more, but it's what Node does.
// https://github.com/nodejs/node/blob/a9270dcbeba4316b1e179b77ecb6c46af5aa8c20/lib/_http_outgoing.js#L662-L665
return true
}
if (req.socket && req.socket.destroyed) {
return false
}
if (!buffer) {
return true
}
if (!Buffer.isBuffer(buffer)) {
buffer = Buffer.from(buffer, encoding)
}
this.requestBodyBuffers.push(buffer)
// can't use instanceof Function because some test runners
// run tests in vm.runInNewContext where Function is not same
// as that in the current context
// https://github.com/nock/nock/pull/1754#issuecomment-571531407
if (typeof callback === 'function') {
callback()
}
common.setImmediate(function () {
req.emit('drain')
})
return false
}
handleEnd(chunk, encoding, callback) {
debug('request end')
const { req } = this
// handle the different overloaded arg signatures
if (typeof chunk === 'function') {
callback = chunk
chunk = null
} else if (typeof encoding === 'function') {
callback = encoding
encoding = null
}
if (typeof callback === 'function') {
req.once('finish', callback)
}
if (chunk) {
req.write(chunk, encoding)
}
req.finished = true
this.maybeStartPlayback()
return req
}
handleFlushHeaders() {
debug('request flushHeaders')
this.maybeStartPlayback()
}
/**
* Set request headers of the given request. This is needed both during the
* routing phase, in case header filters were specified, and during the
* interceptor-playback phase, to correctly pass mocked request headers.
* TODO There are some problems with this; see https://github.com/nock/nock/issues/1718
*/
setHostHeaderUsingInterceptor(interceptor) {
const { req, options } = this
// If a filtered scope is being used we have to use scope's host in the
// header, otherwise 'host' header won't match.
// NOTE: We use lower-case header field names throughout Nock.
const HOST_HEADER = 'host'
if (interceptor.__nock_filteredScope && interceptor.__nock_scopeHost) {
options.headers[HOST_HEADER] = interceptor.__nock_scopeHost
req.setHeader(HOST_HEADER, interceptor.__nock_scopeHost)
} else {
// For all other cases, we always add host header equal to the requested
// host unless it was already defined.
if (options.host && !req.getHeader(HOST_HEADER)) {
let hostHeader = options.host
if (options.port === 80 || options.port === 443) {
hostHeader = hostHeader.split(':')[0]
}
req.setHeader(HOST_HEADER, hostHeader)
}
}
}
maybeStartPlayback() {
const { req, socket, playbackStarted } = this
// In order to get the events in the right order we need to delay playback
// if we get here before the `socket` event is emitted.
if (socket.connecting) {
this.readyToStartPlaybackOnSocketEvent = true
return
}
if (!common.isRequestDestroyed(req) && !playbackStarted) {
this.startPlayback()
}
}
startPlayback() {
debug('ending')
this.playbackStarted = true
const { req, response, socket, options, interceptors } = this
Object.assign(options, {
// Re-update `options` with the current value of `req.path` because badly
// behaving agents like superagent like to change `req.path` mid-flight.
path: req.path,
// Similarly, node-http-proxy will modify headers in flight, so we have
// to put the headers back into options.
// https://github.com/nock/nock/pull/1484
headers: req.getHeaders(),
// Fixes https://github.com/nock/nock/issues/976
protocol: `${options.proto}:`,
})
interceptors.forEach(interceptor => {
this.setHostHeaderUsingInterceptor(interceptor)
})
const requestBodyBuffer = Buffer.concat(this.requestBodyBuffers)
// When request body is a binary buffer we internally use in its hexadecimal
// representation.
const requestBodyIsUtf8Representable =
common.isUtf8Representable(requestBodyBuffer)
const requestBodyString = requestBodyBuffer.toString(
requestBodyIsUtf8Representable ? 'utf8' : 'hex'
)
const matchedInterceptor = interceptors.find(i =>
i.match(req, options, requestBodyString)
)
if (matchedInterceptor) {
matchedInterceptor.scope.logger(
'interceptor identified, starting mocking'
)
matchedInterceptor.markConsumed()
// wait to emit the finish event until we know for sure an Interceptor is going to playback.
// otherwise an unmocked request might emit finish twice.
req.emit('finish')
playbackInterceptor({
req,
socket,
options,
requestBodyString,
requestBodyIsUtf8Representable,
response,
interceptor: matchedInterceptor,
})
} else {
globalEmitter.emit('no match', req, options, requestBodyString)
// Try to find a hostname match that allows unmocked.
const allowUnmocked = interceptors.some(
i => i.matchHostName(options) && i.options.allowUnmocked
)
if (allowUnmocked && req instanceof ClientRequest) {
const newReq =
options.proto === 'https'
? originalHttpsRequest(options)
: originalHttpRequest(options)
propagate(newReq, req)
// We send the raw buffer as we received it, not as we interpreted it.
newReq.end(requestBodyBuffer)
} else {
const reqStr = common.stringifyRequest(options, requestBodyString)
const err = new Error(`Nock: No match for request ${reqStr}`)
err.code = 'ERR_NOCK_NO_MATCH'
err.statusCode = err.status = 404
req.destroy(err)
}
}
}
}
module.exports = { InterceptedRequestRouter }
nock-13.2.4/lib/interceptor.js 0000664 0000000 0000000 00000043546 14177263367 0016231 0 ustar 00root root 0000000 0000000 'use strict'
const stringify = require('json-stringify-safe')
const querystring = require('querystring')
const { URL, URLSearchParams } = require('url')
const common = require('./common')
const { remove } = require('./intercept')
const matchBody = require('./match_body')
let fs
try {
fs = require('fs')
} catch (err) {
// do nothing, we're in the browser
}
module.exports = class Interceptor {
/**
*
* Valid argument types for `uri`:
* - A string used for strict comparisons with pathname.
* The search portion of the URI may also be postfixed, in which case the search params
* are striped and added via the `query` method.
* - A RegExp instance that tests against only the pathname of requests.
* - A synchronous function bound to this Interceptor instance. It's provided the pathname
* of requests and must return a boolean denoting if the request is considered a match.
*/
constructor(scope, uri, method, requestBody, interceptorOptions) {
const uriIsStr = typeof uri === 'string'
// Check for leading slash. Uri can be either a string or a regexp, but
// When enabled filteringScope ignores the passed URL entirely so we skip validation.
if (
uriIsStr &&
!scope.scopeOptions.filteringScope &&
!scope.basePathname &&
!uri.startsWith('/') &&
!uri.startsWith('*')
) {
throw Error(
`Non-wildcard URL path strings must begin with a slash (otherwise they won't match anything) (got: ${uri})`
)
}
if (!method) {
throw new Error(
'The "method" parameter is required for an intercept call.'
)
}
this.scope = scope
this.interceptorMatchHeaders = []
this.method = method.toUpperCase()
this.uri = uri
this._key = `${this.method} ${scope.basePath}${scope.basePathname}${
uriIsStr ? '' : '/'
}${uri}`
this.basePath = this.scope.basePath
this.path = uriIsStr ? scope.basePathname + uri : uri
this.queries = null
this.options = interceptorOptions || {}
this.counter = 1
this._requestBody = requestBody
// We use lower-case header field names throughout Nock.
this.reqheaders = common.headersFieldNamesToLowerCase(
scope.scopeOptions.reqheaders || {},
true
)
this.badheaders = common.headersFieldsArrayToLowerCase(
scope.scopeOptions.badheaders || []
)
this.delayBodyInMs = 0
this.delayConnectionInMs = 0
this.optional = false
// strip off literal query parameters if they were provided as part of the URI
if (uriIsStr && uri.includes('?')) {
// localhost is a dummy value because the URL constructor errors for only relative inputs
const parsedURL = new URL(this.path, 'http://localhost')
this.path = parsedURL.pathname
this.query(parsedURL.searchParams)
this._key = `${this.method} ${scope.basePath}${this.path}`
}
}
optionally(flag = true) {
// The default behaviour of optionally() with no arguments is to make the mock optional.
if (typeof flag !== 'boolean') {
throw new Error('Invalid arguments: argument should be a boolean')
}
this.optional = flag
return this
}
replyWithError(errorMessage) {
this.errorMessage = errorMessage
this.options = {
...this.scope.scopeOptions,
...this.options,
}
this.scope.add(this._key, this)
return this.scope
}
reply(statusCode, body, rawHeaders) {
// support the format of only passing in a callback
if (typeof statusCode === 'function') {
if (arguments.length > 1) {
// It's not very Javascript-y to throw an error for extra args to a function, but because
// of legacy behavior, this error was added to reduce confusion for those migrating.
throw Error(
'Invalid arguments. When providing a function for the first argument, .reply does not accept other arguments.'
)
}
this.statusCode = null
this.fullReplyFunction = statusCode
} else {
if (statusCode !== undefined && !Number.isInteger(statusCode)) {
throw new Error(`Invalid ${typeof statusCode} value for status code`)
}
this.statusCode = statusCode || 200
if (typeof body === 'function') {
this.replyFunction = body
body = null
}
}
this.options = {
...this.scope.scopeOptions,
...this.options,
}
this.rawHeaders = common.headersInputToRawArray(rawHeaders)
if (this.scope.date) {
// https://tools.ietf.org/html/rfc7231#section-7.1.1.2
this.rawHeaders.push('Date', this.scope.date.toUTCString())
}
// Prepare the headers temporarily so we can make best guesses about content-encoding and content-type
// below as well as while the response is being processed in RequestOverrider.end().
// Including all the default headers is safe for our purposes because of the specific headers we introspect.
// A more thoughtful process is used to merge the default headers when the response headers are finally computed.
this.headers = common.headersArrayToObject(
this.rawHeaders.concat(this.scope._defaultReplyHeaders)
)
// If the content is not encoded we may need to transform the response body.
// Otherwise, we leave it as it is.
if (
body &&
typeof body !== 'string' &&
!Buffer.isBuffer(body) &&
!common.isStream(body) &&
!common.isContentEncoded(this.headers)
) {
try {
body = stringify(body)
} catch (err) {
throw new Error('Error encoding response body into JSON')
}
if (!this.headers['content-type']) {
// https://tools.ietf.org/html/rfc7231#section-3.1.1.5
this.rawHeaders.push('Content-Type', 'application/json')
}
}
if (this.scope.contentLen) {
// https://tools.ietf.org/html/rfc7230#section-3.3.2
if (typeof body === 'string') {
this.rawHeaders.push('Content-Length', body.length)
} else if (Buffer.isBuffer(body)) {
this.rawHeaders.push('Content-Length', body.byteLength)
}
}
this.scope.logger('reply.headers:', this.headers)
this.scope.logger('reply.rawHeaders:', this.rawHeaders)
this.body = body
this.scope.add(this._key, this)
return this.scope
}
replyWithFile(statusCode, filePath, headers) {
if (!fs) {
throw new Error('No fs')
}
const readStream = fs.createReadStream(filePath)
readStream.pause()
this.filePath = filePath
return this.reply(statusCode, readStream, headers)
}
// Also match request headers
// https://github.com/nock/nock/issues/163
reqheaderMatches(options, key) {
const reqHeader = this.reqheaders[key]
let header = options.headers[key]
// https://github.com/nock/nock/issues/399
// https://github.com/nock/nock/issues/822
if (header && typeof header !== 'string' && header.toString) {
header = header.toString()
}
// We skip 'host' header comparison unless it's available in both mock and
// actual request. This because 'host' may get inserted by Nock itself and
// then get recorded. NOTE: We use lower-case header field names throughout
// Nock. See https://github.com/nock/nock/pull/196.
if (key === 'host' && (header === undefined || reqHeader === undefined)) {
return true
}
if (reqHeader !== undefined && header !== undefined) {
if (typeof reqHeader === 'function') {
return reqHeader(header)
} else if (common.matchStringOrRegexp(header, reqHeader)) {
return true
}
}
this.scope.logger(
"request header field doesn't match:",
key,
header,
reqHeader
)
return false
}
match(req, options, body) {
// check if the logger is enabled because the stringifies can be expensive.
if (this.scope.logger.enabled) {
this.scope.logger(
'attempting match %s, body = %s',
stringify(options),
stringify(body)
)
}
const method = (options.method || 'GET').toUpperCase()
let { path = '/' } = options
let matches
let matchKey
const { proto } = options
if (this.method !== method) {
this.scope.logger(
`Method did not match. Request ${method} Interceptor ${this.method}`
)
return false
}
if (this.scope.transformPathFunction) {
path = this.scope.transformPathFunction(path)
}
const requestMatchesFilter = ({ name, value: predicate }) => {
const headerValue = req.getHeader(name)
if (typeof predicate === 'function') {
return predicate(headerValue)
} else {
return common.matchStringOrRegexp(headerValue, predicate)
}
}
if (
!this.scope.matchHeaders.every(requestMatchesFilter) ||
!this.interceptorMatchHeaders.every(requestMatchesFilter)
) {
this.scope.logger("headers don't match")
return false
}
const reqHeadersMatch = Object.keys(this.reqheaders).every(key =>
this.reqheaderMatches(options, key)
)
if (!reqHeadersMatch) {
this.scope.logger("headers don't match")
return false
}
if (
this.scope.scopeOptions.conditionally &&
!this.scope.scopeOptions.conditionally()
) {
this.scope.logger(
'matching failed because Scope.conditionally() did not validate'
)
return false
}
const badHeaders = this.badheaders.filter(
header => header in options.headers
)
if (badHeaders.length) {
this.scope.logger('request contains bad headers', ...badHeaders)
return false
}
// Match query strings when using query()
if (this.queries === null) {
this.scope.logger('query matching skipped')
} else {
// can't rely on pathname or search being in the options, but path has a default
const [pathname, search] = path.split('?')
const matchQueries = this.matchQuery({ search })
this.scope.logger(
matchQueries ? 'query matching succeeded' : 'query matching failed'
)
if (!matchQueries) {
return false
}
// If the query string was explicitly checked then subsequent checks against
// the path using a callback or regexp only validate the pathname.
path = pathname
}
// If we have a filtered scope then we use it instead reconstructing the
// scope from the request options (proto, host and port) as these two won't
// necessarily match and we have to remove the scope that was matched (vs.
// that was defined).
if (this.__nock_filteredScope) {
matchKey = this.__nock_filteredScope
} else {
matchKey = common.normalizeOrigin(proto, options.host, options.port)
}
if (typeof this.uri === 'function') {
matches =
common.matchStringOrRegexp(matchKey, this.basePath) &&
// This is a false positive, as `uri` is not bound to `this`.
// eslint-disable-next-line no-useless-call
this.uri.call(this, path)
} else {
matches =
common.matchStringOrRegexp(matchKey, this.basePath) &&
common.matchStringOrRegexp(path, this.path)
}
this.scope.logger(`matching ${matchKey}${path} to ${this._key}: ${matches}`)
if (matches && this._requestBody !== undefined) {
if (this.scope.transformRequestBodyFunction) {
body = this.scope.transformRequestBodyFunction(body, this._requestBody)
}
matches = matchBody(options, this._requestBody, body)
if (!matches) {
this.scope.logger(
"bodies don't match: \n",
this._requestBody,
'\n',
body
)
}
}
return matches
}
/**
* Return true when the interceptor's method, protocol, host, port, and path
* match the provided options.
*/
matchOrigin(options) {
const isPathFn = typeof this.path === 'function'
const isRegex = this.path instanceof RegExp
const isRegexBasePath = this.scope.basePath instanceof RegExp
const method = (options.method || 'GET').toUpperCase()
let { path } = options
const { proto } = options
// NOTE: Do not split off the query params as the regex could use them
if (!isRegex) {
path = path ? path.split('?')[0] : ''
}
if (this.scope.transformPathFunction) {
path = this.scope.transformPathFunction(path)
}
const comparisonKey = isPathFn || isRegex ? this.__nock_scopeKey : this._key
const matchKey = `${method} ${proto}://${options.host}${path}`
if (isPathFn) {
return !!(matchKey.match(comparisonKey) && this.path(path))
}
if (isRegex && !isRegexBasePath) {
return !!matchKey.match(comparisonKey) && this.path.test(path)
}
if (isRegexBasePath) {
return this.scope.basePath.test(matchKey) && !!path.match(this.path)
}
return comparisonKey === matchKey
}
matchHostName(options) {
const { basePath } = this.scope
if (basePath instanceof RegExp) {
return basePath.test(options.hostname)
}
return options.hostname === this.scope.urlParts.hostname
}
matchQuery(options) {
if (this.queries === true) {
return true
}
const reqQueries = querystring.parse(options.search)
this.scope.logger('Interceptor queries: %j', this.queries)
this.scope.logger(' Request queries: %j', reqQueries)
if (typeof this.queries === 'function') {
return this.queries(reqQueries)
}
return common.dataEqual(this.queries, reqQueries)
}
filteringPath(...args) {
this.scope.filteringPath(...args)
return this
}
// TODO filtering by path is valid on the intercept level, but not filtering
// by request body?
markConsumed() {
this.interceptionCounter++
if (
(this.scope.shouldPersist() || this.counter > 0) &&
this.interceptionCounter > 1 &&
this.filePath
) {
this.body = fs.createReadStream(this.filePath)
this.body.pause()
}
remove(this)
if (!this.scope.shouldPersist() && this.counter < 1) {
this.scope.remove(this._key, this)
}
}
matchHeader(name, value) {
this.interceptorMatchHeaders.push({ name, value })
return this
}
basicAuth({ user, pass = '' }) {
const encoded = Buffer.from(`${user}:${pass}`).toString('base64')
this.matchHeader('authorization', `Basic ${encoded}`)
return this
}
/**
* Set query strings for the interceptor
* @name query
* @param queries Object of query string name,values (accepts regexp values)
* @public
* @example
* // Will match 'http://zombo.com/?q=t'
* nock('http://zombo.com').get('/').query({q: 't'});
*/
query(queries) {
if (this.queries !== null) {
throw Error(`Query parameters have already been defined`)
}
// Allow all query strings to match this route
if (queries === true) {
this.queries = queries
return this
}
if (typeof queries === 'function') {
this.queries = queries
return this
}
let strFormattingFn
if (this.scope.scopeOptions.encodedQueryParams) {
strFormattingFn = common.percentDecode
}
if (queries instanceof URLSearchParams) {
// Normalize the data into the shape that is matched against.
// Duplicate keys are handled by combining the values into an array.
queries = querystring.parse(queries.toString())
} else if (!common.isPlainObject(queries)) {
throw Error(`Argument Error: ${queries}`)
}
this.queries = {}
for (const [key, value] of Object.entries(queries)) {
const formatted = common.formatQueryValue(key, value, strFormattingFn)
const [formattedKey, formattedValue] = formatted
this.queries[formattedKey] = formattedValue
}
return this
}
/**
* Set number of times will repeat the interceptor
* @name times
* @param newCounter Number of times to repeat (should be > 0)
* @public
* @example
* // Will repeat mock 5 times for same king of request
* nock('http://zombo.com).get('/').times(5).reply(200, 'Ok');
*/
times(newCounter) {
if (newCounter < 1) {
return this
}
this.counter = newCounter
return this
}
/**
* An sugar syntax for times(1)
* @name once
* @see {@link times}
* @public
* @example
* nock('http://zombo.com).get('/').once().reply(200, 'Ok');
*/
once() {
return this.times(1)
}
/**
* An sugar syntax for times(2)
* @name twice
* @see {@link times}
* @public
* @example
* nock('http://zombo.com).get('/').twice().reply(200, 'Ok');
*/
twice() {
return this.times(2)
}
/**
* An sugar syntax for times(3).
* @name thrice
* @see {@link times}
* @public
* @example
* nock('http://zombo.com).get('/').thrice().reply(200, 'Ok');
*/
thrice() {
return this.times(3)
}
/**
* Delay the response by a certain number of ms.
*
* @param {(integer|object)} opts - Number of milliseconds to wait, or an object
* @param {integer} [opts.head] - Number of milliseconds to wait before response is sent
* @param {integer} [opts.body] - Number of milliseconds to wait before response body is sent
* @return {Interceptor} - the current interceptor for chaining
*/
delay(opts) {
let headDelay
let bodyDelay
if (typeof opts === 'number') {
headDelay = opts
bodyDelay = 0
} else if (typeof opts === 'object') {
headDelay = opts.head || 0
bodyDelay = opts.body || 0
} else {
throw new Error(`Unexpected input opts ${opts}`)
}
return this.delayConnection(headDelay).delayBody(bodyDelay)
}
/**
* Delay the response body by a certain number of ms.
*
* @param {integer} ms - Number of milliseconds to wait before response is sent
* @return {Interceptor} - the current interceptor for chaining
*/
delayBody(ms) {
this.delayBodyInMs = ms
return this
}
/**
* Delay the connection by a certain number of ms.
*
* @param {integer} ms - Number of milliseconds to wait
* @return {Interceptor} - the current interceptor for chaining
*/
delayConnection(ms) {
this.delayConnectionInMs = ms
return this
}
}
nock-13.2.4/lib/match_body.js 0000664 0000000 0000000 00000004011 14177263367 0015764 0 ustar 00root root 0000000 0000000 'use strict'
const querystring = require('querystring')
const common = require('./common')
module.exports = function matchBody(options, spec, body) {
if (spec instanceof RegExp) {
return spec.test(body)
}
if (Buffer.isBuffer(spec)) {
const encoding = common.isUtf8Representable(spec) ? 'utf8' : 'hex'
spec = spec.toString(encoding)
}
const contentType = (
(options.headers &&
(options.headers['Content-Type'] || options.headers['content-type'])) ||
''
).toString()
const isMultipart = contentType.includes('multipart')
const isUrlencoded = contentType.includes('application/x-www-form-urlencoded')
// try to transform body to json
let json
if (typeof spec === 'object' || typeof spec === 'function') {
try {
json = JSON.parse(body)
} catch (err) {
// not a valid JSON string
}
if (json !== undefined) {
body = json
} else if (isUrlencoded) {
body = querystring.parse(body)
}
}
if (typeof spec === 'function') {
return spec.call(options, body)
}
// strip line endings from both so that we get a match no matter what OS we are running on
// if Content-Type does not contains 'multipart'
if (!isMultipart && typeof body === 'string') {
body = body.replace(/\r?\n|\r/g, '')
}
if (!isMultipart && typeof spec === 'string') {
spec = spec.replace(/\r?\n|\r/g, '')
}
// Because the nature of URL encoding, all the values in the body have been cast to strings.
// dataEqual does strict checking so we we have to cast the non-regexp values in the spec too.
if (isUrlencoded) {
spec = mapValuesDeep(spec, val => (val instanceof RegExp ? val : `${val}`))
}
return common.dataEqual(spec, body)
}
/**
* Based on lodash issue discussion
* https://github.com/lodash/lodash/issues/1244
*/
function mapValuesDeep(obj, cb) {
if (Array.isArray(obj)) {
return obj.map(v => mapValuesDeep(v, cb))
}
if (common.isPlainObject(obj)) {
return common.mapValue(obj, v => mapValuesDeep(v, cb))
}
return cb(obj)
}
nock-13.2.4/lib/playback_interceptor.js 0000664 0000000 0000000 00000024020 14177263367 0020061 0 ustar 00root root 0000000 0000000 'use strict'
const stream = require('stream')
const util = require('util')
const zlib = require('zlib')
const debug = require('debug')('nock.playback_interceptor')
const common = require('./common')
function parseJSONRequestBody(req, requestBody) {
if (!requestBody || !common.isJSONContent(req.headers)) {
return requestBody
}
if (common.contentEncoding(req.headers, 'gzip')) {
requestBody = String(zlib.gunzipSync(Buffer.from(requestBody, 'hex')))
} else if (common.contentEncoding(req.headers, 'deflate')) {
requestBody = String(zlib.inflateSync(Buffer.from(requestBody, 'hex')))
}
return JSON.parse(requestBody)
}
function parseFullReplyResult(response, fullReplyResult) {
debug('full response from callback result: %j', fullReplyResult)
if (!Array.isArray(fullReplyResult)) {
throw Error('A single function provided to .reply MUST return an array')
}
if (fullReplyResult.length > 3) {
throw Error(
'The array returned from the .reply callback contains too many values'
)
}
const [status, body = '', headers] = fullReplyResult
if (!Number.isInteger(status)) {
throw new Error(`Invalid ${typeof status} value for status code`)
}
response.statusCode = status
response.rawHeaders.push(...common.headersInputToRawArray(headers))
debug('response.rawHeaders after reply: %j', response.rawHeaders)
return body
}
/**
* Determine which of the default headers should be added to the response.
*
* Don't include any defaults whose case-insensitive keys are already on the response.
*/
function selectDefaultHeaders(existingHeaders, defaultHeaders) {
if (!defaultHeaders.length) {
return [] // return early if we don't need to bother
}
const definedHeaders = new Set()
const result = []
common.forEachHeader(existingHeaders, (_, fieldName) => {
definedHeaders.add(fieldName.toLowerCase())
})
common.forEachHeader(defaultHeaders, (value, fieldName) => {
if (!definedHeaders.has(fieldName.toLowerCase())) {
result.push(fieldName, value)
}
})
return result
}
// Presents a list of Buffers as a Readable
class ReadableBuffers extends stream.Readable {
constructor(buffers, opts = {}) {
super(opts)
this.buffers = buffers
}
_read(_size) {
while (this.buffers.length) {
if (!this.push(this.buffers.shift())) {
return
}
}
this.push(null)
}
}
function convertBodyToStream(body) {
if (common.isStream(body)) {
return body
}
if (body === undefined) {
return new ReadableBuffers([])
}
if (Buffer.isBuffer(body)) {
return new ReadableBuffers([body])
}
if (typeof body !== 'string') {
body = JSON.stringify(body)
}
return new ReadableBuffers([Buffer.from(body)])
}
/**
* Play back an interceptor using the given request and mock response.
*/
function playbackInterceptor({
req,
socket,
options,
requestBodyString,
requestBodyIsUtf8Representable,
response,
interceptor,
}) {
const { logger } = interceptor.scope
function start() {
req.headers = req.getHeaders()
interceptor.scope.emit('request', req, interceptor, requestBodyString)
if (typeof interceptor.errorMessage !== 'undefined') {
let error
if (typeof interceptor.errorMessage === 'object') {
error = interceptor.errorMessage
} else {
error = new Error(interceptor.errorMessage)
}
const delay = interceptor.delayBodyInMs + interceptor.delayConnectionInMs
common.setTimeout(() => req.destroy(error), delay)
return
}
// This will be null if we have a fullReplyFunction,
// in that case status code will be set in `parseFullReplyResult`
response.statusCode = interceptor.statusCode
// Clone headers/rawHeaders to not override them when evaluating later
response.rawHeaders = [...interceptor.rawHeaders]
logger('response.rawHeaders:', response.rawHeaders)
// TODO: MAJOR: Don't tack the request onto the interceptor.
// The only reason we do this is so that it's available inside reply functions.
// It would be better to pass the request as an argument to the functions instead.
// Not adding the req as a third arg now because it should first be decided if (path, body, req)
// is the signature we want to go with going forward.
interceptor.req = req
if (interceptor.replyFunction) {
const parsedRequestBody = parseJSONRequestBody(req, requestBodyString)
let fn = interceptor.replyFunction
if (fn.length === 3) {
// Handle the case of an async reply function, the third parameter being the callback.
fn = util.promisify(fn)
}
// At this point `fn` is either a synchronous function or a promise-returning function;
// wrapping in `Promise.resolve` makes it into a promise either way.
Promise.resolve(fn.call(interceptor, options.path, parsedRequestBody))
.then(continueWithResponseBody)
.catch(err => req.destroy(err))
return
}
if (interceptor.fullReplyFunction) {
const parsedRequestBody = parseJSONRequestBody(req, requestBodyString)
let fn = interceptor.fullReplyFunction
if (fn.length === 3) {
fn = util.promisify(fn)
}
Promise.resolve(fn.call(interceptor, options.path, parsedRequestBody))
.then(continueWithFullResponse)
.catch(err => req.destroy(err))
return
}
if (
common.isContentEncoded(interceptor.headers) &&
!common.isStream(interceptor.body)
) {
// If the content is encoded we know that the response body *must* be an array
// of response buffers which should be mocked one by one.
// (otherwise decompressions after the first one fails as unzip expects to receive
// buffer by buffer and not one single merged buffer)
const bufferData = Array.isArray(interceptor.body)
? interceptor.body
: [interceptor.body]
const responseBuffers = bufferData.map(data => Buffer.from(data, 'hex'))
const responseBody = new ReadableBuffers(responseBuffers)
continueWithResponseBody(responseBody)
return
}
// If we get to this point, the body is either a string or an object that
// will eventually be JSON stringified.
let responseBody = interceptor.body
// If the request was not UTF8-representable then we assume that the
// response won't be either. In that case we send the response as a Buffer
// object as that's what the client will expect.
if (!requestBodyIsUtf8Representable && typeof responseBody === 'string') {
// Try to create the buffer from the interceptor's body response as hex.
responseBody = Buffer.from(responseBody, 'hex')
// Creating buffers does not necessarily throw errors; check for difference in size.
if (
!responseBody ||
(interceptor.body.length > 0 && responseBody.length === 0)
) {
// We fallback on constructing buffer from utf8 representation of the body.
responseBody = Buffer.from(interceptor.body, 'utf8')
}
}
return continueWithResponseBody(responseBody)
}
function continueWithFullResponse(fullReplyResult) {
let responseBody
try {
responseBody = parseFullReplyResult(response, fullReplyResult)
} catch (err) {
req.destroy(err)
return
}
continueWithResponseBody(responseBody)
}
function prepareResponseHeaders(body) {
const defaultHeaders = [...interceptor.scope._defaultReplyHeaders]
// Include a JSON content type when JSON.stringify is called on the body.
// This is a convenience added by Nock that has no analog in Node. It's added to the
// defaults, so it will be ignored if the caller explicitly provided the header already.
const isJSON =
body !== undefined &&
typeof body !== 'string' &&
!Buffer.isBuffer(body) &&
!common.isStream(body)
if (isJSON) {
defaultHeaders.push('Content-Type', 'application/json')
}
response.rawHeaders.push(
...selectDefaultHeaders(response.rawHeaders, defaultHeaders)
)
// Evaluate functional headers.
common.forEachHeader(response.rawHeaders, (value, fieldName, i) => {
if (typeof value === 'function') {
response.rawHeaders[i + 1] = value(req, response, body)
}
})
response.headers = common.headersArrayToObject(response.rawHeaders)
}
function continueWithResponseBody(rawBody) {
prepareResponseHeaders(rawBody)
const bodyAsStream = convertBodyToStream(rawBody)
bodyAsStream.pause()
// IncomingMessage extends Readable so we can't simply pipe.
bodyAsStream.on('data', function (chunk) {
response.push(chunk)
})
bodyAsStream.on('end', function () {
// https://nodejs.org/dist/latest-v10.x/docs/api/http.html#http_message_complete
response.complete = true
response.push(null)
interceptor.scope.emit('replied', req, interceptor)
})
bodyAsStream.on('error', function (err) {
response.emit('error', err)
})
const { delayBodyInMs, delayConnectionInMs } = interceptor
function respond() {
if (common.isRequestDestroyed(req)) {
return
}
// Even though we've had the response object for awhile at this point,
// we only attach it to the request immediately before the `response`
// event because, as in Node, it alters the error handling around aborts.
req.res = response
response.req = req
logger('emitting response')
req.emit('response', response)
common.setTimeout(() => bodyAsStream.resume(), delayBodyInMs)
}
socket.applyDelay(delayConnectionInMs)
common.setTimeout(respond, delayConnectionInMs)
}
// Calling `start` immediately could take the request all the way to the connection delay
// during a single microtask execution. This setImmediate stalls the playback to ensure the
// correct events are emitted first ('socket', 'finish') and any aborts in the queue or
// called during a 'finish' listener can be called.
common.setImmediate(() => {
if (!common.isRequestDestroyed(req)) {
start()
}
})
}
module.exports = { playbackInterceptor }
nock-13.2.4/lib/recorder.js 0000664 0000000 0000000 00000027576 14177263367 0015505 0 ustar 00root root 0000000 0000000 'use strict'
const debug = require('debug')('nock.recorder')
const querystring = require('querystring')
const { inspect } = require('util')
const common = require('./common')
const { restoreOverriddenClientRequest } = require('./intercept')
const SEPARATOR = '\n<<<<<<-- cut here -->>>>>>\n'
let recordingInProgress = false
let outputs = []
function getScope(options) {
const { proto, host, port } = common.normalizeRequestOptions(options)
return common.normalizeOrigin(proto, host, port)
}
function getMethod(options) {
return options.method || 'GET'
}
function getBodyFromChunks(chunks, headers) {
// If we have headers and there is content-encoding it means that the body
// shouldn't be merged but instead persisted as an array of hex strings so
// that the response chunks can be mocked one by one.
if (headers && common.isContentEncoded(headers)) {
return {
body: chunks.map(chunk => chunk.toString('hex')),
}
}
const mergedBuffer = Buffer.concat(chunks)
// The merged buffer can be one of three things:
// 1. A UTF-8-representable string buffer which represents a JSON object.
// 2. A UTF-8-representable buffer which doesn't represent a JSON object.
// 3. A non-UTF-8-representable buffer which then has to be recorded as a hex string.
const isUtf8Representable = common.isUtf8Representable(mergedBuffer)
if (isUtf8Representable) {
const maybeStringifiedJson = mergedBuffer.toString('utf8')
try {
return {
isUtf8Representable,
body: JSON.parse(maybeStringifiedJson),
}
} catch (err) {
return {
isUtf8Representable,
body: maybeStringifiedJson,
}
}
} else {
return {
isUtf8Representable,
body: mergedBuffer.toString('hex'),
}
}
}
function generateRequestAndResponseObject({
req,
bodyChunks,
options,
res,
dataChunks,
reqheaders,
}) {
const { body, isUtf8Representable } = getBodyFromChunks(
dataChunks,
res.headers
)
options.path = req.path
return {
scope: getScope(options),
method: getMethod(options),
path: options.path,
// Is it deliberate that `getBodyFromChunks()` is called a second time?
body: getBodyFromChunks(bodyChunks).body,
status: res.statusCode,
response: body,
rawHeaders: res.rawHeaders,
reqheaders: reqheaders || undefined,
// When content-encoding is enabled, isUtf8Representable is `undefined`,
// so we explicitly check for `false`.
responseIsBinary: isUtf8Representable === false,
}
}
function generateRequestAndResponse({
req,
bodyChunks,
options,
res,
dataChunks,
reqheaders,
}) {
const requestBody = getBodyFromChunks(bodyChunks).body
const responseBody = getBodyFromChunks(dataChunks, res.headers).body
// Remove any query params from options.path so they can be added in the query() function
let { path } = options
const queryIndex = req.path.indexOf('?')
let queryObj = {}
if (queryIndex !== -1) {
// Remove the query from the path
path = path.substring(0, queryIndex)
const queryStr = req.path.slice(queryIndex + 1)
queryObj = querystring.parse(queryStr)
}
// Escape any single quotes in the path as the output uses them
path = path.replace(/'/g, `\\'`)
// Always encode the query parameters when recording.
const encodedQueryObj = {}
for (const key in queryObj) {
const formattedPair = common.formatQueryValue(
key,
queryObj[key],
common.percentEncode
)
encodedQueryObj[formattedPair[0]] = formattedPair[1]
}
const lines = []
// We want a leading newline.
lines.push('')
const scope = getScope(options)
lines.push(`nock('${scope}', {"encodedQueryParams":true})`)
const methodName = getMethod(options).toLowerCase()
if (requestBody) {
lines.push(` .${methodName}('${path}', ${JSON.stringify(requestBody)})`)
} else {
lines.push(` .${methodName}('${path}')`)
}
Object.entries(reqheaders || {}).forEach(([fieldName, fieldValue]) => {
const safeName = JSON.stringify(fieldName)
const safeValue = JSON.stringify(fieldValue)
lines.push(` .matchHeader(${safeName}, ${safeValue})`)
})
if (queryIndex !== -1) {
lines.push(` .query(${JSON.stringify(encodedQueryObj)})`)
}
const statusCode = res.statusCode.toString()
const stringifiedResponseBody = JSON.stringify(responseBody)
const headers = inspect(res.rawHeaders)
lines.push(` .reply(${statusCode}, ${stringifiedResponseBody}, ${headers});`)
return lines.join('\n')
}
// This module variable is used to identify a unique recording ID in order to skip
// spurious requests that sometimes happen. This problem has been, so far,
// exclusively detected in nock's unit testing where 'checks if callback is specified'
// interferes with other tests as its t.end() is invoked without waiting for request
// to finish (which is the point of the test).
let currentRecordingId = 0
const defaultRecordOptions = {
dont_print: false,
enable_reqheaders_recording: false,
logging: console.log, // eslint-disable-line no-console
output_objects: false,
use_separator: true,
}
function record(recOptions) {
// Trying to start recording with recording already in progress implies an error
// in the recording configuration (double recording makes no sense and used to lead
// to duplicates in output)
if (recordingInProgress) {
throw new Error('Nock recording already in progress')
}
recordingInProgress = true
// Set the new current recording ID and capture its value in this instance of record().
currentRecordingId = currentRecordingId + 1
const thisRecordingId = currentRecordingId
// Originally the parameter was a dont_print boolean flag.
// To keep the existing code compatible we take that case into account.
if (typeof recOptions === 'boolean') {
recOptions = { dont_print: recOptions }
}
recOptions = { ...defaultRecordOptions, ...recOptions }
debug('start recording', thisRecordingId, recOptions)
const {
dont_print: dontPrint,
enable_reqheaders_recording: enableReqHeadersRecording,
logging,
output_objects: outputObjects,
use_separator: useSeparator,
} = recOptions
debug(thisRecordingId, 'restoring overridden requests before new overrides')
// To preserve backward compatibility (starting recording wasn't throwing if nock was already active)
// we restore any requests that may have been overridden by other parts of nock (e.g. intercept)
// NOTE: This is hacky as hell but it keeps the backward compatibility *and* allows correct
// behavior in the face of other modules also overriding ClientRequest.
common.restoreOverriddenRequests()
// We restore ClientRequest as it messes with recording of modules that also override ClientRequest (e.g. xhr2)
restoreOverriddenClientRequest()
// We override the requests so that we can save information on them before executing.
common.overrideRequests(function (proto, overriddenRequest, rawArgs) {
const { options, callback } = common.normalizeClientRequestArgs(...rawArgs)
const bodyChunks = []
// Node 0.11 https.request calls http.request -- don't want to record things
// twice.
/* istanbul ignore if */
if (options._recording) {
return overriddenRequest(options, callback)
}
options._recording = true
const req = overriddenRequest(options, function (res) {
debug(thisRecordingId, 'intercepting', proto, 'request to record')
// We put our 'end' listener to the front of the listener array.
res.once('end', function () {
debug(thisRecordingId, proto, 'intercepted request ended')
let reqheaders
// Ignore request headers completely unless it was explicitly enabled by the user (see README)
if (enableReqHeadersRecording) {
// We never record user-agent headers as they are worse than useless -
// they actually make testing more difficult without providing any benefit (see README)
reqheaders = req.getHeaders()
common.deleteHeadersField(reqheaders, 'user-agent')
}
const generateFn = outputObjects
? generateRequestAndResponseObject
: generateRequestAndResponse
let out = generateFn({
req,
bodyChunks,
options,
res,
dataChunks,
reqheaders,
})
debug('out:', out)
// Check that the request was made during the current recording.
// If it hasn't then skip it. There is no other simple way to handle
// this as it depends on the timing of requests and responses. Throwing
// will make some recordings/unit tests fail randomly depending on how
// fast/slow the response arrived.
// If you are seeing this error then you need to make sure that all
// the requests made during a single recording session finish before
// ending the same recording session.
if (thisRecordingId !== currentRecordingId) {
debug('skipping recording of an out-of-order request', out)
return
}
outputs.push(out)
if (!dontPrint) {
if (useSeparator) {
if (typeof out !== 'string') {
out = JSON.stringify(out, null, 2)
}
logging(SEPARATOR + out + SEPARATOR)
} else {
logging(out)
}
}
})
let encoding
// We need to be aware of changes to the stream's encoding so that we
// don't accidentally mangle the data.
const { setEncoding } = res
res.setEncoding = function (newEncoding) {
encoding = newEncoding
return setEncoding.apply(this, arguments)
}
const dataChunks = []
// Replace res.push with our own implementation that stores chunks
const origResPush = res.push
res.push = function (data) {
if (data) {
if (encoding) {
data = Buffer.from(data, encoding)
}
dataChunks.push(data)
}
return origResPush.call(res, data)
}
if (callback) {
callback(res, options, callback)
}
debug('finished setting up intercepting')
// We override both the http and the https modules; when we are
// serializing the request, we need to know which was called.
// By stuffing the state, we can make sure that nock records
// the intended protocol.
if (proto === 'https') {
options.proto = 'https'
}
})
const recordChunk = (chunk, encoding) => {
debug(thisRecordingId, 'new', proto, 'body chunk')
if (!Buffer.isBuffer(chunk)) {
chunk = Buffer.from(chunk, encoding)
}
bodyChunks.push(chunk)
}
const oldWrite = req.write
req.write = function (chunk, encoding) {
if (typeof chunk !== 'undefined') {
recordChunk(chunk, encoding)
oldWrite.apply(req, arguments)
} else {
throw new Error('Data was undefined.')
}
}
// Starting in Node 8, `OutgoingMessage.end()` directly calls an internal
// `write_` function instead of proxying to the public
// `OutgoingMessage.write()` method, so we have to wrap `end` too.
const oldEnd = req.end
req.end = function (chunk, encoding, callback) {
debug('req.end')
if (typeof chunk === 'function') {
callback = chunk
chunk = null
} else if (typeof encoding === 'function') {
callback = encoding
encoding = null
}
if (chunk) {
recordChunk(chunk, encoding)
}
oldEnd.call(req, chunk, encoding, callback)
}
return req
})
}
// Restore *all* the overridden http/https modules' properties.
function restore() {
debug(
currentRecordingId,
'restoring all the overridden http/https properties'
)
common.restoreOverriddenRequests()
restoreOverriddenClientRequest()
recordingInProgress = false
}
function clear() {
outputs = []
}
module.exports = {
record,
outputs: () => outputs,
restore,
clear,
}
nock-13.2.4/lib/scope.js 0000664 0000000 0000000 00000023320 14177263367 0014770 0 ustar 00root root 0000000 0000000 'use strict'
/**
* @module nock/scope
*/
const { addInterceptor, isOn } = require('./intercept')
const common = require('./common')
const assert = require('assert')
const url = require('url')
const debug = require('debug')('nock.scope')
const { EventEmitter } = require('events')
const Interceptor = require('./interceptor')
let fs
try {
fs = require('fs')
} catch (err) {
// do nothing, we're in the browser
}
/**
* @param {string|RegExp|url.url} basePath
* @param {Object} options
* @param {boolean} options.allowUnmocked
* @param {string[]} options.badheaders
* @param {function} options.conditionally
* @param {boolean} options.encodedQueryParams
* @param {function} options.filteringScope
* @param {Object} options.reqheaders
* @constructor
*/
class Scope extends EventEmitter {
constructor(basePath, options) {
super()
this.keyedInterceptors = {}
this.interceptors = []
this.transformPathFunction = null
this.transformRequestBodyFunction = null
this.matchHeaders = []
this.scopeOptions = options || {}
this.urlParts = {}
this._persist = false
this.contentLen = false
this.date = null
this.basePath = basePath
this.basePathname = ''
this.port = null
this._defaultReplyHeaders = []
let logNamespace = String(basePath)
if (!(basePath instanceof RegExp)) {
this.urlParts = url.parse(basePath)
this.port =
this.urlParts.port || (this.urlParts.protocol === 'http:' ? 80 : 443)
this.basePathname = this.urlParts.pathname.replace(/\/$/, '')
this.basePath = `${this.urlParts.protocol}//${this.urlParts.hostname}:${this.port}`
logNamespace = this.urlParts.host
}
this.logger = debug.extend(logNamespace)
}
add(key, interceptor) {
if (!(key in this.keyedInterceptors)) {
this.keyedInterceptors[key] = []
}
this.keyedInterceptors[key].push(interceptor)
addInterceptor(
this.basePath,
interceptor,
this,
this.scopeOptions,
this.urlParts.hostname
)
}
remove(key, interceptor) {
if (this._persist) {
return
}
const arr = this.keyedInterceptors[key]
if (arr) {
arr.splice(arr.indexOf(interceptor), 1)
if (arr.length === 0) {
delete this.keyedInterceptors[key]
}
}
}
intercept(uri, method, requestBody, interceptorOptions) {
const ic = new Interceptor(
this,
uri,
method,
requestBody,
interceptorOptions
)
this.interceptors.push(ic)
return ic
}
get(uri, requestBody, options) {
return this.intercept(uri, 'GET', requestBody, options)
}
post(uri, requestBody, options) {
return this.intercept(uri, 'POST', requestBody, options)
}
put(uri, requestBody, options) {
return this.intercept(uri, 'PUT', requestBody, options)
}
head(uri, requestBody, options) {
return this.intercept(uri, 'HEAD', requestBody, options)
}
patch(uri, requestBody, options) {
return this.intercept(uri, 'PATCH', requestBody, options)
}
merge(uri, requestBody, options) {
return this.intercept(uri, 'MERGE', requestBody, options)
}
delete(uri, requestBody, options) {
return this.intercept(uri, 'DELETE', requestBody, options)
}
options(uri, requestBody, options) {
return this.intercept(uri, 'OPTIONS', requestBody, options)
}
// Returns the list of keys for non-optional Interceptors that haven't been completed yet.
// TODO: This assumes that completed mocks are removed from the keyedInterceptors list
// (when persistence is off). We should change that (and this) in future.
pendingMocks() {
return this.activeMocks().filter(key =>
this.keyedInterceptors[key].some(({ interceptionCounter, optional }) => {
const persistedAndUsed = this._persist && interceptionCounter > 0
return !persistedAndUsed && !optional
})
)
}
// Returns all keyedInterceptors that are active.
// This includes incomplete interceptors, persisted but complete interceptors, and
// optional interceptors, but not non-persisted and completed interceptors.
activeMocks() {
return Object.keys(this.keyedInterceptors)
}
isDone() {
if (!isOn()) {
return true
}
return this.pendingMocks().length === 0
}
done() {
assert.ok(
this.isDone(),
`Mocks not yet satisfied:\n${this.pendingMocks().join('\n')}`
)
}
buildFilter() {
const filteringArguments = arguments
if (arguments[0] instanceof RegExp) {
return function (candidate) {
/* istanbul ignore if */
if (typeof candidate !== 'string') {
// Given the way nock is written, it seems like `candidate` will always
// be a string, regardless of what options might be passed to it.
// However the code used to contain a truthiness test of `candidate`.
// The check is being preserved for now.
throw Error(
`Nock internal assertion failed: typeof candidate is ${typeof candidate}. If you encounter this error, please report it as a bug.`
)
}
return candidate.replace(filteringArguments[0], filteringArguments[1])
}
} else if (typeof arguments[0] === 'function') {
return arguments[0]
}
}
filteringPath() {
this.transformPathFunction = this.buildFilter.apply(this, arguments)
if (!this.transformPathFunction) {
throw new Error(
'Invalid arguments: filtering path should be a function or a regular expression'
)
}
return this
}
filteringRequestBody() {
this.transformRequestBodyFunction = this.buildFilter.apply(this, arguments)
if (!this.transformRequestBodyFunction) {
throw new Error(
'Invalid arguments: filtering request body should be a function or a regular expression'
)
}
return this
}
matchHeader(name, value) {
// We use lower-case header field names throughout Nock.
this.matchHeaders.push({ name: name.toLowerCase(), value })
return this
}
defaultReplyHeaders(headers) {
this._defaultReplyHeaders = common.headersInputToRawArray(headers)
return this
}
persist(flag = true) {
if (typeof flag !== 'boolean') {
throw new Error('Invalid arguments: argument should be a boolean')
}
this._persist = flag
return this
}
/**
* @private
* @returns {boolean}
*/
shouldPersist() {
return this._persist
}
replyContentLength() {
this.contentLen = true
return this
}
replyDate(d) {
this.date = d || new Date()
return this
}
}
function loadDefs(path) {
if (!fs) {
throw new Error('No fs')
}
const contents = fs.readFileSync(path)
return JSON.parse(contents)
}
function load(path) {
return define(loadDefs(path))
}
function getStatusFromDefinition(nockDef) {
// Backward compatibility for when `status` was encoded as string in `reply`.
if (nockDef.reply !== undefined) {
const parsedReply = parseInt(nockDef.reply, 10)
if (isNaN(parsedReply)) {
throw Error('`reply`, when present, must be a numeric string')
}
return parsedReply
}
const DEFAULT_STATUS_OK = 200
return nockDef.status || DEFAULT_STATUS_OK
}
function getScopeFromDefinition(nockDef) {
// Backward compatibility for when `port` was part of definition.
if (nockDef.port !== undefined) {
// Include `port` into scope if it doesn't exist.
const options = url.parse(nockDef.scope)
if (options.port === null) {
return `${nockDef.scope}:${nockDef.port}`
} else {
if (parseInt(options.port) !== parseInt(nockDef.port)) {
throw new Error(
'Mismatched port numbers in scope and port properties of nock definition.'
)
}
}
}
return nockDef.scope
}
function tryJsonParse(string) {
try {
return JSON.parse(string)
} catch (err) {
return string
}
}
function define(nockDefs) {
const scopes = []
nockDefs.forEach(function (nockDef) {
const nscope = getScopeFromDefinition(nockDef)
const npath = nockDef.path
if (!nockDef.method) {
throw Error('Method is required')
}
const method = nockDef.method.toLowerCase()
const status = getStatusFromDefinition(nockDef)
const rawHeaders = nockDef.rawHeaders || []
const reqheaders = nockDef.reqheaders || {}
const badheaders = nockDef.badheaders || []
const options = { ...nockDef.options }
// We use request headers for both filtering (see below) and mocking.
// Here we are setting up mocked request headers but we don't want to
// be changing the user's options object so we clone it first.
options.reqheaders = reqheaders
options.badheaders = badheaders
// Response is not always JSON as it could be a string or binary data or
// even an array of binary buffers (e.g. when content is encoded).
let response
if (!nockDef.response) {
response = ''
// TODO: Rename `responseIsBinary` to `responseIsUtf8Representable`.
} else if (nockDef.responseIsBinary) {
response = Buffer.from(nockDef.response, 'hex')
} else {
response =
typeof nockDef.response === 'string'
? tryJsonParse(nockDef.response)
: nockDef.response
}
const scope = new Scope(nscope, options)
// If request headers were specified filter by them.
Object.entries(reqheaders).forEach(([fieldName, value]) => {
scope.matchHeader(fieldName, value)
})
const acceptableFilters = ['filteringRequestBody', 'filteringPath']
acceptableFilters.forEach(filter => {
if (nockDef[filter]) {
scope[filter](nockDef[filter])
}
})
scope
.intercept(npath, method, nockDef.body)
.reply(status, response, rawHeaders)
scopes.push(scope)
})
return scopes
}
module.exports = {
Scope,
load,
loadDefs,
define,
}
nock-13.2.4/lib/socket.js 0000664 0000000 0000000 00000005154 14177263367 0015154 0 ustar 00root root 0000000 0000000 'use strict'
const { EventEmitter } = require('events')
const debug = require('debug')('nock.socket')
module.exports = class Socket extends EventEmitter {
constructor(options) {
super()
// Pretend this is a TLSSocket
if (options.proto === 'https') {
// https://github.com/nock/nock/issues/158
this.authorized = true
// https://github.com/nock/nock/issues/2147
this.encrypted = true
}
this.bufferSize = 0
this.writableLength = 0
this.writable = true
this.readable = true
this.pending = false
this.destroyed = false
this.connecting = true
// Undocumented flag used by ClientRequest to ensure errors aren't double-fired
this._hadError = false
// Maximum allowed delay. 0 means unlimited.
this.timeout = 0
const ipv6 = options.family === 6
this.remoteFamily = ipv6 ? 'IPv6' : 'IPv4'
this.localAddress = this.remoteAddress = ipv6 ? '::1' : '127.0.0.1'
this.localPort = this.remotePort = parseInt(options.port)
}
setNoDelay() {}
setKeepAlive() {}
resume() {}
ref() {}
unref() {}
address() {
return {
port: this.remotePort,
family: this.remoteFamily,
address: this.remoteAddress,
}
}
setTimeout(timeoutMs, fn) {
this.timeout = timeoutMs
if (fn) {
this.once('timeout', fn)
}
return this
}
/**
* Artificial delay that will trip socket timeouts when appropriate.
*
* Doesn't actually wait for time to pass.
* Timeout events don't necessarily end the request.
* While many clients choose to abort the request upon a timeout, Node itself does not.
*/
applyDelay(delayMs) {
if (this.timeout && delayMs > this.timeout) {
debug('socket timeout')
this.emit('timeout')
}
}
getPeerCertificate() {
return Buffer.from(
(Math.random() * 10000 + Date.now()).toString()
).toString('base64')
}
/**
* Denotes that no more I/O activity should happen on this socket.
*
* The implementation in Node if far more complex as it juggles underlying async streams.
* For the purposes of Nock, we just need it to set some flags and on the first call
* emit a 'close' and optional 'error' event. Both events propagate through the request object.
*/
destroy(err) {
if (this.destroyed) {
return this
}
debug('socket destroy')
this.destroyed = true
this.readable = this.writable = false
this.readableEnded = this.writableFinished = true
process.nextTick(() => {
if (err) {
this._hadError = true
this.emit('error', err)
}
this.emit('close')
})
return this
}
}
nock-13.2.4/migration_guides/ 0000775 0000000 0000000 00000000000 14177263367 0016104 5 ustar 00root root 0000000 0000000 nock-13.2.4/migration_guides/migrating_to_10.md 0000664 0000000 0000000 00000000437 14177263367 0021415 0 ustar 00root root 0000000 0000000 ## Upgrading from Nock 9 to Nock 10
[Release Tag](https://github.com/nock/nock/releases/tag/v10.0.0)
### Breaking changes
Support for Node < 6 was dropped.
To upgrade Nock, ensure your version of Node is also updated.
At the time of release, Node 6.x, 8.x, and 9.x were supported.
nock-13.2.4/migration_guides/migrating_to_11.md 0000664 0000000 0000000 00000017722 14177263367 0021423 0 ustar 00root root 0000000 0000000 ## Upgrading from Nock 10 to Nock 11
[Release Tag](https://github.com/nock/nock/releases/tag/v11.3.2)
### Bug fixes and internal improvements
Nock 11 includes many under-the-hood improvements, including a fully offline
test suite and 100% test coverage. The codebase was also converted to ES6
syntax and formatted with Prettier. Leaning on the test coverage, some
substantial refactors have begun.
Many bug fixes are included. See the detailed changelog below or the
[compare view][compare] for details.
### Fabulous new features for developers
1. The library ships with TypeScript definitions. (Added in v11.3)
1. Add support for the `http.request` signatures added in Node 10.9
1. Scopes can be filtered using the system environment or any external factor
using e.g. `.conditionally(() => true)`
1. In-flight modifications to headers are preserved in mock requests.
1. Recorded mocks can be stringified using custom code in the `afterRecord()`
post-processing hook. When `afterRecord()` returns a string, the
recorder will no longer attempt to re-stringify it. (Added in v11.3)
1. Reply functions passed to `.reply()` can now be async/promise-returning.
1. Specifying reply headers, either via `.reply()` or `.defaultReplyHeaders()`,
can now be done consistently using an object, Map, or flat array.
### Breaking changes
For many developers no code changes will be needed. However, there are several
minor changes to the API, and it's possible that you will need to update your
code for Nock to keep working properly. It's unlikely that your tests will
falsely pass; what's more probable is that your tests will fail until the
necessary changes are made.
1. Nock 11 requires Node 8 or later. Nock supports and tests all the "current"
and "maintenance" versions of Node. As of release, that's Node 8, 10, and 12.
1. In Nock 10, when `reply()` was invoked with a function, the return values were
handled ambiguously depending on their types.
Consider the following example:
```js
const scope = nock('http://example.com')
.get('/')
.reply(200, () => [500, 'hello world'])
```
In Nock 10, the 200 was ignored, the 500 was interpreted as the status
code, and the body would contain `'hello world'`. This caused problems
when the goal was to return a numeric array, so in Nock 11, the 200 is
properly interpreted as the status code, and `[500, 'hello world']` as the
body.
These are the correct calls for Nock 11:
```js
const scope = nock('http://example.com').get('/').reply(500, 'hello world')
const scope = nock('http://example.com')
.get('/')
.reply(500, () => 'hello world')
```
The `.reply()` method can be called with explicit arguments:
```js
.reply() // `statusCode` defaults to `200`.
.reply(statusCode) // `responseBody` defaults to `''`.
.reply(statusCode, responseBody) // `headers` defaults to `{}`.
.reply(statusCode, responseBody, headers)
```
It can be called with a status code and a function that returns an array:
```js
.reply(statusCode, (path, requestBody) => responseBody)
.reply(statusCode, (path, requestBody) => responseBody, headers)
```
Alternatively the status code can be included in the array:
```js
.reply((path, requestBody) => [statusCode])
.reply((path, requestBody) => [statusCode, responseBody])
.reply((path, requestBody) => [statusCode, responseBody, headers])
.reply((path, requestBody) => [statusCode, responseBody], headers)
```
`.reply()` can also be called with an `async` or promise-returning function. The
signatures are identical, e.g.
```js
.reply(async (path, requestBody) => [statusCode, responseBody])
.reply(statusCode, async (path, requestBody) => responseBody)
```
Finally, an error-first callback can be used, e.g.:
```js
.reply((path, requestBody, cb) => cb(undefined, [statusCode, responseBody]))
.reply(statusCode, (path, requestBody, cb) => cb(undefined, responseBody))
```
1. In Nock 10, errors in user-provided reply functions were caught by Nock, and
generated HTTP responses with status codes of 500. In Nock 11 these errors
are not caught, and instead are re-emitted through the request, like any
other error that occurs during request processing.
Consider the following example:
```js
const scope = nock('http://example.com')
.post('/echo')
.reply(201, (uri, requestBody, cb) => {
fs.readFile('cat-poems.txt', cb) // Error-first callback
})
```
When `fs.readFile()` errors in Nock 10, a 500 error was emitted. To get the
same effect in Nock 11, the example would need to be rewritten to:
```js
const scope = nock('http://example.com')
.post('/echo')
.reply((uri, requestBody, cb) => {
fs.readFile('cat-poems.txt', (err, contents) => {
if (err) {
cb([500, err.stack])
} else {
cb([201, contents])
}
})
})
```
1. When `.reply()` is invoked with something other than a whole number status
code or a function, Nock 11 raises a new error **Invalid ... value for status code**.
1. Callback functions provided to the `.query` method now receive the result of [`querystring.parse`](https://nodejs.org/api/querystring.html#querystring_querystring_parse_str_sep_eq_options) instead of [`qs.parse`](https://github.com/ljharb/qs#parsing-objects).
In particular, `querystring.parse` does not interpret keys with JSON
path notation:
```js
querystring.parse('foo[bar]=baz') // { "foo[bar]": 'baz' }
qs.parse('foo[bar]=baz') // { foo: { bar: 'baz' } }
```
1. In Nock 10, duplicate field names provided to the `.query()` method were
silently ignored. We decided this was probably hiding unintentionally bugs
and causing frustration with users. In Nock 11, attempts to provide query
params more than once will throw a new error
**Query parameters have aleady been defined**. This could happen by calling
`.query()` twice, or by calling `.query()` after specifying a literal query
string via the path.
```js
nock('http://example.com')
.get('/path')
.query({ foo: 'bar' })
.query({ baz: 'qux' }) // <-- will throw
.reply()
nock('http://example.com')
.get('/path?foo=bar')
.query({ baz: 'qux' }) // <-- will throw
.reply()
```
1. Paths in Nock have always required a leading slash. e.g.
```js
const scope = nock('http://example.com').get('/path').reply()
```
In Nock 10, if the leading slash was missing the mock would never match. In
Nock 11, this raises an error.
1. The `reqheaders` parameter should be provided as a plain object, e.g.
`nock('http://example.com', { reqheaders: { X-Foo: 'bar' }})`. When the
headers are specified incorrectly as e.g. `{ reqheaders: 1 }`, Nock 10 would
behave in unpredictable ways. In Nock 11, a new error
**Headers must be provided as an object** is thrown.
```js
nock('http://example.com', { reqheaders: 1 }).get('/').reply()
```
1. In Nock 10, the `ClientRequest` instance wrapped the native `on` method
and aliased `once` to it. In Nock 11, this been removed and `request.once`
will correctly call registered listeners...once.
1. In Nock 10, when the method was not specified in a call to `nock.define()`,
the method would default to `GET`. In Nock 11, this raises an error.
1. In very old versions of nock, recordings may include a response status
code encoded as a string in the `reply` field. In Nock 10 these strings could
be non-numeric. In Nock 11 this raises an error.
### Updates to the mock surface
1. For parity with a real response, a mock request correctly supports all
the overrides to `request.end()`, including `request.end(cb)` in Node 12.
1. For parity with a real response, errors from the `.destroy()` method
are propagated correctly. (Added in v11.3)
1. For parity with a real response, the `.complete` property is set when
ending the response.
1. For parity with a real Socket, the mock Socket has an `unref()` function
(which does nothing).
nock-13.2.4/migration_guides/migrating_to_12.md 0000664 0000000 0000000 00000002350 14177263367 0021413 0 ustar 00root root 0000000 0000000 ## Upgrading from Nock 11 to Nock 12
[Release Tag](https://github.com/nock/nock/releases/tag/v12.0.0)
### Breaking changes
1. Support for Node < 10 was dropped.
To upgrade Nock, ensure your version of Node is also updated.
At the time of release, Node 10.x, 12.x, and 13.x were supported.
1. [`cleanAll()`](https://github.com/nock/nock#cleanall) no longer returns the global `nock` instance ([#1872](https://github.com/nock/nock/pull/1872)).
```js
// before
nock.cleanAll().restore() // Uncaught TypeError: Cannot read property 'restore' of undefined
// upgraded
nock.cleanAll()
nock.restore()
```
1. Support was dropped for the String constructor ([#1873](https://github.com/nock/nock/pull/1873)).
Only string primitive are supported. All strings passed to Nock for options should not use `new String` syntax.
[MDN web docs](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String#String_primitives_and_String_objects).
### New features for developers
1. [`enableNetConnect()`](https://github.com/nock/nock#enabling-requests) now accepts a function.
```js
nock.enableNetConnect(
host => host.includes('amazon.com') || host.includes('github.com')
)
```
nock-13.2.4/migration_guides/migrating_to_13.md 0000664 0000000 0000000 00000005410 14177263367 0021414 0 ustar 00root root 0000000 0000000 ## Upgrading from Nock 12 to Nock 13
[Release Tag](https://github.com/nock/nock/releases/tag/v13.0.0)
### Breaking changes
1. `Scope.log` has been removed. Use the `debug` library when [debugging](https://github.com/nock/nock#debugging) failed matches.
1. `socketDelay` has been removed. Use [`delayConnection`](https://github.com/nock/nock#delay-the-connection) instead.
1. `delay`, `delayConnection`, and `delayBody` are now setters instead of additive.
```js
nock('http://example.com')
.get('/')
.delay(1)
.delay({ head: 2, body: 3 })
.delayConnection(4)
.delayBody(5)
.delayBody(6)
.reply()
```
Previously, the connection would have been delayed by 7 and the body delayed by 14.
Now, the connection will be delayed by 4 and the body delayed by 6.
1. [When recording](https://github.com/nock/nock#recording), skipping body matching using `*` is no longer supported by `nock.define`.
Set the definition body to `undefined` instead.
```js
nock.define([
{
scope: 'http://example.test',
method: 'POST',
path: '/',
body: '*', // remove this line or set to undefined
response: 'matched',
},
])
```
1. `ClientRequest.abort()` has been updated to align with Node's native behavior.
- Nock use to always emit a 'socket hang up' error. Now it only emits the error if `abort` is called between the 'socket' and 'response' events.
- The emitted 'abort' event now happens on `nextTick`.
- The socket is now only destroyed if the 'socket' event has fired, and now emits a 'close' event on `nextTick` that propagates though the request object.
- `request.aborted` attribute is set to `true` instead of a timestamp. [Changed in Node v11.0](https://github.com/nodejs/node/pull/20230).
- Calling `write`, `end`, or `flushHeaders` on an aborted request no longer emits an error.
However, writing to a request that is already finished (ended) will emit a 'write after end' error.
1. Playback of a mocked responses will now never happen until the 'socket' event is emitted.
The 'socket' event is still artificially set to emit on `nextTick` when a ClientRequest is created.
This means in the following code the Scope will never be done because at least one tick needs
to happen before any matched Interceptor is considered consumed.
```js
const scope = nock(...).get('/').reply()
const req = http.get(...)
scope.done()
```
The correct way to verify such an action is to call [`scope.done`](https://github.com/nock/nock#expectations) after waiting for a 'response', 'timeout', or 'socket' event on the request.
For example:
```js
const scope = nock(...).get('/').reply()
const req = http.get(...)
req.on('response', () => {
scope.done()
})
```
nock-13.2.4/package-lock.json 0000664 0000000 0000000 00002626000 14177263367 0015775 0 ustar 00root root 0000000 0000000 {
"name": "nock",
"version": "0.0.0-development",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "nock",
"version": "0.0.0-development",
"license": "MIT",
"dependencies": {
"debug": "^4.1.0",
"json-stringify-safe": "^5.0.1",
"lodash.set": "^4.3.2",
"propagate": "^2.0.0"
},
"devDependencies": {
"@definitelytyped/dtslint": "^0.0.103",
"@sinonjs/fake-timers": "^9.0.0",
"assert-rejects": "^1.0.0",
"chai": "^4.1.2",
"dirty-chai": "^2.0.1",
"eslint": "^8.8.0",
"eslint-config-prettier": "^8.1.0",
"eslint-config-standard": "^17.0.0-0",
"eslint-plugin-import": "^2.16.0",
"eslint-plugin-mocha": "^10.0.3",
"eslint-plugin-node": "^11.0.0",
"eslint-plugin-promise": "^6.0.0",
"form-data": "^4.0.0",
"got": "^11.3.0",
"mocha": "^9.1.3",
"npm-run-all": "^4.1.5",
"nyc": "^15.0.0",
"prettier": "2.5.1",
"proxyquire": "^2.1.0",
"rimraf": "^3.0.0",
"semantic-release": "^18.0.1",
"sinon": "^13.0.1",
"sinon-chai": "^3.7.0",
"typescript": "^4.2.2"
},
"engines": {
"node": ">= 10.13"
}
},
"node_modules/@babel/code-frame": {
"version": "7.16.7",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz",
"integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==",
"dev": true,
"dependencies": {
"@babel/highlight": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/compat-data": {
"version": "7.16.8",
"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.8.tgz",
"integrity": "sha512-m7OkX0IdKLKPpBlJtF561YJal5y/jyI5fNfWbPxh2D/nbzzGI4qRyrD8xO2jB24u7l+5I2a43scCG2IrfjC50Q==",
"dev": true,
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/core": {
"version": "7.16.12",
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.12.tgz",
"integrity": "sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg==",
"dev": true,
"dependencies": {
"@babel/code-frame": "^7.16.7",
"@babel/generator": "^7.16.8",
"@babel/helper-compilation-targets": "^7.16.7",
"@babel/helper-module-transforms": "^7.16.7",
"@babel/helpers": "^7.16.7",
"@babel/parser": "^7.16.12",
"@babel/template": "^7.16.7",
"@babel/traverse": "^7.16.10",
"@babel/types": "^7.16.8",
"convert-source-map": "^1.7.0",
"debug": "^4.1.0",
"gensync": "^1.0.0-beta.2",
"json5": "^2.1.2",
"semver": "^6.3.0",
"source-map": "^0.5.0"
},
"engines": {
"node": ">=6.9.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/babel"
}
},
"node_modules/@babel/generator": {
"version": "7.16.8",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz",
"integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==",
"dev": true,
"dependencies": {
"@babel/types": "^7.16.8",
"jsesc": "^2.5.1",
"source-map": "^0.5.0"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-compilation-targets": {
"version": "7.16.7",
"resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz",
"integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==",
"dev": true,
"dependencies": {
"@babel/compat-data": "^7.16.4",
"@babel/helper-validator-option": "^7.16.7",
"browserslist": "^4.17.5",
"semver": "^6.3.0"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0"
}
},
"node_modules/@babel/helper-environment-visitor": {
"version": "7.16.7",
"resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz",
"integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==",
"dev": true,
"dependencies": {
"@babel/types": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-function-name": {
"version": "7.16.7",
"resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz",
"integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==",
"dev": true,
"dependencies": {
"@babel/helper-get-function-arity": "^7.16.7",
"@babel/template": "^7.16.7",
"@babel/types": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-get-function-arity": {
"version": "7.16.7",
"resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz",
"integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==",
"dev": true,
"dependencies": {
"@babel/types": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-hoist-variables": {
"version": "7.16.7",
"resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz",
"integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==",
"dev": true,
"dependencies": {
"@babel/types": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-module-imports": {
"version": "7.16.7",
"resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz",
"integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==",
"dev": true,
"dependencies": {
"@babel/types": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-module-transforms": {
"version": "7.16.7",
"resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz",
"integrity": "sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==",
"dev": true,
"dependencies": {
"@babel/helper-environment-visitor": "^7.16.7",
"@babel/helper-module-imports": "^7.16.7",
"@babel/helper-simple-access": "^7.16.7",
"@babel/helper-split-export-declaration": "^7.16.7",
"@babel/helper-validator-identifier": "^7.16.7",
"@babel/template": "^7.16.7",
"@babel/traverse": "^7.16.7",
"@babel/types": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-simple-access": {
"version": "7.16.7",
"resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz",
"integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==",
"dev": true,
"dependencies": {
"@babel/types": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-split-export-declaration": {
"version": "7.16.7",
"resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz",
"integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==",
"dev": true,
"dependencies": {
"@babel/types": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-validator-identifier": {
"version": "7.16.7",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz",
"integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==",
"dev": true,
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-validator-option": {
"version": "7.16.7",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz",
"integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==",
"dev": true,
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helpers": {
"version": "7.16.7",
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.7.tgz",
"integrity": "sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw==",
"dev": true,
"dependencies": {
"@babel/template": "^7.16.7",
"@babel/traverse": "^7.16.7",
"@babel/types": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/highlight": {
"version": "7.16.10",
"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz",
"integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==",
"dev": true,
"dependencies": {
"@babel/helper-validator-identifier": "^7.16.7",
"chalk": "^2.0.0",
"js-tokens": "^4.0.0"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/highlight/node_modules/ansi-styles": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"dev": true,
"dependencies": {
"color-convert": "^1.9.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/@babel/highlight/node_modules/chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"dev": true,
"dependencies": {
"ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5",
"supports-color": "^5.3.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/@babel/highlight/node_modules/color-convert": {
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"dev": true,
"dependencies": {
"color-name": "1.1.3"
}
},
"node_modules/@babel/highlight/node_modules/color-name": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
"dev": true
},
"node_modules/@babel/highlight/node_modules/escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
"dev": true,
"engines": {
"node": ">=0.8.0"
}
},
"node_modules/@babel/highlight/node_modules/has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
"dev": true,
"engines": {
"node": ">=4"
}
},
"node_modules/@babel/highlight/node_modules/supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
"dependencies": {
"has-flag": "^3.0.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/@babel/parser": {
"version": "7.16.12",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.12.tgz",
"integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==",
"dev": true,
"bin": {
"parser": "bin/babel-parser.js"
},
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@babel/template": {
"version": "7.16.7",
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz",
"integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==",
"dev": true,
"dependencies": {
"@babel/code-frame": "^7.16.7",
"@babel/parser": "^7.16.7",
"@babel/types": "^7.16.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/traverse": {
"version": "7.16.10",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.10.tgz",
"integrity": "sha512-yzuaYXoRJBGMlBhsMJoUW7G1UmSb/eXr/JHYM/MsOJgavJibLwASijW7oXBdw3NQ6T0bW7Ty5P/VarOs9cHmqw==",
"dev": true,
"dependencies": {
"@babel/code-frame": "^7.16.7",
"@babel/generator": "^7.16.8",
"@babel/helper-environment-visitor": "^7.16.7",
"@babel/helper-function-name": "^7.16.7",
"@babel/helper-hoist-variables": "^7.16.7",
"@babel/helper-split-export-declaration": "^7.16.7",
"@babel/parser": "^7.16.10",
"@babel/types": "^7.16.8",
"debug": "^4.1.0",
"globals": "^11.1.0"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/traverse/node_modules/globals": {
"version": "11.12.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
"integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
"dev": true,
"engines": {
"node": ">=4"
}
},
"node_modules/@babel/types": {
"version": "7.16.8",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz",
"integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==",
"dev": true,
"dependencies": {
"@babel/helper-validator-identifier": "^7.16.7",
"to-fast-properties": "^2.0.0"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@definitelytyped/dts-critic": {
"version": "0.0.103",
"resolved": "https://registry.npmjs.org/@definitelytyped/dts-critic/-/dts-critic-0.0.103.tgz",
"integrity": "sha512-QI0/MIf8RcZbxBJCykiq48tH+QDo722ks3I8lst6A7hVa2+7m3dx7LqCCh0Bs6h2moewgvIaX++qebokZitKfQ==",
"dev": true,
"dependencies": {
"@definitelytyped/header-parser": "latest",
"command-exists": "^1.2.8",
"rimraf": "^3.0.2",
"semver": "^6.2.0",
"tmp": "^0.2.1",
"yargs": "^15.3.1"
},
"engines": {
"node": ">=10.17.0"
},
"peerDependencies": {
"typescript": "*"
}
},
"node_modules/@definitelytyped/dtslint": {
"version": "0.0.103",
"resolved": "https://registry.npmjs.org/@definitelytyped/dtslint/-/dtslint-0.0.103.tgz",
"integrity": "sha512-BjRioCLzf77VRNCgl97uirKYvhirlh4wPIL28BS+pYdy5UxFALlZBDVY91h/KXZRXySp6QsxO0XF6jbWeqhJqA==",
"dev": true,
"dependencies": {
"@definitelytyped/dts-critic": "^0.0.103",
"@definitelytyped/header-parser": "0.0.93",
"@definitelytyped/typescript-versions": "0.0.93",
"@definitelytyped/utils": "0.0.93",
"fs-extra": "^6.0.1",
"json-stable-stringify": "^1.0.1",
"strip-json-comments": "^2.0.1",
"tslint": "5.14.0",
"yargs": "^15.1.0"
},
"bin": {
"dtslint": "bin/src/index.js"
},
"engines": {
"node": ">=10.0.0"
},
"peerDependencies": {
"typescript": ">= 3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.7.0-dev || >= 3.8.0-dev || >= 3.9.0-dev || >= 4.0.0-dev"
}
},
"node_modules/@definitelytyped/header-parser": {
"version": "0.0.93",
"resolved": "https://registry.npmjs.org/@definitelytyped/header-parser/-/header-parser-0.0.93.tgz",
"integrity": "sha512-ywrpndOfwQ1CLG6n9DVQYICDW1CPglb/XxzhKMOonYrw2qifuWMeLioszsQsOYpg5jnwCwa8V7moK2TfkI5ztQ==",
"dev": true,
"dependencies": {
"@definitelytyped/typescript-versions": "^0.0.93",
"@types/parsimmon": "^1.10.1",
"parsimmon": "^1.13.0"
}
},
"node_modules/@definitelytyped/typescript-versions": {
"version": "0.0.93",
"resolved": "https://registry.npmjs.org/@definitelytyped/typescript-versions/-/typescript-versions-0.0.93.tgz",
"integrity": "sha512-ymWcBsmZykBMOXy4fF4WsBnJp7qCM3rropPXDfH5V8n2Ie2cK3Ths1kAxD1k80IWCish7EdznWPP4ZRxurycBw==",
"dev": true
},
"node_modules/@definitelytyped/utils": {
"version": "0.0.93",
"resolved": "https://registry.npmjs.org/@definitelytyped/utils/-/utils-0.0.93.tgz",
"integrity": "sha512-FBZhEoSxWtUTbwfwpehTssTyzgiEraAv4PBKjRr2sVVU1H3lIFTG/DlZO2ymfs3EbPr1zS5S0yt05RQFZlFjAQ==",
"dev": true,
"dependencies": {
"@definitelytyped/typescript-versions": "^0.0.93",
"@qiwi/npm-registry-client": "^8.9.1",
"@types/node": "^14.14.35",
"charm": "^1.0.2",
"fs-extra": "^8.1.0",
"fstream": "^1.0.12",
"tar": "^2.2.2",
"tar-stream": "^2.1.4"
}
},
"node_modules/@definitelytyped/utils/node_modules/fs-extra": {
"version": "8.1.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
"integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
"dev": true,
"dependencies": {
"graceful-fs": "^4.2.0",
"jsonfile": "^4.0.0",
"universalify": "^0.1.0"
},
"engines": {
"node": ">=6 <7 || >=8"
}
},
"node_modules/@eslint/eslintrc": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz",
"integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==",
"dev": true,
"dependencies": {
"ajv": "^6.12.4",
"debug": "^4.3.2",
"espree": "^9.2.0",
"globals": "^13.9.0",
"ignore": "^4.0.6",
"import-fresh": "^3.2.1",
"js-yaml": "^4.1.0",
"minimatch": "^3.0.4",
"strip-json-comments": "^3.1.1"
},
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
}
},
"node_modules/@eslint/eslintrc/node_modules/ignore": {
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
"integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
"dev": true,
"engines": {
"node": ">= 4"
}
},
"node_modules/@eslint/eslintrc/node_modules/strip-json-comments": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
"integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
"dev": true,
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/@humanwhocodes/config-array": {
"version": "0.9.3",
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.3.tgz",
"integrity": "sha512-3xSMlXHh03hCcCmFc0rbKp3Ivt2PFEJnQUJDDMTJQ2wkECZWdq4GePs2ctc5H8zV+cHPaq8k2vU8mrQjA6iHdQ==",
"dev": true,
"dependencies": {
"@humanwhocodes/object-schema": "^1.2.1",
"debug": "^4.1.1",
"minimatch": "^3.0.4"
},
"engines": {
"node": ">=10.10.0"
}
},
"node_modules/@humanwhocodes/object-schema": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
"integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
"dev": true
},
"node_modules/@istanbuljs/load-nyc-config": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
"integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==",
"dev": true,
"dependencies": {
"camelcase": "^5.3.1",
"find-up": "^4.1.0",
"get-package-type": "^0.1.0",
"js-yaml": "^3.13.1",
"resolve-from": "^5.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": {
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
"integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
"dev": true,
"dependencies": {
"sprintf-js": "~1.0.2"
}
},
"node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
"dev": true,
"dependencies": {
"locate-path": "^5.0.0",
"path-exists": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": {
"version": "3.14.1",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
"integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
"dev": true,
"dependencies": {
"argparse": "^1.0.7",
"esprima": "^4.0.0"
},
"bin": {
"js-yaml": "bin/js-yaml.js"
}
},
"node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
"dev": true,
"dependencies": {
"p-locate": "^4.1.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
"integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
"dev": true,
"dependencies": {
"p-try": "^2.0.0"
},
"engines": {
"node": ">=6"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
"dev": true,
"dependencies": {
"p-limit": "^2.2.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/@istanbuljs/load-nyc-config/node_modules/p-try": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
"integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
"dev": true,
"engines": {
"node": ">=6"
}
},
"node_modules/@istanbuljs/load-nyc-config/node_modules/path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
"integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/@istanbuljs/schema": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
"integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/@nodelib/fs.scandir": {
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
"integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
"dev": true,
"dependencies": {
"@nodelib/fs.stat": "2.0.5",
"run-parallel": "^1.1.9"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/@nodelib/fs.stat": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
"integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
"dev": true,
"engines": {
"node": ">= 8"
}
},
"node_modules/@nodelib/fs.walk": {
"version": "1.2.8",
"resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
"integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
"dev": true,
"dependencies": {
"@nodelib/fs.scandir": "2.1.5",
"fastq": "^1.6.0"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/@octokit/auth-token": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz",
"integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==",
"dev": true,
"dependencies": {
"@octokit/types": "^6.0.3"
}
},
"node_modules/@octokit/core": {
"version": "3.5.1",
"resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.5.1.tgz",
"integrity": "sha512-omncwpLVxMP+GLpLPgeGJBF6IWJFjXDS5flY5VbppePYX9XehevbDykRH9PdCdvqt9TS5AOTiDide7h0qrkHjw==",
"dev": true,
"dependencies": {
"@octokit/auth-token": "^2.4.4",
"@octokit/graphql": "^4.5.8",
"@octokit/request": "^5.6.0",
"@octokit/request-error": "^2.0.5",
"@octokit/types": "^6.0.3",
"before-after-hook": "^2.2.0",
"universal-user-agent": "^6.0.0"
}
},
"node_modules/@octokit/endpoint": {
"version": "6.0.12",
"resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz",
"integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==",
"dev": true,
"dependencies": {
"@octokit/types": "^6.0.3",
"is-plain-object": "^5.0.0",
"universal-user-agent": "^6.0.0"
}
},
"node_modules/@octokit/graphql": {
"version": "4.8.0",
"resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz",
"integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==",
"dev": true,
"dependencies": {
"@octokit/request": "^5.6.0",
"@octokit/types": "^6.0.3",
"universal-user-agent": "^6.0.0"
}
},
"node_modules/@octokit/openapi-types": {
"version": "11.2.0",
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-11.2.0.tgz",
"integrity": "sha512-PBsVO+15KSlGmiI8QAzaqvsNlZlrDlyAJYcrXBCvVUxCp7VnXjkwPoFHgjEJXx3WF9BAwkA6nfCUA7i9sODzKA==",
"dev": true
},
"node_modules/@octokit/plugin-paginate-rest": {
"version": "2.17.0",
"resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.17.0.tgz",
"integrity": "sha512-tzMbrbnam2Mt4AhuyCHvpRkS0oZ5MvwwcQPYGtMv4tUa5kkzG58SVB0fcsLulOZQeRnOgdkZWkRUiyBlh0Bkyw==",
"dev": true,
"dependencies": {
"@octokit/types": "^6.34.0"
},
"peerDependencies": {
"@octokit/core": ">=2"
}
},
"node_modules/@octokit/plugin-request-log": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz",
"integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==",
"dev": true,
"peerDependencies": {
"@octokit/core": ">=3"
}
},
"node_modules/@octokit/plugin-rest-endpoint-methods": {
"version": "5.13.0",
"resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.13.0.tgz",
"integrity": "sha512-uJjMTkN1KaOIgNtUPMtIXDOjx6dGYysdIFhgA52x4xSadQCz3b/zJexvITDVpANnfKPW/+E0xkOvLntqMYpviA==",
"dev": true,
"dependencies": {
"@octokit/types": "^6.34.0",
"deprecation": "^2.3.1"
},
"peerDependencies": {
"@octokit/core": ">=3"
}
},
"node_modules/@octokit/request": {
"version": "5.6.3",
"resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz",
"integrity": "sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==",
"dev": true,
"dependencies": {
"@octokit/endpoint": "^6.0.1",
"@octokit/request-error": "^2.1.0",
"@octokit/types": "^6.16.1",
"is-plain-object": "^5.0.0",
"node-fetch": "^2.6.7",
"universal-user-agent": "^6.0.0"
}
},
"node_modules/@octokit/request-error": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz",
"integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==",
"dev": true,
"dependencies": {
"@octokit/types": "^6.0.3",
"deprecation": "^2.0.0",
"once": "^1.4.0"
}
},
"node_modules/@octokit/rest": {
"version": "18.12.0",
"resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.12.0.tgz",
"integrity": "sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q==",
"dev": true,
"dependencies": {
"@octokit/core": "^3.5.1",
"@octokit/plugin-paginate-rest": "^2.16.8",
"@octokit/plugin-request-log": "^1.0.4",
"@octokit/plugin-rest-endpoint-methods": "^5.12.0"
}
},
"node_modules/@octokit/types": {
"version": "6.34.0",
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.34.0.tgz",
"integrity": "sha512-s1zLBjWhdEI2zwaoSgyOFoKSl109CUcVBCc7biPJ3aAf6LGLU6szDvi31JPU7bxfla2lqfhjbbg/5DdFNxOwHw==",
"dev": true,
"dependencies": {
"@octokit/openapi-types": "^11.2.0"
}
},
"node_modules/@qiwi/npm-registry-client": {
"version": "8.9.1",
"resolved": "https://registry.npmjs.org/@qiwi/npm-registry-client/-/npm-registry-client-8.9.1.tgz",
"integrity": "sha512-rZF+mG+NfijR0SHphhTLHRr4aM4gtfdwoAMY6we2VGQam8vkN1cxGG1Lg/Llrj8Dd0Mu6VjdFQRyMMRZxtZR2A==",
"dev": true,
"dependencies": {
"concat-stream": "^2.0.0",
"graceful-fs": "^4.2.4",
"normalize-package-data": "~1.0.1 || ^2.0.0 || ^3.0.0",
"npm-package-arg": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^8.0.0",
"once": "^1.4.0",
"request": "^2.88.2",
"retry": "^0.12.0",
"safe-buffer": "^5.2.1",
"semver": "2 >=2.2.1 || 3.x || 4 || 5 || 7",
"slide": "^1.1.6",
"ssri": "^8.0.0"
},
"optionalDependencies": {
"npmlog": "2 || ^3.1.0 || ^4.0.0"
}
},
"node_modules/@qiwi/npm-registry-client/node_modules/semver": {
"version": "7.3.5",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
"integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
"dev": true,
"dependencies": {
"lru-cache": "^6.0.0"
},
"bin": {
"semver": "bin/semver.js"
},
"engines": {
"node": ">=10"
}
},
"node_modules/@semantic-release/commit-analyzer": {
"version": "9.0.2",
"resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-9.0.2.tgz",
"integrity": "sha512-E+dr6L+xIHZkX4zNMe6Rnwg4YQrWNXK+rNsvwOPpdFppvZO1olE2fIgWhv89TkQErygevbjsZFSIxp+u6w2e5g==",
"dev": true,
"dependencies": {
"conventional-changelog-angular": "^5.0.0",
"conventional-commits-filter": "^2.0.0",
"conventional-commits-parser": "^3.2.3",
"debug": "^4.0.0",
"import-from": "^4.0.0",
"lodash": "^4.17.4",
"micromatch": "^4.0.2"
},
"engines": {
"node": ">=14.17"
},
"peerDependencies": {
"semantic-release": ">=18.0.0-beta.1"
}
},
"node_modules/@semantic-release/error": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-3.0.0.tgz",
"integrity": "sha512-5hiM4Un+tpl4cKw3lV4UgzJj+SmfNIDCLLw0TepzQxz9ZGV5ixnqkzIVF+3tp0ZHgcMKE+VNGHJjEeyFG2dcSw==",
"dev": true,
"engines": {
"node": ">=14.17"
}
},
"node_modules/@semantic-release/github": {
"version": "8.0.2",
"resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-8.0.2.tgz",
"integrity": "sha512-wIbfhOeuxlYzMTjtSAa2xgr54n7ZuPAS2gadyTWBpUt2PNAPgla7A6XxCXJnaKPgfVF0iFfSk3B+KlVKk6ByVg==",
"dev": true,
"dependencies": {
"@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": "^10.0.0",
"globby": "^11.0.0",
"http-proxy-agent": "^5.0.0",
"https-proxy-agent": "^5.0.0",
"issue-parser": "^6.0.0",
"lodash": "^4.17.4",
"mime": "^3.0.0",
"p-filter": "^2.0.0",
"p-retry": "^4.0.0",
"url-join": "^4.0.0"
},
"engines": {
"node": ">=14.17"
},
"peerDependencies": {
"semantic-release": ">=18.0.0-beta.1"
}
},
"node_modules/@semantic-release/github/node_modules/@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
},
"node_modules/@semantic-release/github/node_modules/fs-extra": {
"version": "10.0.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz",
"integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==",
"dev": true,
"dependencies": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
},
"engines": {
"node": ">=12"
}
},
"node_modules/@semantic-release/github/node_modules/jsonfile": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
"integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
"dev": true,
"dependencies": {
"universalify": "^2.0.0"
},
"optionalDependencies": {
"graceful-fs": "^4.1.6"
}
},
"node_modules/@semantic-release/github/node_modules/universalify": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
"integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
"dev": true,
"engines": {
"node": ">= 10.0.0"
}
},
"node_modules/@semantic-release/npm": {
"version": "8.0.3",
"resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-8.0.3.tgz",
"integrity": "sha512-Qbg7x/O1t3sJqsv2+U0AL4Utgi/ymlCiUdt67Ftz9HL9N8aDML4t2tE0T9MBaYdqwD976hz57DqHHXKVppUBoA==",
"dev": true,
"dependencies": {
"@semantic-release/error": "^3.0.0",
"aggregate-error": "^3.0.0",
"execa": "^5.0.0",
"fs-extra": "^10.0.0",
"lodash": "^4.17.15",
"nerf-dart": "^1.0.0",
"normalize-url": "^6.0.0",
"npm": "^7.0.0",
"rc": "^1.2.8",
"read-pkg": "^5.0.0",
"registry-auth-token": "^4.0.0",
"semver": "^7.1.2",
"tempy": "^1.0.0"
},
"engines": {
"node": ">=14.17"
},
"peerDependencies": {
"semantic-release": ">=18.0.0"
}
},
"node_modules/@semantic-release/npm/node_modules/fs-extra": {
"version": "10.0.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz",
"integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==",
"dev": true,
"dependencies": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
},
"engines": {
"node": ">=12"
}
},
"node_modules/@semantic-release/npm/node_modules/hosted-git-info": {
"version": "2.8.9",
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
"integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
"dev": true
},
"node_modules/@semantic-release/npm/node_modules/jsonfile": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
"integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
"dev": true,
"dependencies": {
"universalify": "^2.0.0"
},
"optionalDependencies": {
"graceful-fs": "^4.1.6"
}
},
"node_modules/@semantic-release/npm/node_modules/normalize-package-data": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
"integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
"dev": true,
"dependencies": {
"hosted-git-info": "^2.1.4",
"resolve": "^1.10.0",
"semver": "2 || 3 || 4 || 5",
"validate-npm-package-license": "^3.0.1"
}
},
"node_modules/@semantic-release/npm/node_modules/normalize-package-data/node_modules/semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
"dev": true,
"bin": {
"semver": "bin/semver"
}
},
"node_modules/@semantic-release/npm/node_modules/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,
"dependencies": {
"@babel/code-frame": "^7.0.0",
"error-ex": "^1.3.1",
"json-parse-even-better-errors": "^2.3.0",
"lines-and-columns": "^1.1.6"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/@semantic-release/npm/node_modules/read-pkg": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
"integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
"dev": true,
"dependencies": {
"@types/normalize-package-data": "^2.4.0",
"normalize-package-data": "^2.5.0",
"parse-json": "^5.0.0",
"type-fest": "^0.6.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/@semantic-release/npm/node_modules/semver": {
"version": "7.3.5",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
"integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
"dev": true,
"dependencies": {
"lru-cache": "^6.0.0"
},
"bin": {
"semver": "bin/semver.js"
},
"engines": {
"node": ">=10"
}
},
"node_modules/@semantic-release/npm/node_modules/type-fest": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
"integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/@semantic-release/npm/node_modules/universalify": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
"integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
"dev": true,
"engines": {
"node": ">= 10.0.0"
}
},
"node_modules/@semantic-release/release-notes-generator": {
"version": "10.0.3",
"resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-10.0.3.tgz",
"integrity": "sha512-k4x4VhIKneOWoBGHkx0qZogNjCldLPRiAjnIpMnlUh6PtaWXp/T+C9U7/TaNDDtgDa5HMbHl4WlREdxHio6/3w==",
"dev": true,
"dependencies": {
"conventional-changelog-angular": "^5.0.0",
"conventional-changelog-writer": "^5.0.0",
"conventional-commits-filter": "^2.0.0",
"conventional-commits-parser": "^3.2.3",
"debug": "^4.0.0",
"get-stream": "^6.0.0",
"import-from": "^4.0.0",
"into-stream": "^6.0.0",
"lodash": "^4.17.4",
"read-pkg-up": "^7.0.0"
},
"engines": {
"node": ">=14.17"
},
"peerDependencies": {
"semantic-release": ">=18.0.0-beta.1"
}
},
"node_modules/@semantic-release/release-notes-generator/node_modules/get-stream": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
"integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
"dev": true,
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/@sindresorhus/is": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.4.0.tgz",
"integrity": "sha512-QppPM/8l3Mawvh4rn9CNEYIU9bxpXUCRMaX9yUpvBk1nMKusLKpfXGDEKExKaPhLzcn3lzil7pR6rnJ11HgeRQ==",
"dev": true,
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sindresorhus/is?sponsor=1"
}
},
"node_modules/@sinonjs/commons": {
"version": "1.8.3",
"resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz",
"integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==",
"dev": true,
"dependencies": {
"type-detect": "4.0.8"
}
},
"node_modules/@sinonjs/fake-timers": {
"version": "9.0.0",
"resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.0.0.tgz",
"integrity": "sha512-+shXA2X7KNP7H7qNbQTJ3SA+NQc0pZDSBrdvFSRwF8sAo/ohw+ZQFD8Moc+gnz51+1eRXtEQBpKWPiQ4jsRC/w==",
"dev": true,
"dependencies": {
"@sinonjs/commons": "^1.7.0"
}
},
"node_modules/@sinonjs/samsam": {
"version": "6.1.1",
"resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.1.1.tgz",
"integrity": "sha512-cZ7rKJTLiE7u7Wi/v9Hc2fs3Ucc3jrWeMgPHbbTCeVAB2S0wOBbYlkJVeNSL04i7fdhT8wIbDq1zhC/PXTD2SA==",
"dev": true,
"dependencies": {
"@sinonjs/commons": "^1.6.0",
"lodash.get": "^4.4.2",
"type-detect": "^4.0.8"
}
},
"node_modules/@sinonjs/text-encoding": {
"version": "0.7.1",
"resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz",
"integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==",
"dev": true
},
"node_modules/@szmarczak/http-timer": {
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz",
"integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==",
"dev": true,
"dependencies": {
"defer-to-connect": "^2.0.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/@tootallnate/once": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz",
"integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==",
"dev": true,
"engines": {
"node": ">= 10"
}
},
"node_modules/@types/cacheable-request": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz",
"integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==",
"dev": true,
"dependencies": {
"@types/http-cache-semantics": "*",
"@types/keyv": "*",
"@types/node": "*",
"@types/responselike": "*"
}
},
"node_modules/@types/http-cache-semantics": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz",
"integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==",
"dev": true
},
"node_modules/@types/json5": {
"version": "0.0.29",
"resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
"integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=",
"dev": true
},
"node_modules/@types/keyv": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.3.tgz",
"integrity": "sha512-FXCJgyyN3ivVgRoml4h94G/p3kY+u/B86La+QptcqJaWtBWtmc6TtkNfS40n9bIvyLteHh7zXOtgbobORKPbDg==",
"dev": true,
"dependencies": {
"@types/node": "*"
}
},
"node_modules/@types/minimist": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz",
"integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==",
"dev": true
},
"node_modules/@types/node": {
"version": "14.18.10",
"resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.10.tgz",
"integrity": "sha512-6iihJ/Pp5fsFJ/aEDGyvT4pHGmCpq7ToQ/yf4bl5SbVAvwpspYJ+v3jO7n8UyjhQVHTy+KNszOozDdv+O6sovQ==",
"dev": true
},
"node_modules/@types/normalize-package-data": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz",
"integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==",
"dev": true
},
"node_modules/@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
},
"node_modules/@types/parsimmon": {
"version": "1.10.6",
"resolved": "https://registry.npmjs.org/@types/parsimmon/-/parsimmon-1.10.6.tgz",
"integrity": "sha512-FwAQwMRbkhx0J6YELkwIpciVzCcgEqXEbIrIn3a2P5d3kGEHQ3wVhlN3YdVepYP+bZzCYO6OjmD4o9TGOZ40rA==",
"dev": true
},
"node_modules/@types/responselike": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz",
"integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==",
"dev": true,
"dependencies": {
"@types/node": "*"
}
},
"node_modules/@types/retry": {
"version": "0.12.1",
"resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz",
"integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==",
"dev": true
},
"node_modules/@ungap/promise-all-settled": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz",
"integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==",
"dev": true
},
"node_modules/acorn": {
"version": "8.7.0",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz",
"integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==",
"dev": true,
"bin": {
"acorn": "bin/acorn"
},
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/acorn-jsx": {
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
"integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
"dev": true,
"peerDependencies": {
"acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
}
},
"node_modules/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,
"dependencies": {
"debug": "4"
},
"engines": {
"node": ">= 6.0.0"
}
},
"node_modules/aggregate-error": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
"integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
"dev": true,
"dependencies": {
"clean-stack": "^2.0.0",
"indent-string": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/ajv": {
"version": "6.12.6",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"dev": true,
"dependencies": {
"fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
"json-schema-traverse": "^0.4.1",
"uri-js": "^4.2.2"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/epoberezkin"
}
},
"node_modules/ansi-colors": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
"integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
"dev": true,
"engines": {
"node": ">=6"
}
},
"node_modules/ansi-escapes": {
"version": "4.3.2",
"resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
"integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
"dev": true,
"dependencies": {
"type-fest": "^0.21.3"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/ansi-escapes/node_modules/type-fest": {
"version": "0.21.3",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
"integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
"dev": true,
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/ansi-regex": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"dependencies": {
"color-convert": "^2.0.1"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/ansicolors": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz",
"integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=",
"dev": true
},
"node_modules/anymatch": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
"integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
"dev": true,
"dependencies": {
"normalize-path": "^3.0.0",
"picomatch": "^2.0.4"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/append-transform": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz",
"integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==",
"dev": true,
"dependencies": {
"default-require-extensions": "^3.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/aproba": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
"integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
"dev": true
},
"node_modules/archy": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz",
"integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=",
"dev": true
},
"node_modules/are-we-there-yet": {
"version": "1.1.7",
"resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz",
"integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==",
"dev": true,
"dependencies": {
"delegates": "^1.0.0",
"readable-stream": "^2.0.6"
}
},
"node_modules/are-we-there-yet/node_modules/isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
"dev": true
},
"node_modules/are-we-there-yet/node_modules/readable-stream": {
"version": "2.3.7",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
"dev": true,
"dependencies": {
"core-util-is": "~1.0.0",
"inherits": "~2.0.3",
"isarray": "~1.0.0",
"process-nextick-args": "~2.0.0",
"safe-buffer": "~5.1.1",
"string_decoder": "~1.1.1",
"util-deprecate": "~1.0.1"
}
},
"node_modules/are-we-there-yet/node_modules/safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
"dev": true
},
"node_modules/are-we-there-yet/node_modules/string_decoder": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
"dev": true,
"dependencies": {
"safe-buffer": "~5.1.0"
}
},
"node_modules/argparse": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
"dev": true
},
"node_modules/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
},
"node_modules/array-ify": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz",
"integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=",
"dev": true
},
"node_modules/array-includes": {
"version": "3.1.4",
"resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz",
"integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==",
"dev": true,
"dependencies": {
"call-bind": "^1.0.2",
"define-properties": "^1.1.3",
"es-abstract": "^1.19.1",
"get-intrinsic": "^1.1.1",
"is-string": "^1.0.7"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/array-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,
"engines": {
"node": ">=8"
}
},
"node_modules/array.prototype.flat": {
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz",
"integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==",
"dev": true,
"dependencies": {
"call-bind": "^1.0.2",
"define-properties": "^1.1.3",
"es-abstract": "^1.19.0"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/arrify": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
"integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/asn1": {
"version": "0.2.6",
"resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
"integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
"dev": true,
"dependencies": {
"safer-buffer": "~2.1.0"
}
},
"node_modules/assert-plus": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
"integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
"dev": true,
"engines": {
"node": ">=0.8"
}
},
"node_modules/assert-rejects": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/assert-rejects/-/assert-rejects-1.0.0.tgz",
"integrity": "sha512-xSmDqs5YxfrHUQBhVfrP/5+UoEvMBTY2+oRDoLfY9zsTA1hnW0KiKYcXKyeVWSgb0UpsQ4gyeBuKlXKzKUobZA==",
"dev": true,
"dependencies": {
"is-regexp": "^1.0.0"
},
"engines": {
"node": ">=6"
}
},
"node_modules/assertion-error": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
"integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
"dev": true,
"engines": {
"node": "*"
}
},
"node_modules/asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
"dev": true
},
"node_modules/aws-sign2": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
"integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
"dev": true,
"engines": {
"node": "*"
}
},
"node_modules/aws4": {
"version": "1.11.0",
"resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz",
"integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==",
"dev": true
},
"node_modules/babel-code-frame": {
"version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
"integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
"dev": true,
"dependencies": {
"chalk": "^1.1.3",
"esutils": "^2.0.2",
"js-tokens": "^3.0.2"
}
},
"node_modules/babel-code-frame/node_modules/ansi-regex": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/babel-code-frame/node_modules/ansi-styles": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
"integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/babel-code-frame/node_modules/chalk": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
"integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
"dev": true,
"dependencies": {
"ansi-styles": "^2.2.1",
"escape-string-regexp": "^1.0.2",
"has-ansi": "^2.0.0",
"strip-ansi": "^3.0.0",
"supports-color": "^2.0.0"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/babel-code-frame/node_modules/escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
"dev": true,
"engines": {
"node": ">=0.8.0"
}
},
"node_modules/babel-code-frame/node_modules/js-tokens": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
"integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
"dev": true
},
"node_modules/babel-code-frame/node_modules/strip-ansi": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
"dev": true,
"dependencies": {
"ansi-regex": "^2.0.0"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/babel-code-frame/node_modules/supports-color": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
"integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
"dev": true,
"engines": {
"node": ">=0.8.0"
}
},
"node_modules/balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
"dev": true
},
"node_modules/base64-js": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
"integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
]
},
"node_modules/bcrypt-pbkdf": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
"integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
"dev": true,
"dependencies": {
"tweetnacl": "^0.14.3"
}
},
"node_modules/before-after-hook": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.2.tgz",
"integrity": "sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ==",
"dev": true
},
"node_modules/binary-extensions": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
"integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/bl": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
"integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
"dev": true,
"dependencies": {
"buffer": "^5.5.0",
"inherits": "^2.0.4",
"readable-stream": "^3.4.0"
}
},
"node_modules/block-stream": {
"version": "0.0.9",
"resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz",
"integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=",
"dev": true,
"dependencies": {
"inherits": "~2.0.0"
},
"engines": {
"node": "0.4 || >=0.5.8"
}
},
"node_modules/bottleneck": {
"version": "2.19.5",
"resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz",
"integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==",
"dev": true
},
"node_modules/brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"dev": true,
"dependencies": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
}
},
"node_modules/braces": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
"dev": true,
"dependencies": {
"fill-range": "^7.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/browser-stdout": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
"integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
"dev": true
},
"node_modules/browserslist": {
"version": "4.19.1",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz",
"integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==",
"dev": true,
"dependencies": {
"caniuse-lite": "^1.0.30001286",
"electron-to-chromium": "^1.4.17",
"escalade": "^3.1.1",
"node-releases": "^2.0.1",
"picocolors": "^1.0.0"
},
"bin": {
"browserslist": "cli.js"
},
"engines": {
"node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/browserslist"
}
},
"node_modules/buffer": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
"integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"dependencies": {
"base64-js": "^1.3.1",
"ieee754": "^1.1.13"
}
},
"node_modules/buffer-from": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
"dev": true
},
"node_modules/builtin-modules": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
"integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/builtins": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz",
"integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=",
"dev": true
},
"node_modules/cacheable-lookup": {
"version": "5.0.4",
"resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz",
"integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==",
"dev": true,
"engines": {
"node": ">=10.6.0"
}
},
"node_modules/cacheable-request": {
"version": "7.0.2",
"resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz",
"integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==",
"dev": true,
"dependencies": {
"clone-response": "^1.0.2",
"get-stream": "^5.1.0",
"http-cache-semantics": "^4.0.0",
"keyv": "^4.0.0",
"lowercase-keys": "^2.0.0",
"normalize-url": "^6.0.1",
"responselike": "^2.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/caching-transform": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz",
"integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==",
"dev": true,
"dependencies": {
"hasha": "^5.0.0",
"make-dir": "^3.0.0",
"package-hash": "^4.0.0",
"write-file-atomic": "^3.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/call-bind": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
"integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
"dev": true,
"dependencies": {
"function-bind": "^1.1.1",
"get-intrinsic": "^1.0.2"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/callsites": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
"integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
"dev": true,
"engines": {
"node": ">=6"
}
},
"node_modules/camelcase": {
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
"integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
"dev": true,
"engines": {
"node": ">=6"
}
},
"node_modules/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,
"dependencies": {
"camelcase": "^5.3.1",
"map-obj": "^4.0.0",
"quick-lru": "^4.0.1"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/camelcase-keys/node_modules/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,
"engines": {
"node": ">=8"
}
},
"node_modules/caniuse-lite": {
"version": "1.0.30001305",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001305.tgz",
"integrity": "sha512-p7d9YQMji8haf0f+5rbcv9WlQ+N5jMPfRAnUmZRlNxsNeBO3Yr7RYG6M2uTY1h9tCVdlkJg6YNNc4kiAiBLdWA==",
"dev": true,
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/browserslist"
}
},
"node_modules/cardinal": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz",
"integrity": "sha1-fMEFXYItISlU0HsIXeolHMe8VQU=",
"dev": true,
"dependencies": {
"ansicolors": "~0.3.2",
"redeyed": "~2.1.0"
},
"bin": {
"cdl": "bin/cdl.js"
}
},
"node_modules/caseless": {
"version": "0.12.0",
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
"integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
"dev": true
},
"node_modules/chai": {
"version": "4.3.6",
"resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz",
"integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==",
"dev": true,
"dependencies": {
"assertion-error": "^1.1.0",
"check-error": "^1.0.2",
"deep-eql": "^3.0.1",
"get-func-name": "^2.0.0",
"loupe": "^2.3.1",
"pathval": "^1.1.1",
"type-detect": "^4.0.5"
},
"engines": {
"node": ">=4"
}
},
"node_modules/chalk": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"dev": true,
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/charm": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/charm/-/charm-1.0.2.tgz",
"integrity": "sha1-it02cVOm2aWBMxBSxAkJkdqZXjU=",
"dev": true,
"dependencies": {
"inherits": "^2.0.1"
}
},
"node_modules/check-error": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
"integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=",
"dev": true,
"engines": {
"node": "*"
}
},
"node_modules/chokidar": {
"version": "3.5.3",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
"integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
"dev": true,
"funding": [
{
"type": "individual",
"url": "https://paulmillr.com/funding/"
}
],
"dependencies": {
"anymatch": "~3.1.2",
"braces": "~3.0.2",
"glob-parent": "~5.1.2",
"is-binary-path": "~2.1.0",
"is-glob": "~4.0.1",
"normalize-path": "~3.0.0",
"readdirp": "~3.6.0"
},
"engines": {
"node": ">= 8.10.0"
},
"optionalDependencies": {
"fsevents": "~2.3.2"
}
},
"node_modules/chokidar/node_modules/glob-parent": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"dev": true,
"dependencies": {
"is-glob": "^4.0.1"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/clean-stack": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
"integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
"dev": true,
"engines": {
"node": ">=6"
}
},
"node_modules/cli-table3": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.1.tgz",
"integrity": "sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA==",
"dev": true,
"dependencies": {
"string-width": "^4.2.0"
},
"engines": {
"node": "10.* || >= 12.*"
},
"optionalDependencies": {
"colors": "1.4.0"
}
},
"node_modules/cli-table3/node_modules/is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/cli-table3/node_modules/string-width": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"dev": true,
"dependencies": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
"strip-ansi": "^6.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/cliui": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
"integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
"dev": true,
"dependencies": {
"string-width": "^4.2.0",
"strip-ansi": "^6.0.0",
"wrap-ansi": "^6.2.0"
}
},
"node_modules/cliui/node_modules/is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/cliui/node_modules/string-width": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"dev": true,
"dependencies": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
"strip-ansi": "^6.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/clone-response": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
"integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
"dev": true,
"dependencies": {
"mimic-response": "^1.0.0"
}
},
"node_modules/code-point-at": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
"integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"dependencies": {
"color-name": "~1.1.4"
},
"engines": {
"node": ">=7.0.0"
}
},
"node_modules/color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
},
"node_modules/colors": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
"integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==",
"dev": true,
"optional": true,
"engines": {
"node": ">=0.1.90"
}
},
"node_modules/combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"dev": true,
"dependencies": {
"delayed-stream": "~1.0.0"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/command-exists": {
"version": "1.2.9",
"resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz",
"integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==",
"dev": true
},
"node_modules/commander": {
"version": "2.20.3",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
"dev": true
},
"node_modules/commondir": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
"integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
"dev": true
},
"node_modules/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,
"dependencies": {
"array-ify": "^1.0.0",
"dot-prop": "^5.1.0"
}
},
"node_modules/concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
"dev": true
},
"node_modules/concat-stream": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz",
"integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==",
"dev": true,
"engines": [
"node >= 6.0"
],
"dependencies": {
"buffer-from": "^1.0.0",
"inherits": "^2.0.3",
"readable-stream": "^3.0.2",
"typedarray": "^0.0.6"
}
},
"node_modules/console-control-strings": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
"integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
"dev": true
},
"node_modules/conventional-changelog-angular": {
"version": "5.0.13",
"resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz",
"integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==",
"dev": true,
"dependencies": {
"compare-func": "^2.0.0",
"q": "^1.5.1"
},
"engines": {
"node": ">=10"
}
},
"node_modules/conventional-changelog-writer": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz",
"integrity": "sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==",
"dev": true,
"dependencies": {
"conventional-commits-filter": "^2.0.7",
"dateformat": "^3.0.0",
"handlebars": "^4.7.7",
"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"
},
"bin": {
"conventional-changelog-writer": "cli.js"
},
"engines": {
"node": ">=10"
}
},
"node_modules/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,
"dependencies": {
"lodash.ismatch": "^4.4.0",
"modify-values": "^1.0.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/conventional-commits-parser": {
"version": "3.2.4",
"resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz",
"integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==",
"dev": true,
"dependencies": {
"is-text-path": "^1.0.1",
"JSONStream": "^1.0.4",
"lodash": "^4.17.15",
"meow": "^8.0.0",
"split2": "^3.0.0",
"through2": "^4.0.0"
},
"bin": {
"conventional-commits-parser": "cli.js"
},
"engines": {
"node": ">=10"
}
},
"node_modules/convert-source-map": {
"version": "1.8.0",
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz",
"integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==",
"dev": true,
"dependencies": {
"safe-buffer": "~5.1.1"
}
},
"node_modules/convert-source-map/node_modules/safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
"dev": true
},
"node_modules/core-util-is": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
"dev": true
},
"node_modules/cosmiconfig": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz",
"integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==",
"dev": true,
"dependencies": {
"@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"
},
"engines": {
"node": ">=10"
}
},
"node_modules/cosmiconfig/node_modules/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,
"dependencies": {
"@babel/code-frame": "^7.0.0",
"error-ex": "^1.3.1",
"json-parse-even-better-errors": "^2.3.0",
"lines-and-columns": "^1.1.6"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/cosmiconfig/node_modules/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,
"engines": {
"node": ">=8"
}
},
"node_modules/cross-spawn": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
"integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
"dev": true,
"dependencies": {
"path-key": "^3.1.0",
"shebang-command": "^2.0.0",
"which": "^2.0.1"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/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,
"engines": {
"node": ">=8"
}
},
"node_modules/dashdash": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
"integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
"dev": true,
"dependencies": {
"assert-plus": "^1.0.0"
},
"engines": {
"node": ">=0.10"
}
},
"node_modules/dateformat": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz",
"integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==",
"dev": true,
"engines": {
"node": "*"
}
},
"node_modules/debug": {
"version": "4.3.3",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz",
"integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==",
"dependencies": {
"ms": "2.1.2"
},
"engines": {
"node": ">=6.0"
},
"peerDependenciesMeta": {
"supports-color": {
"optional": true
}
}
},
"node_modules/decamelize": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
"integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/decamelize-keys": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz",
"integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=",
"dev": true,
"dependencies": {
"decamelize": "^1.1.0",
"map-obj": "^1.0.0"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/decamelize-keys/node_modules/map-obj": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
"integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/decompress-response": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
"integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
"dev": true,
"dependencies": {
"mimic-response": "^3.1.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/decompress-response/node_modules/mimic-response": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
"integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
"dev": true,
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/deep-eql": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz",
"integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==",
"dev": true,
"dependencies": {
"type-detect": "^4.0.0"
},
"engines": {
"node": ">=0.12"
}
},
"node_modules/deep-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,
"engines": {
"node": ">=4.0.0"
}
},
"node_modules/deep-is": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
"integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
"dev": true
},
"node_modules/default-require-extensions": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz",
"integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==",
"dev": true,
"dependencies": {
"strip-bom": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/defer-to-connect": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz",
"integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==",
"dev": true,
"engines": {
"node": ">=10"
}
},
"node_modules/define-properties": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
"integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
"dev": true,
"dependencies": {
"object-keys": "^1.0.12"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/del": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz",
"integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==",
"dev": true,
"dependencies": {
"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"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/del/node_modules/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,
"dependencies": {
"aggregate-error": "^3.0.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
"dev": true,
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/delegates": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
"integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
"dev": true
},
"node_modules/deprecation": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz",
"integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==",
"dev": true
},
"node_modules/diff": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz",
"integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==",
"dev": true,
"engines": {
"node": ">=0.3.1"
}
},
"node_modules/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,
"dependencies": {
"path-type": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/dir-glob/node_modules/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,
"engines": {
"node": ">=8"
}
},
"node_modules/dirty-chai": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/dirty-chai/-/dirty-chai-2.0.1.tgz",
"integrity": "sha512-ys79pWKvDMowIDEPC6Fig8d5THiC0DJ2gmTeGzVAoEH18J8OzLud0Jh7I9IWg3NSk8x2UocznUuFmfHCXYZx9w==",
"dev": true,
"peerDependencies": {
"chai": ">=2.2.1 <5"
}
},
"node_modules/doctrine": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
"integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
"dev": true,
"dependencies": {
"esutils": "^2.0.2"
},
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/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,
"dependencies": {
"is-obj": "^2.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/duplexer2": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
"integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=",
"dev": true,
"dependencies": {
"readable-stream": "^2.0.2"
}
},
"node_modules/duplexer2/node_modules/isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
"dev": true
},
"node_modules/duplexer2/node_modules/readable-stream": {
"version": "2.3.7",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
"dev": true,
"dependencies": {
"core-util-is": "~1.0.0",
"inherits": "~2.0.3",
"isarray": "~1.0.0",
"process-nextick-args": "~2.0.0",
"safe-buffer": "~5.1.1",
"string_decoder": "~1.1.1",
"util-deprecate": "~1.0.1"
}
},
"node_modules/duplexer2/node_modules/safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
"dev": true
},
"node_modules/duplexer2/node_modules/string_decoder": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
"dev": true,
"dependencies": {
"safe-buffer": "~5.1.0"
}
},
"node_modules/ecc-jsbn": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
"integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
"dev": true,
"dependencies": {
"jsbn": "~0.1.0",
"safer-buffer": "^2.1.0"
}
},
"node_modules/electron-to-chromium": {
"version": "1.4.61",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.61.tgz",
"integrity": "sha512-kpzCOOFlx63C9qKRyIDEsKIUgzoe98ump7T4gU+/OLzj8gYkkWf2SIyBjhTSE0keAjMAp3i7C262YtkQOMYrGw==",
"dev": true
},
"node_modules/emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
"dev": true
},
"node_modules/end-of-stream": {
"version": "1.4.4",
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
"integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
"dev": true,
"dependencies": {
"once": "^1.4.0"
}
},
"node_modules/env-ci": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/env-ci/-/env-ci-5.5.0.tgz",
"integrity": "sha512-o0JdWIbOLP+WJKIUt36hz1ImQQFuN92nhsfTkHHap+J8CiI8WgGpH/a9jEGHh4/TU5BUUGjlnKXNoDb57+ne+A==",
"dev": true,
"dependencies": {
"execa": "^5.0.0",
"fromentries": "^1.3.2",
"java-properties": "^1.0.0"
},
"engines": {
"node": ">=10.17"
}
},
"node_modules/error-ex": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
"integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
"dev": true,
"dependencies": {
"is-arrayish": "^0.2.1"
}
},
"node_modules/es-abstract": {
"version": "1.19.1",
"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz",
"integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==",
"dev": true,
"dependencies": {
"call-bind": "^1.0.2",
"es-to-primitive": "^1.2.1",
"function-bind": "^1.1.1",
"get-intrinsic": "^1.1.1",
"get-symbol-description": "^1.0.0",
"has": "^1.0.3",
"has-symbols": "^1.0.2",
"internal-slot": "^1.0.3",
"is-callable": "^1.2.4",
"is-negative-zero": "^2.0.1",
"is-regex": "^1.1.4",
"is-shared-array-buffer": "^1.0.1",
"is-string": "^1.0.7",
"is-weakref": "^1.0.1",
"object-inspect": "^1.11.0",
"object-keys": "^1.1.1",
"object.assign": "^4.1.2",
"string.prototype.trimend": "^1.0.4",
"string.prototype.trimstart": "^1.0.4",
"unbox-primitive": "^1.0.1"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/es-to-primitive": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
"integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
"dev": true,
"dependencies": {
"is-callable": "^1.1.4",
"is-date-object": "^1.0.1",
"is-symbol": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/es6-error": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz",
"integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==",
"dev": true
},
"node_modules/escalade": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
"integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
"dev": true,
"engines": {
"node": ">=6"
}
},
"node_modules/escape-string-regexp": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
"integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
"dev": true,
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/eslint": {
"version": "8.8.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.8.0.tgz",
"integrity": "sha512-H3KXAzQGBH1plhYS3okDix2ZthuYJlQQEGE5k0IKuEqUSiyu4AmxxlJ2MtTYeJ3xB4jDhcYCwGOg2TXYdnDXlQ==",
"dev": true,
"dependencies": {
"@eslint/eslintrc": "^1.0.5",
"@humanwhocodes/config-array": "^0.9.2",
"ajv": "^6.10.0",
"chalk": "^4.0.0",
"cross-spawn": "^7.0.2",
"debug": "^4.3.2",
"doctrine": "^3.0.0",
"escape-string-regexp": "^4.0.0",
"eslint-scope": "^7.1.0",
"eslint-utils": "^3.0.0",
"eslint-visitor-keys": "^3.2.0",
"espree": "^9.3.0",
"esquery": "^1.4.0",
"esutils": "^2.0.2",
"fast-deep-equal": "^3.1.3",
"file-entry-cache": "^6.0.1",
"functional-red-black-tree": "^1.0.1",
"glob-parent": "^6.0.1",
"globals": "^13.6.0",
"ignore": "^5.2.0",
"import-fresh": "^3.0.0",
"imurmurhash": "^0.1.4",
"is-glob": "^4.0.0",
"js-yaml": "^4.1.0",
"json-stable-stringify-without-jsonify": "^1.0.1",
"levn": "^0.4.1",
"lodash.merge": "^4.6.2",
"minimatch": "^3.0.4",
"natural-compare": "^1.4.0",
"optionator": "^0.9.1",
"regexpp": "^3.2.0",
"strip-ansi": "^6.0.1",
"strip-json-comments": "^3.1.0",
"text-table": "^0.2.0",
"v8-compile-cache": "^2.0.3"
},
"bin": {
"eslint": "bin/eslint.js"
},
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
"funding": {
"url": "https://opencollective.com/eslint"
}
},
"node_modules/eslint-config-prettier": {
"version": "8.3.0",
"resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz",
"integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==",
"dev": true,
"bin": {
"eslint-config-prettier": "bin/cli.js"
},
"peerDependencies": {
"eslint": ">=7.0.0"
}
},
"node_modules/eslint-config-standard": {
"version": "17.0.0-1",
"resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.0.0-1.tgz",
"integrity": "sha512-aqRG58dqoBNfOLN+PsitasxmW+W9Os4oQrx081B16T4E4WogsSbpUL6hnKSnyv35sSRYA2XjBtKMOrUboL6jgw==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"peerDependencies": {
"eslint": "^8.0.1",
"eslint-plugin-import": "^2.25.2",
"eslint-plugin-n": "^14.0.0",
"eslint-plugin-promise": "^6.0.0"
}
},
"node_modules/eslint-import-resolver-node": {
"version": "0.3.6",
"resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz",
"integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==",
"dev": true,
"dependencies": {
"debug": "^3.2.7",
"resolve": "^1.20.0"
}
},
"node_modules/eslint-import-resolver-node/node_modules/debug": {
"version": "3.2.7",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
"integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
"dev": true,
"dependencies": {
"ms": "^2.1.1"
}
},
"node_modules/eslint-module-utils": {
"version": "2.7.3",
"resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz",
"integrity": "sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==",
"dev": true,
"dependencies": {
"debug": "^3.2.7",
"find-up": "^2.1.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/eslint-module-utils/node_modules/debug": {
"version": "3.2.7",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
"integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
"dev": true,
"dependencies": {
"ms": "^2.1.1"
}
},
"node_modules/eslint-plugin-es": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz",
"integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==",
"dev": true,
"peer": true,
"dependencies": {
"eslint-utils": "^2.0.0",
"regexpp": "^3.0.0"
},
"engines": {
"node": ">=8.10.0"
},
"funding": {
"url": "https://github.com/sponsors/mysticatea"
},
"peerDependencies": {
"eslint": ">=4.19.1"
}
},
"node_modules/eslint-plugin-es/node_modules/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,
"peer": true,
"dependencies": {
"eslint-visitor-keys": "^1.1.0"
},
"engines": {
"node": ">=6"
},
"funding": {
"url": "https://github.com/sponsors/mysticatea"
}
},
"node_modules/eslint-plugin-es/node_modules/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,
"peer": true,
"engines": {
"node": ">=4"
}
},
"node_modules/eslint-plugin-import": {
"version": "2.25.4",
"resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.4.tgz",
"integrity": "sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA==",
"dev": true,
"dependencies": {
"array-includes": "^3.1.4",
"array.prototype.flat": "^1.2.5",
"debug": "^2.6.9",
"doctrine": "^2.1.0",
"eslint-import-resolver-node": "^0.3.6",
"eslint-module-utils": "^2.7.2",
"has": "^1.0.3",
"is-core-module": "^2.8.0",
"is-glob": "^4.0.3",
"minimatch": "^3.0.4",
"object.values": "^1.1.5",
"resolve": "^1.20.0",
"tsconfig-paths": "^3.12.0"
},
"engines": {
"node": ">=4"
},
"peerDependencies": {
"eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8"
}
},
"node_modules/eslint-plugin-import/node_modules/debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
"dependencies": {
"ms": "2.0.0"
}
},
"node_modules/eslint-plugin-import/node_modules/doctrine": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
"integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
"dev": true,
"dependencies": {
"esutils": "^2.0.2"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/eslint-plugin-import/node_modules/ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
"dev": true
},
"node_modules/eslint-plugin-mocha": {
"version": "10.0.3",
"resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.0.3.tgz",
"integrity": "sha512-9mM7PZGxfejpjey+MrG0Cu3Lc8MyA5E2s7eUCdHXgS4SY/H9zLuwa7wVAjnEaoDjbBilA+0bPEB+iMO7lBUPcg==",
"dev": true,
"dependencies": {
"eslint-utils": "^3.0.0",
"ramda": "^0.27.1"
},
"engines": {
"node": ">=14.0.0"
},
"peerDependencies": {
"eslint": ">=7.0.0"
}
},
"node_modules/eslint-plugin-n": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-14.0.0.tgz",
"integrity": "sha512-mNwplPLsbaKhHyA0fa/cy8j+oF6bF6l81hzBTWa6JOvPcMNAuIogk2ih6d9tYvWYzyUG+7ZFeChqbzdFpg2QrQ==",
"dev": true,
"peer": true,
"dependencies": {
"eslint-plugin-es": "^4.1.0",
"eslint-utils": "^3.0.0",
"ignore": "^5.1.1",
"is-core-module": "^2.3.0",
"minimatch": "^3.0.4",
"resolve": "^1.10.1",
"semver": "^6.1.0"
},
"engines": {
"node": ">=12.22.0"
},
"funding": {
"url": "https://github.com/sponsors/mysticatea"
},
"peerDependencies": {
"eslint": ">=7.0.0"
}
},
"node_modules/eslint-plugin-node": {
"version": "11.1.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz",
"integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==",
"dev": true,
"dependencies": {
"eslint-plugin-es": "^3.0.0",
"eslint-utils": "^2.0.0",
"ignore": "^5.1.1",
"minimatch": "^3.0.4",
"resolve": "^1.10.1",
"semver": "^6.1.0"
},
"engines": {
"node": ">=8.10.0"
},
"peerDependencies": {
"eslint": ">=5.16.0"
}
},
"node_modules/eslint-plugin-node/node_modules/eslint-plugin-es": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz",
"integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==",
"dev": true,
"dependencies": {
"eslint-utils": "^2.0.0",
"regexpp": "^3.0.0"
},
"engines": {
"node": ">=8.10.0"
},
"funding": {
"url": "https://github.com/sponsors/mysticatea"
},
"peerDependencies": {
"eslint": ">=4.19.1"
}
},
"node_modules/eslint-plugin-node/node_modules/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,
"dependencies": {
"eslint-visitor-keys": "^1.1.0"
},
"engines": {
"node": ">=6"
},
"funding": {
"url": "https://github.com/sponsors/mysticatea"
}
},
"node_modules/eslint-plugin-node/node_modules/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,
"engines": {
"node": ">=4"
}
},
"node_modules/eslint-plugin-promise": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.0.0.tgz",
"integrity": "sha512-7GPezalm5Bfi/E22PnQxDWH2iW9GTvAlUNTztemeHb6c1BniSyoeTrM87JkC0wYdi6aQrZX9p2qEiAno8aTcbw==",
"dev": true,
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
"peerDependencies": {
"eslint": "^7.0.0 || ^8.0.0"
}
},
"node_modules/eslint-scope": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz",
"integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==",
"dev": true,
"dependencies": {
"esrecurse": "^4.3.0",
"estraverse": "^5.2.0"
},
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
}
},
"node_modules/eslint-utils": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
"integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
"dev": true,
"dependencies": {
"eslint-visitor-keys": "^2.0.0"
},
"engines": {
"node": "^10.0.0 || ^12.0.0 || >= 14.0.0"
},
"funding": {
"url": "https://github.com/sponsors/mysticatea"
},
"peerDependencies": {
"eslint": ">=5"
}
},
"node_modules/eslint-utils/node_modules/eslint-visitor-keys": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
"integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
"dev": true,
"engines": {
"node": ">=10"
}
},
"node_modules/eslint-visitor-keys": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz",
"integrity": "sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ==",
"dev": true,
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
}
},
"node_modules/eslint/node_modules/strip-json-comments": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
"integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
"dev": true,
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/espree": {
"version": "9.3.0",
"resolved": "https://registry.npmjs.org/espree/-/espree-9.3.0.tgz",
"integrity": "sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ==",
"dev": true,
"dependencies": {
"acorn": "^8.7.0",
"acorn-jsx": "^5.3.1",
"eslint-visitor-keys": "^3.1.0"
},
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
}
},
"node_modules/esprima": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
"integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
"dev": true,
"bin": {
"esparse": "bin/esparse.js",
"esvalidate": "bin/esvalidate.js"
},
"engines": {
"node": ">=4"
}
},
"node_modules/esquery": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
"integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
"dev": true,
"dependencies": {
"estraverse": "^5.1.0"
},
"engines": {
"node": ">=0.10"
}
},
"node_modules/esrecurse": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
"integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
"dev": true,
"dependencies": {
"estraverse": "^5.2.0"
},
"engines": {
"node": ">=4.0"
}
},
"node_modules/estraverse": {
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
"integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
"dev": true,
"engines": {
"node": ">=4.0"
}
},
"node_modules/esutils": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
"integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/execa": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
"integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
"dev": true,
"dependencies": {
"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"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sindresorhus/execa?sponsor=1"
}
},
"node_modules/execa/node_modules/get-stream": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
"integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
"dev": true,
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/extend": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
"integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
"dev": true
},
"node_modules/extsprintf": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
"integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
"dev": true,
"engines": [
"node >=0.6.0"
]
},
"node_modules/fast-deep-equal": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
"dev": true
},
"node_modules/fast-glob": {
"version": "3.2.11",
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz",
"integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==",
"dev": true,
"dependencies": {
"@nodelib/fs.stat": "^2.0.2",
"@nodelib/fs.walk": "^1.2.3",
"glob-parent": "^5.1.2",
"merge2": "^1.3.0",
"micromatch": "^4.0.4"
},
"engines": {
"node": ">=8.6.0"
}
},
"node_modules/fast-glob/node_modules/glob-parent": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"dev": true,
"dependencies": {
"is-glob": "^4.0.1"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/fast-json-stable-stringify": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
"integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
"dev": true
},
"node_modules/fast-levenshtein": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
"integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
"dev": true
},
"node_modules/fastq": {
"version": "1.13.0",
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
"integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
"dev": true,
"dependencies": {
"reusify": "^1.0.4"
}
},
"node_modules/figures": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
"integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
"dev": true,
"dependencies": {
"escape-string-regexp": "^1.0.5"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/figures/node_modules/escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
"dev": true,
"engines": {
"node": ">=0.8.0"
}
},
"node_modules/file-entry-cache": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
"integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
"dev": true,
"dependencies": {
"flat-cache": "^3.0.4"
},
"engines": {
"node": "^10.12.0 || >=12.0.0"
}
},
"node_modules/fill-keys": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/fill-keys/-/fill-keys-1.0.2.tgz",
"integrity": "sha1-mo+jb06K1jTjv2tPPIiCVRRS6yA=",
"dev": true,
"dependencies": {
"is-object": "~1.0.1",
"merge-descriptors": "~1.0.0"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/fill-range": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
"dev": true,
"dependencies": {
"to-regex-range": "^5.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/find-cache-dir": {
"version": "3.3.2",
"resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz",
"integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==",
"dev": true,
"dependencies": {
"commondir": "^1.0.1",
"make-dir": "^3.0.2",
"pkg-dir": "^4.1.0"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/avajs/find-cache-dir?sponsor=1"
}
},
"node_modules/find-up": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
"integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
"dev": true,
"dependencies": {
"locate-path": "^2.0.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/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,
"dependencies": {
"semver-regex": "^3.1.2"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/flat": {
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
"integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
"dev": true,
"bin": {
"flat": "cli.js"
}
},
"node_modules/flat-cache": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
"integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
"dev": true,
"dependencies": {
"flatted": "^3.1.0",
"rimraf": "^3.0.2"
},
"engines": {
"node": "^10.12.0 || >=12.0.0"
}
},
"node_modules/flatted": {
"version": "3.2.5",
"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz",
"integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==",
"dev": true
},
"node_modules/foreground-child": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz",
"integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==",
"dev": true,
"dependencies": {
"cross-spawn": "^7.0.0",
"signal-exit": "^3.0.2"
},
"engines": {
"node": ">=8.0.0"
}
},
"node_modules/forever-agent": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
"integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
"dev": true,
"engines": {
"node": "*"
}
},
"node_modules/form-data": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
"integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
"dev": true,
"dependencies": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"mime-types": "^2.1.12"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/from2": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
"integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=",
"dev": true,
"dependencies": {
"inherits": "^2.0.1",
"readable-stream": "^2.0.0"
}
},
"node_modules/from2/node_modules/isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
"dev": true
},
"node_modules/from2/node_modules/readable-stream": {
"version": "2.3.7",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
"dev": true,
"dependencies": {
"core-util-is": "~1.0.0",
"inherits": "~2.0.3",
"isarray": "~1.0.0",
"process-nextick-args": "~2.0.0",
"safe-buffer": "~5.1.1",
"string_decoder": "~1.1.1",
"util-deprecate": "~1.0.1"
}
},
"node_modules/from2/node_modules/safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
"dev": true
},
"node_modules/from2/node_modules/string_decoder": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
"dev": true,
"dependencies": {
"safe-buffer": "~5.1.0"
}
},
"node_modules/fromentries": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz",
"integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
]
},
"node_modules/fs-constants": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
"integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
"dev": true
},
"node_modules/fs-extra": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz",
"integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==",
"dev": true,
"dependencies": {
"graceful-fs": "^4.1.2",
"jsonfile": "^4.0.0",
"universalify": "^0.1.0"
}
},
"node_modules/fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
"dev": true
},
"node_modules/fsevents": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
"integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
"dev": true,
"hasInstallScript": true,
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
}
},
"node_modules/fstream": {
"version": "1.0.12",
"resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz",
"integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==",
"dev": true,
"dependencies": {
"graceful-fs": "^4.1.2",
"inherits": "~2.0.0",
"mkdirp": ">=0.5 0",
"rimraf": "2"
},
"engines": {
"node": ">=0.6"
}
},
"node_modules/fstream/node_modules/rimraf": {
"version": "2.7.1",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
"integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
"dev": true,
"dependencies": {
"glob": "^7.1.3"
},
"bin": {
"rimraf": "bin.js"
}
},
"node_modules/function-bind": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
"dev": true
},
"node_modules/functional-red-black-tree": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
"integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
"dev": true
},
"node_modules/gauge": {
"version": "2.7.4",
"resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
"integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
"dev": true,
"dependencies": {
"aproba": "^1.0.3",
"console-control-strings": "^1.0.0",
"has-unicode": "^2.0.0",
"object-assign": "^4.1.0",
"signal-exit": "^3.0.0",
"string-width": "^1.0.1",
"strip-ansi": "^3.0.1",
"wide-align": "^1.1.0"
}
},
"node_modules/gauge/node_modules/ansi-regex": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/gauge/node_modules/strip-ansi": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
"dev": true,
"dependencies": {
"ansi-regex": "^2.0.0"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/gensync": {
"version": "1.0.0-beta.2",
"resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
"integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
"dev": true,
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/get-caller-file": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
"dev": true,
"engines": {
"node": "6.* || 8.* || >= 10.*"
}
},
"node_modules/get-func-name": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz",
"integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=",
"dev": true,
"engines": {
"node": "*"
}
},
"node_modules/get-intrinsic": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
"integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
"dev": true,
"dependencies": {
"function-bind": "^1.1.1",
"has": "^1.0.3",
"has-symbols": "^1.0.1"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/get-package-type": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
"integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
"dev": true,
"engines": {
"node": ">=8.0.0"
}
},
"node_modules/get-stream": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
"integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
"dev": true,
"dependencies": {
"pump": "^3.0.0"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/get-symbol-description": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
"integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
"dev": true,
"dependencies": {
"call-bind": "^1.0.2",
"get-intrinsic": "^1.1.1"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/getpass": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
"integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
"dev": true,
"dependencies": {
"assert-plus": "^1.0.0"
}
},
"node_modules/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,
"dependencies": {
"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"
}
},
"node_modules/git-log-parser/node_modules/isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
"dev": true
},
"node_modules/git-log-parser/node_modules/readable-stream": {
"version": "2.3.7",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
"dev": true,
"dependencies": {
"core-util-is": "~1.0.0",
"inherits": "~2.0.3",
"isarray": "~1.0.0",
"process-nextick-args": "~2.0.0",
"safe-buffer": "~5.1.1",
"string_decoder": "~1.1.1",
"util-deprecate": "~1.0.1"
}
},
"node_modules/git-log-parser/node_modules/safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
"dev": true
},
"node_modules/git-log-parser/node_modules/split2": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/split2/-/split2-1.0.0.tgz",
"integrity": "sha1-UuLiIdiMdfmnP5BVbiY/+WdysxQ=",
"dev": true,
"dependencies": {
"through2": "~2.0.0"
}
},
"node_modules/git-log-parser/node_modules/string_decoder": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
"dev": true,
"dependencies": {
"safe-buffer": "~5.1.0"
}
},
"node_modules/git-log-parser/node_modules/through2": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
"integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
"dev": true,
"dependencies": {
"readable-stream": "~2.3.6",
"xtend": "~4.0.1"
}
},
"node_modules/glob": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
"integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
"dev": true,
"dependencies": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
"inherits": "2",
"minimatch": "^3.0.4",
"once": "^1.3.0",
"path-is-absolute": "^1.0.0"
},
"engines": {
"node": "*"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/glob-parent": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
"integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
"dev": true,
"dependencies": {
"is-glob": "^4.0.3"
},
"engines": {
"node": ">=10.13.0"
}
},
"node_modules/globals": {
"version": "13.12.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz",
"integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==",
"dev": true,
"dependencies": {
"type-fest": "^0.20.2"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/globby": {
"version": "11.1.0",
"resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
"integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
"dev": true,
"dependencies": {
"array-union": "^2.1.0",
"dir-glob": "^3.0.1",
"fast-glob": "^3.2.9",
"ignore": "^5.2.0",
"merge2": "^1.4.1",
"slash": "^3.0.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/got": {
"version": "11.8.3",
"resolved": "https://registry.npmjs.org/got/-/got-11.8.3.tgz",
"integrity": "sha512-7gtQ5KiPh1RtGS9/Jbv1ofDpBFuq42gyfEib+ejaRBJuj/3tQFeR5+gw57e4ipaU8c/rCjvX6fkQz2lyDlGAOg==",
"dev": true,
"dependencies": {
"@sindresorhus/is": "^4.0.0",
"@szmarczak/http-timer": "^4.0.5",
"@types/cacheable-request": "^6.0.1",
"@types/responselike": "^1.0.0",
"cacheable-lookup": "^5.0.3",
"cacheable-request": "^7.0.2",
"decompress-response": "^6.0.0",
"http2-wrapper": "^1.0.0-beta.5.2",
"lowercase-keys": "^2.0.0",
"p-cancelable": "^2.0.0",
"responselike": "^2.0.0"
},
"engines": {
"node": ">=10.19.0"
},
"funding": {
"url": "https://github.com/sindresorhus/got?sponsor=1"
}
},
"node_modules/graceful-fs": {
"version": "4.2.9",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz",
"integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==",
"dev": true
},
"node_modules/growl": {
"version": "1.10.5",
"resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
"integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==",
"dev": true,
"engines": {
"node": ">=4.x"
}
},
"node_modules/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,
"dependencies": {
"minimist": "^1.2.5",
"neo-async": "^2.6.0",
"source-map": "^0.6.1",
"wordwrap": "^1.0.0"
},
"bin": {
"handlebars": "bin/handlebars"
},
"engines": {
"node": ">=0.4.7"
},
"optionalDependencies": {
"uglify-js": "^3.1.4"
}
},
"node_modules/handlebars/node_modules/source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/har-schema": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
"integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
"dev": true,
"engines": {
"node": ">=4"
}
},
"node_modules/har-validator": {
"version": "5.1.5",
"resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
"integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
"deprecated": "this library is no longer supported",
"dev": true,
"dependencies": {
"ajv": "^6.12.3",
"har-schema": "^2.0.0"
},
"engines": {
"node": ">=6"
}
},
"node_modules/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,
"engines": {
"node": ">=6"
}
},
"node_modules/has": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
"dev": true,
"dependencies": {
"function-bind": "^1.1.1"
},
"engines": {
"node": ">= 0.4.0"
}
},
"node_modules/has-ansi": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
"integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
"dev": true,
"dependencies": {
"ansi-regex": "^2.0.0"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/has-ansi/node_modules/ansi-regex": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/has-bigints": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz",
"integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==",
"dev": true,
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/has-symbols": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
"integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==",
"dev": true,
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has-tostringtag": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
"integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
"dev": true,
"dependencies": {
"has-symbols": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has-unicode": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
"integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
"dev": true
},
"node_modules/hasha": {
"version": "5.2.2",
"resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz",
"integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==",
"dev": true,
"dependencies": {
"is-stream": "^2.0.0",
"type-fest": "^0.8.0"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/hasha/node_modules/type-fest": {
"version": "0.8.1",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
"integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/he": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
"integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
"dev": true,
"bin": {
"he": "bin/he"
}
},
"node_modules/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,
"engines": {
"node": ">=8"
}
},
"node_modules/hosted-git-info": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
"integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==",
"dev": true,
"dependencies": {
"lru-cache": "^6.0.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/html-escaper": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
"integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
"dev": true
},
"node_modules/http-cache-semantics": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
"integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==",
"dev": true
},
"node_modules/http-proxy-agent": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz",
"integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==",
"dev": true,
"dependencies": {
"@tootallnate/once": "2",
"agent-base": "6",
"debug": "4"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/http-signature": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
"integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
"dev": true,
"dependencies": {
"assert-plus": "^1.0.0",
"jsprim": "^1.2.2",
"sshpk": "^1.7.0"
},
"engines": {
"node": ">=0.8",
"npm": ">=1.3.7"
}
},
"node_modules/http2-wrapper": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz",
"integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==",
"dev": true,
"dependencies": {
"quick-lru": "^5.1.1",
"resolve-alpn": "^1.0.0"
},
"engines": {
"node": ">=10.19.0"
}
},
"node_modules/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,
"dependencies": {
"agent-base": "6",
"debug": "4"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/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,
"engines": {
"node": ">=10.17.0"
}
},
"node_modules/ieee754": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
"integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
]
},
"node_modules/ignore": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
"integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
"dev": true,
"engines": {
"node": ">= 4"
}
},
"node_modules/import-fresh": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
"integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
"dev": true,
"dependencies": {
"parent-module": "^1.0.0",
"resolve-from": "^4.0.0"
},
"engines": {
"node": ">=6"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/import-from": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/import-from/-/import-from-4.0.0.tgz",
"integrity": "sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==",
"dev": true,
"engines": {
"node": ">=12.2"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/imurmurhash": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
"integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
"dev": true,
"engines": {
"node": ">=0.8.19"
}
},
"node_modules/indent-string": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
"integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/inflight": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
"dev": true,
"dependencies": {
"once": "^1.3.0",
"wrappy": "1"
}
},
"node_modules/inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"dev": true
},
"node_modules/ini": {
"version": "1.3.8",
"resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
"integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
"dev": true
},
"node_modules/internal-slot": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz",
"integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==",
"dev": true,
"dependencies": {
"get-intrinsic": "^1.1.0",
"has": "^1.0.3",
"side-channel": "^1.0.4"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/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,
"dependencies": {
"from2": "^2.3.0",
"p-is-promise": "^3.0.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/is-arrayish": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
"integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
"dev": true
},
"node_modules/is-bigint": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
"integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
"dev": true,
"dependencies": {
"has-bigints": "^1.0.1"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-binary-path": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
"integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
"dev": true,
"dependencies": {
"binary-extensions": "^2.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/is-boolean-object": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
"integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
"dev": true,
"dependencies": {
"call-bind": "^1.0.2",
"has-tostringtag": "^1.0.0"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-callable": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz",
"integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==",
"dev": true,
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-core-module": {
"version": "2.8.1",
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz",
"integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==",
"dev": true,
"dependencies": {
"has": "^1.0.3"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-date-object": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
"integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
"dev": true,
"dependencies": {
"has-tostringtag": "^1.0.0"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/is-fullwidth-code-point": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
"integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
"dev": true,
"dependencies": {
"number-is-nan": "^1.0.0"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/is-glob": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
"dev": true,
"dependencies": {
"is-extglob": "^2.1.1"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/is-negative-zero": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
"integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==",
"dev": true,
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-number": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
"dev": true,
"engines": {
"node": ">=0.12.0"
}
},
"node_modules/is-number-object": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz",
"integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==",
"dev": true,
"dependencies": {
"has-tostringtag": "^1.0.0"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-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,
"engines": {
"node": ">=8"
}
},
"node_modules/is-object": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz",
"integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==",
"dev": true,
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/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,
"engines": {
"node": ">=6"
}
},
"node_modules/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,
"engines": {
"node": ">=8"
}
},
"node_modules/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,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/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,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/is-regex": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
"integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
"dev": true,
"dependencies": {
"call-bind": "^1.0.2",
"has-tostringtag": "^1.0.0"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-regexp": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz",
"integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/is-shared-array-buffer": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz",
"integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==",
"dev": true,
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-stream": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
"integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
"dev": true,
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/is-string": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
"integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
"dev": true,
"dependencies": {
"has-tostringtag": "^1.0.0"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-symbol": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
"integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
"dev": true,
"dependencies": {
"has-symbols": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-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,
"dependencies": {
"text-extensions": "^1.0.0"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/is-typedarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
"integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
"dev": true
},
"node_modules/is-unicode-supported": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
"integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
"dev": true,
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/is-weakref": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
"integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
"dev": true,
"dependencies": {
"call-bind": "^1.0.2"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-windows": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
"integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/isarray": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
"integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
"dev": true
},
"node_modules/isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
"integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
"dev": true
},
"node_modules/isstream": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
"integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
"dev": true
},
"node_modules/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,
"dependencies": {
"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"
},
"engines": {
"node": ">=10.13"
}
},
"node_modules/istanbul-lib-coverage": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz",
"integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/istanbul-lib-hook": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz",
"integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==",
"dev": true,
"dependencies": {
"append-transform": "^2.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/istanbul-lib-instrument": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz",
"integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==",
"dev": true,
"dependencies": {
"@babel/core": "^7.7.5",
"@istanbuljs/schema": "^0.1.2",
"istanbul-lib-coverage": "^3.0.0",
"semver": "^6.3.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/istanbul-lib-processinfo": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz",
"integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==",
"dev": true,
"dependencies": {
"archy": "^1.0.0",
"cross-spawn": "^7.0.0",
"istanbul-lib-coverage": "^3.0.0-alpha.1",
"make-dir": "^3.0.0",
"p-map": "^3.0.0",
"rimraf": "^3.0.0",
"uuid": "^3.3.3"
},
"engines": {
"node": ">=8"
}
},
"node_modules/istanbul-lib-report": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
"integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==",
"dev": true,
"dependencies": {
"istanbul-lib-coverage": "^3.0.0",
"make-dir": "^3.0.0",
"supports-color": "^7.1.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/istanbul-lib-source-maps": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz",
"integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==",
"dev": true,
"dependencies": {
"debug": "^4.1.1",
"istanbul-lib-coverage": "^3.0.0",
"source-map": "^0.6.1"
},
"engines": {
"node": ">=10"
}
},
"node_modules/istanbul-lib-source-maps/node_modules/source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/istanbul-reports": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.3.tgz",
"integrity": "sha512-x9LtDVtfm/t1GFiLl3NffC7hz+I1ragvgX1P/Lg1NlIagifZDKUkuuaAxH/qpwj2IuEfD8G2Bs/UKp+sZ/pKkg==",
"dev": true,
"dependencies": {
"html-escaper": "^2.0.0",
"istanbul-lib-report": "^3.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/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,
"engines": {
"node": ">= 0.6.0"
}
},
"node_modules/js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
"dev": true
},
"node_modules/js-yaml": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
"integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
"dev": true,
"dependencies": {
"argparse": "^2.0.1"
},
"bin": {
"js-yaml": "bin/js-yaml.js"
}
},
"node_modules/jsbn": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
"integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
"dev": true
},
"node_modules/jsesc": {
"version": "2.5.2",
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
"integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
"dev": true,
"bin": {
"jsesc": "bin/jsesc"
},
"engines": {
"node": ">=4"
}
},
"node_modules/json-buffer": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
"integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
"dev": true
},
"node_modules/json-parse-better-errors": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
"integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
"dev": true
},
"node_modules/json-parse-even-better-errors": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
"integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
"dev": true
},
"node_modules/json-schema": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
"integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
"dev": true
},
"node_modules/json-schema-traverse": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
"dev": true
},
"node_modules/json-stable-stringify": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz",
"integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=",
"dev": true,
"dependencies": {
"jsonify": "~0.0.0"
}
},
"node_modules/json-stable-stringify-without-jsonify": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
"integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
"dev": true
},
"node_modules/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="
},
"node_modules/json5": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz",
"integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==",
"dev": true,
"dependencies": {
"minimist": "^1.2.5"
},
"bin": {
"json5": "lib/cli.js"
},
"engines": {
"node": ">=6"
}
},
"node_modules/jsonfile": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
"integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
"dev": true,
"optionalDependencies": {
"graceful-fs": "^4.1.6"
}
},
"node_modules/jsonify": {
"version": "0.0.0",
"resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
"integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
"dev": true,
"engines": {
"node": "*"
}
},
"node_modules/jsonparse": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
"integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=",
"dev": true,
"engines": [
"node >= 0.2.0"
]
},
"node_modules/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,
"dependencies": {
"jsonparse": "^1.2.0",
"through": ">=2.2.7 <3"
},
"bin": {
"JSONStream": "bin.js"
},
"engines": {
"node": "*"
}
},
"node_modules/jsprim": {
"version": "1.4.2",
"resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
"integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
"dev": true,
"dependencies": {
"assert-plus": "1.0.0",
"extsprintf": "1.3.0",
"json-schema": "0.4.0",
"verror": "1.10.0"
},
"engines": {
"node": ">=0.6.0"
}
},
"node_modules/just-extend": {
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz",
"integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==",
"dev": true
},
"node_modules/keyv": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-4.1.0.tgz",
"integrity": "sha512-YsY3wr6HabE11/sscee+3nZ03XjvkrPWGouAmJFBdZoK92wiOlJCzI5/sDEIKdJhdhHO144ei45U9gXfbu14Uw==",
"dev": true,
"dependencies": {
"json-buffer": "3.0.1"
}
},
"node_modules/kind-of": {
"version": "6.0.3",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
"integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/levn": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
"integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
"dev": true,
"dependencies": {
"prelude-ls": "^1.2.1",
"type-check": "~0.4.0"
},
"engines": {
"node": ">= 0.8.0"
}
},
"node_modules/lines-and-columns": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
"integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
"dev": true
},
"node_modules/load-json-file": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
"integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=",
"dev": true,
"dependencies": {
"graceful-fs": "^4.1.2",
"parse-json": "^4.0.0",
"pify": "^3.0.0",
"strip-bom": "^3.0.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/load-json-file/node_modules/strip-bom": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
"integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
"dev": true,
"engines": {
"node": ">=4"
}
},
"node_modules/locate-path": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
"integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
"dev": true,
"dependencies": {
"p-locate": "^2.0.0",
"path-exists": "^3.0.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
"dev": true
},
"node_modules/lodash.capitalize": {
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz",
"integrity": "sha1-+CbJtOKoUR2E46yinbBeGk87cqk=",
"dev": true
},
"node_modules/lodash.escaperegexp": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz",
"integrity": "sha1-ZHYsSGGAglGKw99Mz11YhtriA0c=",
"dev": true
},
"node_modules/lodash.flattendeep": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz",
"integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=",
"dev": true
},
"node_modules/lodash.get": {
"version": "4.4.2",
"resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
"integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=",
"dev": true
},
"node_modules/lodash.ismatch": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz",
"integrity": "sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc=",
"dev": true
},
"node_modules/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
},
"node_modules/lodash.isstring": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
"integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=",
"dev": true
},
"node_modules/lodash.merge": {
"version": "4.6.2",
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
"integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
"dev": true
},
"node_modules/lodash.set": {
"version": "4.3.2",
"resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz",
"integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM="
},
"node_modules/lodash.uniqby": {
"version": "4.7.0",
"resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz",
"integrity": "sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI=",
"dev": true
},
"node_modules/log-symbols": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
"integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
"dev": true,
"dependencies": {
"chalk": "^4.1.0",
"is-unicode-supported": "^0.1.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/loupe": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.1.tgz",
"integrity": "sha512-EN1D3jyVmaX4tnajVlfbREU4axL647hLec1h/PXAb8CPDMJiYitcWF2UeLVNttRqaIqQs4x+mRvXf+d+TlDrCA==",
"dev": true,
"dependencies": {
"get-func-name": "^2.0.0"
}
},
"node_modules/lowercase-keys": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
"integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/lru-cache": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
"integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
"dev": true,
"dependencies": {
"yallist": "^4.0.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/make-dir": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
"integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
"dev": true,
"dependencies": {
"semver": "^6.0.0"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/map-obj": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz",
"integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==",
"dev": true,
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/marked": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/marked/-/marked-2.1.3.tgz",
"integrity": "sha512-/Q+7MGzaETqifOMWYEA7HVMaZb4XbcRfaOzcSsHZEith83KGlvaSG33u0SKu89Mj5h+T8V2hM+8O45Qc5XTgwA==",
"dev": true,
"bin": {
"marked": "bin/marked"
},
"engines": {
"node": ">= 10"
}
},
"node_modules/marked-terminal": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-4.2.0.tgz",
"integrity": "sha512-DQfNRV9svZf0Dm9Cf5x5xaVJ1+XjxQW6XjFJ5HFkVyK52SDpj5PCBzS5X5r2w9nHr3mlB0T5201UMLue9fmhUw==",
"dev": true,
"dependencies": {
"ansi-escapes": "^4.3.1",
"cardinal": "^2.1.1",
"chalk": "^4.1.0",
"cli-table3": "^0.6.0",
"node-emoji": "^1.10.0",
"supports-hyperlinks": "^2.1.0"
},
"peerDependencies": {
"marked": "^1.0.0 || ^2.0.0"
}
},
"node_modules/memorystream": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz",
"integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=",
"dev": true,
"engines": {
"node": ">= 0.10.0"
}
},
"node_modules/meow": {
"version": "8.1.2",
"resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz",
"integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==",
"dev": true,
"dependencies": {
"@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"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/meow/node_modules/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,
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/merge-descriptors": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
"integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=",
"dev": true
},
"node_modules/merge-stream": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
"integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
"dev": true
},
"node_modules/merge2": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
"integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
"dev": true,
"engines": {
"node": ">= 8"
}
},
"node_modules/micromatch": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
"integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
"dev": true,
"dependencies": {
"braces": "^3.0.1",
"picomatch": "^2.2.3"
},
"engines": {
"node": ">=8.6"
}
},
"node_modules/mime": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz",
"integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==",
"dev": true,
"bin": {
"mime": "cli.js"
},
"engines": {
"node": ">=10.0.0"
}
},
"node_modules/mime-db": {
"version": "1.51.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz",
"integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==",
"dev": true,
"engines": {
"node": ">= 0.6"
}
},
"node_modules/mime-types": {
"version": "2.1.34",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz",
"integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==",
"dev": true,
"dependencies": {
"mime-db": "1.51.0"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/mimic-fn": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
"integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
"dev": true,
"engines": {
"node": ">=6"
}
},
"node_modules/mimic-response": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
"integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
"dev": true,
"engines": {
"node": ">=4"
}
},
"node_modules/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,
"engines": {
"node": ">=4"
}
},
"node_modules/minimatch": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
"dev": true,
"dependencies": {
"brace-expansion": "^1.1.7"
},
"engines": {
"node": "*"
}
},
"node_modules/minimist": {
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
"dev": true
},
"node_modules/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,
"dependencies": {
"arrify": "^1.0.1",
"is-plain-obj": "^1.1.0",
"kind-of": "^6.0.3"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/minipass": {
"version": "3.1.6",
"resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz",
"integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==",
"dev": true,
"dependencies": {
"yallist": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/mkdirp": {
"version": "0.5.5",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
"integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
"dev": true,
"dependencies": {
"minimist": "^1.2.5"
},
"bin": {
"mkdirp": "bin/cmd.js"
}
},
"node_modules/mocha": {
"version": "9.2.0",
"resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.0.tgz",
"integrity": "sha512-kNn7E8g2SzVcq0a77dkphPsDSN7P+iYkqE0ZsGCYWRsoiKjOt+NvXfaagik8vuDa6W5Zw3qxe8Jfpt5qKf+6/Q==",
"dev": true,
"dependencies": {
"@ungap/promise-all-settled": "1.1.2",
"ansi-colors": "4.1.1",
"browser-stdout": "1.3.1",
"chokidar": "3.5.3",
"debug": "4.3.3",
"diff": "5.0.0",
"escape-string-regexp": "4.0.0",
"find-up": "5.0.0",
"glob": "7.2.0",
"growl": "1.10.5",
"he": "1.2.0",
"js-yaml": "4.1.0",
"log-symbols": "4.1.0",
"minimatch": "3.0.4",
"ms": "2.1.3",
"nanoid": "3.2.0",
"serialize-javascript": "6.0.0",
"strip-json-comments": "3.1.1",
"supports-color": "8.1.1",
"which": "2.0.2",
"workerpool": "6.2.0",
"yargs": "16.2.0",
"yargs-parser": "20.2.4",
"yargs-unparser": "2.0.0"
},
"bin": {
"_mocha": "bin/_mocha",
"mocha": "bin/mocha"
},
"engines": {
"node": ">= 12.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/mochajs"
}
},
"node_modules/mocha/node_modules/cliui": {
"version": "7.0.4",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
"integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
"dev": true,
"dependencies": {
"string-width": "^4.2.0",
"strip-ansi": "^6.0.0",
"wrap-ansi": "^7.0.0"
}
},
"node_modules/mocha/node_modules/find-up": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
"integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
"dev": true,
"dependencies": {
"locate-path": "^6.0.0",
"path-exists": "^4.0.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/mocha/node_modules/is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/mocha/node_modules/locate-path": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
"integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
"dev": true,
"dependencies": {
"p-locate": "^5.0.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/mocha/node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
"dev": true
},
"node_modules/mocha/node_modules/p-limit": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
"integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
"dev": true,
"dependencies": {
"yocto-queue": "^0.1.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/mocha/node_modules/p-locate": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
"integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
"dev": true,
"dependencies": {
"p-limit": "^3.0.2"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/mocha/node_modules/path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/mocha/node_modules/string-width": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"dev": true,
"dependencies": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
"strip-ansi": "^6.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/mocha/node_modules/strip-json-comments": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
"integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
"dev": true,
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/mocha/node_modules/supports-color": {
"version": "8.1.1",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
"integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
"dev": true,
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/supports-color?sponsor=1"
}
},
"node_modules/mocha/node_modules/wrap-ansi": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
"dev": true,
"dependencies": {
"ansi-styles": "^4.0.0",
"string-width": "^4.1.0",
"strip-ansi": "^6.0.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
"node_modules/mocha/node_modules/y18n": {
"version": "5.0.8",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
"integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
"dev": true,
"engines": {
"node": ">=10"
}
},
"node_modules/mocha/node_modules/yargs": {
"version": "16.2.0",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
"integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
"dev": true,
"dependencies": {
"cliui": "^7.0.2",
"escalade": "^3.1.1",
"get-caller-file": "^2.0.5",
"require-directory": "^2.1.1",
"string-width": "^4.2.0",
"y18n": "^5.0.5",
"yargs-parser": "^20.2.2"
},
"engines": {
"node": ">=10"
}
},
"node_modules/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,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/module-not-found-error": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/module-not-found-error/-/module-not-found-error-1.0.1.tgz",
"integrity": "sha1-z4tP9PKWQGdNbN0CsOO8UjwrvcA=",
"dev": true
},
"node_modules/ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
},
"node_modules/nanoid": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz",
"integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==",
"dev": true,
"bin": {
"nanoid": "bin/nanoid.cjs"
},
"engines": {
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
}
},
"node_modules/natural-compare": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
"integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
"dev": true
},
"node_modules/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
},
"node_modules/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_modules/nice-try": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
"integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
"dev": true
},
"node_modules/nise": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/nise/-/nise-5.1.1.tgz",
"integrity": "sha512-yr5kW2THW1AkxVmCnKEh4nbYkJdB3I7LUkiUgOvEkOp414mc2UMaHMA7pjq1nYowhdoJZGwEKGaQVbxfpWj10A==",
"dev": true,
"dependencies": {
"@sinonjs/commons": "^1.8.3",
"@sinonjs/fake-timers": ">=5",
"@sinonjs/text-encoding": "^0.7.1",
"just-extend": "^4.0.2",
"path-to-regexp": "^1.7.0"
}
},
"node_modules/node-emoji": {
"version": "1.11.0",
"resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz",
"integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==",
"dev": true,
"dependencies": {
"lodash": "^4.17.21"
}
},
"node_modules/node-fetch": {
"version": "2.6.7",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
"integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
"dev": true,
"dependencies": {
"whatwg-url": "^5.0.0"
},
"engines": {
"node": "4.x || >=6.0.0"
},
"peerDependencies": {
"encoding": "^0.1.0"
},
"peerDependenciesMeta": {
"encoding": {
"optional": true
}
}
},
"node_modules/node-preload": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz",
"integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==",
"dev": true,
"dependencies": {
"process-on-spawn": "^1.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/node-releases": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz",
"integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==",
"dev": true
},
"node_modules/normalize-package-data": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz",
"integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==",
"dev": true,
"dependencies": {
"hosted-git-info": "^4.0.1",
"is-core-module": "^2.5.0",
"semver": "^7.3.4",
"validate-npm-package-license": "^3.0.1"
},
"engines": {
"node": ">=10"
}
},
"node_modules/normalize-package-data/node_modules/semver": {
"version": "7.3.5",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
"integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
"dev": true,
"dependencies": {
"lru-cache": "^6.0.0"
},
"bin": {
"semver": "bin/semver.js"
},
"engines": {
"node": ">=10"
}
},
"node_modules/normalize-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/normalize-url": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz",
"integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==",
"dev": true,
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/npm": {
"version": "7.24.2",
"resolved": "https://registry.npmjs.org/npm/-/npm-7.24.2.tgz",
"integrity": "sha512-120p116CE8VMMZ+hk8IAb1inCPk4Dj3VZw29/n2g6UI77urJKVYb7FZUDW8hY+EBnfsjI/2yrobBgFyzo7YpVQ==",
"bundleDependencies": [
"@isaacs/string-locale-compare",
"@npmcli/arborist",
"@npmcli/ci-detect",
"@npmcli/config",
"@npmcli/map-workspaces",
"@npmcli/package-json",
"@npmcli/run-script",
"abbrev",
"ansicolors",
"ansistyles",
"archy",
"cacache",
"chalk",
"chownr",
"cli-columns",
"cli-table3",
"columnify",
"fastest-levenshtein",
"glob",
"graceful-fs",
"hosted-git-info",
"ini",
"init-package-json",
"is-cidr",
"json-parse-even-better-errors",
"libnpmaccess",
"libnpmdiff",
"libnpmexec",
"libnpmfund",
"libnpmhook",
"libnpmorg",
"libnpmpack",
"libnpmpublish",
"libnpmsearch",
"libnpmteam",
"libnpmversion",
"make-fetch-happen",
"minipass",
"minipass-pipeline",
"mkdirp",
"mkdirp-infer-owner",
"ms",
"node-gyp",
"nopt",
"npm-audit-report",
"npm-install-checks",
"npm-package-arg",
"npm-pick-manifest",
"npm-profile",
"npm-registry-fetch",
"npm-user-validate",
"npmlog",
"opener",
"pacote",
"parse-conflict-json",
"qrcode-terminal",
"read",
"read-package-json",
"read-package-json-fast",
"readdir-scoped-modules",
"rimraf",
"semver",
"ssri",
"tar",
"text-table",
"tiny-relative-date",
"treeverse",
"validate-npm-package-name",
"which",
"write-file-atomic"
],
"dev": true,
"dependencies": {
"@isaacs/string-locale-compare": "*",
"@npmcli/arborist": "*",
"@npmcli/ci-detect": "*",
"@npmcli/config": "*",
"@npmcli/map-workspaces": "*",
"@npmcli/package-json": "*",
"@npmcli/run-script": "*",
"abbrev": "*",
"ansicolors": "*",
"ansistyles": "*",
"archy": "*",
"cacache": "*",
"chalk": "*",
"chownr": "*",
"cli-columns": "*",
"cli-table3": "*",
"columnify": "*",
"fastest-levenshtein": "*",
"glob": "*",
"graceful-fs": "*",
"hosted-git-info": "*",
"ini": "*",
"init-package-json": "*",
"is-cidr": "*",
"json-parse-even-better-errors": "*",
"libnpmaccess": "*",
"libnpmdiff": "*",
"libnpmexec": "*",
"libnpmfund": "*",
"libnpmhook": "*",
"libnpmorg": "*",
"libnpmpack": "*",
"libnpmpublish": "*",
"libnpmsearch": "*",
"libnpmteam": "*",
"libnpmversion": "*",
"make-fetch-happen": "*",
"minipass": "*",
"minipass-pipeline": "*",
"mkdirp": "*",
"mkdirp-infer-owner": "*",
"ms": "*",
"node-gyp": "*",
"nopt": "*",
"npm-audit-report": "*",
"npm-install-checks": "*",
"npm-package-arg": "*",
"npm-pick-manifest": "*",
"npm-profile": "*",
"npm-registry-fetch": "*",
"npm-user-validate": "*",
"npmlog": "*",
"opener": "*",
"pacote": "*",
"parse-conflict-json": "*",
"qrcode-terminal": "*",
"read": "*",
"read-package-json": "*",
"read-package-json-fast": "*",
"readdir-scoped-modules": "*",
"rimraf": "*",
"semver": "*",
"ssri": "*",
"tar": "*",
"text-table": "*",
"tiny-relative-date": "*",
"treeverse": "*",
"validate-npm-package-name": "*",
"which": "*",
"write-file-atomic": "*"
},
"bin": {
"npm": "bin/npm-cli.js",
"npx": "bin/npx-cli.js"
},
"engines": {
"node": ">=10"
}
},
"node_modules/npm-package-arg": {
"version": "8.1.5",
"resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.5.tgz",
"integrity": "sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==",
"dev": true,
"dependencies": {
"hosted-git-info": "^4.0.1",
"semver": "^7.3.4",
"validate-npm-package-name": "^3.0.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/npm-package-arg/node_modules/semver": {
"version": "7.3.5",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
"integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
"dev": true,
"dependencies": {
"lru-cache": "^6.0.0"
},
"bin": {
"semver": "bin/semver.js"
},
"engines": {
"node": ">=10"
}
},
"node_modules/npm-run-all": {
"version": "4.1.5",
"resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz",
"integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==",
"dev": true,
"dependencies": {
"ansi-styles": "^3.2.1",
"chalk": "^2.4.1",
"cross-spawn": "^6.0.5",
"memorystream": "^0.3.1",
"minimatch": "^3.0.4",
"pidtree": "^0.3.0",
"read-pkg": "^3.0.0",
"shell-quote": "^1.6.1",
"string.prototype.padend": "^3.0.0"
},
"bin": {
"npm-run-all": "bin/npm-run-all/index.js",
"run-p": "bin/run-p/index.js",
"run-s": "bin/run-s/index.js"
},
"engines": {
"node": ">= 4"
}
},
"node_modules/npm-run-all/node_modules/ansi-styles": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"dev": true,
"dependencies": {
"color-convert": "^1.9.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/npm-run-all/node_modules/chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"dev": true,
"dependencies": {
"ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5",
"supports-color": "^5.3.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/npm-run-all/node_modules/color-convert": {
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"dev": true,
"dependencies": {
"color-name": "1.1.3"
}
},
"node_modules/npm-run-all/node_modules/color-name": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
"dev": true
},
"node_modules/npm-run-all/node_modules/cross-spawn": {
"version": "6.0.5",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
"integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
"dev": true,
"dependencies": {
"nice-try": "^1.0.4",
"path-key": "^2.0.1",
"semver": "^5.5.0",
"shebang-command": "^1.2.0",
"which": "^1.2.9"
},
"engines": {
"node": ">=4.8"
}
},
"node_modules/npm-run-all/node_modules/escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
"dev": true,
"engines": {
"node": ">=0.8.0"
}
},
"node_modules/npm-run-all/node_modules/has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
"dev": true,
"engines": {
"node": ">=4"
}
},
"node_modules/npm-run-all/node_modules/path-key": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
"integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
"dev": true,
"engines": {
"node": ">=4"
}
},
"node_modules/npm-run-all/node_modules/semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
"dev": true,
"bin": {
"semver": "bin/semver"
}
},
"node_modules/npm-run-all/node_modules/shebang-command": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
"integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
"dev": true,
"dependencies": {
"shebang-regex": "^1.0.0"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/npm-run-all/node_modules/shebang-regex": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
"integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/npm-run-all/node_modules/supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
"dependencies": {
"has-flag": "^3.0.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/npm-run-all/node_modules/which": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
"integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
"dev": true,
"dependencies": {
"isexe": "^2.0.0"
},
"bin": {
"which": "bin/which"
}
},
"node_modules/npm-run-path": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
"integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
"dev": true,
"dependencies": {
"path-key": "^3.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/npm/node_modules/@gar/promisify": {
"version": "1.1.2",
"dev": true,
"inBundle": true,
"license": "MIT"
},
"node_modules/npm/node_modules/@isaacs/string-locale-compare": {
"version": "1.1.0",
"dev": true,
"inBundle": true,
"license": "ISC"
},
"node_modules/npm/node_modules/@npmcli/arborist": {
"version": "2.9.0",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"@isaacs/string-locale-compare": "^1.0.1",
"@npmcli/installed-package-contents": "^1.0.7",
"@npmcli/map-workspaces": "^1.0.2",
"@npmcli/metavuln-calculator": "^1.1.0",
"@npmcli/move-file": "^1.1.0",
"@npmcli/name-from-folder": "^1.0.1",
"@npmcli/node-gyp": "^1.0.1",
"@npmcli/package-json": "^1.0.1",
"@npmcli/run-script": "^1.8.2",
"bin-links": "^2.2.1",
"cacache": "^15.0.3",
"common-ancestor-path": "^1.0.1",
"json-parse-even-better-errors": "^2.3.1",
"json-stringify-nice": "^1.1.4",
"mkdirp": "^1.0.4",
"mkdirp-infer-owner": "^2.0.0",
"npm-install-checks": "^4.0.0",
"npm-package-arg": "^8.1.5",
"npm-pick-manifest": "^6.1.0",
"npm-registry-fetch": "^11.0.0",
"pacote": "^11.3.5",
"parse-conflict-json": "^1.1.1",
"proc-log": "^1.0.0",
"promise-all-reject-late": "^1.0.0",
"promise-call-limit": "^1.0.1",
"read-package-json-fast": "^2.0.2",
"readdir-scoped-modules": "^1.1.0",
"rimraf": "^3.0.2",
"semver": "^7.3.5",
"ssri": "^8.0.1",
"treeverse": "^1.0.4",
"walk-up-path": "^1.0.0"
},
"bin": {
"arborist": "bin/index.js"
},
"engines": {
"node": ">= 10"
}
},
"node_modules/npm/node_modules/@npmcli/ci-detect": {
"version": "1.3.0",
"dev": true,
"inBundle": true,
"license": "ISC"
},
"node_modules/npm/node_modules/@npmcli/config": {
"version": "2.3.0",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"ini": "^2.0.0",
"mkdirp-infer-owner": "^2.0.0",
"nopt": "^5.0.0",
"semver": "^7.3.4",
"walk-up-path": "^1.0.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/npm/node_modules/@npmcli/disparity-colors": {
"version": "1.0.1",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"ansi-styles": "^4.3.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/npm/node_modules/@npmcli/fs": {
"version": "1.0.0",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"@gar/promisify": "^1.0.1",
"semver": "^7.3.5"
}
},
"node_modules/npm/node_modules/@npmcli/git": {
"version": "2.1.0",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"@npmcli/promise-spawn": "^1.3.2",
"lru-cache": "^6.0.0",
"mkdirp": "^1.0.4",
"npm-pick-manifest": "^6.1.1",
"promise-inflight": "^1.0.1",
"promise-retry": "^2.0.1",
"semver": "^7.3.5",
"which": "^2.0.2"
}
},
"node_modules/npm/node_modules/@npmcli/installed-package-contents": {
"version": "1.0.7",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"npm-bundled": "^1.1.1",
"npm-normalize-package-bin": "^1.0.1"
},
"bin": {
"installed-package-contents": "index.js"
},
"engines": {
"node": ">= 10"
}
},
"node_modules/npm/node_modules/@npmcli/map-workspaces": {
"version": "1.0.4",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"@npmcli/name-from-folder": "^1.0.1",
"glob": "^7.1.6",
"minimatch": "^3.0.4",
"read-package-json-fast": "^2.0.1"
},
"engines": {
"node": ">=10"
}
},
"node_modules/npm/node_modules/@npmcli/metavuln-calculator": {
"version": "1.1.1",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"cacache": "^15.0.5",
"pacote": "^11.1.11",
"semver": "^7.3.2"
}
},
"node_modules/npm/node_modules/@npmcli/move-file": {
"version": "1.1.2",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
"mkdirp": "^1.0.4",
"rimraf": "^3.0.2"
},
"engines": {
"node": ">=10"
}
},
"node_modules/npm/node_modules/@npmcli/name-from-folder": {
"version": "1.0.1",
"dev": true,
"inBundle": true,
"license": "ISC"
},
"node_modules/npm/node_modules/@npmcli/node-gyp": {
"version": "1.0.2",
"dev": true,
"inBundle": true,
"license": "ISC"
},
"node_modules/npm/node_modules/@npmcli/package-json": {
"version": "1.0.1",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"json-parse-even-better-errors": "^2.3.1"
}
},
"node_modules/npm/node_modules/@npmcli/promise-spawn": {
"version": "1.3.2",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"infer-owner": "^1.0.4"
}
},
"node_modules/npm/node_modules/@npmcli/run-script": {
"version": "1.8.6",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"@npmcli/node-gyp": "^1.0.2",
"@npmcli/promise-spawn": "^1.3.2",
"node-gyp": "^7.1.0",
"read-package-json-fast": "^2.0.1"
}
},
"node_modules/npm/node_modules/@tootallnate/once": {
"version": "1.1.2",
"dev": true,
"inBundle": true,
"license": "MIT",
"engines": {
"node": ">= 6"
}
},
"node_modules/npm/node_modules/abbrev": {
"version": "1.1.1",
"dev": true,
"inBundle": true,
"license": "ISC"
},
"node_modules/npm/node_modules/agent-base": {
"version": "6.0.2",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
"debug": "4"
},
"engines": {
"node": ">= 6.0.0"
}
},
"node_modules/npm/node_modules/agentkeepalive": {
"version": "4.1.4",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
"debug": "^4.1.0",
"depd": "^1.1.2",
"humanize-ms": "^1.2.1"
},
"engines": {
"node": ">= 8.0.0"
}
},
"node_modules/npm/node_modules/aggregate-error": {
"version": "3.1.0",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
"clean-stack": "^2.0.0",
"indent-string": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/npm/node_modules/ajv": {
"version": "6.12.6",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
"fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
"json-schema-traverse": "^0.4.1",
"uri-js": "^4.2.2"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/epoberezkin"
}
},
"node_modules/npm/node_modules/ansi-regex": {
"version": "2.1.1",
"dev": true,
"inBundle": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/npm/node_modules/ansi-styles": {
"version": "4.3.0",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/npm/node_modules/ansicolors": {
"version": "0.3.2",
"dev": true,
"inBundle": true,
"license": "MIT"
},
"node_modules/npm/node_modules/ansistyles": {
"version": "0.1.3",
"dev": true,
"inBundle": true,
"license": "MIT"
},
"node_modules/npm/node_modules/aproba": {
"version": "2.0.0",
"dev": true,
"inBundle": true,
"license": "ISC"
},
"node_modules/npm/node_modules/archy": {
"version": "1.0.0",
"dev": true,
"inBundle": true,
"license": "MIT"
},
"node_modules/npm/node_modules/are-we-there-yet": {
"version": "1.1.6",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"delegates": "^1.0.0",
"readable-stream": "^3.6.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/npm/node_modules/asap": {
"version": "2.0.6",
"dev": true,
"inBundle": true,
"license": "MIT"
},
"node_modules/npm/node_modules/asn1": {
"version": "0.2.4",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
"safer-buffer": "~2.1.0"
}
},
"node_modules/npm/node_modules/assert-plus": {
"version": "1.0.0",
"dev": true,
"inBundle": true,
"license": "MIT",
"engines": {
"node": ">=0.8"
}
},
"node_modules/npm/node_modules/asynckit": {
"version": "0.4.0",
"dev": true,
"inBundle": true,
"license": "MIT"
},
"node_modules/npm/node_modules/aws-sign2": {
"version": "0.7.0",
"dev": true,
"inBundle": true,
"license": "Apache-2.0",
"engines": {
"node": "*"
}
},
"node_modules/npm/node_modules/aws4": {
"version": "1.11.0",
"dev": true,
"inBundle": true,
"license": "MIT"
},
"node_modules/npm/node_modules/balanced-match": {
"version": "1.0.2",
"dev": true,
"inBundle": true,
"license": "MIT"
},
"node_modules/npm/node_modules/bcrypt-pbkdf": {
"version": "1.0.2",
"dev": true,
"inBundle": true,
"license": "BSD-3-Clause",
"dependencies": {
"tweetnacl": "^0.14.3"
}
},
"node_modules/npm/node_modules/bin-links": {
"version": "2.2.1",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"cmd-shim": "^4.0.1",
"mkdirp": "^1.0.3",
"npm-normalize-package-bin": "^1.0.0",
"read-cmd-shim": "^2.0.0",
"rimraf": "^3.0.0",
"write-file-atomic": "^3.0.3"
},
"engines": {
"node": ">=10"
}
},
"node_modules/npm/node_modules/binary-extensions": {
"version": "2.2.0",
"dev": true,
"inBundle": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/npm/node_modules/brace-expansion": {
"version": "1.1.11",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
}
},
"node_modules/npm/node_modules/builtins": {
"version": "1.0.3",
"dev": true,
"inBundle": true,
"license": "MIT"
},
"node_modules/npm/node_modules/cacache": {
"version": "15.3.0",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"@npmcli/fs": "^1.0.0",
"@npmcli/move-file": "^1.0.1",
"chownr": "^2.0.0",
"fs-minipass": "^2.0.0",
"glob": "^7.1.4",
"infer-owner": "^1.0.4",
"lru-cache": "^6.0.0",
"minipass": "^3.1.1",
"minipass-collect": "^1.0.2",
"minipass-flush": "^1.0.5",
"minipass-pipeline": "^1.2.2",
"mkdirp": "^1.0.3",
"p-map": "^4.0.0",
"promise-inflight": "^1.0.1",
"rimraf": "^3.0.2",
"ssri": "^8.0.1",
"tar": "^6.0.2",
"unique-filename": "^1.1.1"
},
"engines": {
"node": ">= 10"
}
},
"node_modules/npm/node_modules/caseless": {
"version": "0.12.0",
"dev": true,
"inBundle": true,
"license": "Apache-2.0"
},
"node_modules/npm/node_modules/chalk": {
"version": "4.1.2",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/npm/node_modules/chownr": {
"version": "2.0.0",
"dev": true,
"inBundle": true,
"license": "ISC",
"engines": {
"node": ">=10"
}
},
"node_modules/npm/node_modules/cidr-regex": {
"version": "3.1.1",
"dev": true,
"inBundle": true,
"license": "BSD-2-Clause",
"dependencies": {
"ip-regex": "^4.1.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/npm/node_modules/clean-stack": {
"version": "2.2.0",
"dev": true,
"inBundle": true,
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/npm/node_modules/cli-columns": {
"version": "3.1.2",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
"string-width": "^2.0.0",
"strip-ansi": "^3.0.1"
},
"engines": {
"node": ">= 4"
}
},
"node_modules/npm/node_modules/cli-table3": {
"version": "0.6.0",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
"object-assign": "^4.1.0",
"string-width": "^4.2.0"
},
"engines": {
"node": "10.* || >= 12.*"
},
"optionalDependencies": {
"colors": "^1.1.2"
}
},
"node_modules/npm/node_modules/cli-table3/node_modules/ansi-regex": {
"version": "5.0.0",
"dev": true,
"inBundle": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/npm/node_modules/cli-table3/node_modules/is-fullwidth-code-point": {
"version": "3.0.0",
"dev": true,
"inBundle": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/npm/node_modules/cli-table3/node_modules/string-width": {
"version": "4.2.2",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
"strip-ansi": "^6.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/npm/node_modules/cli-table3/node_modules/strip-ansi": {
"version": "6.0.0",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
"ansi-regex": "^5.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/npm/node_modules/clone": {
"version": "1.0.4",
"dev": true,
"inBundle": true,
"license": "MIT",
"engines": {
"node": ">=0.8"
}
},
"node_modules/npm/node_modules/cmd-shim": {
"version": "4.1.0",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"mkdirp-infer-owner": "^2.0.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/npm/node_modules/code-point-at": {
"version": "1.1.0",
"dev": true,
"inBundle": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/npm/node_modules/color-convert": {
"version": "2.0.1",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
"color-name": "~1.1.4"
},
"engines": {
"node": ">=7.0.0"
}
},
"node_modules/npm/node_modules/color-name": {
"version": "1.1.4",
"dev": true,
"inBundle": true,
"license": "MIT"
},
"node_modules/npm/node_modules/color-support": {
"version": "1.1.3",
"dev": true,
"inBundle": true,
"license": "ISC",
"bin": {
"color-support": "bin.js"
}
},
"node_modules/npm/node_modules/colors": {
"version": "1.4.0",
"dev": true,
"inBundle": true,
"license": "MIT",
"optional": true,
"engines": {
"node": ">=0.1.90"
}
},
"node_modules/npm/node_modules/columnify": {
"version": "1.5.4",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
"strip-ansi": "^3.0.0",
"wcwidth": "^1.0.0"
}
},
"node_modules/npm/node_modules/combined-stream": {
"version": "1.0.8",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
"delayed-stream": "~1.0.0"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/npm/node_modules/common-ancestor-path": {
"version": "1.0.1",
"dev": true,
"inBundle": true,
"license": "ISC"
},
"node_modules/npm/node_modules/concat-map": {
"version": "0.0.1",
"dev": true,
"inBundle": true,
"license": "MIT"
},
"node_modules/npm/node_modules/console-control-strings": {
"version": "1.1.0",
"dev": true,
"inBundle": true,
"license": "ISC"
},
"node_modules/npm/node_modules/core-util-is": {
"version": "1.0.2",
"dev": true,
"inBundle": true,
"license": "MIT"
},
"node_modules/npm/node_modules/dashdash": {
"version": "1.14.1",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
"assert-plus": "^1.0.0"
},
"engines": {
"node": ">=0.10"
}
},
"node_modules/npm/node_modules/debug": {
"version": "4.3.2",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
"ms": "2.1.2"
},
"engines": {
"node": ">=6.0"
},
"peerDependenciesMeta": {
"supports-color": {
"optional": true
}
}
},
"node_modules/npm/node_modules/debug/node_modules/ms": {
"version": "2.1.2",
"dev": true,
"inBundle": true,
"license": "MIT"
},
"node_modules/npm/node_modules/debuglog": {
"version": "1.0.1",
"dev": true,
"inBundle": true,
"license": "MIT",
"engines": {
"node": "*"
}
},
"node_modules/npm/node_modules/defaults": {
"version": "1.0.3",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
"clone": "^1.0.2"
}
},
"node_modules/npm/node_modules/delayed-stream": {
"version": "1.0.0",
"dev": true,
"inBundle": true,
"license": "MIT",
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/npm/node_modules/delegates": {
"version": "1.0.0",
"dev": true,
"inBundle": true,
"license": "MIT"
},
"node_modules/npm/node_modules/depd": {
"version": "1.1.2",
"dev": true,
"inBundle": true,
"license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/npm/node_modules/dezalgo": {
"version": "1.0.3",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"asap": "^2.0.0",
"wrappy": "1"
}
},
"node_modules/npm/node_modules/diff": {
"version": "5.0.0",
"dev": true,
"inBundle": true,
"license": "BSD-3-Clause",
"engines": {
"node": ">=0.3.1"
}
},
"node_modules/npm/node_modules/ecc-jsbn": {
"version": "0.1.2",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
"jsbn": "~0.1.0",
"safer-buffer": "^2.1.0"
}
},
"node_modules/npm/node_modules/emoji-regex": {
"version": "8.0.0",
"dev": true,
"inBundle": true,
"license": "MIT"
},
"node_modules/npm/node_modules/encoding": {
"version": "0.1.13",
"dev": true,
"inBundle": true,
"license": "MIT",
"optional": true,
"dependencies": {
"iconv-lite": "^0.6.2"
}
},
"node_modules/npm/node_modules/env-paths": {
"version": "2.2.1",
"dev": true,
"inBundle": true,
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/npm/node_modules/err-code": {
"version": "2.0.3",
"dev": true,
"inBundle": true,
"license": "MIT"
},
"node_modules/npm/node_modules/extend": {
"version": "3.0.2",
"dev": true,
"inBundle": true,
"license": "MIT"
},
"node_modules/npm/node_modules/extsprintf": {
"version": "1.3.0",
"dev": true,
"engines": [
"node >=0.6.0"
],
"inBundle": true,
"license": "MIT"
},
"node_modules/npm/node_modules/fast-deep-equal": {
"version": "3.1.3",
"dev": true,
"inBundle": true,
"license": "MIT"
},
"node_modules/npm/node_modules/fast-json-stable-stringify": {
"version": "2.1.0",
"dev": true,
"inBundle": true,
"license": "MIT"
},
"node_modules/npm/node_modules/fastest-levenshtein": {
"version": "1.0.12",
"dev": true,
"inBundle": true,
"license": "MIT"
},
"node_modules/npm/node_modules/forever-agent": {
"version": "0.6.1",
"dev": true,
"inBundle": true,
"license": "Apache-2.0",
"engines": {
"node": "*"
}
},
"node_modules/npm/node_modules/fs-minipass": {
"version": "2.1.0",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"minipass": "^3.0.0"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/npm/node_modules/fs.realpath": {
"version": "1.0.0",
"dev": true,
"inBundle": true,
"license": "ISC"
},
"node_modules/npm/node_modules/function-bind": {
"version": "1.1.1",
"dev": true,
"inBundle": true,
"license": "MIT"
},
"node_modules/npm/node_modules/gauge": {
"version": "3.0.1",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"aproba": "^1.0.3 || ^2.0.0",
"color-support": "^1.1.2",
"console-control-strings": "^1.0.0",
"has-unicode": "^2.0.1",
"object-assign": "^4.1.1",
"signal-exit": "^3.0.0",
"string-width": "^1.0.1 || ^2.0.0",
"strip-ansi": "^3.0.1 || ^4.0.0",
"wide-align": "^1.1.2"
},
"engines": {
"node": ">=10"
}
},
"node_modules/npm/node_modules/getpass": {
"version": "0.1.7",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
"assert-plus": "^1.0.0"
}
},
"node_modules/npm/node_modules/glob": {
"version": "7.2.0",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
"inherits": "2",
"minimatch": "^3.0.4",
"once": "^1.3.0",
"path-is-absolute": "^1.0.0"
},
"engines": {
"node": "*"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/npm/node_modules/graceful-fs": {
"version": "4.2.8",
"dev": true,
"inBundle": true,
"license": "ISC"
},
"node_modules/npm/node_modules/har-schema": {
"version": "2.0.0",
"dev": true,
"inBundle": true,
"license": "ISC",
"engines": {
"node": ">=4"
}
},
"node_modules/npm/node_modules/har-validator": {
"version": "5.1.5",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
"ajv": "^6.12.3",
"har-schema": "^2.0.0"
},
"engines": {
"node": ">=6"
}
},
"node_modules/npm/node_modules/has": {
"version": "1.0.3",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
"function-bind": "^1.1.1"
},
"engines": {
"node": ">= 0.4.0"
}
},
"node_modules/npm/node_modules/has-flag": {
"version": "4.0.0",
"dev": true,
"inBundle": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/npm/node_modules/has-unicode": {
"version": "2.0.1",
"dev": true,
"inBundle": true,
"license": "ISC"
},
"node_modules/npm/node_modules/hosted-git-info": {
"version": "4.0.2",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"lru-cache": "^6.0.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/npm/node_modules/http-cache-semantics": {
"version": "4.1.0",
"dev": true,
"inBundle": true,
"license": "BSD-2-Clause"
},
"node_modules/npm/node_modules/http-proxy-agent": {
"version": "4.0.1",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
"@tootallnate/once": "1",
"agent-base": "6",
"debug": "4"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/npm/node_modules/http-signature": {
"version": "1.2.0",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
"assert-plus": "^1.0.0",
"jsprim": "^1.2.2",
"sshpk": "^1.7.0"
},
"engines": {
"node": ">=0.8",
"npm": ">=1.3.7"
}
},
"node_modules/npm/node_modules/https-proxy-agent": {
"version": "5.0.0",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
"agent-base": "6",
"debug": "4"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/npm/node_modules/humanize-ms": {
"version": "1.2.1",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
"ms": "^2.0.0"
}
},
"node_modules/npm/node_modules/iconv-lite": {
"version": "0.6.3",
"dev": true,
"inBundle": true,
"license": "MIT",
"optional": true,
"dependencies": {
"safer-buffer": ">= 2.1.2 < 3.0.0"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/npm/node_modules/ignore-walk": {
"version": "3.0.4",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"minimatch": "^3.0.4"
}
},
"node_modules/npm/node_modules/imurmurhash": {
"version": "0.1.4",
"dev": true,
"inBundle": true,
"license": "MIT",
"engines": {
"node": ">=0.8.19"
}
},
"node_modules/npm/node_modules/indent-string": {
"version": "4.0.0",
"dev": true,
"inBundle": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/npm/node_modules/infer-owner": {
"version": "1.0.4",
"dev": true,
"inBundle": true,
"license": "ISC"
},
"node_modules/npm/node_modules/inflight": {
"version": "1.0.6",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"once": "^1.3.0",
"wrappy": "1"
}
},
"node_modules/npm/node_modules/inherits": {
"version": "2.0.4",
"dev": true,
"inBundle": true,
"license": "ISC"
},
"node_modules/npm/node_modules/ini": {
"version": "2.0.0",
"dev": true,
"inBundle": true,
"license": "ISC",
"engines": {
"node": ">=10"
}
},
"node_modules/npm/node_modules/init-package-json": {
"version": "2.0.5",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"npm-package-arg": "^8.1.5",
"promzard": "^0.3.0",
"read": "~1.0.1",
"read-package-json": "^4.1.1",
"semver": "^7.3.5",
"validate-npm-package-license": "^3.0.4",
"validate-npm-package-name": "^3.0.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/npm/node_modules/ip": {
"version": "1.1.5",
"dev": true,
"inBundle": true,
"license": "MIT"
},
"node_modules/npm/node_modules/ip-regex": {
"version": "4.3.0",
"dev": true,
"inBundle": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/npm/node_modules/is-cidr": {
"version": "4.0.2",
"dev": true,
"inBundle": true,
"license": "BSD-2-Clause",
"dependencies": {
"cidr-regex": "^3.1.1"
},
"engines": {
"node": ">=10"
}
},
"node_modules/npm/node_modules/is-core-module": {
"version": "2.7.0",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
"has": "^1.0.3"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/npm/node_modules/is-fullwidth-code-point": {
"version": "2.0.0",
"dev": true,
"inBundle": true,
"license": "MIT",
"engines": {
"node": ">=4"
}
},
"node_modules/npm/node_modules/is-lambda": {
"version": "1.0.1",
"dev": true,
"inBundle": true,
"license": "MIT"
},
"node_modules/npm/node_modules/is-typedarray": {
"version": "1.0.0",
"dev": true,
"inBundle": true,
"license": "MIT"
},
"node_modules/npm/node_modules/isexe": {
"version": "2.0.0",
"dev": true,
"inBundle": true,
"license": "ISC"
},
"node_modules/npm/node_modules/isstream": {
"version": "0.1.2",
"dev": true,
"inBundle": true,
"license": "MIT"
},
"node_modules/npm/node_modules/jsbn": {
"version": "0.1.1",
"dev": true,
"inBundle": true,
"license": "MIT"
},
"node_modules/npm/node_modules/json-parse-even-better-errors": {
"version": "2.3.1",
"dev": true,
"inBundle": true,
"license": "MIT"
},
"node_modules/npm/node_modules/json-schema": {
"version": "0.2.3",
"dev": true,
"inBundle": true
},
"node_modules/npm/node_modules/json-schema-traverse": {
"version": "0.4.1",
"dev": true,
"inBundle": true,
"license": "MIT"
},
"node_modules/npm/node_modules/json-stringify-nice": {
"version": "1.1.4",
"dev": true,
"inBundle": true,
"license": "ISC",
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/npm/node_modules/json-stringify-safe": {
"version": "5.0.1",
"dev": true,
"inBundle": true,
"license": "ISC"
},
"node_modules/npm/node_modules/jsonparse": {
"version": "1.3.1",
"dev": true,
"engines": [
"node >= 0.2.0"
],
"inBundle": true,
"license": "MIT"
},
"node_modules/npm/node_modules/jsprim": {
"version": "1.4.1",
"dev": true,
"engines": [
"node >=0.6.0"
],
"inBundle": true,
"license": "MIT",
"dependencies": {
"assert-plus": "1.0.0",
"extsprintf": "1.3.0",
"json-schema": "0.2.3",
"verror": "1.10.0"
}
},
"node_modules/npm/node_modules/just-diff": {
"version": "3.1.1",
"dev": true,
"inBundle": true,
"license": "MIT"
},
"node_modules/npm/node_modules/just-diff-apply": {
"version": "3.0.0",
"dev": true,
"inBundle": true,
"license": "MIT"
},
"node_modules/npm/node_modules/libnpmaccess": {
"version": "4.0.3",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"aproba": "^2.0.0",
"minipass": "^3.1.1",
"npm-package-arg": "^8.1.2",
"npm-registry-fetch": "^11.0.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/npm/node_modules/libnpmdiff": {
"version": "2.0.4",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"@npmcli/disparity-colors": "^1.0.1",
"@npmcli/installed-package-contents": "^1.0.7",
"binary-extensions": "^2.2.0",
"diff": "^5.0.0",
"minimatch": "^3.0.4",
"npm-package-arg": "^8.1.4",
"pacote": "^11.3.4",
"tar": "^6.1.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/npm/node_modules/libnpmexec": {
"version": "2.0.1",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"@npmcli/arborist": "^2.3.0",
"@npmcli/ci-detect": "^1.3.0",
"@npmcli/run-script": "^1.8.4",
"chalk": "^4.1.0",
"mkdirp-infer-owner": "^2.0.0",
"npm-package-arg": "^8.1.2",
"pacote": "^11.3.1",
"proc-log": "^1.0.0",
"read": "^1.0.7",
"read-package-json-fast": "^2.0.2",
"walk-up-path": "^1.0.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/npm/node_modules/libnpmfund": {
"version": "1.1.0",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"@npmcli/arborist": "^2.5.0"
}
},
"node_modules/npm/node_modules/libnpmhook": {
"version": "6.0.3",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"aproba": "^2.0.0",
"npm-registry-fetch": "^11.0.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/npm/node_modules/libnpmorg": {
"version": "2.0.3",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"aproba": "^2.0.0",
"npm-registry-fetch": "^11.0.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/npm/node_modules/libnpmpack": {
"version": "2.0.1",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"@npmcli/run-script": "^1.8.3",
"npm-package-arg": "^8.1.0",
"pacote": "^11.2.6"
},
"engines": {
"node": ">=10"
}
},
"node_modules/npm/node_modules/libnpmpublish": {
"version": "4.0.2",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"normalize-package-data": "^3.0.2",
"npm-package-arg": "^8.1.2",
"npm-registry-fetch": "^11.0.0",
"semver": "^7.1.3",
"ssri": "^8.0.1"
},
"engines": {
"node": ">=10"
}
},
"node_modules/npm/node_modules/libnpmsearch": {
"version": "3.1.2",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"npm-registry-fetch": "^11.0.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/npm/node_modules/libnpmteam": {
"version": "2.0.4",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"aproba": "^2.0.0",
"npm-registry-fetch": "^11.0.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/npm/node_modules/libnpmversion": {
"version": "1.2.1",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"@npmcli/git": "^2.0.7",
"@npmcli/run-script": "^1.8.4",
"json-parse-even-better-errors": "^2.3.1",
"semver": "^7.3.5",
"stringify-package": "^1.0.1"
}
},
"node_modules/npm/node_modules/lru-cache": {
"version": "6.0.0",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"yallist": "^4.0.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/npm/node_modules/make-fetch-happen": {
"version": "9.1.0",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"agentkeepalive": "^4.1.3",
"cacache": "^15.2.0",
"http-cache-semantics": "^4.1.0",
"http-proxy-agent": "^4.0.1",
"https-proxy-agent": "^5.0.0",
"is-lambda": "^1.0.1",
"lru-cache": "^6.0.0",
"minipass": "^3.1.3",
"minipass-collect": "^1.0.2",
"minipass-fetch": "^1.3.2",
"minipass-flush": "^1.0.5",
"minipass-pipeline": "^1.2.4",
"negotiator": "^0.6.2",
"promise-retry": "^2.0.1",
"socks-proxy-agent": "^6.0.0",
"ssri": "^8.0.0"
},
"engines": {
"node": ">= 10"
}
},
"node_modules/npm/node_modules/mime-db": {
"version": "1.49.0",
"dev": true,
"inBundle": true,
"license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/npm/node_modules/mime-types": {
"version": "2.1.32",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
"mime-db": "1.49.0"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/npm/node_modules/minimatch": {
"version": "3.0.4",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"brace-expansion": "^1.1.7"
},
"engines": {
"node": "*"
}
},
"node_modules/npm/node_modules/minipass": {
"version": "3.1.5",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"yallist": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/npm/node_modules/minipass-collect": {
"version": "1.0.2",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"minipass": "^3.0.0"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/npm/node_modules/minipass-fetch": {
"version": "1.4.1",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
"minipass": "^3.1.0",
"minipass-sized": "^1.0.3",
"minizlib": "^2.0.0"
},
"engines": {
"node": ">=8"
},
"optionalDependencies": {
"encoding": "^0.1.12"
}
},
"node_modules/npm/node_modules/minipass-flush": {
"version": "1.0.5",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"minipass": "^3.0.0"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/npm/node_modules/minipass-json-stream": {
"version": "1.0.1",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
"jsonparse": "^1.3.1",
"minipass": "^3.0.0"
}
},
"node_modules/npm/node_modules/minipass-pipeline": {
"version": "1.2.4",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"minipass": "^3.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/npm/node_modules/minipass-sized": {
"version": "1.0.3",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"minipass": "^3.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/npm/node_modules/minizlib": {
"version": "2.1.2",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
"minipass": "^3.0.0",
"yallist": "^4.0.0"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/npm/node_modules/mkdirp": {
"version": "1.0.4",
"dev": true,
"inBundle": true,
"license": "MIT",
"bin": {
"mkdirp": "bin/cmd.js"
},
"engines": {
"node": ">=10"
}
},
"node_modules/npm/node_modules/mkdirp-infer-owner": {
"version": "2.0.0",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"chownr": "^2.0.0",
"infer-owner": "^1.0.4",
"mkdirp": "^1.0.3"
},
"engines": {
"node": ">=10"
}
},
"node_modules/npm/node_modules/ms": {
"version": "2.1.3",
"dev": true,
"inBundle": true,
"license": "MIT"
},
"node_modules/npm/node_modules/mute-stream": {
"version": "0.0.8",
"dev": true,
"inBundle": true,
"license": "ISC"
},
"node_modules/npm/node_modules/negotiator": {
"version": "0.6.2",
"dev": true,
"inBundle": true,
"license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/npm/node_modules/node-gyp": {
"version": "7.1.2",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
"env-paths": "^2.2.0",
"glob": "^7.1.4",
"graceful-fs": "^4.2.3",
"nopt": "^5.0.0",
"npmlog": "^4.1.2",
"request": "^2.88.2",
"rimraf": "^3.0.2",
"semver": "^7.3.2",
"tar": "^6.0.2",
"which": "^2.0.2"
},
"bin": {
"node-gyp": "bin/node-gyp.js"
},
"engines": {
"node": ">= 10.12.0"
}
},
"node_modules/npm/node_modules/node-gyp/node_modules/aproba": {
"version": "1.2.0",
"dev": true,
"inBundle": true,
"license": "ISC"
},
"node_modules/npm/node_modules/node-gyp/node_modules/gauge": {
"version": "2.7.4",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"aproba": "^1.0.3",
"console-control-strings": "^1.0.0",
"has-unicode": "^2.0.0",
"object-assign": "^4.1.0",
"signal-exit": "^3.0.0",
"string-width": "^1.0.1",
"strip-ansi": "^3.0.1",
"wide-align": "^1.1.0"
}
},
"node_modules/npm/node_modules/node-gyp/node_modules/is-fullwidth-code-point": {
"version": "1.0.0",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
"number-is-nan": "^1.0.0"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/npm/node_modules/node-gyp/node_modules/npmlog": {
"version": "4.1.2",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"are-we-there-yet": "~1.1.2",
"console-control-strings": "~1.1.0",
"gauge": "~2.7.3",
"set-blocking": "~2.0.0"
}
},
"node_modules/npm/node_modules/node-gyp/node_modules/string-width": {
"version": "1.0.2",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
"code-point-at": "^1.0.0",
"is-fullwidth-code-point": "^1.0.0",
"strip-ansi": "^3.0.0"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/npm/node_modules/nopt": {
"version": "5.0.0",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"abbrev": "1"
},
"bin": {
"nopt": "bin/nopt.js"
},
"engines": {
"node": ">=6"
}
},
"node_modules/npm/node_modules/normalize-package-data": {
"version": "3.0.3",
"dev": true,
"inBundle": true,
"license": "BSD-2-Clause",
"dependencies": {
"hosted-git-info": "^4.0.1",
"is-core-module": "^2.5.0",
"semver": "^7.3.4",
"validate-npm-package-license": "^3.0.1"
},
"engines": {
"node": ">=10"
}
},
"node_modules/npm/node_modules/npm-audit-report": {
"version": "2.1.5",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"chalk": "^4.0.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/npm/node_modules/npm-bundled": {
"version": "1.1.2",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"npm-normalize-package-bin": "^1.0.1"
}
},
"node_modules/npm/node_modules/npm-install-checks": {
"version": "4.0.0",
"dev": true,
"inBundle": true,
"license": "BSD-2-Clause",
"dependencies": {
"semver": "^7.1.1"
},
"engines": {
"node": ">=10"
}
},
"node_modules/npm/node_modules/npm-normalize-package-bin": {
"version": "1.0.1",
"dev": true,
"inBundle": true,
"license": "ISC"
},
"node_modules/npm/node_modules/npm-package-arg": {
"version": "8.1.5",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"hosted-git-info": "^4.0.1",
"semver": "^7.3.4",
"validate-npm-package-name": "^3.0.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/npm/node_modules/npm-packlist": {
"version": "2.2.2",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"glob": "^7.1.6",
"ignore-walk": "^3.0.3",
"npm-bundled": "^1.1.1",
"npm-normalize-package-bin": "^1.0.1"
},
"bin": {
"npm-packlist": "bin/index.js"
},
"engines": {
"node": ">=10"
}
},
"node_modules/npm/node_modules/npm-pick-manifest": {
"version": "6.1.1",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"npm-install-checks": "^4.0.0",
"npm-normalize-package-bin": "^1.0.1",
"npm-package-arg": "^8.1.2",
"semver": "^7.3.4"
}
},
"node_modules/npm/node_modules/npm-profile": {
"version": "5.0.4",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"npm-registry-fetch": "^11.0.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/npm/node_modules/npm-registry-fetch": {
"version": "11.0.0",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"make-fetch-happen": "^9.0.1",
"minipass": "^3.1.3",
"minipass-fetch": "^1.3.0",
"minipass-json-stream": "^1.0.1",
"minizlib": "^2.0.0",
"npm-package-arg": "^8.0.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/npm/node_modules/npm-user-validate": {
"version": "1.0.1",
"dev": true,
"inBundle": true,
"license": "BSD-2-Clause"
},
"node_modules/npm/node_modules/npmlog": {
"version": "5.0.1",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"are-we-there-yet": "^2.0.0",
"console-control-strings": "^1.1.0",
"gauge": "^3.0.0",
"set-blocking": "^2.0.0"
}
},
"node_modules/npm/node_modules/npmlog/node_modules/are-we-there-yet": {
"version": "2.0.0",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"delegates": "^1.0.0",
"readable-stream": "^3.6.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/npm/node_modules/number-is-nan": {
"version": "1.0.1",
"dev": true,
"inBundle": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/npm/node_modules/oauth-sign": {
"version": "0.9.0",
"dev": true,
"inBundle": true,
"license": "Apache-2.0",
"engines": {
"node": "*"
}
},
"node_modules/npm/node_modules/object-assign": {
"version": "4.1.1",
"dev": true,
"inBundle": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/npm/node_modules/once": {
"version": "1.4.0",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"wrappy": "1"
}
},
"node_modules/npm/node_modules/opener": {
"version": "1.5.2",
"dev": true,
"inBundle": true,
"license": "(WTFPL OR MIT)",
"bin": {
"opener": "bin/opener-bin.js"
}
},
"node_modules/npm/node_modules/p-map": {
"version": "4.0.0",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
"aggregate-error": "^3.0.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/npm/node_modules/pacote": {
"version": "11.3.5",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"@npmcli/git": "^2.1.0",
"@npmcli/installed-package-contents": "^1.0.6",
"@npmcli/promise-spawn": "^1.2.0",
"@npmcli/run-script": "^1.8.2",
"cacache": "^15.0.5",
"chownr": "^2.0.0",
"fs-minipass": "^2.1.0",
"infer-owner": "^1.0.4",
"minipass": "^3.1.3",
"mkdirp": "^1.0.3",
"npm-package-arg": "^8.0.1",
"npm-packlist": "^2.1.4",
"npm-pick-manifest": "^6.0.0",
"npm-registry-fetch": "^11.0.0",
"promise-retry": "^2.0.1",
"read-package-json-fast": "^2.0.1",
"rimraf": "^3.0.2",
"ssri": "^8.0.1",
"tar": "^6.1.0"
},
"bin": {
"pacote": "lib/bin.js"
},
"engines": {
"node": ">=10"
}
},
"node_modules/npm/node_modules/parse-conflict-json": {
"version": "1.1.1",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"json-parse-even-better-errors": "^2.3.0",
"just-diff": "^3.0.1",
"just-diff-apply": "^3.0.0"
}
},
"node_modules/npm/node_modules/path-is-absolute": {
"version": "1.0.1",
"dev": true,
"inBundle": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/npm/node_modules/performance-now": {
"version": "2.1.0",
"dev": true,
"inBundle": true,
"license": "MIT"
},
"node_modules/npm/node_modules/proc-log": {
"version": "1.0.0",
"dev": true,
"inBundle": true,
"license": "ISC"
},
"node_modules/npm/node_modules/promise-all-reject-late": {
"version": "1.0.1",
"dev": true,
"inBundle": true,
"license": "ISC",
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/npm/node_modules/promise-call-limit": {
"version": "1.0.1",
"dev": true,
"inBundle": true,
"license": "ISC",
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/npm/node_modules/promise-inflight": {
"version": "1.0.1",
"dev": true,
"inBundle": true,
"license": "ISC"
},
"node_modules/npm/node_modules/promise-retry": {
"version": "2.0.1",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
"err-code": "^2.0.2",
"retry": "^0.12.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/npm/node_modules/promzard": {
"version": "0.3.0",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"read": "1"
}
},
"node_modules/npm/node_modules/psl": {
"version": "1.8.0",
"dev": true,
"inBundle": true,
"license": "MIT"
},
"node_modules/npm/node_modules/punycode": {
"version": "2.1.1",
"dev": true,
"inBundle": true,
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/npm/node_modules/qrcode-terminal": {
"version": "0.12.0",
"dev": true,
"inBundle": true,
"bin": {
"qrcode-terminal": "bin/qrcode-terminal.js"
}
},
"node_modules/npm/node_modules/qs": {
"version": "6.5.2",
"dev": true,
"inBundle": true,
"license": "BSD-3-Clause",
"engines": {
"node": ">=0.6"
}
},
"node_modules/npm/node_modules/read": {
"version": "1.0.7",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"mute-stream": "~0.0.4"
},
"engines": {
"node": ">=0.8"
}
},
"node_modules/npm/node_modules/read-cmd-shim": {
"version": "2.0.0",
"dev": true,
"inBundle": true,
"license": "ISC"
},
"node_modules/npm/node_modules/read-package-json": {
"version": "4.1.1",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"glob": "^7.1.1",
"json-parse-even-better-errors": "^2.3.0",
"normalize-package-data": "^3.0.0",
"npm-normalize-package-bin": "^1.0.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/npm/node_modules/read-package-json-fast": {
"version": "2.0.3",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"json-parse-even-better-errors": "^2.3.0",
"npm-normalize-package-bin": "^1.0.1"
},
"engines": {
"node": ">=10"
}
},
"node_modules/npm/node_modules/readable-stream": {
"version": "3.6.0",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
"inherits": "^2.0.3",
"string_decoder": "^1.1.1",
"util-deprecate": "^1.0.1"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/npm/node_modules/readdir-scoped-modules": {
"version": "1.1.0",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"debuglog": "^1.0.1",
"dezalgo": "^1.0.0",
"graceful-fs": "^4.1.2",
"once": "^1.3.0"
}
},
"node_modules/npm/node_modules/request": {
"version": "2.88.2",
"dev": true,
"inBundle": true,
"license": "Apache-2.0",
"dependencies": {
"aws-sign2": "~0.7.0",
"aws4": "^1.8.0",
"caseless": "~0.12.0",
"combined-stream": "~1.0.6",
"extend": "~3.0.2",
"forever-agent": "~0.6.1",
"form-data": "~2.3.2",
"har-validator": "~5.1.3",
"http-signature": "~1.2.0",
"is-typedarray": "~1.0.0",
"isstream": "~0.1.2",
"json-stringify-safe": "~5.0.1",
"mime-types": "~2.1.19",
"oauth-sign": "~0.9.0",
"performance-now": "^2.1.0",
"qs": "~6.5.2",
"safe-buffer": "^5.1.2",
"tough-cookie": "~2.5.0",
"tunnel-agent": "^0.6.0",
"uuid": "^3.3.2"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/npm/node_modules/request/node_modules/form-data": {
"version": "2.3.3",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.6",
"mime-types": "^2.1.12"
},
"engines": {
"node": ">= 0.12"
}
},
"node_modules/npm/node_modules/request/node_modules/tough-cookie": {
"version": "2.5.0",
"dev": true,
"inBundle": true,
"license": "BSD-3-Clause",
"dependencies": {
"psl": "^1.1.28",
"punycode": "^2.1.1"
},
"engines": {
"node": ">=0.8"
}
},
"node_modules/npm/node_modules/retry": {
"version": "0.12.0",
"dev": true,
"inBundle": true,
"license": "MIT",
"engines": {
"node": ">= 4"
}
},
"node_modules/npm/node_modules/rimraf": {
"version": "3.0.2",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"glob": "^7.1.3"
},
"bin": {
"rimraf": "bin.js"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/npm/node_modules/safe-buffer": {
"version": "5.2.1",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"inBundle": true,
"license": "MIT"
},
"node_modules/npm/node_modules/safer-buffer": {
"version": "2.1.2",
"dev": true,
"inBundle": true,
"license": "MIT"
},
"node_modules/npm/node_modules/semver": {
"version": "7.3.5",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"lru-cache": "^6.0.0"
},
"bin": {
"semver": "bin/semver.js"
},
"engines": {
"node": ">=10"
}
},
"node_modules/npm/node_modules/set-blocking": {
"version": "2.0.0",
"dev": true,
"inBundle": true,
"license": "ISC"
},
"node_modules/npm/node_modules/signal-exit": {
"version": "3.0.3",
"dev": true,
"inBundle": true,
"license": "ISC"
},
"node_modules/npm/node_modules/smart-buffer": {
"version": "4.2.0",
"dev": true,
"inBundle": true,
"license": "MIT",
"engines": {
"node": ">= 6.0.0",
"npm": ">= 3.0.0"
}
},
"node_modules/npm/node_modules/socks": {
"version": "2.6.1",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
"ip": "^1.1.5",
"smart-buffer": "^4.1.0"
},
"engines": {
"node": ">= 10.13.0",
"npm": ">= 3.0.0"
}
},
"node_modules/npm/node_modules/socks-proxy-agent": {
"version": "6.1.0",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
"agent-base": "^6.0.2",
"debug": "^4.3.1",
"socks": "^2.6.1"
},
"engines": {
"node": ">= 10"
}
},
"node_modules/npm/node_modules/spdx-correct": {
"version": "3.1.1",
"dev": true,
"inBundle": true,
"license": "Apache-2.0",
"dependencies": {
"spdx-expression-parse": "^3.0.0",
"spdx-license-ids": "^3.0.0"
}
},
"node_modules/npm/node_modules/spdx-exceptions": {
"version": "2.3.0",
"dev": true,
"inBundle": true,
"license": "CC-BY-3.0"
},
"node_modules/npm/node_modules/spdx-expression-parse": {
"version": "3.0.1",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
"spdx-exceptions": "^2.1.0",
"spdx-license-ids": "^3.0.0"
}
},
"node_modules/npm/node_modules/spdx-license-ids": {
"version": "3.0.10",
"dev": true,
"inBundle": true,
"license": "CC0-1.0"
},
"node_modules/npm/node_modules/sshpk": {
"version": "1.16.1",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
"asn1": "~0.2.3",
"assert-plus": "^1.0.0",
"bcrypt-pbkdf": "^1.0.0",
"dashdash": "^1.12.0",
"ecc-jsbn": "~0.1.1",
"getpass": "^0.1.1",
"jsbn": "~0.1.0",
"safer-buffer": "^2.0.2",
"tweetnacl": "~0.14.0"
},
"bin": {
"sshpk-conv": "bin/sshpk-conv",
"sshpk-sign": "bin/sshpk-sign",
"sshpk-verify": "bin/sshpk-verify"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/npm/node_modules/ssri": {
"version": "8.0.1",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"minipass": "^3.1.1"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/npm/node_modules/string_decoder": {
"version": "1.3.0",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
"safe-buffer": "~5.2.0"
}
},
"node_modules/npm/node_modules/string-width": {
"version": "2.1.1",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
"is-fullwidth-code-point": "^2.0.0",
"strip-ansi": "^4.0.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/npm/node_modules/string-width/node_modules/ansi-regex": {
"version": "3.0.0",
"dev": true,
"inBundle": true,
"license": "MIT",
"engines": {
"node": ">=4"
}
},
"node_modules/npm/node_modules/string-width/node_modules/strip-ansi": {
"version": "4.0.0",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
"ansi-regex": "^3.0.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/npm/node_modules/stringify-package": {
"version": "1.0.1",
"dev": true,
"inBundle": true,
"license": "ISC"
},
"node_modules/npm/node_modules/strip-ansi": {
"version": "3.0.1",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
"ansi-regex": "^2.0.0"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/npm/node_modules/supports-color": {
"version": "7.2.0",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/npm/node_modules/tar": {
"version": "6.1.11",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"chownr": "^2.0.0",
"fs-minipass": "^2.0.0",
"minipass": "^3.0.0",
"minizlib": "^2.1.1",
"mkdirp": "^1.0.3",
"yallist": "^4.0.0"
},
"engines": {
"node": ">= 10"
}
},
"node_modules/npm/node_modules/text-table": {
"version": "0.2.0",
"dev": true,
"inBundle": true,
"license": "MIT"
},
"node_modules/npm/node_modules/tiny-relative-date": {
"version": "1.3.0",
"dev": true,
"inBundle": true,
"license": "MIT"
},
"node_modules/npm/node_modules/treeverse": {
"version": "1.0.4",
"dev": true,
"inBundle": true,
"license": "ISC"
},
"node_modules/npm/node_modules/tunnel-agent": {
"version": "0.6.0",
"dev": true,
"inBundle": true,
"license": "Apache-2.0",
"dependencies": {
"safe-buffer": "^5.0.1"
},
"engines": {
"node": "*"
}
},
"node_modules/npm/node_modules/tweetnacl": {
"version": "0.14.5",
"dev": true,
"inBundle": true,
"license": "Unlicense"
},
"node_modules/npm/node_modules/typedarray-to-buffer": {
"version": "3.1.5",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
"is-typedarray": "^1.0.0"
}
},
"node_modules/npm/node_modules/unique-filename": {
"version": "1.1.1",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"unique-slug": "^2.0.0"
}
},
"node_modules/npm/node_modules/unique-slug": {
"version": "2.0.2",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"imurmurhash": "^0.1.4"
}
},
"node_modules/npm/node_modules/uri-js": {
"version": "4.4.1",
"dev": true,
"inBundle": true,
"license": "BSD-2-Clause",
"dependencies": {
"punycode": "^2.1.0"
}
},
"node_modules/npm/node_modules/util-deprecate": {
"version": "1.0.2",
"dev": true,
"inBundle": true,
"license": "MIT"
},
"node_modules/npm/node_modules/uuid": {
"version": "3.4.0",
"dev": true,
"inBundle": true,
"license": "MIT",
"bin": {
"uuid": "bin/uuid"
}
},
"node_modules/npm/node_modules/validate-npm-package-license": {
"version": "3.0.4",
"dev": true,
"inBundle": true,
"license": "Apache-2.0",
"dependencies": {
"spdx-correct": "^3.0.0",
"spdx-expression-parse": "^3.0.0"
}
},
"node_modules/npm/node_modules/validate-npm-package-name": {
"version": "3.0.0",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"builtins": "^1.0.3"
}
},
"node_modules/npm/node_modules/verror": {
"version": "1.10.0",
"dev": true,
"engines": [
"node >=0.6.0"
],
"inBundle": true,
"license": "MIT",
"dependencies": {
"assert-plus": "^1.0.0",
"core-util-is": "1.0.2",
"extsprintf": "^1.2.0"
}
},
"node_modules/npm/node_modules/walk-up-path": {
"version": "1.0.0",
"dev": true,
"inBundle": true,
"license": "ISC"
},
"node_modules/npm/node_modules/wcwidth": {
"version": "1.0.1",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
"defaults": "^1.0.3"
}
},
"node_modules/npm/node_modules/which": {
"version": "2.0.2",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"isexe": "^2.0.0"
},
"bin": {
"node-which": "bin/node-which"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/npm/node_modules/wide-align": {
"version": "1.1.3",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"string-width": "^1.0.2 || 2"
}
},
"node_modules/npm/node_modules/wrappy": {
"version": "1.0.2",
"dev": true,
"inBundle": true,
"license": "ISC"
},
"node_modules/npm/node_modules/write-file-atomic": {
"version": "3.0.3",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"imurmurhash": "^0.1.4",
"is-typedarray": "^1.0.0",
"signal-exit": "^3.0.2",
"typedarray-to-buffer": "^3.1.5"
}
},
"node_modules/npm/node_modules/yallist": {
"version": "4.0.0",
"dev": true,
"inBundle": true,
"license": "ISC"
},
"node_modules/npmlog": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
"integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
"dev": true,
"dependencies": {
"are-we-there-yet": "~1.1.2",
"console-control-strings": "~1.1.0",
"gauge": "~2.7.3",
"set-blocking": "~2.0.0"
}
},
"node_modules/number-is-nan": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
"integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/nyc": {
"version": "15.1.0",
"resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz",
"integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==",
"dev": true,
"dependencies": {
"@istanbuljs/load-nyc-config": "^1.0.0",
"@istanbuljs/schema": "^0.1.2",
"caching-transform": "^4.0.0",
"convert-source-map": "^1.7.0",
"decamelize": "^1.2.0",
"find-cache-dir": "^3.2.0",
"find-up": "^4.1.0",
"foreground-child": "^2.0.0",
"get-package-type": "^0.1.0",
"glob": "^7.1.6",
"istanbul-lib-coverage": "^3.0.0",
"istanbul-lib-hook": "^3.0.0",
"istanbul-lib-instrument": "^4.0.0",
"istanbul-lib-processinfo": "^2.0.2",
"istanbul-lib-report": "^3.0.0",
"istanbul-lib-source-maps": "^4.0.0",
"istanbul-reports": "^3.0.2",
"make-dir": "^3.0.0",
"node-preload": "^0.2.1",
"p-map": "^3.0.0",
"process-on-spawn": "^1.0.0",
"resolve-from": "^5.0.0",
"rimraf": "^3.0.0",
"signal-exit": "^3.0.2",
"spawn-wrap": "^2.0.0",
"test-exclude": "^6.0.0",
"yargs": "^15.0.2"
},
"bin": {
"nyc": "bin/nyc.js"
},
"engines": {
"node": ">=8.9"
}
},
"node_modules/nyc/node_modules/find-up": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
"dev": true,
"dependencies": {
"locate-path": "^5.0.0",
"path-exists": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/nyc/node_modules/locate-path": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
"dev": true,
"dependencies": {
"p-locate": "^4.1.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/nyc/node_modules/p-limit": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
"integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
"dev": true,
"dependencies": {
"p-try": "^2.0.0"
},
"engines": {
"node": ">=6"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/nyc/node_modules/p-locate": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
"dev": true,
"dependencies": {
"p-limit": "^2.2.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/nyc/node_modules/p-try": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
"integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
"dev": true,
"engines": {
"node": ">=6"
}
},
"node_modules/nyc/node_modules/path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/nyc/node_modules/resolve-from": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
"integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/oauth-sign": {
"version": "0.9.0",
"resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
"integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
"dev": true,
"engines": {
"node": "*"
}
},
"node_modules/object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/object-inspect": {
"version": "1.12.0",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz",
"integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==",
"dev": true,
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/object-keys": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
"integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
"dev": true,
"engines": {
"node": ">= 0.4"
}
},
"node_modules/object.assign": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
"integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
"dev": true,
"dependencies": {
"call-bind": "^1.0.0",
"define-properties": "^1.1.3",
"has-symbols": "^1.0.1",
"object-keys": "^1.1.1"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/object.values": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz",
"integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==",
"dev": true,
"dependencies": {
"call-bind": "^1.0.2",
"define-properties": "^1.1.3",
"es-abstract": "^1.19.1"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
"dev": true,
"dependencies": {
"wrappy": "1"
}
},
"node_modules/onetime": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
"integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
"dev": true,
"dependencies": {
"mimic-fn": "^2.1.0"
},
"engines": {
"node": ">=6"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/optionator": {
"version": "0.9.1",
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
"integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
"dev": true,
"dependencies": {
"deep-is": "^0.1.3",
"fast-levenshtein": "^2.0.6",
"levn": "^0.4.1",
"prelude-ls": "^1.2.1",
"type-check": "^0.4.0",
"word-wrap": "^1.2.3"
},
"engines": {
"node": ">= 0.8.0"
}
},
"node_modules/p-cancelable": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz",
"integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/p-each-series": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz",
"integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==",
"dev": true,
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/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,
"dependencies": {
"p-map": "^2.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/p-filter/node_modules/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,
"engines": {
"node": ">=6"
}
},
"node_modules/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,
"engines": {
"node": ">=8"
}
},
"node_modules/p-limit": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
"integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
"dev": true,
"dependencies": {
"p-try": "^1.0.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/p-locate": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
"integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
"dev": true,
"dependencies": {
"p-limit": "^1.1.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/p-map": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz",
"integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==",
"dev": true,
"dependencies": {
"aggregate-error": "^3.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/p-reduce": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz",
"integrity": "sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/p-retry": {
"version": "4.6.1",
"resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.1.tgz",
"integrity": "sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA==",
"dev": true,
"dependencies": {
"@types/retry": "^0.12.0",
"retry": "^0.13.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/p-retry/node_modules/retry": {
"version": "0.13.1",
"resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz",
"integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==",
"dev": true,
"engines": {
"node": ">= 4"
}
},
"node_modules/p-try": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
"integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
"dev": true,
"engines": {
"node": ">=4"
}
},
"node_modules/package-hash": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz",
"integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==",
"dev": true,
"dependencies": {
"graceful-fs": "^4.1.15",
"hasha": "^5.0.0",
"lodash.flattendeep": "^4.4.0",
"release-zalgo": "^1.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/parent-module": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
"integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
"dev": true,
"dependencies": {
"callsites": "^3.0.0"
},
"engines": {
"node": ">=6"
}
},
"node_modules/parse-json": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
"integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
"dev": true,
"dependencies": {
"error-ex": "^1.3.1",
"json-parse-better-errors": "^1.0.1"
},
"engines": {
"node": ">=4"
}
},
"node_modules/parsimmon": {
"version": "1.18.1",
"resolved": "https://registry.npmjs.org/parsimmon/-/parsimmon-1.18.1.tgz",
"integrity": "sha512-u7p959wLfGAhJpSDJVYXoyMCXWYwHia78HhRBWqk7AIbxdmlrfdp5wX0l3xv/iTSH5HvhN9K7o26hwwpgS5Nmw==",
"dev": true
},
"node_modules/path-exists": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
"integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
"dev": true,
"engines": {
"node": ">=4"
}
},
"node_modules/path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/path-key": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
"integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/path-parse": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
"dev": true
},
"node_modules/path-to-regexp": {
"version": "1.8.0",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz",
"integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==",
"dev": true,
"dependencies": {
"isarray": "0.0.1"
}
},
"node_modules/path-type": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
"integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
"dev": true,
"dependencies": {
"pify": "^3.0.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/pathval": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz",
"integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==",
"dev": true,
"engines": {
"node": "*"
}
},
"node_modules/performance-now": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
"integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
"dev": true
},
"node_modules/picocolors": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
"integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
"dev": true
},
"node_modules/picomatch": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
"dev": true,
"engines": {
"node": ">=8.6"
},
"funding": {
"url": "https://github.com/sponsors/jonschlinkert"
}
},
"node_modules/pidtree": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz",
"integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==",
"dev": true,
"bin": {
"pidtree": "bin/pidtree.js"
},
"engines": {
"node": ">=0.10"
}
},
"node_modules/pify": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
"integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
"dev": true,
"engines": {
"node": ">=4"
}
},
"node_modules/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,
"dependencies": {
"find-up": "^2.0.0",
"load-json-file": "^4.0.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/pkg-dir": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
"integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
"dev": true,
"dependencies": {
"find-up": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/pkg-dir/node_modules/find-up": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
"dev": true,
"dependencies": {
"locate-path": "^5.0.0",
"path-exists": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/pkg-dir/node_modules/locate-path": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
"dev": true,
"dependencies": {
"p-locate": "^4.1.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/pkg-dir/node_modules/p-limit": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
"integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
"dev": true,
"dependencies": {
"p-try": "^2.0.0"
},
"engines": {
"node": ">=6"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/pkg-dir/node_modules/p-locate": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
"dev": true,
"dependencies": {
"p-limit": "^2.2.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/pkg-dir/node_modules/p-try": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
"integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
"dev": true,
"engines": {
"node": ">=6"
}
},
"node_modules/pkg-dir/node_modules/path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/prelude-ls": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
"integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
"dev": true,
"engines": {
"node": ">= 0.8.0"
}
},
"node_modules/prettier": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz",
"integrity": "sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==",
"dev": true,
"bin": {
"prettier": "bin-prettier.js"
},
"engines": {
"node": ">=10.13.0"
}
},
"node_modules/process-nextick-args": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
"dev": true
},
"node_modules/process-on-spawn": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz",
"integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==",
"dev": true,
"dependencies": {
"fromentries": "^1.2.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/propagate": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/propagate/-/propagate-2.0.1.tgz",
"integrity": "sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==",
"engines": {
"node": ">= 8"
}
},
"node_modules/proxyquire": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/proxyquire/-/proxyquire-2.1.3.tgz",
"integrity": "sha512-BQWfCqYM+QINd+yawJz23tbBM40VIGXOdDw3X344KcclI/gtBbdWF6SlQ4nK/bYhF9d27KYug9WzljHC6B9Ysg==",
"dev": true,
"dependencies": {
"fill-keys": "^1.0.2",
"module-not-found-error": "^1.0.1",
"resolve": "^1.11.1"
}
},
"node_modules/psl": {
"version": "1.8.0",
"resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
"integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==",
"dev": true
},
"node_modules/pump": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
"integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
"dev": true,
"dependencies": {
"end-of-stream": "^1.1.0",
"once": "^1.3.1"
}
},
"node_modules/punycode": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
"dev": true,
"engines": {
"node": ">=6"
}
},
"node_modules/q": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
"integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
"dev": true,
"engines": {
"node": ">=0.6.0",
"teleport": ">=0.2.0"
}
},
"node_modules/qs": {
"version": "6.5.3",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
"integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==",
"dev": true,
"engines": {
"node": ">=0.6"
}
},
"node_modules/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,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
]
},
"node_modules/quick-lru": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
"integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
"dev": true,
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/ramda": {
"version": "0.27.2",
"resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.2.tgz",
"integrity": "sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA==",
"dev": true
},
"node_modules/randombytes": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
"integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
"dev": true,
"dependencies": {
"safe-buffer": "^5.1.0"
}
},
"node_modules/rc": {
"version": "1.2.8",
"resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
"integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
"dev": true,
"dependencies": {
"deep-extend": "^0.6.0",
"ini": "~1.3.0",
"minimist": "^1.2.0",
"strip-json-comments": "~2.0.1"
},
"bin": {
"rc": "cli.js"
}
},
"node_modules/read-pkg": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
"integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=",
"dev": true,
"dependencies": {
"load-json-file": "^4.0.0",
"normalize-package-data": "^2.3.2",
"path-type": "^3.0.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/read-pkg-up": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
"integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
"dev": true,
"dependencies": {
"find-up": "^4.1.0",
"read-pkg": "^5.2.0",
"type-fest": "^0.8.1"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/read-pkg-up/node_modules/find-up": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
"dev": true,
"dependencies": {
"locate-path": "^5.0.0",
"path-exists": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/read-pkg-up/node_modules/hosted-git-info": {
"version": "2.8.9",
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
"integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
"dev": true
},
"node_modules/read-pkg-up/node_modules/locate-path": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
"dev": true,
"dependencies": {
"p-locate": "^4.1.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/read-pkg-up/node_modules/normalize-package-data": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
"integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
"dev": true,
"dependencies": {
"hosted-git-info": "^2.1.4",
"resolve": "^1.10.0",
"semver": "2 || 3 || 4 || 5",
"validate-npm-package-license": "^3.0.1"
}
},
"node_modules/read-pkg-up/node_modules/p-limit": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
"integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
"dev": true,
"dependencies": {
"p-try": "^2.0.0"
},
"engines": {
"node": ">=6"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/read-pkg-up/node_modules/p-locate": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
"dev": true,
"dependencies": {
"p-limit": "^2.2.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/read-pkg-up/node_modules/p-try": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
"integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
"dev": true,
"engines": {
"node": ">=6"
}
},
"node_modules/read-pkg-up/node_modules/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,
"dependencies": {
"@babel/code-frame": "^7.0.0",
"error-ex": "^1.3.1",
"json-parse-even-better-errors": "^2.3.0",
"lines-and-columns": "^1.1.6"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/read-pkg-up/node_modules/path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/read-pkg-up/node_modules/read-pkg": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
"integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
"dev": true,
"dependencies": {
"@types/normalize-package-data": "^2.4.0",
"normalize-package-data": "^2.5.0",
"parse-json": "^5.0.0",
"type-fest": "^0.6.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/read-pkg-up/node_modules/read-pkg/node_modules/type-fest": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
"integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/read-pkg-up/node_modules/semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
"dev": true,
"bin": {
"semver": "bin/semver"
}
},
"node_modules/read-pkg-up/node_modules/type-fest": {
"version": "0.8.1",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
"integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/read-pkg/node_modules/hosted-git-info": {
"version": "2.8.9",
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
"integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
"dev": true
},
"node_modules/read-pkg/node_modules/normalize-package-data": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
"integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
"dev": true,
"dependencies": {
"hosted-git-info": "^2.1.4",
"resolve": "^1.10.0",
"semver": "2 || 3 || 4 || 5",
"validate-npm-package-license": "^3.0.1"
}
},
"node_modules/read-pkg/node_modules/semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
"dev": true,
"bin": {
"semver": "bin/semver"
}
},
"node_modules/readable-stream": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
"integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
"dev": true,
"dependencies": {
"inherits": "^2.0.3",
"string_decoder": "^1.1.1",
"util-deprecate": "^1.0.1"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/readdirp": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
"integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
"dev": true,
"dependencies": {
"picomatch": "^2.2.1"
},
"engines": {
"node": ">=8.10.0"
}
},
"node_modules/redent": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
"integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
"dev": true,
"dependencies": {
"indent-string": "^4.0.0",
"strip-indent": "^3.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/redeyed": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz",
"integrity": "sha1-iYS1gV2ZyyIEacme7v/jiRPmzAs=",
"dev": true,
"dependencies": {
"esprima": "~4.0.0"
}
},
"node_modules/regexpp": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
"integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
"dev": true,
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/mysticatea"
}
},
"node_modules/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,
"dependencies": {
"rc": "^1.2.8"
},
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/release-zalgo": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz",
"integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=",
"dev": true,
"dependencies": {
"es6-error": "^4.0.1"
},
"engines": {
"node": ">=4"
}
},
"node_modules/request": {
"version": "2.88.2",
"resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
"integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
"deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142",
"dev": true,
"dependencies": {
"aws-sign2": "~0.7.0",
"aws4": "^1.8.0",
"caseless": "~0.12.0",
"combined-stream": "~1.0.6",
"extend": "~3.0.2",
"forever-agent": "~0.6.1",
"form-data": "~2.3.2",
"har-validator": "~5.1.3",
"http-signature": "~1.2.0",
"is-typedarray": "~1.0.0",
"isstream": "~0.1.2",
"json-stringify-safe": "~5.0.1",
"mime-types": "~2.1.19",
"oauth-sign": "~0.9.0",
"performance-now": "^2.1.0",
"qs": "~6.5.2",
"safe-buffer": "^5.1.2",
"tough-cookie": "~2.5.0",
"tunnel-agent": "^0.6.0",
"uuid": "^3.3.2"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/request/node_modules/form-data": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
"integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
"dev": true,
"dependencies": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.6",
"mime-types": "^2.1.12"
},
"engines": {
"node": ">= 0.12"
}
},
"node_modules/require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
"integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/require-main-filename": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
"integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
"dev": true
},
"node_modules/resolve": {
"version": "1.22.0",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz",
"integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==",
"dev": true,
"dependencies": {
"is-core-module": "^2.8.1",
"path-parse": "^1.0.7",
"supports-preserve-symlinks-flag": "^1.0.0"
},
"bin": {
"resolve": "bin/resolve"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/resolve-alpn": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz",
"integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==",
"dev": true
},
"node_modules/resolve-from": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
"integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
"dev": true,
"engines": {
"node": ">=4"
}
},
"node_modules/responselike": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz",
"integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==",
"dev": true,
"dependencies": {
"lowercase-keys": "^2.0.0"
}
},
"node_modules/retry": {
"version": "0.12.0",
"resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
"integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=",
"dev": true,
"engines": {
"node": ">= 4"
}
},
"node_modules/reusify": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
"integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
"dev": true,
"engines": {
"iojs": ">=1.0.0",
"node": ">=0.10.0"
}
},
"node_modules/rimraf": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
"integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
"dev": true,
"dependencies": {
"glob": "^7.1.3"
},
"bin": {
"rimraf": "bin.js"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/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,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"dependencies": {
"queue-microtask": "^1.2.2"
}
},
"node_modules/safe-buffer": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
]
},
"node_modules/safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
"dev": true
},
"node_modules/semantic-release": {
"version": "18.0.1",
"resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-18.0.1.tgz",
"integrity": "sha512-xTdKCaEnCzHr+Fqyhg/5I8P9pvY9z7WHa8TFCYIwcdPbuzAtQShOTzw3VNPsqBT+Yq1kFyBQFBKBYkGOlqWmfA==",
"dev": true,
"dependencies": {
"@semantic-release/commit-analyzer": "^9.0.2",
"@semantic-release/error": "^3.0.0",
"@semantic-release/github": "^8.0.0",
"@semantic-release/npm": "^8.0.0",
"@semantic-release/release-notes-generator": "^10.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.21",
"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"
},
"bin": {
"semantic-release": "bin/semantic-release.js"
},
"engines": {
"node": ">=14.17"
}
},
"node_modules/semantic-release/node_modules/cliui": {
"version": "7.0.4",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
"integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
"dev": true,
"dependencies": {
"string-width": "^4.2.0",
"strip-ansi": "^6.0.0",
"wrap-ansi": "^7.0.0"
}
},
"node_modules/semantic-release/node_modules/get-stream": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
"integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
"dev": true,
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/semantic-release/node_modules/is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/semantic-release/node_modules/resolve-from": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
"integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/semantic-release/node_modules/semver": {
"version": "7.3.5",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
"integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
"dev": true,
"dependencies": {
"lru-cache": "^6.0.0"
},
"bin": {
"semver": "bin/semver.js"
},
"engines": {
"node": ">=10"
}
},
"node_modules/semantic-release/node_modules/string-width": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"dev": true,
"dependencies": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
"strip-ansi": "^6.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/semantic-release/node_modules/wrap-ansi": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
"dev": true,
"dependencies": {
"ansi-styles": "^4.0.0",
"string-width": "^4.1.0",
"strip-ansi": "^6.0.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
"node_modules/semantic-release/node_modules/y18n": {
"version": "5.0.8",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
"integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
"dev": true,
"engines": {
"node": ">=10"
}
},
"node_modules/semantic-release/node_modules/yargs": {
"version": "16.2.0",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
"integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
"dev": true,
"dependencies": {
"cliui": "^7.0.2",
"escalade": "^3.1.1",
"get-caller-file": "^2.0.5",
"require-directory": "^2.1.1",
"string-width": "^4.2.0",
"y18n": "^5.0.5",
"yargs-parser": "^20.2.2"
},
"engines": {
"node": ">=10"
}
},
"node_modules/semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
"dev": true,
"bin": {
"semver": "bin/semver.js"
}
},
"node_modules/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,
"dependencies": {
"semver": "^6.3.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/semver-regex": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-3.1.3.tgz",
"integrity": "sha512-Aqi54Mk9uYTjVexLnR67rTyBusmwd04cLkHy9hNvk3+G3nT2Oyg7E0l4XVbOaNwIvQ3hHeYxGcyEy+mKreyBFQ==",
"dev": true,
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/serialize-javascript": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
"integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
"dev": true,
"dependencies": {
"randombytes": "^2.1.0"
}
},
"node_modules/set-blocking": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
"integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
"dev": true
},
"node_modules/shebang-command": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
"integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
"dev": true,
"dependencies": {
"shebang-regex": "^3.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/shebang-regex": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/shell-quote": {
"version": "1.7.3",
"resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz",
"integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==",
"dev": true
},
"node_modules/side-channel": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
"integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
"dev": true,
"dependencies": {
"call-bind": "^1.0.0",
"get-intrinsic": "^1.0.2",
"object-inspect": "^1.9.0"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/signal-exit": {
"version": "3.0.6",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz",
"integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==",
"dev": true
},
"node_modules/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,
"dependencies": {
"chalk": "^2.3.2",
"figures": "^2.0.0",
"pkg-conf": "^2.1.0"
},
"engines": {
"node": ">=6"
}
},
"node_modules/signale/node_modules/ansi-styles": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"dev": true,
"dependencies": {
"color-convert": "^1.9.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/signale/node_modules/chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"dev": true,
"dependencies": {
"ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5",
"supports-color": "^5.3.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/signale/node_modules/color-convert": {
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"dev": true,
"dependencies": {
"color-name": "1.1.3"
}
},
"node_modules/signale/node_modules/color-name": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
"dev": true
},
"node_modules/signale/node_modules/escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
"dev": true,
"engines": {
"node": ">=0.8.0"
}
},
"node_modules/signale/node_modules/figures": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
"integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
"dev": true,
"dependencies": {
"escape-string-regexp": "^1.0.5"
},
"engines": {
"node": ">=4"
}
},
"node_modules/signale/node_modules/has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
"dev": true,
"engines": {
"node": ">=4"
}
},
"node_modules/signale/node_modules/supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
"dependencies": {
"has-flag": "^3.0.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/sinon": {
"version": "13.0.1",
"resolved": "https://registry.npmjs.org/sinon/-/sinon-13.0.1.tgz",
"integrity": "sha512-8yx2wIvkBjIq/MGY1D9h1LMraYW+z1X0mb648KZnKSdvLasvDu7maa0dFaNYdTDczFgbjNw2tOmWdTk9saVfwQ==",
"dev": true,
"dependencies": {
"@sinonjs/commons": "^1.8.3",
"@sinonjs/fake-timers": "^9.0.0",
"@sinonjs/samsam": "^6.1.1",
"diff": "^5.0.0",
"nise": "^5.1.1",
"supports-color": "^7.2.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/sinon"
}
},
"node_modules/sinon-chai": {
"version": "3.7.0",
"resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.7.0.tgz",
"integrity": "sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g==",
"dev": true,
"peerDependencies": {
"chai": "^4.0.0",
"sinon": ">=4.0.0"
}
},
"node_modules/slash": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
"integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/slide": {
"version": "1.1.6",
"resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz",
"integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=",
"dev": true,
"engines": {
"node": "*"
}
},
"node_modules/source-map": {
"version": "0.5.7",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
"integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/spawn-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
},
"node_modules/spawn-wrap": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz",
"integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==",
"dev": true,
"dependencies": {
"foreground-child": "^2.0.0",
"is-windows": "^1.0.2",
"make-dir": "^3.0.0",
"rimraf": "^3.0.0",
"signal-exit": "^3.0.2",
"which": "^2.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/spdx-correct": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
"integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
"dev": true,
"dependencies": {
"spdx-expression-parse": "^3.0.0",
"spdx-license-ids": "^3.0.0"
}
},
"node_modules/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
},
"node_modules/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,
"dependencies": {
"spdx-exceptions": "^2.1.0",
"spdx-license-ids": "^3.0.0"
}
},
"node_modules/spdx-license-ids": {
"version": "3.0.11",
"resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz",
"integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==",
"dev": true
},
"node_modules/split": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz",
"integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==",
"dev": true,
"dependencies": {
"through": "2"
},
"engines": {
"node": "*"
}
},
"node_modules/split2": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz",
"integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==",
"dev": true,
"dependencies": {
"readable-stream": "^3.0.0"
}
},
"node_modules/sprintf-js": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
"integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
"dev": true
},
"node_modules/sshpk": {
"version": "1.17.0",
"resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz",
"integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==",
"dev": true,
"dependencies": {
"asn1": "~0.2.3",
"assert-plus": "^1.0.0",
"bcrypt-pbkdf": "^1.0.0",
"dashdash": "^1.12.0",
"ecc-jsbn": "~0.1.1",
"getpass": "^0.1.1",
"jsbn": "~0.1.0",
"safer-buffer": "^2.0.2",
"tweetnacl": "~0.14.0"
},
"bin": {
"sshpk-conv": "bin/sshpk-conv",
"sshpk-sign": "bin/sshpk-sign",
"sshpk-verify": "bin/sshpk-verify"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/ssri": {
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz",
"integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==",
"dev": true,
"dependencies": {
"minipass": "^3.1.1"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/stream-combiner2": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz",
"integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=",
"dev": true,
"dependencies": {
"duplexer2": "~0.1.0",
"readable-stream": "^2.0.2"
}
},
"node_modules/stream-combiner2/node_modules/isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
"dev": true
},
"node_modules/stream-combiner2/node_modules/readable-stream": {
"version": "2.3.7",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
"dev": true,
"dependencies": {
"core-util-is": "~1.0.0",
"inherits": "~2.0.3",
"isarray": "~1.0.0",
"process-nextick-args": "~2.0.0",
"safe-buffer": "~5.1.1",
"string_decoder": "~1.1.1",
"util-deprecate": "~1.0.1"
}
},
"node_modules/stream-combiner2/node_modules/safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
"dev": true
},
"node_modules/stream-combiner2/node_modules/string_decoder": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
"dev": true,
"dependencies": {
"safe-buffer": "~5.1.0"
}
},
"node_modules/string_decoder": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
"integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
"dev": true,
"dependencies": {
"safe-buffer": "~5.2.0"
}
},
"node_modules/string-width": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
"integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
"dev": true,
"dependencies": {
"code-point-at": "^1.0.0",
"is-fullwidth-code-point": "^1.0.0",
"strip-ansi": "^3.0.0"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/string-width/node_modules/ansi-regex": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/string-width/node_modules/strip-ansi": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
"dev": true,
"dependencies": {
"ansi-regex": "^2.0.0"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/string.prototype.padend": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.3.tgz",
"integrity": "sha512-jNIIeokznm8SD/TZISQsZKYu7RJyheFNt84DUPrh482GC8RVp2MKqm2O5oBRdGxbDQoXrhhWtPIWQOiy20svUg==",
"dev": true,
"dependencies": {
"call-bind": "^1.0.2",
"define-properties": "^1.1.3",
"es-abstract": "^1.19.1"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/string.prototype.trimend": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz",
"integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==",
"dev": true,
"dependencies": {
"call-bind": "^1.0.2",
"define-properties": "^1.1.3"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/string.prototype.trimstart": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz",
"integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==",
"dev": true,
"dependencies": {
"call-bind": "^1.0.2",
"define-properties": "^1.1.3"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/strip-ansi": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"dev": true,
"dependencies": {
"ansi-regex": "^5.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/strip-bom": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
"integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/strip-final-newline": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
"integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
"dev": true,
"engines": {
"node": ">=6"
}
},
"node_modules/strip-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,
"dependencies": {
"min-indent": "^1.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/strip-json-comments": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
"integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/supports-hyperlinks": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz",
"integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==",
"dev": true,
"dependencies": {
"has-flag": "^4.0.0",
"supports-color": "^7.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/supports-preserve-symlinks-flag": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
"dev": true,
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/tar": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz",
"integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==",
"deprecated": "This version of tar is no longer supported, and will not receive security updates. Please upgrade asap.",
"dev": true,
"dependencies": {
"block-stream": "*",
"fstream": "^1.0.12",
"inherits": "2"
}
},
"node_modules/tar-stream": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
"integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
"dev": true,
"dependencies": {
"bl": "^4.0.3",
"end-of-stream": "^1.4.1",
"fs-constants": "^1.0.0",
"inherits": "^2.0.3",
"readable-stream": "^3.1.1"
},
"engines": {
"node": ">=6"
}
},
"node_modules/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,
"engines": {
"node": ">=8"
}
},
"node_modules/tempy": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/tempy/-/tempy-1.0.1.tgz",
"integrity": "sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==",
"dev": true,
"dependencies": {
"del": "^6.0.0",
"is-stream": "^2.0.0",
"temp-dir": "^2.0.0",
"type-fest": "^0.16.0",
"unique-string": "^2.0.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/tempy/node_modules/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,
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/test-exclude": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
"integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
"dev": true,
"dependencies": {
"@istanbuljs/schema": "^0.1.2",
"glob": "^7.1.4",
"minimatch": "^3.0.4"
},
"engines": {
"node": ">=8"
}
},
"node_modules/text-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,
"engines": {
"node": ">=0.10"
}
},
"node_modules/text-table": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
"integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
"dev": true
},
"node_modules/through": {
"version": "2.3.8",
"resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
"integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
"dev": true
},
"node_modules/through2": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz",
"integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==",
"dev": true,
"dependencies": {
"readable-stream": "3"
}
},
"node_modules/tmp": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz",
"integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==",
"dev": true,
"dependencies": {
"rimraf": "^3.0.0"
},
"engines": {
"node": ">=8.17.0"
}
},
"node_modules/to-fast-properties": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
"integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
"dev": true,
"engines": {
"node": ">=4"
}
},
"node_modules/to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
"dev": true,
"dependencies": {
"is-number": "^7.0.0"
},
"engines": {
"node": ">=8.0"
}
},
"node_modules/tough-cookie": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
"integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
"dev": true,
"dependencies": {
"psl": "^1.1.28",
"punycode": "^2.1.1"
},
"engines": {
"node": ">=0.8"
}
},
"node_modules/tr46": {
"version": "0.0.3",
"resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
"integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=",
"dev": true
},
"node_modules/traverse": {
"version": "0.6.6",
"resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz",
"integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=",
"dev": true
},
"node_modules/trim-newlines": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz",
"integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/tsconfig-paths": {
"version": "3.12.0",
"resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.12.0.tgz",
"integrity": "sha512-e5adrnOYT6zqVnWqZu7i/BQ3BnhzvGbjEjejFXO20lKIKpwTaupkCPgEfv4GZK1IBciJUEhYs3J3p75FdaTFVg==",
"dev": true,
"dependencies": {
"@types/json5": "^0.0.29",
"json5": "^1.0.1",
"minimist": "^1.2.0",
"strip-bom": "^3.0.0"
}
},
"node_modules/tsconfig-paths/node_modules/json5": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
"dev": true,
"dependencies": {
"minimist": "^1.2.0"
},
"bin": {
"json5": "lib/cli.js"
}
},
"node_modules/tsconfig-paths/node_modules/strip-bom": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
"integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
"dev": true,
"engines": {
"node": ">=4"
}
},
"node_modules/tslib": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
"dev": true
},
"node_modules/tslint": {
"version": "5.14.0",
"resolved": "https://registry.npmjs.org/tslint/-/tslint-5.14.0.tgz",
"integrity": "sha512-IUla/ieHVnB8Le7LdQFRGlVJid2T/gaJe5VkjzRVSRR6pA2ODYrnfR1hmxi+5+au9l50jBwpbBL34txgv4NnTQ==",
"dev": true,
"dependencies": {
"babel-code-frame": "^6.22.0",
"builtin-modules": "^1.1.1",
"chalk": "^2.3.0",
"commander": "^2.12.1",
"diff": "^3.2.0",
"glob": "^7.1.1",
"js-yaml": "^3.7.0",
"minimatch": "^3.0.4",
"mkdirp": "^0.5.1",
"resolve": "^1.3.2",
"semver": "^5.3.0",
"tslib": "^1.8.0",
"tsutils": "^2.29.0"
},
"bin": {
"tslint": "bin/tslint"
},
"engines": {
"node": ">=4.8.0"
},
"peerDependencies": {
"typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev"
}
},
"node_modules/tslint/node_modules/ansi-styles": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"dev": true,
"dependencies": {
"color-convert": "^1.9.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/tslint/node_modules/argparse": {
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
"integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
"dev": true,
"dependencies": {
"sprintf-js": "~1.0.2"
}
},
"node_modules/tslint/node_modules/chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"dev": true,
"dependencies": {
"ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5",
"supports-color": "^5.3.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/tslint/node_modules/color-convert": {
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"dev": true,
"dependencies": {
"color-name": "1.1.3"
}
},
"node_modules/tslint/node_modules/color-name": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
"dev": true
},
"node_modules/tslint/node_modules/diff": {
"version": "3.5.0",
"resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
"integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
"dev": true,
"engines": {
"node": ">=0.3.1"
}
},
"node_modules/tslint/node_modules/escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
"dev": true,
"engines": {
"node": ">=0.8.0"
}
},
"node_modules/tslint/node_modules/has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
"dev": true,
"engines": {
"node": ">=4"
}
},
"node_modules/tslint/node_modules/js-yaml": {
"version": "3.14.1",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
"integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
"dev": true,
"dependencies": {
"argparse": "^1.0.7",
"esprima": "^4.0.0"
},
"bin": {
"js-yaml": "bin/js-yaml.js"
}
},
"node_modules/tslint/node_modules/semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
"dev": true,
"bin": {
"semver": "bin/semver"
}
},
"node_modules/tslint/node_modules/supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
"dependencies": {
"has-flag": "^3.0.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/tsutils": {
"version": "2.29.0",
"resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz",
"integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==",
"dev": true,
"dependencies": {
"tslib": "^1.8.1"
},
"peerDependencies": {
"typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev"
}
},
"node_modules/tunnel-agent": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
"integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
"dev": true,
"dependencies": {
"safe-buffer": "^5.0.1"
},
"engines": {
"node": "*"
}
},
"node_modules/tweetnacl": {
"version": "0.14.5",
"resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
"integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
"dev": true
},
"node_modules/type-check": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
"integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
"dev": true,
"dependencies": {
"prelude-ls": "^1.2.1"
},
"engines": {
"node": ">= 0.8.0"
}
},
"node_modules/type-detect": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
"integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
"dev": true,
"engines": {
"node": ">=4"
}
},
"node_modules/type-fest": {
"version": "0.20.2",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
"integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
"dev": true,
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/typedarray": {
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
"integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
"dev": true
},
"node_modules/typedarray-to-buffer": {
"version": "3.1.5",
"resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
"integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
"dev": true,
"dependencies": {
"is-typedarray": "^1.0.0"
}
},
"node_modules/typescript": {
"version": "4.5.5",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz",
"integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==",
"dev": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
},
"engines": {
"node": ">=4.2.0"
}
},
"node_modules/uglify-js": {
"version": "3.15.0",
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.15.0.tgz",
"integrity": "sha512-x+xdeDWq7FiORDvyIJ0q/waWd4PhjBNOm5dQUOq2AKC0IEjxOS66Ha9tctiVDGcRQuh69K7fgU5oRuTK4cysSg==",
"dev": true,
"optional": true,
"bin": {
"uglifyjs": "bin/uglifyjs"
},
"engines": {
"node": ">=0.8.0"
}
},
"node_modules/unbox-primitive": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz",
"integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==",
"dev": true,
"dependencies": {
"function-bind": "^1.1.1",
"has-bigints": "^1.0.1",
"has-symbols": "^1.0.2",
"which-boxed-primitive": "^1.0.2"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/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,
"dependencies": {
"crypto-random-string": "^2.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/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
},
"node_modules/universalify": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
"integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
"dev": true,
"engines": {
"node": ">= 4.0.0"
}
},
"node_modules/uri-js": {
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
"integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
"dev": true,
"dependencies": {
"punycode": "^2.1.0"
}
},
"node_modules/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
},
"node_modules/util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
"dev": true
},
"node_modules/uuid": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
"integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
"deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.",
"dev": true,
"bin": {
"uuid": "bin/uuid"
}
},
"node_modules/v8-compile-cache": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
"integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
"dev": true
},
"node_modules/validate-npm-package-license": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
"integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
"dev": true,
"dependencies": {
"spdx-correct": "^3.0.0",
"spdx-expression-parse": "^3.0.0"
}
},
"node_modules/validate-npm-package-name": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz",
"integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=",
"dev": true,
"dependencies": {
"builtins": "^1.0.3"
}
},
"node_modules/verror": {
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
"integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
"dev": true,
"engines": [
"node >=0.6.0"
],
"dependencies": {
"assert-plus": "^1.0.0",
"core-util-is": "1.0.2",
"extsprintf": "^1.2.0"
}
},
"node_modules/webidl-conversions": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
"integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=",
"dev": true
},
"node_modules/whatwg-url": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
"integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=",
"dev": true,
"dependencies": {
"tr46": "~0.0.3",
"webidl-conversions": "^3.0.0"
}
},
"node_modules/which": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
"dev": true,
"dependencies": {
"isexe": "^2.0.0"
},
"bin": {
"node-which": "bin/node-which"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/which-boxed-primitive": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
"integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
"dev": true,
"dependencies": {
"is-bigint": "^1.0.1",
"is-boolean-object": "^1.1.0",
"is-number-object": "^1.0.4",
"is-string": "^1.0.5",
"is-symbol": "^1.0.3"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/which-module": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
"integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
"dev": true
},
"node_modules/wide-align": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
"integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==",
"dev": true,
"dependencies": {
"string-width": "^1.0.2 || 2 || 3 || 4"
}
},
"node_modules/word-wrap": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
"integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/wordwrap": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
"integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
"dev": true
},
"node_modules/workerpool": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz",
"integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==",
"dev": true
},
"node_modules/wrap-ansi": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
"integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
"dev": true,
"dependencies": {
"ansi-styles": "^4.0.0",
"string-width": "^4.1.0",
"strip-ansi": "^6.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/wrap-ansi/node_modules/string-width": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"dev": true,
"dependencies": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
"strip-ansi": "^6.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
"dev": true
},
"node_modules/write-file-atomic": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
"integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
"dev": true,
"dependencies": {
"imurmurhash": "^0.1.4",
"is-typedarray": "^1.0.0",
"signal-exit": "^3.0.2",
"typedarray-to-buffer": "^3.1.5"
}
},
"node_modules/xtend": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
"integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
"dev": true,
"engines": {
"node": ">=0.4"
}
},
"node_modules/y18n": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
"integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
"dev": true
},
"node_modules/yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
"dev": true
},
"node_modules/yaml": {
"version": "1.10.2",
"resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
"integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
"dev": true,
"engines": {
"node": ">= 6"
}
},
"node_modules/yargs": {
"version": "15.4.1",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
"integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
"dev": true,
"dependencies": {
"cliui": "^6.0.0",
"decamelize": "^1.2.0",
"find-up": "^4.1.0",
"get-caller-file": "^2.0.1",
"require-directory": "^2.1.1",
"require-main-filename": "^2.0.0",
"set-blocking": "^2.0.0",
"string-width": "^4.2.0",
"which-module": "^2.0.0",
"y18n": "^4.0.0",
"yargs-parser": "^18.1.2"
},
"engines": {
"node": ">=8"
}
},
"node_modules/yargs-parser": {
"version": "20.2.4",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz",
"integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==",
"dev": true,
"engines": {
"node": ">=10"
}
},
"node_modules/yargs-unparser": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz",
"integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==",
"dev": true,
"dependencies": {
"camelcase": "^6.0.0",
"decamelize": "^4.0.0",
"flat": "^5.0.2",
"is-plain-obj": "^2.1.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/yargs-unparser/node_modules/camelcase": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
"integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
"dev": true,
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/yargs-unparser/node_modules/decamelize": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz",
"integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
"dev": true,
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/yargs-unparser/node_modules/is-plain-obj": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
"integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/yargs/node_modules/find-up": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
"dev": true,
"dependencies": {
"locate-path": "^5.0.0",
"path-exists": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/yargs/node_modules/is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/yargs/node_modules/locate-path": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
"dev": true,
"dependencies": {
"p-locate": "^4.1.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/yargs/node_modules/p-limit": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
"integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
"dev": true,
"dependencies": {
"p-try": "^2.0.0"
},
"engines": {
"node": ">=6"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/yargs/node_modules/p-locate": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
"dev": true,
"dependencies": {
"p-limit": "^2.2.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/yargs/node_modules/p-try": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
"integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
"dev": true,
"engines": {
"node": ">=6"
}
},
"node_modules/yargs/node_modules/path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/yargs/node_modules/string-width": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"dev": true,
"dependencies": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
"strip-ansi": "^6.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/yargs/node_modules/yargs-parser": {
"version": "18.1.3",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
"integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
"dev": true,
"dependencies": {
"camelcase": "^5.0.0",
"decamelize": "^1.2.0"
},
"engines": {
"node": ">=6"
}
},
"node_modules/yocto-queue": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
"integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
"dev": true,
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
}
},
"dependencies": {
"@babel/code-frame": {
"version": "7.16.7",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz",
"integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==",
"dev": true,
"requires": {
"@babel/highlight": "^7.16.7"
}
},
"@babel/compat-data": {
"version": "7.16.8",
"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.8.tgz",
"integrity": "sha512-m7OkX0IdKLKPpBlJtF561YJal5y/jyI5fNfWbPxh2D/nbzzGI4qRyrD8xO2jB24u7l+5I2a43scCG2IrfjC50Q==",
"dev": true
},
"@babel/core": {
"version": "7.16.12",
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.12.tgz",
"integrity": "sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg==",
"dev": true,
"requires": {
"@babel/code-frame": "^7.16.7",
"@babel/generator": "^7.16.8",
"@babel/helper-compilation-targets": "^7.16.7",
"@babel/helper-module-transforms": "^7.16.7",
"@babel/helpers": "^7.16.7",
"@babel/parser": "^7.16.12",
"@babel/template": "^7.16.7",
"@babel/traverse": "^7.16.10",
"@babel/types": "^7.16.8",
"convert-source-map": "^1.7.0",
"debug": "^4.1.0",
"gensync": "^1.0.0-beta.2",
"json5": "^2.1.2",
"semver": "^6.3.0",
"source-map": "^0.5.0"
}
},
"@babel/generator": {
"version": "7.16.8",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz",
"integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==",
"dev": true,
"requires": {
"@babel/types": "^7.16.8",
"jsesc": "^2.5.1",
"source-map": "^0.5.0"
}
},
"@babel/helper-compilation-targets": {
"version": "7.16.7",
"resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz",
"integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==",
"dev": true,
"requires": {
"@babel/compat-data": "^7.16.4",
"@babel/helper-validator-option": "^7.16.7",
"browserslist": "^4.17.5",
"semver": "^6.3.0"
}
},
"@babel/helper-environment-visitor": {
"version": "7.16.7",
"resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz",
"integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==",
"dev": true,
"requires": {
"@babel/types": "^7.16.7"
}
},
"@babel/helper-function-name": {
"version": "7.16.7",
"resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz",
"integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==",
"dev": true,
"requires": {
"@babel/helper-get-function-arity": "^7.16.7",
"@babel/template": "^7.16.7",
"@babel/types": "^7.16.7"
}
},
"@babel/helper-get-function-arity": {
"version": "7.16.7",
"resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz",
"integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==",
"dev": true,
"requires": {
"@babel/types": "^7.16.7"
}
},
"@babel/helper-hoist-variables": {
"version": "7.16.7",
"resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz",
"integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==",
"dev": true,
"requires": {
"@babel/types": "^7.16.7"
}
},
"@babel/helper-module-imports": {
"version": "7.16.7",
"resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz",
"integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==",
"dev": true,
"requires": {
"@babel/types": "^7.16.7"
}
},
"@babel/helper-module-transforms": {
"version": "7.16.7",
"resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz",
"integrity": "sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==",
"dev": true,
"requires": {
"@babel/helper-environment-visitor": "^7.16.7",
"@babel/helper-module-imports": "^7.16.7",
"@babel/helper-simple-access": "^7.16.7",
"@babel/helper-split-export-declaration": "^7.16.7",
"@babel/helper-validator-identifier": "^7.16.7",
"@babel/template": "^7.16.7",
"@babel/traverse": "^7.16.7",
"@babel/types": "^7.16.7"
}
},
"@babel/helper-simple-access": {
"version": "7.16.7",
"resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz",
"integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==",
"dev": true,
"requires": {
"@babel/types": "^7.16.7"
}
},
"@babel/helper-split-export-declaration": {
"version": "7.16.7",
"resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz",
"integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==",
"dev": true,
"requires": {
"@babel/types": "^7.16.7"
}
},
"@babel/helper-validator-identifier": {
"version": "7.16.7",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz",
"integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==",
"dev": true
},
"@babel/helper-validator-option": {
"version": "7.16.7",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz",
"integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==",
"dev": true
},
"@babel/helpers": {
"version": "7.16.7",
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.7.tgz",
"integrity": "sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw==",
"dev": true,
"requires": {
"@babel/template": "^7.16.7",
"@babel/traverse": "^7.16.7",
"@babel/types": "^7.16.7"
}
},
"@babel/highlight": {
"version": "7.16.10",
"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz",
"integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==",
"dev": true,
"requires": {
"@babel/helper-validator-identifier": "^7.16.7",
"chalk": "^2.0.0",
"js-tokens": "^4.0.0"
},
"dependencies": {
"ansi-styles": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"dev": true,
"requires": {
"color-convert": "^1.9.0"
}
},
"chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"dev": true,
"requires": {
"ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5",
"supports-color": "^5.3.0"
}
},
"color-convert": {
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"dev": true,
"requires": {
"color-name": "1.1.3"
}
},
"color-name": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
"dev": true
},
"escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
"dev": true
},
"has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
"dev": true
},
"supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
"requires": {
"has-flag": "^3.0.0"
}
}
}
},
"@babel/parser": {
"version": "7.16.12",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.12.tgz",
"integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==",
"dev": true
},
"@babel/template": {
"version": "7.16.7",
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz",
"integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==",
"dev": true,
"requires": {
"@babel/code-frame": "^7.16.7",
"@babel/parser": "^7.16.7",
"@babel/types": "^7.16.7"
}
},
"@babel/traverse": {
"version": "7.16.10",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.10.tgz",
"integrity": "sha512-yzuaYXoRJBGMlBhsMJoUW7G1UmSb/eXr/JHYM/MsOJgavJibLwASijW7oXBdw3NQ6T0bW7Ty5P/VarOs9cHmqw==",
"dev": true,
"requires": {
"@babel/code-frame": "^7.16.7",
"@babel/generator": "^7.16.8",
"@babel/helper-environment-visitor": "^7.16.7",
"@babel/helper-function-name": "^7.16.7",
"@babel/helper-hoist-variables": "^7.16.7",
"@babel/helper-split-export-declaration": "^7.16.7",
"@babel/parser": "^7.16.10",
"@babel/types": "^7.16.8",
"debug": "^4.1.0",
"globals": "^11.1.0"
},
"dependencies": {
"globals": {
"version": "11.12.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
"integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
"dev": true
}
}
},
"@babel/types": {
"version": "7.16.8",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz",
"integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==",
"dev": true,
"requires": {
"@babel/helper-validator-identifier": "^7.16.7",
"to-fast-properties": "^2.0.0"
}
},
"@definitelytyped/dts-critic": {
"version": "0.0.103",
"resolved": "https://registry.npmjs.org/@definitelytyped/dts-critic/-/dts-critic-0.0.103.tgz",
"integrity": "sha512-QI0/MIf8RcZbxBJCykiq48tH+QDo722ks3I8lst6A7hVa2+7m3dx7LqCCh0Bs6h2moewgvIaX++qebokZitKfQ==",
"dev": true,
"requires": {
"@definitelytyped/header-parser": "latest",
"command-exists": "^1.2.8",
"rimraf": "^3.0.2",
"semver": "^6.2.0",
"tmp": "^0.2.1",
"yargs": "^15.3.1"
}
},
"@definitelytyped/dtslint": {
"version": "0.0.103",
"resolved": "https://registry.npmjs.org/@definitelytyped/dtslint/-/dtslint-0.0.103.tgz",
"integrity": "sha512-BjRioCLzf77VRNCgl97uirKYvhirlh4wPIL28BS+pYdy5UxFALlZBDVY91h/KXZRXySp6QsxO0XF6jbWeqhJqA==",
"dev": true,
"requires": {
"@definitelytyped/dts-critic": "^0.0.103",
"@definitelytyped/header-parser": "0.0.93",
"@definitelytyped/typescript-versions": "0.0.93",
"@definitelytyped/utils": "0.0.93",
"fs-extra": "^6.0.1",
"json-stable-stringify": "^1.0.1",
"strip-json-comments": "^2.0.1",
"tslint": "5.14.0",
"yargs": "^15.1.0"
}
},
"@definitelytyped/header-parser": {
"version": "0.0.93",
"resolved": "https://registry.npmjs.org/@definitelytyped/header-parser/-/header-parser-0.0.93.tgz",
"integrity": "sha512-ywrpndOfwQ1CLG6n9DVQYICDW1CPglb/XxzhKMOonYrw2qifuWMeLioszsQsOYpg5jnwCwa8V7moK2TfkI5ztQ==",
"dev": true,
"requires": {
"@definitelytyped/typescript-versions": "^0.0.93",
"@types/parsimmon": "^1.10.1",
"parsimmon": "^1.13.0"
}
},
"@definitelytyped/typescript-versions": {
"version": "0.0.93",
"resolved": "https://registry.npmjs.org/@definitelytyped/typescript-versions/-/typescript-versions-0.0.93.tgz",
"integrity": "sha512-ymWcBsmZykBMOXy4fF4WsBnJp7qCM3rropPXDfH5V8n2Ie2cK3Ths1kAxD1k80IWCish7EdznWPP4ZRxurycBw==",
"dev": true
},
"@definitelytyped/utils": {
"version": "0.0.93",
"resolved": "https://registry.npmjs.org/@definitelytyped/utils/-/utils-0.0.93.tgz",
"integrity": "sha512-FBZhEoSxWtUTbwfwpehTssTyzgiEraAv4PBKjRr2sVVU1H3lIFTG/DlZO2ymfs3EbPr1zS5S0yt05RQFZlFjAQ==",
"dev": true,
"requires": {
"@definitelytyped/typescript-versions": "^0.0.93",
"@qiwi/npm-registry-client": "^8.9.1",
"@types/node": "^14.14.35",
"charm": "^1.0.2",
"fs-extra": "^8.1.0",
"fstream": "^1.0.12",
"tar": "^2.2.2",
"tar-stream": "^2.1.4"
},
"dependencies": {
"fs-extra": {
"version": "8.1.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
"integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
"dev": true,
"requires": {
"graceful-fs": "^4.2.0",
"jsonfile": "^4.0.0",
"universalify": "^0.1.0"
}
}
}
},
"@eslint/eslintrc": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz",
"integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==",
"dev": true,
"requires": {
"ajv": "^6.12.4",
"debug": "^4.3.2",
"espree": "^9.2.0",
"globals": "^13.9.0",
"ignore": "^4.0.6",
"import-fresh": "^3.2.1",
"js-yaml": "^4.1.0",
"minimatch": "^3.0.4",
"strip-json-comments": "^3.1.1"
},
"dependencies": {
"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
}
}
},
"@humanwhocodes/config-array": {
"version": "0.9.3",
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.3.tgz",
"integrity": "sha512-3xSMlXHh03hCcCmFc0rbKp3Ivt2PFEJnQUJDDMTJQ2wkECZWdq4GePs2ctc5H8zV+cHPaq8k2vU8mrQjA6iHdQ==",
"dev": true,
"requires": {
"@humanwhocodes/object-schema": "^1.2.1",
"debug": "^4.1.1",
"minimatch": "^3.0.4"
}
},
"@humanwhocodes/object-schema": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
"integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
"dev": true
},
"@istanbuljs/load-nyc-config": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
"integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==",
"dev": true,
"requires": {
"camelcase": "^5.3.1",
"find-up": "^4.1.0",
"get-package-type": "^0.1.0",
"js-yaml": "^3.13.1",
"resolve-from": "^5.0.0"
},
"dependencies": {
"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"
}
},
"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"
}
},
"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"
}
},
"locate-path": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
"dev": true,
"requires": {
"p-locate": "^4.1.0"
}
},
"p-limit": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
"integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
"dev": true,
"requires": {
"p-try": "^2.0.0"
}
},
"p-locate": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
"dev": true,
"requires": {
"p-limit": "^2.2.0"
}
},
"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
},
"path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
"dev": true
},
"resolve-from": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
"integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
"dev": true
}
}
},
"@istanbuljs/schema": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
"integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
"dev": true
},
"@nodelib/fs.scandir": {
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
"integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
"dev": true,
"requires": {
"@nodelib/fs.stat": "2.0.5",
"run-parallel": "^1.1.9"
}
},
"@nodelib/fs.stat": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
"integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
"dev": true
},
"@nodelib/fs.walk": {
"version": "1.2.8",
"resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
"integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
"dev": true,
"requires": {
"@nodelib/fs.scandir": "2.1.5",
"fastq": "^1.6.0"
}
},
"@octokit/auth-token": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz",
"integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==",
"dev": true,
"requires": {
"@octokit/types": "^6.0.3"
}
},
"@octokit/core": {
"version": "3.5.1",
"resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.5.1.tgz",
"integrity": "sha512-omncwpLVxMP+GLpLPgeGJBF6IWJFjXDS5flY5VbppePYX9XehevbDykRH9PdCdvqt9TS5AOTiDide7h0qrkHjw==",
"dev": true,
"requires": {
"@octokit/auth-token": "^2.4.4",
"@octokit/graphql": "^4.5.8",
"@octokit/request": "^5.6.0",
"@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.12",
"resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz",
"integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==",
"dev": true,
"requires": {
"@octokit/types": "^6.0.3",
"is-plain-object": "^5.0.0",
"universal-user-agent": "^6.0.0"
}
},
"@octokit/graphql": {
"version": "4.8.0",
"resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz",
"integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==",
"dev": true,
"requires": {
"@octokit/request": "^5.6.0",
"@octokit/types": "^6.0.3",
"universal-user-agent": "^6.0.0"
}
},
"@octokit/openapi-types": {
"version": "11.2.0",
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-11.2.0.tgz",
"integrity": "sha512-PBsVO+15KSlGmiI8QAzaqvsNlZlrDlyAJYcrXBCvVUxCp7VnXjkwPoFHgjEJXx3WF9BAwkA6nfCUA7i9sODzKA==",
"dev": true
},
"@octokit/plugin-paginate-rest": {
"version": "2.17.0",
"resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.17.0.tgz",
"integrity": "sha512-tzMbrbnam2Mt4AhuyCHvpRkS0oZ5MvwwcQPYGtMv4tUa5kkzG58SVB0fcsLulOZQeRnOgdkZWkRUiyBlh0Bkyw==",
"dev": true,
"requires": {
"@octokit/types": "^6.34.0"
}
},
"@octokit/plugin-request-log": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz",
"integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==",
"dev": true,
"requires": {}
},
"@octokit/plugin-rest-endpoint-methods": {
"version": "5.13.0",
"resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.13.0.tgz",
"integrity": "sha512-uJjMTkN1KaOIgNtUPMtIXDOjx6dGYysdIFhgA52x4xSadQCz3b/zJexvITDVpANnfKPW/+E0xkOvLntqMYpviA==",
"dev": true,
"requires": {
"@octokit/types": "^6.34.0",
"deprecation": "^2.3.1"
}
},
"@octokit/request": {
"version": "5.6.3",
"resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz",
"integrity": "sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==",
"dev": true,
"requires": {
"@octokit/endpoint": "^6.0.1",
"@octokit/request-error": "^2.1.0",
"@octokit/types": "^6.16.1",
"is-plain-object": "^5.0.0",
"node-fetch": "^2.6.7",
"universal-user-agent": "^6.0.0"
}
},
"@octokit/request-error": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz",
"integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==",
"dev": true,
"requires": {
"@octokit/types": "^6.0.3",
"deprecation": "^2.0.0",
"once": "^1.4.0"
}
},
"@octokit/rest": {
"version": "18.12.0",
"resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.12.0.tgz",
"integrity": "sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q==",
"dev": true,
"requires": {
"@octokit/core": "^3.5.1",
"@octokit/plugin-paginate-rest": "^2.16.8",
"@octokit/plugin-request-log": "^1.0.4",
"@octokit/plugin-rest-endpoint-methods": "^5.12.0"
}
},
"@octokit/types": {
"version": "6.34.0",
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.34.0.tgz",
"integrity": "sha512-s1zLBjWhdEI2zwaoSgyOFoKSl109CUcVBCc7biPJ3aAf6LGLU6szDvi31JPU7bxfla2lqfhjbbg/5DdFNxOwHw==",
"dev": true,
"requires": {
"@octokit/openapi-types": "^11.2.0"
}
},
"@qiwi/npm-registry-client": {
"version": "8.9.1",
"resolved": "https://registry.npmjs.org/@qiwi/npm-registry-client/-/npm-registry-client-8.9.1.tgz",
"integrity": "sha512-rZF+mG+NfijR0SHphhTLHRr4aM4gtfdwoAMY6we2VGQam8vkN1cxGG1Lg/Llrj8Dd0Mu6VjdFQRyMMRZxtZR2A==",
"dev": true,
"requires": {
"concat-stream": "^2.0.0",
"graceful-fs": "^4.2.4",
"normalize-package-data": "~1.0.1 || ^2.0.0 || ^3.0.0",
"npm-package-arg": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^8.0.0",
"npmlog": "2 || ^3.1.0 || ^4.0.0",
"once": "^1.4.0",
"request": "^2.88.2",
"retry": "^0.12.0",
"safe-buffer": "^5.2.1",
"semver": "2 >=2.2.1 || 3.x || 4 || 5 || 7",
"slide": "^1.1.6",
"ssri": "^8.0.0"
},
"dependencies": {
"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"
}
}
}
},
"@semantic-release/commit-analyzer": {
"version": "9.0.2",
"resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-9.0.2.tgz",
"integrity": "sha512-E+dr6L+xIHZkX4zNMe6Rnwg4YQrWNXK+rNsvwOPpdFppvZO1olE2fIgWhv89TkQErygevbjsZFSIxp+u6w2e5g==",
"dev": true,
"requires": {
"conventional-changelog-angular": "^5.0.0",
"conventional-commits-filter": "^2.0.0",
"conventional-commits-parser": "^3.2.3",
"debug": "^4.0.0",
"import-from": "^4.0.0",
"lodash": "^4.17.4",
"micromatch": "^4.0.2"
}
},
"@semantic-release/error": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-3.0.0.tgz",
"integrity": "sha512-5hiM4Un+tpl4cKw3lV4UgzJj+SmfNIDCLLw0TepzQxz9ZGV5ixnqkzIVF+3tp0ZHgcMKE+VNGHJjEeyFG2dcSw==",
"dev": true
},
"@semantic-release/github": {
"version": "8.0.2",
"resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-8.0.2.tgz",
"integrity": "sha512-wIbfhOeuxlYzMTjtSAa2xgr54n7ZuPAS2gadyTWBpUt2PNAPgla7A6XxCXJnaKPgfVF0iFfSk3B+KlVKk6ByVg==",
"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": "^10.0.0",
"globby": "^11.0.0",
"http-proxy-agent": "^5.0.0",
"https-proxy-agent": "^5.0.0",
"issue-parser": "^6.0.0",
"lodash": "^4.17.4",
"mime": "^3.0.0",
"p-filter": "^2.0.0",
"p-retry": "^4.0.0",
"url-join": "^4.0.0"
},
"dependencies": {
"@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
},
"fs-extra": {
"version": "10.0.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz",
"integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==",
"dev": true,
"requires": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
}
},
"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"
}
},
"universalify": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
"integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
"dev": true
}
}
},
"@semantic-release/npm": {
"version": "8.0.3",
"resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-8.0.3.tgz",
"integrity": "sha512-Qbg7x/O1t3sJqsv2+U0AL4Utgi/ymlCiUdt67Ftz9HL9N8aDML4t2tE0T9MBaYdqwD976hz57DqHHXKVppUBoA==",
"dev": true,
"requires": {
"@semantic-release/error": "^3.0.0",
"aggregate-error": "^3.0.0",
"execa": "^5.0.0",
"fs-extra": "^10.0.0",
"lodash": "^4.17.15",
"nerf-dart": "^1.0.0",
"normalize-url": "^6.0.0",
"npm": "^7.0.0",
"rc": "^1.2.8",
"read-pkg": "^5.0.0",
"registry-auth-token": "^4.0.0",
"semver": "^7.1.2",
"tempy": "^1.0.0"
},
"dependencies": {
"fs-extra": {
"version": "10.0.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz",
"integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==",
"dev": true,
"requires": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
}
},
"hosted-git-info": {
"version": "2.8.9",
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
"integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
"dev": true
},
"jsonfile": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
"integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
"dev": true,
"requires": {
"graceful-fs": "^4.1.6",
"universalify": "^2.0.0"
}
},
"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"
},
"dependencies": {
"semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
"dev": true
}
}
},
"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"
}
},
"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"
}
},
"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"
}
},
"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
},
"universalify": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
"integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
"dev": true
}
}
},
"@semantic-release/release-notes-generator": {
"version": "10.0.3",
"resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-10.0.3.tgz",
"integrity": "sha512-k4x4VhIKneOWoBGHkx0qZogNjCldLPRiAjnIpMnlUh6PtaWXp/T+C9U7/TaNDDtgDa5HMbHl4WlREdxHio6/3w==",
"dev": true,
"requires": {
"conventional-changelog-angular": "^5.0.0",
"conventional-changelog-writer": "^5.0.0",
"conventional-commits-filter": "^2.0.0",
"conventional-commits-parser": "^3.2.3",
"debug": "^4.0.0",
"get-stream": "^6.0.0",
"import-from": "^4.0.0",
"into-stream": "^6.0.0",
"lodash": "^4.17.4",
"read-pkg-up": "^7.0.0"
},
"dependencies": {
"get-stream": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
"integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
"dev": true
}
}
},
"@sindresorhus/is": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.4.0.tgz",
"integrity": "sha512-QppPM/8l3Mawvh4rn9CNEYIU9bxpXUCRMaX9yUpvBk1nMKusLKpfXGDEKExKaPhLzcn3lzil7pR6rnJ11HgeRQ==",
"dev": true
},
"@sinonjs/commons": {
"version": "1.8.3",
"resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz",
"integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==",
"dev": true,
"requires": {
"type-detect": "4.0.8"
}
},
"@sinonjs/fake-timers": {
"version": "9.0.0",
"resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.0.0.tgz",
"integrity": "sha512-+shXA2X7KNP7H7qNbQTJ3SA+NQc0pZDSBrdvFSRwF8sAo/ohw+ZQFD8Moc+gnz51+1eRXtEQBpKWPiQ4jsRC/w==",
"dev": true,
"requires": {
"@sinonjs/commons": "^1.7.0"
}
},
"@sinonjs/samsam": {
"version": "6.1.1",
"resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.1.1.tgz",
"integrity": "sha512-cZ7rKJTLiE7u7Wi/v9Hc2fs3Ucc3jrWeMgPHbbTCeVAB2S0wOBbYlkJVeNSL04i7fdhT8wIbDq1zhC/PXTD2SA==",
"dev": true,
"requires": {
"@sinonjs/commons": "^1.6.0",
"lodash.get": "^4.4.2",
"type-detect": "^4.0.8"
}
},
"@sinonjs/text-encoding": {
"version": "0.7.1",
"resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz",
"integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==",
"dev": true
},
"@szmarczak/http-timer": {
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz",
"integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==",
"dev": true,
"requires": {
"defer-to-connect": "^2.0.0"
}
},
"@tootallnate/once": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz",
"integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==",
"dev": true
},
"@types/cacheable-request": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz",
"integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==",
"dev": true,
"requires": {
"@types/http-cache-semantics": "*",
"@types/keyv": "*",
"@types/node": "*",
"@types/responselike": "*"
}
},
"@types/http-cache-semantics": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz",
"integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==",
"dev": true
},
"@types/json5": {
"version": "0.0.29",
"resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
"integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=",
"dev": true
},
"@types/keyv": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.3.tgz",
"integrity": "sha512-FXCJgyyN3ivVgRoml4h94G/p3kY+u/B86La+QptcqJaWtBWtmc6TtkNfS40n9bIvyLteHh7zXOtgbobORKPbDg==",
"dev": true,
"requires": {
"@types/node": "*"
}
},
"@types/minimist": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz",
"integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==",
"dev": true
},
"@types/node": {
"version": "14.18.10",
"resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.10.tgz",
"integrity": "sha512-6iihJ/Pp5fsFJ/aEDGyvT4pHGmCpq7ToQ/yf4bl5SbVAvwpspYJ+v3jO7n8UyjhQVHTy+KNszOozDdv+O6sovQ==",
"dev": true
},
"@types/normalize-package-data": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz",
"integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==",
"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/parsimmon": {
"version": "1.10.6",
"resolved": "https://registry.npmjs.org/@types/parsimmon/-/parsimmon-1.10.6.tgz",
"integrity": "sha512-FwAQwMRbkhx0J6YELkwIpciVzCcgEqXEbIrIn3a2P5d3kGEHQ3wVhlN3YdVepYP+bZzCYO6OjmD4o9TGOZ40rA==",
"dev": true
},
"@types/responselike": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz",
"integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==",
"dev": true,
"requires": {
"@types/node": "*"
}
},
"@types/retry": {
"version": "0.12.1",
"resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz",
"integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==",
"dev": true
},
"@ungap/promise-all-settled": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz",
"integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==",
"dev": true
},
"acorn": {
"version": "8.7.0",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz",
"integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==",
"dev": true
},
"acorn-jsx": {
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
"integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
"dev": true,
"requires": {}
},
"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.2",
"resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
"integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
"dev": true,
"requires": {
"type-fest": "^0.21.3"
},
"dependencies": {
"type-fest": {
"version": "0.21.3",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
"integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
"dev": true
}
}
},
"ansi-regex": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"dev": true
},
"ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"requires": {
"color-convert": "^2.0.1"
}
},
"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.2",
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
"integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
"dev": true,
"requires": {
"normalize-path": "^3.0.0",
"picomatch": "^2.0.4"
}
},
"append-transform": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz",
"integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==",
"dev": true,
"requires": {
"default-require-extensions": "^3.0.0"
}
},
"aproba": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
"integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
"dev": true
},
"archy": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz",
"integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=",
"dev": true
},
"are-we-there-yet": {
"version": "1.1.7",
"resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz",
"integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==",
"dev": true,
"requires": {
"delegates": "^1.0.0",
"readable-stream": "^2.0.6"
},
"dependencies": {
"isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
"dev": true
},
"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"
}
}
}
},
"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
},
"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-includes": {
"version": "3.1.4",
"resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz",
"integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==",
"dev": true,
"requires": {
"call-bind": "^1.0.2",
"define-properties": "^1.1.3",
"es-abstract": "^1.19.1",
"get-intrinsic": "^1.1.1",
"is-string": "^1.0.7"
}
},
"array-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
},
"array.prototype.flat": {
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz",
"integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==",
"dev": true,
"requires": {
"call-bind": "^1.0.2",
"define-properties": "^1.1.3",
"es-abstract": "^1.19.0"
}
},
"arrify": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
"integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
"dev": true
},
"asn1": {
"version": "0.2.6",
"resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
"integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
"dev": true,
"requires": {
"safer-buffer": "~2.1.0"
}
},
"assert-plus": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
"integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
"dev": true
},
"assert-rejects": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/assert-rejects/-/assert-rejects-1.0.0.tgz",
"integrity": "sha512-xSmDqs5YxfrHUQBhVfrP/5+UoEvMBTY2+oRDoLfY9zsTA1hnW0KiKYcXKyeVWSgb0UpsQ4gyeBuKlXKzKUobZA==",
"dev": true,
"requires": {
"is-regexp": "^1.0.0"
}
},
"assertion-error": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
"integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
"dev": true
},
"asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
"dev": true
},
"aws-sign2": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
"integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
"dev": true
},
"aws4": {
"version": "1.11.0",
"resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz",
"integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==",
"dev": true
},
"babel-code-frame": {
"version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
"integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
"dev": true,
"requires": {
"chalk": "^1.1.3",
"esutils": "^2.0.2",
"js-tokens": "^3.0.2"
},
"dependencies": {
"ansi-regex": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
"dev": true
},
"ansi-styles": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
"integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
"dev": true
},
"chalk": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
"integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
"dev": true,
"requires": {
"ansi-styles": "^2.2.1",
"escape-string-regexp": "^1.0.2",
"has-ansi": "^2.0.0",
"strip-ansi": "^3.0.0",
"supports-color": "^2.0.0"
}
},
"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
},
"js-tokens": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
"integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
"dev": true
},
"strip-ansi": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
"dev": true,
"requires": {
"ansi-regex": "^2.0.0"
}
},
"supports-color": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
"integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
"dev": true
}
}
},
"balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
"dev": true
},
"base64-js": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
"integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
"dev": true
},
"bcrypt-pbkdf": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
"integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
"dev": true,
"requires": {
"tweetnacl": "^0.14.3"
}
},
"before-after-hook": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.2.tgz",
"integrity": "sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ==",
"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
},
"bl": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
"integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
"dev": true,
"requires": {
"buffer": "^5.5.0",
"inherits": "^2.0.4",
"readable-stream": "^3.4.0"
}
},
"block-stream": {
"version": "0.0.9",
"resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz",
"integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=",
"dev": true,
"requires": {
"inherits": "~2.0.0"
}
},
"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.19.1",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz",
"integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==",
"dev": true,
"requires": {
"caniuse-lite": "^1.0.30001286",
"electron-to-chromium": "^1.4.17",
"escalade": "^3.1.1",
"node-releases": "^2.0.1",
"picocolors": "^1.0.0"
}
},
"buffer": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
"integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
"dev": true,
"requires": {
"base64-js": "^1.3.1",
"ieee754": "^1.1.13"
}
},
"buffer-from": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
"dev": true
},
"builtin-modules": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
"integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
"dev": true
},
"builtins": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz",
"integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=",
"dev": true
},
"cacheable-lookup": {
"version": "5.0.4",
"resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz",
"integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==",
"dev": true
},
"cacheable-request": {
"version": "7.0.2",
"resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz",
"integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==",
"dev": true,
"requires": {
"clone-response": "^1.0.2",
"get-stream": "^5.1.0",
"http-cache-semantics": "^4.0.0",
"keyv": "^4.0.0",
"lowercase-keys": "^2.0.0",
"normalize-url": "^6.0.1",
"responselike": "^2.0.0"
}
},
"caching-transform": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz",
"integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==",
"dev": true,
"requires": {
"hasha": "^5.0.0",
"make-dir": "^3.0.0",
"package-hash": "^4.0.0",
"write-file-atomic": "^3.0.0"
}
},
"call-bind": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
"integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
"dev": true,
"requires": {
"function-bind": "^1.1.1",
"get-intrinsic": "^1.0.2"
}
},
"callsites": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
"integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
"dev": true
},
"camelcase": {
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
"integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
"dev": true
},
"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"
},
"dependencies": {
"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
}
}
},
"caniuse-lite": {
"version": "1.0.30001305",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001305.tgz",
"integrity": "sha512-p7d9YQMji8haf0f+5rbcv9WlQ+N5jMPfRAnUmZRlNxsNeBO3Yr7RYG6M2uTY1h9tCVdlkJg6YNNc4kiAiBLdWA==",
"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"
}
},
"caseless": {
"version": "0.12.0",
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
"integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
"dev": true
},
"chai": {
"version": "4.3.6",
"resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz",
"integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==",
"dev": true,
"requires": {
"assertion-error": "^1.1.0",
"check-error": "^1.0.2",
"deep-eql": "^3.0.1",
"get-func-name": "^2.0.0",
"loupe": "^2.3.1",
"pathval": "^1.1.1",
"type-detect": "^4.0.5"
}
},
"chalk": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"dev": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
}
},
"charm": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/charm/-/charm-1.0.2.tgz",
"integrity": "sha1-it02cVOm2aWBMxBSxAkJkdqZXjU=",
"dev": true,
"requires": {
"inherits": "^2.0.1"
}
},
"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.3",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
"integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
"dev": true,
"requires": {
"anymatch": "~3.1.2",
"braces": "~3.0.2",
"fsevents": "~2.3.2",
"glob-parent": "~5.1.2",
"is-binary-path": "~2.1.0",
"is-glob": "~4.0.1",
"normalize-path": "~3.0.0",
"readdirp": "~3.6.0"
},
"dependencies": {
"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"
}
}
}
},
"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-table3": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.1.tgz",
"integrity": "sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA==",
"dev": true,
"requires": {
"colors": "1.4.0",
"string-width": "^4.2.0"
},
"dependencies": {
"is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
"dev": true
},
"string-width": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"dev": true,
"requires": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
"strip-ansi": "^6.0.1"
}
}
}
},
"cliui": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
"integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
"dev": true,
"requires": {
"string-width": "^4.2.0",
"strip-ansi": "^6.0.0",
"wrap-ansi": "^6.2.0"
},
"dependencies": {
"is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
"dev": true
},
"string-width": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"dev": true,
"requires": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
"strip-ansi": "^6.0.1"
}
}
}
},
"clone-response": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
"integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
"dev": true,
"requires": {
"mimic-response": "^1.0.0"
}
},
"code-point-at": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
"integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
"dev": true
},
"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
},
"colors": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
"integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==",
"dev": true,
"optional": true
},
"combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"dev": true,
"requires": {
"delayed-stream": "~1.0.0"
}
},
"command-exists": {
"version": "1.2.9",
"resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz",
"integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==",
"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
},
"concat-stream": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz",
"integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==",
"dev": true,
"requires": {
"buffer-from": "^1.0.0",
"inherits": "^2.0.3",
"readable-stream": "^3.0.2",
"typedarray": "^0.0.6"
}
},
"console-control-strings": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
"integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
"dev": true
},
"conventional-changelog-angular": {
"version": "5.0.13",
"resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz",
"integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==",
"dev": true,
"requires": {
"compare-func": "^2.0.0",
"q": "^1.5.1"
}
},
"conventional-changelog-writer": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz",
"integrity": "sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==",
"dev": true,
"requires": {
"conventional-commits-filter": "^2.0.7",
"dateformat": "^3.0.0",
"handlebars": "^4.7.7",
"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"
}
},
"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.4",
"resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz",
"integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==",
"dev": true,
"requires": {
"is-text-path": "^1.0.1",
"JSONStream": "^1.0.4",
"lodash": "^4.17.15",
"meow": "^8.0.0",
"split2": "^3.0.0",
"through2": "^4.0.0"
}
},
"convert-source-map": {
"version": "1.8.0",
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz",
"integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==",
"dev": true,
"requires": {
"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.1",
"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz",
"integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==",
"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"
},
"dependencies": {
"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-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
}
}
},
"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
},
"dashdash": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
"integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
"dev": true,
"requires": {
"assert-plus": "^1.0.0"
}
},
"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.3",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz",
"integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==",
"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
}
}
},
"decompress-response": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
"integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
"dev": true,
"requires": {
"mimic-response": "^3.1.0"
},
"dependencies": {
"mimic-response": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
"integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
"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.4",
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
"integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
"dev": true
},
"default-require-extensions": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz",
"integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==",
"dev": true,
"requires": {
"strip-bom": "^4.0.0"
}
},
"defer-to-connect": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz",
"integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==",
"dev": true
},
"define-properties": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
"integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
"dev": true,
"requires": {
"object-keys": "^1.0.12"
}
},
"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"
},
"dependencies": {
"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"
}
}
}
},
"delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
"dev": true
},
"delegates": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
"integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
"dev": true
},
"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"
},
"dependencies": {
"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
}
}
},
"dirty-chai": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/dirty-chai/-/dirty-chai-2.0.1.tgz",
"integrity": "sha512-ys79pWKvDMowIDEPC6Fig8d5THiC0DJ2gmTeGzVAoEH18J8OzLud0Jh7I9IWg3NSk8x2UocznUuFmfHCXYZx9w==",
"dev": true,
"requires": {}
},
"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"
}
},
"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": {
"isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
"dev": true
},
"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"
}
}
}
},
"ecc-jsbn": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
"integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
"dev": true,
"requires": {
"jsbn": "~0.1.0",
"safer-buffer": "^2.1.0"
}
},
"electron-to-chromium": {
"version": "1.4.61",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.61.tgz",
"integrity": "sha512-kpzCOOFlx63C9qKRyIDEsKIUgzoe98ump7T4gU+/OLzj8gYkkWf2SIyBjhTSE0keAjMAp3i7C262YtkQOMYrGw==",
"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"
}
},
"env-ci": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/env-ci/-/env-ci-5.5.0.tgz",
"integrity": "sha512-o0JdWIbOLP+WJKIUt36hz1ImQQFuN92nhsfTkHHap+J8CiI8WgGpH/a9jEGHh4/TU5BUUGjlnKXNoDb57+ne+A==",
"dev": true,
"requires": {
"execa": "^5.0.0",
"fromentries": "^1.3.2",
"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"
}
},
"es-abstract": {
"version": "1.19.1",
"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz",
"integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==",
"dev": true,
"requires": {
"call-bind": "^1.0.2",
"es-to-primitive": "^1.2.1",
"function-bind": "^1.1.1",
"get-intrinsic": "^1.1.1",
"get-symbol-description": "^1.0.0",
"has": "^1.0.3",
"has-symbols": "^1.0.2",
"internal-slot": "^1.0.3",
"is-callable": "^1.2.4",
"is-negative-zero": "^2.0.1",
"is-regex": "^1.1.4",
"is-shared-array-buffer": "^1.0.1",
"is-string": "^1.0.7",
"is-weakref": "^1.0.1",
"object-inspect": "^1.11.0",
"object-keys": "^1.1.1",
"object.assign": "^4.1.2",
"string.prototype.trimend": "^1.0.4",
"string.prototype.trimstart": "^1.0.4",
"unbox-primitive": "^1.0.1"
}
},
"es-to-primitive": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
"integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
"dev": true,
"requires": {
"is-callable": "^1.1.4",
"is-date-object": "^1.0.1",
"is-symbol": "^1.0.2"
}
},
"es6-error": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz",
"integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==",
"dev": true
},
"escalade": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
"integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
"dev": true
},
"escape-string-regexp": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
"integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
"dev": true
},
"eslint": {
"version": "8.8.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.8.0.tgz",
"integrity": "sha512-H3KXAzQGBH1plhYS3okDix2ZthuYJlQQEGE5k0IKuEqUSiyu4AmxxlJ2MtTYeJ3xB4jDhcYCwGOg2TXYdnDXlQ==",
"dev": true,
"requires": {
"@eslint/eslintrc": "^1.0.5",
"@humanwhocodes/config-array": "^0.9.2",
"ajv": "^6.10.0",
"chalk": "^4.0.0",
"cross-spawn": "^7.0.2",
"debug": "^4.3.2",
"doctrine": "^3.0.0",
"escape-string-regexp": "^4.0.0",
"eslint-scope": "^7.1.0",
"eslint-utils": "^3.0.0",
"eslint-visitor-keys": "^3.2.0",
"espree": "^9.3.0",
"esquery": "^1.4.0",
"esutils": "^2.0.2",
"fast-deep-equal": "^3.1.3",
"file-entry-cache": "^6.0.1",
"functional-red-black-tree": "^1.0.1",
"glob-parent": "^6.0.1",
"globals": "^13.6.0",
"ignore": "^5.2.0",
"import-fresh": "^3.0.0",
"imurmurhash": "^0.1.4",
"is-glob": "^4.0.0",
"js-yaml": "^4.1.0",
"json-stable-stringify-without-jsonify": "^1.0.1",
"levn": "^0.4.1",
"lodash.merge": "^4.6.2",
"minimatch": "^3.0.4",
"natural-compare": "^1.4.0",
"optionator": "^0.9.1",
"regexpp": "^3.2.0",
"strip-ansi": "^6.0.1",
"strip-json-comments": "^3.1.0",
"text-table": "^0.2.0",
"v8-compile-cache": "^2.0.3"
},
"dependencies": {
"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
}
}
},
"eslint-config-prettier": {
"version": "8.3.0",
"resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz",
"integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==",
"dev": true,
"requires": {}
},
"eslint-config-standard": {
"version": "17.0.0-1",
"resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.0.0-1.tgz",
"integrity": "sha512-aqRG58dqoBNfOLN+PsitasxmW+W9Os4oQrx081B16T4E4WogsSbpUL6hnKSnyv35sSRYA2XjBtKMOrUboL6jgw==",
"dev": true,
"requires": {}
},
"eslint-import-resolver-node": {
"version": "0.3.6",
"resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz",
"integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==",
"dev": true,
"requires": {
"debug": "^3.2.7",
"resolve": "^1.20.0"
},
"dependencies": {
"debug": {
"version": "3.2.7",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
"integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
"dev": true,
"requires": {
"ms": "^2.1.1"
}
}
}
},
"eslint-module-utils": {
"version": "2.7.3",
"resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz",
"integrity": "sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==",
"dev": true,
"requires": {
"debug": "^3.2.7",
"find-up": "^2.1.0"
},
"dependencies": {
"debug": {
"version": "3.2.7",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
"integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
"dev": true,
"requires": {
"ms": "^2.1.1"
}
}
}
},
"eslint-plugin-es": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz",
"integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==",
"dev": true,
"peer": true,
"requires": {
"eslint-utils": "^2.0.0",
"regexpp": "^3.0.0"
},
"dependencies": {
"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,
"peer": true,
"requires": {
"eslint-visitor-keys": "^1.1.0"
}
},
"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,
"peer": true
}
}
},
"eslint-plugin-import": {
"version": "2.25.4",
"resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.4.tgz",
"integrity": "sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA==",
"dev": true,
"requires": {
"array-includes": "^3.1.4",
"array.prototype.flat": "^1.2.5",
"debug": "^2.6.9",
"doctrine": "^2.1.0",
"eslint-import-resolver-node": "^0.3.6",
"eslint-module-utils": "^2.7.2",
"has": "^1.0.3",
"is-core-module": "^2.8.0",
"is-glob": "^4.0.3",
"minimatch": "^3.0.4",
"object.values": "^1.1.5",
"resolve": "^1.20.0",
"tsconfig-paths": "^3.12.0"
},
"dependencies": {
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
"requires": {
"ms": "2.0.0"
}
},
"doctrine": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
"integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
"dev": true,
"requires": {
"esutils": "^2.0.2"
}
},
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
"dev": true
}
}
},
"eslint-plugin-mocha": {
"version": "10.0.3",
"resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.0.3.tgz",
"integrity": "sha512-9mM7PZGxfejpjey+MrG0Cu3Lc8MyA5E2s7eUCdHXgS4SY/H9zLuwa7wVAjnEaoDjbBilA+0bPEB+iMO7lBUPcg==",
"dev": true,
"requires": {
"eslint-utils": "^3.0.0",
"ramda": "^0.27.1"
}
},
"eslint-plugin-n": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-14.0.0.tgz",
"integrity": "sha512-mNwplPLsbaKhHyA0fa/cy8j+oF6bF6l81hzBTWa6JOvPcMNAuIogk2ih6d9tYvWYzyUG+7ZFeChqbzdFpg2QrQ==",
"dev": true,
"peer": true,
"requires": {
"eslint-plugin-es": "^4.1.0",
"eslint-utils": "^3.0.0",
"ignore": "^5.1.1",
"is-core-module": "^2.3.0",
"minimatch": "^3.0.4",
"resolve": "^1.10.1",
"semver": "^6.1.0"
}
},
"eslint-plugin-node": {
"version": "11.1.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz",
"integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==",
"dev": true,
"requires": {
"eslint-plugin-es": "^3.0.0",
"eslint-utils": "^2.0.0",
"ignore": "^5.1.1",
"minimatch": "^3.0.4",
"resolve": "^1.10.1",
"semver": "^6.1.0"
},
"dependencies": {
"eslint-plugin-es": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz",
"integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==",
"dev": true,
"requires": {
"eslint-utils": "^2.0.0",
"regexpp": "^3.0.0"
}
},
"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"
}
},
"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-plugin-promise": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.0.0.tgz",
"integrity": "sha512-7GPezalm5Bfi/E22PnQxDWH2iW9GTvAlUNTztemeHb6c1BniSyoeTrM87JkC0wYdi6aQrZX9p2qEiAno8aTcbw==",
"dev": true,
"requires": {}
},
"eslint-scope": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz",
"integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==",
"dev": true,
"requires": {
"esrecurse": "^4.3.0",
"estraverse": "^5.2.0"
}
},
"eslint-utils": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
"integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
"dev": true,
"requires": {
"eslint-visitor-keys": "^2.0.0"
},
"dependencies": {
"eslint-visitor-keys": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
"integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
"dev": true
}
}
},
"eslint-visitor-keys": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz",
"integrity": "sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ==",
"dev": true
},
"espree": {
"version": "9.3.0",
"resolved": "https://registry.npmjs.org/espree/-/espree-9.3.0.tgz",
"integrity": "sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ==",
"dev": true,
"requires": {
"acorn": "^8.7.0",
"acorn-jsx": "^5.3.1",
"eslint-visitor-keys": "^3.1.0"
}
},
"esprima": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
"integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
"dev": true
},
"esquery": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
"integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
"dev": true,
"requires": {
"estraverse": "^5.1.0"
}
},
"esrecurse": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
"integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
"dev": true,
"requires": {
"estraverse": "^5.2.0"
}
},
"estraverse": {
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
"integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
"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": "5.1.1",
"resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
"integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
"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"
},
"dependencies": {
"get-stream": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
"integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
"dev": true
}
}
},
"extend": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
"integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
"dev": true
},
"extsprintf": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
"integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
"dev": true
},
"fast-deep-equal": {
"version": "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.11",
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz",
"integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==",
"dev": true,
"requires": {
"@nodelib/fs.stat": "^2.0.2",
"@nodelib/fs.walk": "^1.2.3",
"glob-parent": "^5.1.2",
"merge2": "^1.3.0",
"micromatch": "^4.0.4"
},
"dependencies": {
"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"
}
}
}
},
"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.13.0",
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
"integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
"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"
},
"dependencies": {
"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
}
}
},
"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-keys": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/fill-keys/-/fill-keys-1.0.2.tgz",
"integrity": "sha1-mo+jb06K1jTjv2tPPIiCVRRS6yA=",
"dev": true,
"requires": {
"is-object": "~1.0.1",
"merge-descriptors": "~1.0.0"
}
},
"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.2",
"resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz",
"integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==",
"dev": true,
"requires": {
"commondir": "^1.0.1",
"make-dir": "^3.0.2",
"pkg-dir": "^4.1.0"
}
},
"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"
}
},
"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.2.5",
"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz",
"integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==",
"dev": true
},
"foreground-child": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz",
"integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==",
"dev": true,
"requires": {
"cross-spawn": "^7.0.0",
"signal-exit": "^3.0.2"
}
},
"forever-agent": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
"integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
"dev": true
},
"form-data": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
"integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
"dev": true,
"requires": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"mime-types": "^2.1.12"
}
},
"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": {
"isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
"dev": true
},
"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-constants": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
"integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
"dev": true
},
"fs-extra": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz",
"integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==",
"dev": true,
"requires": {
"graceful-fs": "^4.1.2",
"jsonfile": "^4.0.0",
"universalify": "^0.1.0"
}
},
"fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
"dev": true
},
"fsevents": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
"integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
"dev": true,
"optional": true
},
"fstream": {
"version": "1.0.12",
"resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz",
"integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==",
"dev": true,
"requires": {
"graceful-fs": "^4.1.2",
"inherits": "~2.0.0",
"mkdirp": ">=0.5 0",
"rimraf": "2"
},
"dependencies": {
"rimraf": {
"version": "2.7.1",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
"integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
"dev": true,
"requires": {
"glob": "^7.1.3"
}
}
}
},
"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
},
"gauge": {
"version": "2.7.4",
"resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
"integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
"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": {
"ansi-regex": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
"dev": true
},
"strip-ansi": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
"dev": true,
"requires": {
"ansi-regex": "^2.0.0"
}
}
}
},
"gensync": {
"version": "1.0.0-beta.2",
"resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
"integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
"dev": true
},
"get-caller-file": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
"dev": true
},
"get-func-name": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz",
"integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=",
"dev": true
},
"get-intrinsic": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
"integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
"dev": true,
"requires": {
"function-bind": "^1.1.1",
"has": "^1.0.3",
"has-symbols": "^1.0.1"
}
},
"get-package-type": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
"integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
"dev": true
},
"get-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"
}
},
"get-symbol-description": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
"integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
"dev": true,
"requires": {
"call-bind": "^1.0.2",
"get-intrinsic": "^1.1.1"
}
},
"getpass": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
"integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
"dev": true,
"requires": {
"assert-plus": "^1.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": {
"isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
"dev": true
},
"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.2.0",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
"integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
"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": "6.0.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
"integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
"dev": true,
"requires": {
"is-glob": "^4.0.3"
}
},
"globals": {
"version": "13.12.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz",
"integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==",
"dev": true,
"requires": {
"type-fest": "^0.20.2"
}
},
"globby": {
"version": "11.1.0",
"resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
"integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
"dev": true,
"requires": {
"array-union": "^2.1.0",
"dir-glob": "^3.0.1",
"fast-glob": "^3.2.9",
"ignore": "^5.2.0",
"merge2": "^1.4.1",
"slash": "^3.0.0"
}
},
"got": {
"version": "11.8.3",
"resolved": "https://registry.npmjs.org/got/-/got-11.8.3.tgz",
"integrity": "sha512-7gtQ5KiPh1RtGS9/Jbv1ofDpBFuq42gyfEib+ejaRBJuj/3tQFeR5+gw57e4ipaU8c/rCjvX6fkQz2lyDlGAOg==",
"dev": true,
"requires": {
"@sindresorhus/is": "^4.0.0",
"@szmarczak/http-timer": "^4.0.5",
"@types/cacheable-request": "^6.0.1",
"@types/responselike": "^1.0.0",
"cacheable-lookup": "^5.0.3",
"cacheable-request": "^7.0.2",
"decompress-response": "^6.0.0",
"http2-wrapper": "^1.0.0-beta.5.2",
"lowercase-keys": "^2.0.0",
"p-cancelable": "^2.0.0",
"responselike": "^2.0.0"
}
},
"graceful-fs": {
"version": "4.2.9",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz",
"integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==",
"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"
},
"dependencies": {
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true
}
}
},
"har-schema": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
"integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
"dev": true
},
"har-validator": {
"version": "5.1.5",
"resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
"integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
"dev": true,
"requires": {
"ajv": "^6.12.3",
"har-schema": "^2.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-ansi": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
"integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
"dev": true,
"requires": {
"ansi-regex": "^2.0.0"
},
"dependencies": {
"ansi-regex": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
"dev": true
}
}
},
"has-bigints": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz",
"integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==",
"dev": true
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true
},
"has-symbols": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
"integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==",
"dev": true
},
"has-tostringtag": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
"integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
"dev": true,
"requires": {
"has-symbols": "^1.0.2"
}
},
"has-unicode": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
"integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
"dev": true
},
"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.1.0",
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
"integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==",
"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-cache-semantics": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
"integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==",
"dev": true
},
"http-proxy-agent": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz",
"integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==",
"dev": true,
"requires": {
"@tootallnate/once": "2",
"agent-base": "6",
"debug": "4"
}
},
"http-signature": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
"integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
"dev": true,
"requires": {
"assert-plus": "^1.0.0",
"jsprim": "^1.2.2",
"sshpk": "^1.7.0"
}
},
"http2-wrapper": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz",
"integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==",
"dev": true,
"requires": {
"quick-lru": "^5.1.1",
"resolve-alpn": "^1.0.0"
}
},
"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": "2.1.0",
"resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
"integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
"dev": true
},
"ieee754": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
"integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
"dev": true
},
"ignore": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
"integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
"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"
}
},
"import-from": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/import-from/-/import-from-4.0.0.tgz",
"integrity": "sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==",
"dev": true
},
"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
},
"internal-slot": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz",
"integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==",
"dev": true,
"requires": {
"get-intrinsic": "^1.1.0",
"has": "^1.0.3",
"side-channel": "^1.0.4"
}
},
"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-bigint": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
"integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
"dev": true,
"requires": {
"has-bigints": "^1.0.1"
}
},
"is-binary-path": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
"integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
"dev": true,
"requires": {
"binary-extensions": "^2.0.0"
}
},
"is-boolean-object": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
"integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
"dev": true,
"requires": {
"call-bind": "^1.0.2",
"has-tostringtag": "^1.0.0"
}
},
"is-callable": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz",
"integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==",
"dev": true
},
"is-core-module": {
"version": "2.8.1",
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz",
"integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==",
"dev": true,
"requires": {
"has": "^1.0.3"
}
},
"is-date-object": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
"integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
"dev": true,
"requires": {
"has-tostringtag": "^1.0.0"
}
},
"is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
"dev": true
},
"is-fullwidth-code-point": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
"integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
"dev": true,
"requires": {
"number-is-nan": "^1.0.0"
}
},
"is-glob": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
"dev": true,
"requires": {
"is-extglob": "^2.1.1"
}
},
"is-negative-zero": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
"integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==",
"dev": true
},
"is-number": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
"dev": true
},
"is-number-object": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz",
"integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==",
"dev": true,
"requires": {
"has-tostringtag": "^1.0.0"
}
},
"is-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-object": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz",
"integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==",
"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-regex": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
"integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
"dev": true,
"requires": {
"call-bind": "^1.0.2",
"has-tostringtag": "^1.0.0"
}
},
"is-regexp": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz",
"integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=",
"dev": true
},
"is-shared-array-buffer": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz",
"integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==",
"dev": true
},
"is-stream": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
"integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
"dev": true
},
"is-string": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
"integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
"dev": true,
"requires": {
"has-tostringtag": "^1.0.0"
}
},
"is-symbol": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
"integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
"dev": true,
"requires": {
"has-symbols": "^1.0.2"
}
},
"is-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-unicode-supported": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
"integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
"dev": true
},
"is-weakref": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
"integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
"dev": true,
"requires": {
"call-bind": "^1.0.2"
}
},
"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": "0.0.1",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
"integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
"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
},
"isstream": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
"integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
"dev": true
},
"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.2.0",
"resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz",
"integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==",
"dev": true
},
"istanbul-lib-hook": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz",
"integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==",
"dev": true,
"requires": {
"append-transform": "^2.0.0"
}
},
"istanbul-lib-instrument": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz",
"integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==",
"dev": true,
"requires": {
"@babel/core": "^7.7.5",
"@istanbuljs/schema": "^0.1.2",
"istanbul-lib-coverage": "^3.0.0",
"semver": "^6.3.0"
}
},
"istanbul-lib-processinfo": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz",
"integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==",
"dev": true,
"requires": {
"archy": "^1.0.0",
"cross-spawn": "^7.0.0",
"istanbul-lib-coverage": "^3.0.0-alpha.1",
"make-dir": "^3.0.0",
"p-map": "^3.0.0",
"rimraf": "^3.0.0",
"uuid": "^3.3.3"
}
},
"istanbul-lib-report": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
"integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==",
"dev": true,
"requires": {
"istanbul-lib-coverage": "^3.0.0",
"make-dir": "^3.0.0",
"supports-color": "^7.1.0"
}
},
"istanbul-lib-source-maps": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz",
"integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==",
"dev": true,
"requires": {
"debug": "^4.1.1",
"istanbul-lib-coverage": "^3.0.0",
"source-map": "^0.6.1"
},
"dependencies": {
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true
}
}
},
"istanbul-reports": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.3.tgz",
"integrity": "sha512-x9LtDVtfm/t1GFiLl3NffC7hz+I1ragvgX1P/Lg1NlIagifZDKUkuuaAxH/qpwj2IuEfD8G2Bs/UKp+sZ/pKkg==",
"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": "4.1.0",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
"integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
"dev": true,
"requires": {
"argparse": "^2.0.1"
}
},
"jsbn": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
"integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
"dev": true
},
"jsesc": {
"version": "2.5.2",
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
"integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
"dev": true
},
"json-buffer": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
"integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
"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": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
"integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
"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": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz",
"integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=",
"dev": true,
"requires": {
"jsonify": "~0.0.0"
}
},
"json-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="
},
"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": "4.0.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
"integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
"dev": true,
"requires": {
"graceful-fs": "^4.1.6"
}
},
"jsonify": {
"version": "0.0.0",
"resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
"integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
"dev": true
},
"jsonparse": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
"integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=",
"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"
}
},
"jsprim": {
"version": "1.4.2",
"resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
"integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
"dev": true,
"requires": {
"assert-plus": "1.0.0",
"extsprintf": "1.3.0",
"json-schema": "0.4.0",
"verror": "1.10.0"
}
},
"just-extend": {
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz",
"integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==",
"dev": true
},
"keyv": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-4.1.0.tgz",
"integrity": "sha512-YsY3wr6HabE11/sscee+3nZ03XjvkrPWGouAmJFBdZoK92wiOlJCzI5/sDEIKdJhdhHO144ei45U9gXfbu14Uw==",
"dev": true,
"requires": {
"json-buffer": "3.0.1"
}
},
"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.2.4",
"resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
"integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
"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": {
"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": "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"
}
},
"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.get": {
"version": "4.4.2",
"resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
"integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=",
"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.merge": {
"version": "4.6.2",
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
"integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
"dev": true
},
"lodash.set": {
"version": "4.3.2",
"resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz",
"integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM="
},
"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.1.0",
"resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
"integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
"dev": true,
"requires": {
"chalk": "^4.1.0",
"is-unicode-supported": "^0.1.0"
}
},
"loupe": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.1.tgz",
"integrity": "sha512-EN1D3jyVmaX4tnajVlfbREU4axL647hLec1h/PXAb8CPDMJiYitcWF2UeLVNttRqaIqQs4x+mRvXf+d+TlDrCA==",
"dev": true,
"requires": {
"get-func-name": "^2.0.0"
}
},
"lowercase-keys": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
"integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
"dev": true
},
"lru-cache": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
"integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
"dev": true,
"requires": {
"yallist": "^4.0.0"
}
},
"make-dir": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
"integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
"dev": true,
"requires": {
"semver": "^6.0.0"
}
},
"map-obj": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz",
"integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==",
"dev": true
},
"marked": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/marked/-/marked-2.1.3.tgz",
"integrity": "sha512-/Q+7MGzaETqifOMWYEA7HVMaZb4XbcRfaOzcSsHZEith83KGlvaSG33u0SKu89Mj5h+T8V2hM+8O45Qc5XTgwA==",
"dev": true
},
"marked-terminal": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-4.2.0.tgz",
"integrity": "sha512-DQfNRV9svZf0Dm9Cf5x5xaVJ1+XjxQW6XjFJ5HFkVyK52SDpj5PCBzS5X5r2w9nHr3mlB0T5201UMLue9fmhUw==",
"dev": true,
"requires": {
"ansi-escapes": "^4.3.1",
"cardinal": "^2.1.1",
"chalk": "^4.1.0",
"cli-table3": "^0.6.0",
"node-emoji": "^1.10.0",
"supports-hyperlinks": "^2.1.0"
}
},
"memorystream": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz",
"integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=",
"dev": true
},
"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"
},
"dependencies": {
"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
}
}
},
"merge-descriptors": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
"integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=",
"dev": true
},
"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.4",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
"integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
"dev": true,
"requires": {
"braces": "^3.0.1",
"picomatch": "^2.2.3"
}
},
"mime": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz",
"integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==",
"dev": true
},
"mime-db": {
"version": "1.51.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz",
"integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==",
"dev": true
},
"mime-types": {
"version": "2.1.34",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz",
"integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==",
"dev": true,
"requires": {
"mime-db": "1.51.0"
}
},
"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
},
"mimic-response": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
"integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
"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"
}
},
"minipass": {
"version": "3.1.6",
"resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz",
"integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==",
"dev": true,
"requires": {
"yallist": "^4.0.0"
}
},
"mkdirp": {
"version": "0.5.5",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
"integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
"dev": true,
"requires": {
"minimist": "^1.2.5"
}
},
"mocha": {
"version": "9.2.0",
"resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.0.tgz",
"integrity": "sha512-kNn7E8g2SzVcq0a77dkphPsDSN7P+iYkqE0ZsGCYWRsoiKjOt+NvXfaagik8vuDa6W5Zw3qxe8Jfpt5qKf+6/Q==",
"dev": true,
"requires": {
"@ungap/promise-all-settled": "1.1.2",
"ansi-colors": "4.1.1",
"browser-stdout": "1.3.1",
"chokidar": "3.5.3",
"debug": "4.3.3",
"diff": "5.0.0",
"escape-string-regexp": "4.0.0",
"find-up": "5.0.0",
"glob": "7.2.0",
"growl": "1.10.5",
"he": "1.2.0",
"js-yaml": "4.1.0",
"log-symbols": "4.1.0",
"minimatch": "3.0.4",
"ms": "2.1.3",
"nanoid": "3.2.0",
"serialize-javascript": "6.0.0",
"strip-json-comments": "3.1.1",
"supports-color": "8.1.1",
"which": "2.0.2",
"workerpool": "6.2.0",
"yargs": "16.2.0",
"yargs-parser": "20.2.4",
"yargs-unparser": "2.0.0"
},
"dependencies": {
"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"
}
},
"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"
}
},
"is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
"dev": true
},
"locate-path": {
"version": "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"
}
},
"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
},
"string-width": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"dev": true,
"requires": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
"strip-ansi": "^6.0.1"
}
},
"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"
}
},
"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"
}
},
"y18n": {
"version": "5.0.8",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
"integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
"dev": true
},
"yargs": {
"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"
}
}
}
},
"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
},
"module-not-found-error": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/module-not-found-error/-/module-not-found-error-1.0.1.tgz",
"integrity": "sha1-z4tP9PKWQGdNbN0CsOO8UjwrvcA=",
"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=="
},
"nanoid": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz",
"integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==",
"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
},
"nice-try": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
"integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
"dev": true
},
"nise": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/nise/-/nise-5.1.1.tgz",
"integrity": "sha512-yr5kW2THW1AkxVmCnKEh4nbYkJdB3I7LUkiUgOvEkOp414mc2UMaHMA7pjq1nYowhdoJZGwEKGaQVbxfpWj10A==",
"dev": true,
"requires": {
"@sinonjs/commons": "^1.8.3",
"@sinonjs/fake-timers": ">=5",
"@sinonjs/text-encoding": "^0.7.1",
"just-extend": "^4.0.2",
"path-to-regexp": "^1.7.0"
}
},
"node-emoji": {
"version": "1.11.0",
"resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz",
"integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==",
"dev": true,
"requires": {
"lodash": "^4.17.21"
}
},
"node-fetch": {
"version": "2.6.7",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
"integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
"dev": true,
"requires": {
"whatwg-url": "^5.0.0"
}
},
"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": "2.0.1",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz",
"integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==",
"dev": true
},
"normalize-package-data": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz",
"integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==",
"dev": true,
"requires": {
"hosted-git-info": "^4.0.1",
"is-core-module": "^2.5.0",
"semver": "^7.3.4",
"validate-npm-package-license": "^3.0.1"
},
"dependencies": {
"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"
}
}
}
},
"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": "6.1.0",
"resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz",
"integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==",
"dev": true
},
"npm": {
"version": "7.24.2",
"resolved": "https://registry.npmjs.org/npm/-/npm-7.24.2.tgz",
"integrity": "sha512-120p116CE8VMMZ+hk8IAb1inCPk4Dj3VZw29/n2g6UI77urJKVYb7FZUDW8hY+EBnfsjI/2yrobBgFyzo7YpVQ==",
"dev": true,
"requires": {
"@isaacs/string-locale-compare": "*",
"@npmcli/arborist": "*",
"@npmcli/ci-detect": "*",
"@npmcli/config": "*",
"@npmcli/map-workspaces": "*",
"@npmcli/package-json": "*",
"@npmcli/run-script": "*",
"abbrev": "*",
"ansicolors": "*",
"ansistyles": "*",
"archy": "*",
"cacache": "*",
"chalk": "*",
"chownr": "*",
"cli-columns": "*",
"cli-table3": "*",
"columnify": "*",
"fastest-levenshtein": "*",
"glob": "*",
"graceful-fs": "*",
"hosted-git-info": "*",
"ini": "*",
"init-package-json": "*",
"is-cidr": "*",
"json-parse-even-better-errors": "*",
"libnpmaccess": "*",
"libnpmdiff": "*",
"libnpmexec": "*",
"libnpmfund": "*",
"libnpmhook": "*",
"libnpmorg": "*",
"libnpmpack": "*",
"libnpmpublish": "*",
"libnpmsearch": "*",
"libnpmteam": "*",
"libnpmversion": "*",
"make-fetch-happen": "*",
"minipass": "*",
"minipass-pipeline": "*",
"mkdirp": "*",
"mkdirp-infer-owner": "*",
"ms": "*",
"node-gyp": "*",
"nopt": "*",
"npm-audit-report": "*",
"npm-install-checks": "*",
"npm-package-arg": "*",
"npm-pick-manifest": "*",
"npm-profile": "*",
"npm-registry-fetch": "*",
"npm-user-validate": "*",
"npmlog": "*",
"opener": "*",
"pacote": "*",
"parse-conflict-json": "*",
"qrcode-terminal": "*",
"read": "*",
"read-package-json": "*",
"read-package-json-fast": "*",
"readdir-scoped-modules": "*",
"rimraf": "*",
"semver": "*",
"ssri": "*",
"tar": "*",
"text-table": "*",
"tiny-relative-date": "*",
"treeverse": "*",
"validate-npm-package-name": "*",
"which": "*",
"write-file-atomic": "*"
},
"dependencies": {
"@gar/promisify": {
"version": "1.1.2",
"bundled": true,
"dev": true
},
"@isaacs/string-locale-compare": {
"version": "1.1.0",
"bundled": true,
"dev": true
},
"@npmcli/arborist": {
"version": "2.9.0",
"bundled": true,
"dev": true,
"requires": {
"@isaacs/string-locale-compare": "^1.0.1",
"@npmcli/installed-package-contents": "^1.0.7",
"@npmcli/map-workspaces": "^1.0.2",
"@npmcli/metavuln-calculator": "^1.1.0",
"@npmcli/move-file": "^1.1.0",
"@npmcli/name-from-folder": "^1.0.1",
"@npmcli/node-gyp": "^1.0.1",
"@npmcli/package-json": "^1.0.1",
"@npmcli/run-script": "^1.8.2",
"bin-links": "^2.2.1",
"cacache": "^15.0.3",
"common-ancestor-path": "^1.0.1",
"json-parse-even-better-errors": "^2.3.1",
"json-stringify-nice": "^1.1.4",
"mkdirp": "^1.0.4",
"mkdirp-infer-owner": "^2.0.0",
"npm-install-checks": "^4.0.0",
"npm-package-arg": "^8.1.5",
"npm-pick-manifest": "^6.1.0",
"npm-registry-fetch": "^11.0.0",
"pacote": "^11.3.5",
"parse-conflict-json": "^1.1.1",
"proc-log": "^1.0.0",
"promise-all-reject-late": "^1.0.0",
"promise-call-limit": "^1.0.1",
"read-package-json-fast": "^2.0.2",
"readdir-scoped-modules": "^1.1.0",
"rimraf": "^3.0.2",
"semver": "^7.3.5",
"ssri": "^8.0.1",
"treeverse": "^1.0.4",
"walk-up-path": "^1.0.0"
}
},
"@npmcli/ci-detect": {
"version": "1.3.0",
"bundled": true,
"dev": true
},
"@npmcli/config": {
"version": "2.3.0",
"bundled": true,
"dev": true,
"requires": {
"ini": "^2.0.0",
"mkdirp-infer-owner": "^2.0.0",
"nopt": "^5.0.0",
"semver": "^7.3.4",
"walk-up-path": "^1.0.0"
}
},
"@npmcli/disparity-colors": {
"version": "1.0.1",
"bundled": true,
"dev": true,
"requires": {
"ansi-styles": "^4.3.0"
}
},
"@npmcli/fs": {
"version": "1.0.0",
"bundled": true,
"dev": true,
"requires": {
"@gar/promisify": "^1.0.1",
"semver": "^7.3.5"
}
},
"@npmcli/git": {
"version": "2.1.0",
"bundled": true,
"dev": true,
"requires": {
"@npmcli/promise-spawn": "^1.3.2",
"lru-cache": "^6.0.0",
"mkdirp": "^1.0.4",
"npm-pick-manifest": "^6.1.1",
"promise-inflight": "^1.0.1",
"promise-retry": "^2.0.1",
"semver": "^7.3.5",
"which": "^2.0.2"
}
},
"@npmcli/installed-package-contents": {
"version": "1.0.7",
"bundled": true,
"dev": true,
"requires": {
"npm-bundled": "^1.1.1",
"npm-normalize-package-bin": "^1.0.1"
}
},
"@npmcli/map-workspaces": {
"version": "1.0.4",
"bundled": true,
"dev": true,
"requires": {
"@npmcli/name-from-folder": "^1.0.1",
"glob": "^7.1.6",
"minimatch": "^3.0.4",
"read-package-json-fast": "^2.0.1"
}
},
"@npmcli/metavuln-calculator": {
"version": "1.1.1",
"bundled": true,
"dev": true,
"requires": {
"cacache": "^15.0.5",
"pacote": "^11.1.11",
"semver": "^7.3.2"
}
},
"@npmcli/move-file": {
"version": "1.1.2",
"bundled": true,
"dev": true,
"requires": {
"mkdirp": "^1.0.4",
"rimraf": "^3.0.2"
}
},
"@npmcli/name-from-folder": {
"version": "1.0.1",
"bundled": true,
"dev": true
},
"@npmcli/node-gyp": {
"version": "1.0.2",
"bundled": true,
"dev": true
},
"@npmcli/package-json": {
"version": "1.0.1",
"bundled": true,
"dev": true,
"requires": {
"json-parse-even-better-errors": "^2.3.1"
}
},
"@npmcli/promise-spawn": {
"version": "1.3.2",
"bundled": true,
"dev": true,
"requires": {
"infer-owner": "^1.0.4"
}
},
"@npmcli/run-script": {
"version": "1.8.6",
"bundled": true,
"dev": true,
"requires": {
"@npmcli/node-gyp": "^1.0.2",
"@npmcli/promise-spawn": "^1.3.2",
"node-gyp": "^7.1.0",
"read-package-json-fast": "^2.0.1"
}
},
"@tootallnate/once": {
"version": "1.1.2",
"bundled": true,
"dev": true
},
"abbrev": {
"version": "1.1.1",
"bundled": true,
"dev": true
},
"agent-base": {
"version": "6.0.2",
"bundled": true,
"dev": true,
"requires": {
"debug": "4"
}
},
"agentkeepalive": {
"version": "4.1.4",
"bundled": true,
"dev": true,
"requires": {
"debug": "^4.1.0",
"depd": "^1.1.2",
"humanize-ms": "^1.2.1"
}
},
"aggregate-error": {
"version": "3.1.0",
"bundled": true,
"dev": true,
"requires": {
"clean-stack": "^2.0.0",
"indent-string": "^4.0.0"
}
},
"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"
}
},
"ansi-regex": {
"version": "2.1.1",
"bundled": true,
"dev": true
},
"ansi-styles": {
"version": "4.3.0",
"bundled": true,
"dev": true,
"requires": {
"color-convert": "^2.0.1"
}
},
"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.6",
"bundled": true,
"dev": true,
"requires": {
"delegates": "^1.0.0",
"readable-stream": "^3.6.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.11.0",
"bundled": true,
"dev": true
},
"balanced-match": {
"version": "1.0.2",
"bundled": true,
"dev": true
},
"bcrypt-pbkdf": {
"version": "1.0.2",
"bundled": true,
"dev": true,
"requires": {
"tweetnacl": "^0.14.3"
}
},
"bin-links": {
"version": "2.2.1",
"bundled": true,
"dev": true,
"requires": {
"cmd-shim": "^4.0.1",
"mkdirp": "^1.0.3",
"npm-normalize-package-bin": "^1.0.0",
"read-cmd-shim": "^2.0.0",
"rimraf": "^3.0.0",
"write-file-atomic": "^3.0.3"
}
},
"binary-extensions": {
"version": "2.2.0",
"bundled": true,
"dev": true
},
"brace-expansion": {
"version": "1.1.11",
"bundled": true,
"dev": true,
"requires": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
}
},
"builtins": {
"version": "1.0.3",
"bundled": true,
"dev": true
},
"cacache": {
"version": "15.3.0",
"bundled": true,
"dev": true,
"requires": {
"@npmcli/fs": "^1.0.0",
"@npmcli/move-file": "^1.0.1",
"chownr": "^2.0.0",
"fs-minipass": "^2.0.0",
"glob": "^7.1.4",
"infer-owner": "^1.0.4",
"lru-cache": "^6.0.0",
"minipass": "^3.1.1",
"minipass-collect": "^1.0.2",
"minipass-flush": "^1.0.5",
"minipass-pipeline": "^1.2.2",
"mkdirp": "^1.0.3",
"p-map": "^4.0.0",
"promise-inflight": "^1.0.1",
"rimraf": "^3.0.2",
"ssri": "^8.0.1",
"tar": "^6.0.2",
"unique-filename": "^1.1.1"
}
},
"caseless": {
"version": "0.12.0",
"bundled": true,
"dev": true
},
"chalk": {
"version": "4.1.2",
"bundled": true,
"dev": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
}
},
"chownr": {
"version": "2.0.0",
"bundled": true,
"dev": true
},
"cidr-regex": {
"version": "3.1.1",
"bundled": true,
"dev": true,
"requires": {
"ip-regex": "^4.1.0"
}
},
"clean-stack": {
"version": "2.2.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.6.0",
"bundled": true,
"dev": true,
"requires": {
"colors": "^1.1.2",
"object-assign": "^4.1.0",
"string-width": "^4.2.0"
},
"dependencies": {
"ansi-regex": {
"version": "5.0.0",
"bundled": true,
"dev": true
},
"is-fullwidth-code-point": {
"version": "3.0.0",
"bundled": true,
"dev": true
},
"string-width": {
"version": "4.2.2",
"bundled": true,
"dev": true,
"requires": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
"strip-ansi": "^6.0.0"
}
},
"strip-ansi": {
"version": "6.0.0",
"bundled": true,
"dev": true,
"requires": {
"ansi-regex": "^5.0.0"
}
}
}
},
"clone": {
"version": "1.0.4",
"bundled": true,
"dev": true
},
"cmd-shim": {
"version": "4.1.0",
"bundled": true,
"dev": true,
"requires": {
"mkdirp-infer-owner": "^2.0.0"
}
},
"code-point-at": {
"version": "1.1.0",
"bundled": true,
"dev": true
},
"color-convert": {
"version": "2.0.1",
"bundled": true,
"dev": true,
"requires": {
"color-name": "~1.1.4"
}
},
"color-name": {
"version": "1.1.4",
"bundled": true,
"dev": true
},
"color-support": {
"version": "1.1.3",
"bundled": true,
"dev": true
},
"colors": {
"version": "1.4.0",
"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.8",
"bundled": true,
"dev": true,
"requires": {
"delayed-stream": "~1.0.0"
}
},
"common-ancestor-path": {
"version": "1.0.1",
"bundled": true,
"dev": true
},
"concat-map": {
"version": "0.0.1",
"bundled": true,
"dev": true
},
"console-control-strings": {
"version": "1.1.0",
"bundled": true,
"dev": true
},
"core-util-is": {
"version": "1.0.2",
"bundled": true,
"dev": true
},
"dashdash": {
"version": "1.14.1",
"bundled": true,
"dev": true,
"requires": {
"assert-plus": "^1.0.0"
}
},
"debug": {
"version": "4.3.2",
"bundled": true,
"dev": true,
"requires": {
"ms": "2.1.2"
},
"dependencies": {
"ms": {
"version": "2.1.2",
"bundled": true,
"dev": true
}
}
},
"debuglog": {
"version": "1.0.1",
"bundled": true,
"dev": true
},
"defaults": {
"version": "1.0.3",
"bundled": true,
"dev": true,
"requires": {
"clone": "^1.0.2"
}
},
"delayed-stream": {
"version": "1.0.0",
"bundled": true,
"dev": true
},
"delegates": {
"version": "1.0.0",
"bundled": true,
"dev": true
},
"depd": {
"version": "1.1.2",
"bundled": true,
"dev": true
},
"dezalgo": {
"version": "1.0.3",
"bundled": true,
"dev": true,
"requires": {
"asap": "^2.0.0",
"wrappy": "1"
}
},
"diff": {
"version": "5.0.0",
"bundled": true,
"dev": true
},
"ecc-jsbn": {
"version": "0.1.2",
"bundled": true,
"dev": true,
"requires": {
"jsbn": "~0.1.0",
"safer-buffer": "^2.1.0"
}
},
"emoji-regex": {
"version": "8.0.0",
"bundled": true,
"dev": true
},
"encoding": {
"version": "0.1.13",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"iconv-lite": "^0.6.2"
}
},
"env-paths": {
"version": "2.2.1",
"bundled": true,
"dev": true
},
"err-code": {
"version": "2.0.3",
"bundled": true,
"dev": true
},
"extend": {
"version": "3.0.2",
"bundled": true,
"dev": true
},
"extsprintf": {
"version": "1.3.0",
"bundled": true,
"dev": true
},
"fast-deep-equal": {
"version": "3.1.3",
"bundled": true,
"dev": true
},
"fast-json-stable-stringify": {
"version": "2.1.0",
"bundled": true,
"dev": true
},
"fastest-levenshtein": {
"version": "1.0.12",
"bundled": true,
"dev": true
},
"forever-agent": {
"version": "0.6.1",
"bundled": true,
"dev": true
},
"fs-minipass": {
"version": "2.1.0",
"bundled": true,
"dev": true,
"requires": {
"minipass": "^3.0.0"
}
},
"fs.realpath": {
"version": "1.0.0",
"bundled": true,
"dev": true
},
"function-bind": {
"version": "1.1.1",
"bundled": true,
"dev": true
},
"gauge": {
"version": "3.0.1",
"bundled": true,
"dev": true,
"requires": {
"aproba": "^1.0.3 || ^2.0.0",
"color-support": "^1.1.2",
"console-control-strings": "^1.0.0",
"has-unicode": "^2.0.1",
"object-assign": "^4.1.1",
"signal-exit": "^3.0.0",
"string-width": "^1.0.1 || ^2.0.0",
"strip-ansi": "^3.0.1 || ^4.0.0",
"wide-align": "^1.1.2"
}
},
"getpass": {
"version": "0.1.7",
"bundled": true,
"dev": true,
"requires": {
"assert-plus": "^1.0.0"
}
},
"glob": {
"version": "7.2.0",
"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"
}
},
"graceful-fs": {
"version": "4.2.8",
"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"
}
},
"has": {
"version": "1.0.3",
"bundled": true,
"dev": true,
"requires": {
"function-bind": "^1.1.1"
}
},
"has-flag": {
"version": "4.0.0",
"bundled": true,
"dev": true
},
"has-unicode": {
"version": "2.0.1",
"bundled": true,
"dev": true
},
"hosted-git-info": {
"version": "4.0.2",
"bundled": true,
"dev": true,
"requires": {
"lru-cache": "^6.0.0"
}
},
"http-cache-semantics": {
"version": "4.1.0",
"bundled": true,
"dev": true
},
"http-proxy-agent": {
"version": "4.0.1",
"bundled": true,
"dev": true,
"requires": {
"@tootallnate/once": "1",
"agent-base": "6",
"debug": "4"
}
},
"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": "5.0.0",
"bundled": true,
"dev": true,
"requires": {
"agent-base": "6",
"debug": "4"
}
},
"humanize-ms": {
"version": "1.2.1",
"bundled": true,
"dev": true,
"requires": {
"ms": "^2.0.0"
}
},
"iconv-lite": {
"version": "0.6.3",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"safer-buffer": ">= 2.1.2 < 3.0.0"
}
},
"ignore-walk": {
"version": "3.0.4",
"bundled": true,
"dev": true,
"requires": {
"minimatch": "^3.0.4"
}
},
"imurmurhash": {
"version": "0.1.4",
"bundled": true,
"dev": true
},
"indent-string": {
"version": "4.0.0",
"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": "2.0.0",
"bundled": true,
"dev": true
},
"init-package-json": {
"version": "2.0.5",
"bundled": true,
"dev": true,
"requires": {
"npm-package-arg": "^8.1.5",
"promzard": "^0.3.0",
"read": "~1.0.1",
"read-package-json": "^4.1.1",
"semver": "^7.3.5",
"validate-npm-package-license": "^3.0.4",
"validate-npm-package-name": "^3.0.0"
}
},
"ip": {
"version": "1.1.5",
"bundled": true,
"dev": true
},
"ip-regex": {
"version": "4.3.0",
"bundled": true,
"dev": true
},
"is-cidr": {
"version": "4.0.2",
"bundled": true,
"dev": true,
"requires": {
"cidr-regex": "^3.1.1"
}
},
"is-core-module": {
"version": "2.7.0",
"bundled": true,
"dev": true,
"requires": {
"has": "^1.0.3"
}
},
"is-fullwidth-code-point": {
"version": "2.0.0",
"bundled": true,
"dev": true
},
"is-lambda": {
"version": "1.0.1",
"bundled": true,
"dev": true
},
"is-typedarray": {
"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
},
"json-parse-even-better-errors": {
"version": "2.3.1",
"bundled": true,
"dev": true
},
"json-schema": {
"version": "0.2.3",
"bundled": true,
"dev": true
},
"json-schema-traverse": {
"version": "0.4.1",
"bundled": true,
"dev": true
},
"json-stringify-nice": {
"version": "1.1.4",
"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"
}
},
"just-diff": {
"version": "3.1.1",
"bundled": true,
"dev": true
},
"just-diff-apply": {
"version": "3.0.0",
"bundled": true,
"dev": true
},
"libnpmaccess": {
"version": "4.0.3",
"bundled": true,
"dev": true,
"requires": {
"aproba": "^2.0.0",
"minipass": "^3.1.1",
"npm-package-arg": "^8.1.2",
"npm-registry-fetch": "^11.0.0"
}
},
"libnpmdiff": {
"version": "2.0.4",
"bundled": true,
"dev": true,
"requires": {
"@npmcli/disparity-colors": "^1.0.1",
"@npmcli/installed-package-contents": "^1.0.7",
"binary-extensions": "^2.2.0",
"diff": "^5.0.0",
"minimatch": "^3.0.4",
"npm-package-arg": "^8.1.4",
"pacote": "^11.3.4",
"tar": "^6.1.0"
}
},
"libnpmexec": {
"version": "2.0.1",
"bundled": true,
"dev": true,
"requires": {
"@npmcli/arborist": "^2.3.0",
"@npmcli/ci-detect": "^1.3.0",
"@npmcli/run-script": "^1.8.4",
"chalk": "^4.1.0",
"mkdirp-infer-owner": "^2.0.0",
"npm-package-arg": "^8.1.2",
"pacote": "^11.3.1",
"proc-log": "^1.0.0",
"read": "^1.0.7",
"read-package-json-fast": "^2.0.2",
"walk-up-path": "^1.0.0"
}
},
"libnpmfund": {
"version": "1.1.0",
"bundled": true,
"dev": true,
"requires": {
"@npmcli/arborist": "^2.5.0"
}
},
"libnpmhook": {
"version": "6.0.3",
"bundled": true,
"dev": true,
"requires": {
"aproba": "^2.0.0",
"npm-registry-fetch": "^11.0.0"
}
},
"libnpmorg": {
"version": "2.0.3",
"bundled": true,
"dev": true,
"requires": {
"aproba": "^2.0.0",
"npm-registry-fetch": "^11.0.0"
}
},
"libnpmpack": {
"version": "2.0.1",
"bundled": true,
"dev": true,
"requires": {
"@npmcli/run-script": "^1.8.3",
"npm-package-arg": "^8.1.0",
"pacote": "^11.2.6"
}
},
"libnpmpublish": {
"version": "4.0.2",
"bundled": true,
"dev": true,
"requires": {
"normalize-package-data": "^3.0.2",
"npm-package-arg": "^8.1.2",
"npm-registry-fetch": "^11.0.0",
"semver": "^7.1.3",
"ssri": "^8.0.1"
}
},
"libnpmsearch": {
"version": "3.1.2",
"bundled": true,
"dev": true,
"requires": {
"npm-registry-fetch": "^11.0.0"
}
},
"libnpmteam": {
"version": "2.0.4",
"bundled": true,
"dev": true,
"requires": {
"aproba": "^2.0.0",
"npm-registry-fetch": "^11.0.0"
}
},
"libnpmversion": {
"version": "1.2.1",
"bundled": true,
"dev": true,
"requires": {
"@npmcli/git": "^2.0.7",
"@npmcli/run-script": "^1.8.4",
"json-parse-even-better-errors": "^2.3.1",
"semver": "^7.3.5",
"stringify-package": "^1.0.1"
}
},
"lru-cache": {
"version": "6.0.0",
"bundled": true,
"dev": true,
"requires": {
"yallist": "^4.0.0"
}
},
"make-fetch-happen": {
"version": "9.1.0",
"bundled": true,
"dev": true,
"requires": {
"agentkeepalive": "^4.1.3",
"cacache": "^15.2.0",
"http-cache-semantics": "^4.1.0",
"http-proxy-agent": "^4.0.1",
"https-proxy-agent": "^5.0.0",
"is-lambda": "^1.0.1",
"lru-cache": "^6.0.0",
"minipass": "^3.1.3",
"minipass-collect": "^1.0.2",
"minipass-fetch": "^1.3.2",
"minipass-flush": "^1.0.5",
"minipass-pipeline": "^1.2.4",
"negotiator": "^0.6.2",
"promise-retry": "^2.0.1",
"socks-proxy-agent": "^6.0.0",
"ssri": "^8.0.0"
}
},
"mime-db": {
"version": "1.49.0",
"bundled": true,
"dev": true
},
"mime-types": {
"version": "2.1.32",
"bundled": true,
"dev": true,
"requires": {
"mime-db": "1.49.0"
}
},
"minimatch": {
"version": "3.0.4",
"bundled": true,
"dev": true,
"requires": {
"brace-expansion": "^1.1.7"
}
},
"minipass": {
"version": "3.1.5",
"bundled": true,
"dev": true,
"requires": {
"yallist": "^4.0.0"
}
},
"minipass-collect": {
"version": "1.0.2",
"bundled": true,
"dev": true,
"requires": {
"minipass": "^3.0.0"
}
},
"minipass-fetch": {
"version": "1.4.1",
"bundled": true,
"dev": true,
"requires": {
"encoding": "^0.1.12",
"minipass": "^3.1.0",
"minipass-sized": "^1.0.3",
"minizlib": "^2.0.0"
}
},
"minipass-flush": {
"version": "1.0.5",
"bundled": true,
"dev": true,
"requires": {
"minipass": "^3.0.0"
}
},
"minipass-json-stream": {
"version": "1.0.1",
"bundled": true,
"dev": true,
"requires": {
"jsonparse": "^1.3.1",
"minipass": "^3.0.0"
}
},
"minipass-pipeline": {
"version": "1.2.4",
"bundled": true,
"dev": true,
"requires": {
"minipass": "^3.0.0"
}
},
"minipass-sized": {
"version": "1.0.3",
"bundled": true,
"dev": true,
"requires": {
"minipass": "^3.0.0"
}
},
"minizlib": {
"version": "2.1.2",
"bundled": true,
"dev": true,
"requires": {
"minipass": "^3.0.0",
"yallist": "^4.0.0"
}
},
"mkdirp": {
"version": "1.0.4",
"bundled": true,
"dev": true
},
"mkdirp-infer-owner": {
"version": "2.0.0",
"bundled": true,
"dev": true,
"requires": {
"chownr": "^2.0.0",
"infer-owner": "^1.0.4",
"mkdirp": "^1.0.3"
}
},
"ms": {
"version": "2.1.3",
"bundled": true,
"dev": true
},
"mute-stream": {
"version": "0.0.8",
"bundled": true,
"dev": true
},
"negotiator": {
"version": "0.6.2",
"bundled": true,
"dev": true
},
"node-gyp": {
"version": "7.1.2",
"bundled": true,
"dev": true,
"requires": {
"env-paths": "^2.2.0",
"glob": "^7.1.4",
"graceful-fs": "^4.2.3",
"nopt": "^5.0.0",
"npmlog": "^4.1.2",
"request": "^2.88.2",
"rimraf": "^3.0.2",
"semver": "^7.3.2",
"tar": "^6.0.2",
"which": "^2.0.2"
},
"dependencies": {
"aproba": {
"version": "1.2.0",
"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"
}
},
"is-fullwidth-code-point": {
"version": "1.0.0",
"bundled": true,
"dev": true,
"requires": {
"number-is-nan": "^1.0.0"
}
},
"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"
}
},
"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"
}
}
}
},
"nopt": {
"version": "5.0.0",
"bundled": true,
"dev": true,
"requires": {
"abbrev": "1"
}
},
"normalize-package-data": {
"version": "3.0.3",
"bundled": true,
"dev": true,
"requires": {
"hosted-git-info": "^4.0.1",
"is-core-module": "^2.5.0",
"semver": "^7.3.4",
"validate-npm-package-license": "^3.0.1"
}
},
"npm-audit-report": {
"version": "2.1.5",
"bundled": true,
"dev": true,
"requires": {
"chalk": "^4.0.0"
}
},
"npm-bundled": {
"version": "1.1.2",
"bundled": true,
"dev": true,
"requires": {
"npm-normalize-package-bin": "^1.0.1"
}
},
"npm-install-checks": {
"version": "4.0.0",
"bundled": true,
"dev": true,
"requires": {
"semver": "^7.1.1"
}
},
"npm-normalize-package-bin": {
"version": "1.0.1",
"bundled": true,
"dev": true
},
"npm-package-arg": {
"version": "8.1.5",
"bundled": true,
"dev": true,
"requires": {
"hosted-git-info": "^4.0.1",
"semver": "^7.3.4",
"validate-npm-package-name": "^3.0.0"
}
},
"npm-packlist": {
"version": "2.2.2",
"bundled": true,
"dev": true,
"requires": {
"glob": "^7.1.6",
"ignore-walk": "^3.0.3",
"npm-bundled": "^1.1.1",
"npm-normalize-package-bin": "^1.0.1"
}
},
"npm-pick-manifest": {
"version": "6.1.1",
"bundled": true,
"dev": true,
"requires": {
"npm-install-checks": "^4.0.0",
"npm-normalize-package-bin": "^1.0.1",
"npm-package-arg": "^8.1.2",
"semver": "^7.3.4"
}
},
"npm-profile": {
"version": "5.0.4",
"bundled": true,
"dev": true,
"requires": {
"npm-registry-fetch": "^11.0.0"
}
},
"npm-registry-fetch": {
"version": "11.0.0",
"bundled": true,
"dev": true,
"requires": {
"make-fetch-happen": "^9.0.1",
"minipass": "^3.1.3",
"minipass-fetch": "^1.3.0",
"minipass-json-stream": "^1.0.1",
"minizlib": "^2.0.0",
"npm-package-arg": "^8.0.0"
}
},
"npm-user-validate": {
"version": "1.0.1",
"bundled": true,
"dev": true
},
"npmlog": {
"version": "5.0.1",
"bundled": true,
"dev": true,
"requires": {
"are-we-there-yet": "^2.0.0",
"console-control-strings": "^1.1.0",
"gauge": "^3.0.0",
"set-blocking": "^2.0.0"
},
"dependencies": {
"are-we-there-yet": {
"version": "2.0.0",
"bundled": true,
"dev": true,
"requires": {
"delegates": "^1.0.0",
"readable-stream": "^3.6.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
},
"once": {
"version": "1.4.0",
"bundled": true,
"dev": true,
"requires": {
"wrappy": "1"
}
},
"opener": {
"version": "1.5.2",
"bundled": true,
"dev": true
},
"p-map": {
"version": "4.0.0",
"bundled": true,
"dev": true,
"requires": {
"aggregate-error": "^3.0.0"
}
},
"pacote": {
"version": "11.3.5",
"bundled": true,
"dev": true,
"requires": {
"@npmcli/git": "^2.1.0",
"@npmcli/installed-package-contents": "^1.0.6",
"@npmcli/promise-spawn": "^1.2.0",
"@npmcli/run-script": "^1.8.2",
"cacache": "^15.0.5",
"chownr": "^2.0.0",
"fs-minipass": "^2.1.0",
"infer-owner": "^1.0.4",
"minipass": "^3.1.3",
"mkdirp": "^1.0.3",
"npm-package-arg": "^8.0.1",
"npm-packlist": "^2.1.4",
"npm-pick-manifest": "^6.0.0",
"npm-registry-fetch": "^11.0.0",
"promise-retry": "^2.0.1",
"read-package-json-fast": "^2.0.1",
"rimraf": "^3.0.2",
"ssri": "^8.0.1",
"tar": "^6.1.0"
}
},
"parse-conflict-json": {
"version": "1.1.1",
"bundled": true,
"dev": true,
"requires": {
"json-parse-even-better-errors": "^2.3.0",
"just-diff": "^3.0.1",
"just-diff-apply": "^3.0.0"
}
},
"path-is-absolute": {
"version": "1.0.1",
"bundled": true,
"dev": true
},
"performance-now": {
"version": "2.1.0",
"bundled": true,
"dev": true
},
"proc-log": {
"version": "1.0.0",
"bundled": true,
"dev": true
},
"promise-all-reject-late": {
"version": "1.0.1",
"bundled": true,
"dev": true
},
"promise-call-limit": {
"version": "1.0.1",
"bundled": true,
"dev": true
},
"promise-inflight": {
"version": "1.0.1",
"bundled": true,
"dev": true
},
"promise-retry": {
"version": "2.0.1",
"bundled": true,
"dev": true,
"requires": {
"err-code": "^2.0.2",
"retry": "^0.12.0"
}
},
"promzard": {
"version": "0.3.0",
"bundled": true,
"dev": true,
"requires": {
"read": "1"
}
},
"psl": {
"version": "1.8.0",
"bundled": true,
"dev": true
},
"punycode": {
"version": "2.1.1",
"bundled": true,
"dev": true
},
"qrcode-terminal": {
"version": "0.12.0",
"bundled": true,
"dev": true
},
"qs": {
"version": "6.5.2",
"bundled": true,
"dev": true
},
"read": {
"version": "1.0.7",
"bundled": true,
"dev": true,
"requires": {
"mute-stream": "~0.0.4"
}
},
"read-cmd-shim": {
"version": "2.0.0",
"bundled": true,
"dev": true
},
"read-package-json": {
"version": "4.1.1",
"bundled": true,
"dev": true,
"requires": {
"glob": "^7.1.1",
"json-parse-even-better-errors": "^2.3.0",
"normalize-package-data": "^3.0.0",
"npm-normalize-package-bin": "^1.0.0"
}
},
"read-package-json-fast": {
"version": "2.0.3",
"bundled": true,
"dev": true,
"requires": {
"json-parse-even-better-errors": "^2.3.0",
"npm-normalize-package-bin": "^1.0.1"
}
},
"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"
}
},
"request": {
"version": "2.88.2",
"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.3",
"http-signature": "~1.2.0",
"is-typedarray": "~1.0.0",
"isstream": "~0.1.2",
"json-stringify-safe": "~5.0.1",
"mime-types": "~2.1.19",
"oauth-sign": "~0.9.0",
"performance-now": "^2.1.0",
"qs": "~6.5.2",
"safe-buffer": "^5.1.2",
"tough-cookie": "~2.5.0",
"tunnel-agent": "^0.6.0",
"uuid": "^3.3.2"
},
"dependencies": {
"form-data": {
"version": "2.3.3",
"bundled": true,
"dev": true,
"requires": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.6",
"mime-types": "^2.1.12"
}
},
"tough-cookie": {
"version": "2.5.0",
"bundled": true,
"dev": true,
"requires": {
"psl": "^1.1.28",
"punycode": "^2.1.1"
}
}
}
},
"retry": {
"version": "0.12.0",
"bundled": true,
"dev": true
},
"rimraf": {
"version": "3.0.2",
"bundled": true,
"dev": true,
"requires": {
"glob": "^7.1.3"
}
},
"safe-buffer": {
"version": "5.2.1",
"bundled": true,
"dev": true
},
"safer-buffer": {
"version": "2.1.2",
"bundled": true,
"dev": true
},
"semver": {
"version": "7.3.5",
"bundled": true,
"dev": true,
"requires": {
"lru-cache": "^6.0.0"
}
},
"set-blocking": {
"version": "2.0.0",
"bundled": true,
"dev": true
},
"signal-exit": {
"version": "3.0.3",
"bundled": true,
"dev": true
},
"smart-buffer": {
"version": "4.2.0",
"bundled": true,
"dev": true
},
"socks": {
"version": "2.6.1",
"bundled": true,
"dev": true,
"requires": {
"ip": "^1.1.5",
"smart-buffer": "^4.1.0"
}
},
"socks-proxy-agent": {
"version": "6.1.0",
"bundled": true,
"dev": true,
"requires": {
"agent-base": "^6.0.2",
"debug": "^4.3.1",
"socks": "^2.6.1"
}
},
"spdx-correct": {
"version": "3.1.1",
"bundled": true,
"dev": true,
"requires": {
"spdx-expression-parse": "^3.0.0",
"spdx-license-ids": "^3.0.0"
}
},
"spdx-exceptions": {
"version": "2.3.0",
"bundled": true,
"dev": true
},
"spdx-expression-parse": {
"version": "3.0.1",
"bundled": true,
"dev": true,
"requires": {
"spdx-exceptions": "^2.1.0",
"spdx-license-ids": "^3.0.0"
}
},
"spdx-license-ids": {
"version": "3.0.10",
"bundled": true,
"dev": true
},
"sshpk": {
"version": "1.16.1",
"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": "8.0.1",
"bundled": true,
"dev": true,
"requires": {
"minipass": "^3.1.1"
}
},
"string_decoder": {
"version": "1.3.0",
"bundled": true,
"dev": true,
"requires": {
"safe-buffer": "~5.2.0"
}
},
"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
},
"strip-ansi": {
"version": "4.0.0",
"bundled": true,
"dev": true,
"requires": {
"ansi-regex": "^3.0.0"
}
}
}
},
"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"
}
},
"supports-color": {
"version": "7.2.0",
"bundled": true,
"dev": true,
"requires": {
"has-flag": "^4.0.0"
}
},
"tar": {
"version": "6.1.11",
"bundled": true,
"dev": true,
"requires": {
"chownr": "^2.0.0",
"fs-minipass": "^2.0.0",
"minipass": "^3.0.0",
"minizlib": "^2.1.1",
"mkdirp": "^1.0.3",
"yallist": "^4.0.0"
}
},
"text-table": {
"version": "0.2.0",
"bundled": true,
"dev": true
},
"tiny-relative-date": {
"version": "1.3.0",
"bundled": true,
"dev": true
},
"treeverse": {
"version": "1.0.4",
"bundled": true,
"dev": true
},
"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
},
"typedarray-to-buffer": {
"version": "3.1.5",
"bundled": true,
"dev": true,
"requires": {
"is-typedarray": "^1.0.0"
}
},
"unique-filename": {
"version": "1.1.1",
"bundled": true,
"dev": true,
"requires": {
"unique-slug": "^2.0.0"
}
},
"unique-slug": {
"version": "2.0.2",
"bundled": true,
"dev": true,
"requires": {
"imurmurhash": "^0.1.4"
}
},
"uri-js": {
"version": "4.4.1",
"bundled": true,
"dev": true,
"requires": {
"punycode": "^2.1.0"
}
},
"util-deprecate": {
"version": "1.0.2",
"bundled": true,
"dev": true
},
"uuid": {
"version": "3.4.0",
"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"
}
},
"walk-up-path": {
"version": "1.0.0",
"bundled": true,
"dev": true
},
"wcwidth": {
"version": "1.0.1",
"bundled": true,
"dev": true,
"requires": {
"defaults": "^1.0.3"
}
},
"which": {
"version": "2.0.2",
"bundled": true,
"dev": true,
"requires": {
"isexe": "^2.0.0"
}
},
"wide-align": {
"version": "1.1.3",
"bundled": true,
"dev": true,
"requires": {
"string-width": "^1.0.2 || 2"
}
},
"wrappy": {
"version": "1.0.2",
"bundled": true,
"dev": true
},
"write-file-atomic": {
"version": "3.0.3",
"bundled": true,
"dev": true,
"requires": {
"imurmurhash": "^0.1.4",
"is-typedarray": "^1.0.0",
"signal-exit": "^3.0.2",
"typedarray-to-buffer": "^3.1.5"
}
},
"yallist": {
"version": "4.0.0",
"bundled": true,
"dev": true
}
}
},
"npm-package-arg": {
"version": "8.1.5",
"resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.5.tgz",
"integrity": "sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==",
"dev": true,
"requires": {
"hosted-git-info": "^4.0.1",
"semver": "^7.3.4",
"validate-npm-package-name": "^3.0.0"
},
"dependencies": {
"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"
}
}
}
},
"npm-run-all": {
"version": "4.1.5",
"resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz",
"integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==",
"dev": true,
"requires": {
"ansi-styles": "^3.2.1",
"chalk": "^2.4.1",
"cross-spawn": "^6.0.5",
"memorystream": "^0.3.1",
"minimatch": "^3.0.4",
"pidtree": "^0.3.0",
"read-pkg": "^3.0.0",
"shell-quote": "^1.6.1",
"string.prototype.padend": "^3.0.0"
},
"dependencies": {
"ansi-styles": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"dev": true,
"requires": {
"color-convert": "^1.9.0"
}
},
"chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"dev": true,
"requires": {
"ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5",
"supports-color": "^5.3.0"
}
},
"color-convert": {
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"dev": true,
"requires": {
"color-name": "1.1.3"
}
},
"color-name": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
"dev": true
},
"cross-spawn": {
"version": "6.0.5",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
"integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
"dev": true,
"requires": {
"nice-try": "^1.0.4",
"path-key": "^2.0.1",
"semver": "^5.5.0",
"shebang-command": "^1.2.0",
"which": "^1.2.9"
}
},
"escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
"dev": true
},
"has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
"dev": true
},
"path-key": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
"integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
"dev": true
},
"semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
"dev": true
},
"shebang-command": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
"integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
"dev": true,
"requires": {
"shebang-regex": "^1.0.0"
}
},
"shebang-regex": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
"integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
"dev": true
},
"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"
}
},
"which": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
"integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
"dev": true,
"requires": {
"isexe": "^2.0.0"
}
}
}
},
"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"
}
},
"npmlog": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
"integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
"dev": true,
"requires": {
"are-we-there-yet": "~1.1.2",
"console-control-strings": "~1.1.0",
"gauge": "~2.7.3",
"set-blocking": "~2.0.0"
}
},
"number-is-nan": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
"integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
"dev": true
},
"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": {
"find-up": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
"dev": true,
"requires": {
"locate-path": "^5.0.0",
"path-exists": "^4.0.0"
}
},
"locate-path": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
"dev": true,
"requires": {
"p-locate": "^4.1.0"
}
},
"p-limit": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
"integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
"dev": true,
"requires": {
"p-try": "^2.0.0"
}
},
"p-locate": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
"dev": true,
"requires": {
"p-limit": "^2.2.0"
}
},
"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
},
"path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
"dev": true
},
"resolve-from": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
"integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
"dev": true
}
}
},
"oauth-sign": {
"version": "0.9.0",
"resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
"integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
"dev": true
},
"object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
"dev": true
},
"object-inspect": {
"version": "1.12.0",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz",
"integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==",
"dev": true
},
"object-keys": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
"integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
"dev": true
},
"object.assign": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
"integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
"dev": true,
"requires": {
"call-bind": "^1.0.0",
"define-properties": "^1.1.3",
"has-symbols": "^1.0.1",
"object-keys": "^1.1.1"
}
},
"object.values": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz",
"integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==",
"dev": true,
"requires": {
"call-bind": "^1.0.2",
"define-properties": "^1.1.3",
"es-abstract": "^1.19.1"
}
},
"once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
"dev": true,
"requires": {
"wrappy": "1"
}
},
"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"
}
},
"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-cancelable": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz",
"integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==",
"dev": true
},
"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": "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-map": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz",
"integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==",
"dev": true,
"requires": {
"aggregate-error": "^3.0.0"
}
},
"p-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.6.1",
"resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.1.tgz",
"integrity": "sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA==",
"dev": true,
"requires": {
"@types/retry": "^0.12.0",
"retry": "^0.13.1"
},
"dependencies": {
"retry": {
"version": "0.13.1",
"resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz",
"integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==",
"dev": true
}
}
},
"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
},
"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": "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"
}
},
"parsimmon": {
"version": "1.18.1",
"resolved": "https://registry.npmjs.org/parsimmon/-/parsimmon-1.18.1.tgz",
"integrity": "sha512-u7p959wLfGAhJpSDJVYXoyMCXWYwHia78HhRBWqk7AIbxdmlrfdp5wX0l3xv/iTSH5HvhN9K7o26hwwpgS5Nmw==",
"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
},
"path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
"dev": true
},
"path-key": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
"integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
"dev": true
},
"path-parse": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
"dev": true
},
"path-to-regexp": {
"version": "1.8.0",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz",
"integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==",
"dev": true,
"requires": {
"isarray": "0.0.1"
}
},
"path-type": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
"integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
"dev": true,
"requires": {
"pify": "^3.0.0"
}
},
"pathval": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz",
"integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==",
"dev": true
},
"performance-now": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
"integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
"dev": true
},
"picocolors": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
"integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
"dev": true
},
"picomatch": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
"dev": true
},
"pidtree": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz",
"integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==",
"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"
}
},
"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"
},
"dependencies": {
"find-up": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
"dev": true,
"requires": {
"locate-path": "^5.0.0",
"path-exists": "^4.0.0"
}
},
"locate-path": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
"dev": true,
"requires": {
"p-locate": "^4.1.0"
}
},
"p-limit": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
"integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
"dev": true,
"requires": {
"p-try": "^2.0.0"
}
},
"p-locate": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
"dev": true,
"requires": {
"p-limit": "^2.2.0"
}
},
"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
},
"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
}
}
},
"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.5.1",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz",
"integrity": "sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==",
"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"
}
},
"propagate": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/propagate/-/propagate-2.0.1.tgz",
"integrity": "sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag=="
},
"proxyquire": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/proxyquire/-/proxyquire-2.1.3.tgz",
"integrity": "sha512-BQWfCqYM+QINd+yawJz23tbBM40VIGXOdDw3X344KcclI/gtBbdWF6SlQ4nK/bYhF9d27KYug9WzljHC6B9Ysg==",
"dev": true,
"requires": {
"fill-keys": "^1.0.2",
"module-not-found-error": "^1.0.1",
"resolve": "^1.11.1"
}
},
"psl": {
"version": "1.8.0",
"resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
"integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==",
"dev": true
},
"pump": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
"integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
"dev": true,
"requires": {
"end-of-stream": "^1.1.0",
"once": "^1.3.1"
}
},
"punycode": {
"version": "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
},
"qs": {
"version": "6.5.3",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
"integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==",
"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": "5.1.1",
"resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
"integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
"dev": true
},
"ramda": {
"version": "0.27.2",
"resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.2.tgz",
"integrity": "sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA==",
"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": "3.0.0",
"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
"integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=",
"dev": true,
"requires": {
"load-json-file": "^4.0.0",
"normalize-package-data": "^2.3.2",
"path-type": "^3.0.0"
},
"dependencies": {
"hosted-git-info": {
"version": "2.8.9",
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
"integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
"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
}
}
},
"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": {
"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"
}
},
"hosted-git-info": {
"version": "2.8.9",
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
"integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
"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"
}
},
"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"
}
},
"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-try": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
"integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
"dev": true
},
"parse-json": {
"version": "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
},
"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": {
"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
}
}
},
"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.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.6.0",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
"integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
"dev": true,
"requires": {
"picomatch": "^2.2.1"
}
},
"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"
}
},
"regexpp": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
"integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
"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"
}
},
"request": {
"version": "2.88.2",
"resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
"integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
"dev": true,
"requires": {
"aws-sign2": "~0.7.0",
"aws4": "^1.8.0",
"caseless": "~0.12.0",
"combined-stream": "~1.0.6",
"extend": "~3.0.2",
"forever-agent": "~0.6.1",
"form-data": "~2.3.2",
"har-validator": "~5.1.3",
"http-signature": "~1.2.0",
"is-typedarray": "~1.0.0",
"isstream": "~0.1.2",
"json-stringify-safe": "~5.0.1",
"mime-types": "~2.1.19",
"oauth-sign": "~0.9.0",
"performance-now": "^2.1.0",
"qs": "~6.5.2",
"safe-buffer": "^5.1.2",
"tough-cookie": "~2.5.0",
"tunnel-agent": "^0.6.0",
"uuid": "^3.3.2"
},
"dependencies": {
"form-data": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
"integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
"dev": true,
"requires": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.6",
"mime-types": "^2.1.12"
}
}
}
},
"require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
"integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
"dev": true
},
"require-main-filename": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
"integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
"dev": true
},
"resolve": {
"version": "1.22.0",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz",
"integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==",
"dev": true,
"requires": {
"is-core-module": "^2.8.1",
"path-parse": "^1.0.7",
"supports-preserve-symlinks-flag": "^1.0.0"
}
},
"resolve-alpn": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz",
"integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==",
"dev": true
},
"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
},
"responselike": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz",
"integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==",
"dev": true,
"requires": {
"lowercase-keys": "^2.0.0"
}
},
"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
},
"safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
"dev": true
},
"semantic-release": {
"version": "18.0.1",
"resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-18.0.1.tgz",
"integrity": "sha512-xTdKCaEnCzHr+Fqyhg/5I8P9pvY9z7WHa8TFCYIwcdPbuzAtQShOTzw3VNPsqBT+Yq1kFyBQFBKBYkGOlqWmfA==",
"dev": true,
"requires": {
"@semantic-release/commit-analyzer": "^9.0.2",
"@semantic-release/error": "^3.0.0",
"@semantic-release/github": "^8.0.0",
"@semantic-release/npm": "^8.0.0",
"@semantic-release/release-notes-generator": "^10.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.21",
"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": {
"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"
}
},
"get-stream": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
"integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
"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
},
"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
},
"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"
}
},
"string-width": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"dev": true,
"requires": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
"strip-ansi": "^6.0.1"
}
},
"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"
}
},
"y18n": {
"version": "5.0.8",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
"integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
"dev": true
},
"yargs": {
"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"
}
}
}
},
"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-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"
}
},
"semver-regex": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-3.1.3.tgz",
"integrity": "sha512-Aqi54Mk9uYTjVexLnR67rTyBusmwd04cLkHy9hNvk3+G3nT2Oyg7E0l4XVbOaNwIvQ3hHeYxGcyEy+mKreyBFQ==",
"dev": true
},
"serialize-javascript": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
"integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
"dev": true,
"requires": {
"randombytes": "^2.1.0"
}
},
"set-blocking": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
"integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
"dev": true
},
"shebang-command": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
"integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
"dev": true,
"requires": {
"shebang-regex": "^3.0.0"
}
},
"shebang-regex": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
"dev": true
},
"shell-quote": {
"version": "1.7.3",
"resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz",
"integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==",
"dev": true
},
"side-channel": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
"integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
"dev": true,
"requires": {
"call-bind": "^1.0.0",
"get-intrinsic": "^1.0.2",
"object-inspect": "^1.9.0"
}
},
"signal-exit": {
"version": "3.0.6",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz",
"integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==",
"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": {
"ansi-styles": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"dev": true,
"requires": {
"color-convert": "^1.9.0"
}
},
"chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"dev": true,
"requires": {
"ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5",
"supports-color": "^5.3.0"
}
},
"color-convert": {
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"dev": true,
"requires": {
"color-name": "1.1.3"
}
},
"color-name": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
"dev": true
},
"escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
"dev": true
},
"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"
}
},
"has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
"dev": true
},
"supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
"requires": {
"has-flag": "^3.0.0"
}
}
}
},
"sinon": {
"version": "13.0.1",
"resolved": "https://registry.npmjs.org/sinon/-/sinon-13.0.1.tgz",
"integrity": "sha512-8yx2wIvkBjIq/MGY1D9h1LMraYW+z1X0mb648KZnKSdvLasvDu7maa0dFaNYdTDczFgbjNw2tOmWdTk9saVfwQ==",
"dev": true,
"requires": {
"@sinonjs/commons": "^1.8.3",
"@sinonjs/fake-timers": "^9.0.0",
"@sinonjs/samsam": "^6.1.1",
"diff": "^5.0.0",
"nise": "^5.1.1",
"supports-color": "^7.2.0"
}
},
"sinon-chai": {
"version": "3.7.0",
"resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.7.0.tgz",
"integrity": "sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g==",
"dev": true,
"requires": {}
},
"slash": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
"integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
"dev": true
},
"slide": {
"version": "1.1.6",
"resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz",
"integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=",
"dev": true
},
"source-map": {
"version": "0.5.7",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
"integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
"dev": true
},
"spawn-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.11",
"resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz",
"integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==",
"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
},
"sshpk": {
"version": "1.17.0",
"resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz",
"integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==",
"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": "8.0.1",
"resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz",
"integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==",
"dev": true,
"requires": {
"minipass": "^3.1.1"
}
},
"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": {
"isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
"dev": true
},
"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_decoder": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
"integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
"dev": true,
"requires": {
"safe-buffer": "~5.2.0"
}
},
"string-width": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
"integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
"dev": true,
"requires": {
"code-point-at": "^1.0.0",
"is-fullwidth-code-point": "^1.0.0",
"strip-ansi": "^3.0.0"
},
"dependencies": {
"ansi-regex": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
"dev": true
},
"strip-ansi": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
"dev": true,
"requires": {
"ansi-regex": "^2.0.0"
}
}
}
},
"string.prototype.padend": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.3.tgz",
"integrity": "sha512-jNIIeokznm8SD/TZISQsZKYu7RJyheFNt84DUPrh482GC8RVp2MKqm2O5oBRdGxbDQoXrhhWtPIWQOiy20svUg==",
"dev": true,
"requires": {
"call-bind": "^1.0.2",
"define-properties": "^1.1.3",
"es-abstract": "^1.19.1"
}
},
"string.prototype.trimend": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz",
"integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==",
"dev": true,
"requires": {
"call-bind": "^1.0.2",
"define-properties": "^1.1.3"
}
},
"string.prototype.trimstart": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz",
"integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==",
"dev": true,
"requires": {
"call-bind": "^1.0.2",
"define-properties": "^1.1.3"
}
},
"strip-ansi": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"dev": true,
"requires": {
"ansi-regex": "^5.0.1"
}
},
"strip-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": "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"
}
},
"supports-hyperlinks": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz",
"integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==",
"dev": true,
"requires": {
"has-flag": "^4.0.0",
"supports-color": "^7.0.0"
}
},
"supports-preserve-symlinks-flag": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
"dev": true
},
"tar": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz",
"integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==",
"dev": true,
"requires": {
"block-stream": "*",
"fstream": "^1.0.12",
"inherits": "2"
}
},
"tar-stream": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
"integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
"dev": true,
"requires": {
"bl": "^4.0.3",
"end-of-stream": "^1.4.1",
"fs-constants": "^1.0.0",
"inherits": "^2.0.3",
"readable-stream": "^3.1.1"
}
},
"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"
}
},
"tmp": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz",
"integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==",
"dev": true,
"requires": {
"rimraf": "^3.0.0"
}
},
"to-fast-properties": {
"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"
}
},
"tough-cookie": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
"integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
"dev": true,
"requires": {
"psl": "^1.1.28",
"punycode": "^2.1.1"
}
},
"tr46": {
"version": "0.0.3",
"resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
"integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=",
"dev": true
},
"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.1",
"resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz",
"integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==",
"dev": true
},
"tsconfig-paths": {
"version": "3.12.0",
"resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.12.0.tgz",
"integrity": "sha512-e5adrnOYT6zqVnWqZu7i/BQ3BnhzvGbjEjejFXO20lKIKpwTaupkCPgEfv4GZK1IBciJUEhYs3J3p75FdaTFVg==",
"dev": true,
"requires": {
"@types/json5": "^0.0.29",
"json5": "^1.0.1",
"minimist": "^1.2.0",
"strip-bom": "^3.0.0"
},
"dependencies": {
"json5": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
"dev": true,
"requires": {
"minimist": "^1.2.0"
}
},
"strip-bom": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
"integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
"dev": true
}
}
},
"tslib": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
"dev": true
},
"tslint": {
"version": "5.14.0",
"resolved": "https://registry.npmjs.org/tslint/-/tslint-5.14.0.tgz",
"integrity": "sha512-IUla/ieHVnB8Le7LdQFRGlVJid2T/gaJe5VkjzRVSRR6pA2ODYrnfR1hmxi+5+au9l50jBwpbBL34txgv4NnTQ==",
"dev": true,
"requires": {
"babel-code-frame": "^6.22.0",
"builtin-modules": "^1.1.1",
"chalk": "^2.3.0",
"commander": "^2.12.1",
"diff": "^3.2.0",
"glob": "^7.1.1",
"js-yaml": "^3.7.0",
"minimatch": "^3.0.4",
"mkdirp": "^0.5.1",
"resolve": "^1.3.2",
"semver": "^5.3.0",
"tslib": "^1.8.0",
"tsutils": "^2.29.0"
},
"dependencies": {
"ansi-styles": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"dev": true,
"requires": {
"color-convert": "^1.9.0"
}
},
"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"
}
},
"chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"dev": true,
"requires": {
"ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5",
"supports-color": "^5.3.0"
}
},
"color-convert": {
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"dev": true,
"requires": {
"color-name": "1.1.3"
}
},
"color-name": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
"dev": true
},
"diff": {
"version": "3.5.0",
"resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
"integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
"dev": true
},
"escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
"dev": true
},
"has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
"dev": true
},
"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"
}
},
"semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
"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"
}
}
}
},
"tsutils": {
"version": "2.29.0",
"resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz",
"integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==",
"dev": true,
"requires": {
"tslib": "^1.8.1"
}
},
"tunnel-agent": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
"integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
"dev": true,
"requires": {
"safe-buffer": "^5.0.1"
}
},
"tweetnacl": {
"version": "0.14.5",
"resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
"integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
"dev": true
},
"type-check": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
"integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
"dev": true,
"requires": {
"prelude-ls": "^1.2.1"
}
},
"type-detect": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
"integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
"dev": true
},
"type-fest": {
"version": "0.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
},
"typedarray": {
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
"integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
"dev": true
},
"typedarray-to-buffer": {
"version": "3.1.5",
"resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
"integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
"dev": true,
"requires": {
"is-typedarray": "^1.0.0"
}
},
"typescript": {
"version": "4.5.5",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz",
"integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==",
"dev": true
},
"uglify-js": {
"version": "3.15.0",
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.15.0.tgz",
"integrity": "sha512-x+xdeDWq7FiORDvyIJ0q/waWd4PhjBNOm5dQUOq2AKC0IEjxOS66Ha9tctiVDGcRQuh69K7fgU5oRuTK4cysSg==",
"dev": true,
"optional": true
},
"unbox-primitive": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz",
"integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==",
"dev": true,
"requires": {
"function-bind": "^1.1.1",
"has-bigints": "^1.0.1",
"has-symbols": "^1.0.2",
"which-boxed-primitive": "^1.0.2"
}
},
"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": "0.1.2",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
"integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
"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"
}
},
"validate-npm-package-name": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz",
"integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=",
"dev": true,
"requires": {
"builtins": "^1.0.3"
}
},
"verror": {
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
"integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
"dev": true,
"requires": {
"assert-plus": "^1.0.0",
"core-util-is": "1.0.2",
"extsprintf": "^1.2.0"
}
},
"webidl-conversions": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
"integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=",
"dev": true
},
"whatwg-url": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
"integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=",
"dev": true,
"requires": {
"tr46": "~0.0.3",
"webidl-conversions": "^3.0.0"
}
},
"which": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
"dev": true,
"requires": {
"isexe": "^2.0.0"
}
},
"which-boxed-primitive": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
"integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
"dev": true,
"requires": {
"is-bigint": "^1.0.1",
"is-boolean-object": "^1.1.0",
"is-number-object": "^1.0.4",
"is-string": "^1.0.5",
"is-symbol": "^1.0.3"
}
},
"which-module": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
"integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
"dev": true
},
"wide-align": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
"integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==",
"dev": true,
"requires": {
"string-width": "^1.0.2 || 2 || 3 || 4"
}
},
"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.2.0",
"resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz",
"integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==",
"dev": true
},
"wrap-ansi": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
"integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
"dev": true,
"requires": {
"ansi-styles": "^4.0.0",
"string-width": "^4.1.0",
"strip-ansi": "^6.0.0"
},
"dependencies": {
"is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
"dev": true
},
"string-width": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"dev": true,
"requires": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
"strip-ansi": "^6.0.1"
}
}
}
},
"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": "4.0.3",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
"integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
"dev": true
},
"yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
"dev": true
},
"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": "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"
},
"dependencies": {
"find-up": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
"dev": true,
"requires": {
"locate-path": "^5.0.0",
"path-exists": "^4.0.0"
}
},
"is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
"dev": true
},
"locate-path": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
"dev": true,
"requires": {
"p-locate": "^4.1.0"
}
},
"p-limit": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
"integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
"dev": true,
"requires": {
"p-try": "^2.0.0"
}
},
"p-locate": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
"dev": true,
"requires": {
"p-limit": "^2.2.0"
}
},
"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
},
"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
},
"string-width": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"dev": true,
"requires": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
"strip-ansi": "^6.0.1"
}
},
"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"
}
}
}
},
"yargs-parser": {
"version": "20.2.4",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz",
"integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==",
"dev": true
},
"yargs-unparser": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz",
"integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==",
"dev": true,
"requires": {
"camelcase": "^6.0.0",
"decamelize": "^4.0.0",
"flat": "^5.0.2",
"is-plain-obj": "^2.1.0"
},
"dependencies": {
"camelcase": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
"integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
"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
}
}
},
"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
}
}
}
nock-13.2.4/package.json 0000664 0000000 0000000 00000004341 14177263367 0015043 0 ustar 00root root 0000000 0000000 {
"name": "nock",
"description": "HTTP server mocking and expectations library for Node.js",
"tags": [
"Mock",
"HTTP",
"testing",
"isolation"
],
"version": "0.0.0-development",
"author": "Pedro Teixeira ",
"repository": {
"type": "git",
"url": "https://github.com/nock/nock.git"
},
"bugs": {
"url": "https://github.com/nock/nock/issues"
},
"engines": {
"node": ">= 10.13"
},
"main": "./index.js",
"types": "types",
"dependencies": {
"debug": "^4.1.0",
"json-stringify-safe": "^5.0.1",
"lodash.set": "^4.3.2",
"propagate": "^2.0.0"
},
"devDependencies": {
"@definitelytyped/dtslint": "^0.0.103",
"@sinonjs/fake-timers": "^9.0.0",
"assert-rejects": "^1.0.0",
"chai": "^4.1.2",
"dirty-chai": "^2.0.1",
"eslint": "^8.8.0",
"eslint-config-prettier": "^8.1.0",
"eslint-config-standard": "^17.0.0-0",
"eslint-plugin-import": "^2.16.0",
"eslint-plugin-mocha": "^10.0.3",
"eslint-plugin-node": "^11.0.0",
"eslint-plugin-promise": "^6.0.0",
"form-data": "^4.0.0",
"got": "^11.3.0",
"mocha": "^9.1.3",
"npm-run-all": "^4.1.5",
"nyc": "^15.0.0",
"prettier": "2.5.1",
"proxyquire": "^2.1.0",
"rimraf": "^3.0.0",
"semantic-release": "^18.0.1",
"sinon": "^13.0.1",
"sinon-chai": "^3.7.0",
"typescript": "^4.2.2"
},
"scripts": {
"format:fix": "prettier --write '**/*.{js,json,md,ts,yml,yaml}'",
"format": "prettier --check '**/*.{js,json,md,ts,yml,yaml}'",
"lint": "run-p lint:js lint:ts",
"lint:js": "eslint --cache --cache-location './.cache/eslint' '**/*.js'",
"lint:js:fix": "eslint --cache --cache-location './.cache/eslint' --fix '**/*.js'",
"lint:ts": "dtslint types",
"test": "nyc --reporter=lcov --reporter=text mocha tests",
"test:coverage": "open coverage/lcov-report/index.html"
},
"license": "MIT",
"files": [
"index.js",
"lib",
"types/index.d.ts"
],
"release": {
"branches": [
"+([0-9])?(.{+([0-9]),x}).x",
"main",
"next",
"next-major",
{
"name": "beta",
"prerelease": true
},
{
"name": "alpha",
"prerelease": true
}
]
}
}
nock-13.2.4/rfcs/ 0000775 0000000 0000000 00000000000 14177263367 0013510 5 ustar 00root root 0000000 0000000 nock-13.2.4/rfcs/rfc-001.md 0000664 0000000 0000000 00000011240 14177263367 0015100 0 ustar 00root root 0000000 0000000 # Analysis of lifecycle methods (RFC-001)


In Nock v10/v11, the lifecycle methods are confusingly named, difficult to
understand, and at times inconvenient. Unless they are studied carefully, it
is easy to inadvertently leave unwanted state in Nock.
Nock doesn't automatically provide a way to assert that mocks have been
satisfied; it's the caller's responsibility to do this for each mock.
This RFC analyzes the most common use cases and the function calls
currently needed for each one. Subsequent RFCs will propose changes to the
lifecycle APIs which better afford these use cases.
See
https://github.com/paulmelnikow/icedfrisby-nock/blob/8bdb5cbc9f6ec38bcdd8d1ec6f8979b05ab6a905/icedfrisby-nock.js
for an attempt at getting the lifecycle right.
## Typical use cases
1. Assert that all mocks have been satisfied.
2. Completely reset Nock after a test.
3. Allow unmocked requests only to certain hosts.
4. Prevent unmocked requests entirely.
5. Simulate network connection failures.
6. Temporarily disable http call interception while preserving registered mocks.
7. Turn Nock all the way off and clean up its state. (I haven't experienced
a need for this, but wanted to include it in the analysis.)
## Analysis
| Use case | Code | Assessment |
| ----------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Assert that all mocks have been satisfied | `scopes.forEach(scope => scope.done())`. When using `nockBack`, `assert.deepEqual(scope.pendingMocks(), [])` | `done()` could have a more explicit name, though otherwise this is fairly clear. However it requires the caller to keep track of all the scopes, which is not ideal. |
| Reset Nock after a test to its initial post-`require()` state | `nock.restore(); nock.cleanAll(); nock.enableNetConnect(); nock.activate()` | This is a lot of typing. Some developers may wish to abort response playback that is in flight. ([#1118][]) |
| Forbid unmocked requests | `nock.disableNetConnect()` | This _looks_ okay, but it doesn't have the desired effect. Errors are received by the client code and often swallowed up by the application ([#884][]). |
| Allow unmocked requests, but only to certain hosts | `nock.disableNetConnect(); nock.enableNetConnect('example.com')` | This is a common use case, and should be possible to do more succintly, with a single call. |
| Simulate network connection failure | N/A | This is what `disableNetConnect()` does today. However from the function name, it's not really clear this is the intention. |
| Temporarily disable http interception while preserving registered mocks | `nock.restore()` | This is a confusing name, as it only cleans _part_ of nock's state. |
| Turn Nock all the way off and clean up its state | `nock.restore(); nock.cleanAll()` | `restore()` is a confusing name. This isn't the most common use case, so it is probably okay that it requires two function calls. |
## References
- [#1441][]
- [#1474][]
[#884]: https://github.com/nock/nock/issues/884
[#1118]: https://github.com/nock/nock/issues/1118
[#1441]: https://github.com/nock/nock/issues/1441
[#1474]: https://github.com/nock/nock/issues/1474
nock-13.2.4/tests/ 0000775 0000000 0000000 00000000000 14177263367 0013715 5 ustar 00root root 0000000 0000000 nock-13.2.4/tests/assets/ 0000775 0000000 0000000 00000000000 14177263367 0015217 5 ustar 00root root 0000000 0000000 nock-13.2.4/tests/assets/reply_file_1.txt 0000664 0000000 0000000 00000000024 14177263367 0020326 0 ustar 00root root 0000000 0000000 Hello from the file! nock-13.2.4/tests/assets/reply_file_2.txt.gz 0000664 0000000 0000000 00000000071 14177263367 0020750 0 ustar 00root root 0000000 0000000 9S reply_file_2.txt HWH+U(HUHIU pN, nock-13.2.4/tests/fixtures/ 0000775 0000000 0000000 00000000000 14177263367 0015566 5 ustar 00root root 0000000 0000000 nock-13.2.4/tests/fixtures/good_request.json 0000664 0000000 0000000 00000152354 14177263367 0021173 0 ustar 00root root 0000000 0000000 [
{
"scope": "http://www.example.test:80",
"method": "GET",
"path": "/",
"body": "",
"status": 200,
"response": "Google × |
| A faster way to browse the web |
|
",
"headers": {
"date": "Thu, 09 Oct 2014 04:31:42 GMT",
"expires": "-1",
"cache-control": "private, max-age=0",
"content-type": "text/html; charset=ISO-8859-1",
"set-cookie": [
"PREF=ID=61e37f09ab4c9630:FF=0:TM=1412829102:LM=1412829102:S=n4CvWIEl9Nh9pgAq; expires=Sat, 08-Oct-2016 04:31:42 GMT; path=/; domain=.google.com",
"NID=67=EeZ2zt5Y7FEID_Mmw7unRUwQWdAjS_2ZwixURIotpGpjBIYLTf6DdhnNWwlVBozGq8Xhsz3LljeqvNZ6dlLOE2s2DH0fpAc-UmOB210Z_SAEOtEQPzbRlPDY_No1MjHr; expires=Fri, 10-Apr-2015 04:31:42 GMT; path=/; domain=.google.com; HttpOnly"
],
"p3p": "CP=\"This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for more info.\"",
"server": "gws",
"x-xss-protection": "1; mode=block",
"x-frame-options": "SAMEORIGIN",
"alternate-protocol": "80:quic,p=0.01",
"transfer-encoding": "chunked"
}
}
]
nock-13.2.4/tests/fixtures/wrong_uri.json 0000664 0000000 0000000 00000325033 14177263367 0020502 0 ustar 00root root 0000000 0000000 [
{
"scope": "http://www.google.com:80",
"method": "GET",
"path": "/",
"body": "",
"status": 200,
"response": "Google × |
| A faster way to browse the web |
|
",
"headers": {
"date": "Thu, 09 Oct 2014 03:32:35 GMT",
"expires": "-1",
"cache-control": "private, max-age=0",
"content-type": "text/html; charset=ISO-8859-1",
"set-cookie": [
"PREF=ID=c968b8b9030f6c3a:FF=0:TM=1412825555:LM=1412825555:S=3CSfpgDYqfFnW-oh; expires=Sat, 08-Oct-2016 03:32:35 GMT; path=/; domain=.google.com",
"NID=67=XTab7eObELOOPU85mA0UXGXqm4IRG7uQqPpHR-PpdTN7ARmxo2nYKKasYy5IhW2IYQKFoT4TDoGlWh2r5_8oejLCYwYewnOuHTv22YXAmsMvIzQoHsbNVg2XK2L_YvFC; expires=Fri, 10-Apr-2015 03:32:35 GMT; path=/; domain=.google.com; HttpOnly"
],
"p3p": "CP=\"This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for more info.\"",
"server": "gws",
"x-xss-protection": "1; mode=block",
"x-frame-options": "SAMEORIGIN",
"alternate-protocol": "80:quic,p=0.01",
"transfer-encoding": "chunked"
}
},
{
"scope": "http://www.google.com:80",
"method": "GET",
"path": "/",
"body": "",
"status": 200,
"response": "Google × |
| A faster way to browse the web |
|
",
"headers": {
"date": "Thu, 09 Oct 2014 03:32:35 GMT",
"expires": "-1",
"cache-control": "private, max-age=0",
"content-type": "text/html; charset=ISO-8859-1",
"set-cookie": [
"PREF=ID=22ae44503a9c2e00:FF=0:TM=1412825555:LM=1412825555:S=UjX7C_HhzJ2E-uWp; expires=Sat, 08-Oct-2016 03:32:35 GMT; path=/; domain=.google.com",
"NID=67=GHdePVosHO62Wh_2rBW5x0xgQm6xRasZMtb1kxjhYkUohxh9KagR6SjTJ31lMrcSKlzcOl99mdcBcm-xjSqFE3tGuLVl9lg0sy_kboS6qiGeNIDkopSrTxbIN6ScfPyA; expires=Fri, 10-Apr-2015 03:32:35 GMT; path=/; domain=.google.com; HttpOnly"
],
"p3p": "CP=\"This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for more info.\"",
"server": "gws",
"x-xss-protection": "1; mode=block",
"x-frame-options": "SAMEORIGIN",
"alternate-protocol": "80:quic,p=0.01",
"transfer-encoding": "chunked"
}
}
]
nock-13.2.4/tests/got_client.js 0000664 0000000 0000000 00000000200 14177263367 0016372 0 ustar 00root root 0000000 0000000 'use strict'
const got = require('got')
// https://github.com/nock/nock/issues/1523
module.exports = got.extend({ retry: 0 })
nock-13.2.4/tests/servers/ 0000775 0000000 0000000 00000000000 14177263367 0015406 5 ustar 00root root 0000000 0000000 nock-13.2.4/tests/servers/ca.crt 0000664 0000000 0000000 00000002167 14177263367 0016511 0 ustar 00root root 0000000 0000000 -----BEGIN CERTIFICATE-----
MIIDHjCCAgYCCQC+uR0/H01JfjANBgkqhkiG9w0BAQsFADBRMQswCQYDVQQGEwJH
QjEQMA4GA1UECAwHRW5nbGFuZDEPMA0GA1UEBwwGTG9uZG9uMQ0wCwYDVQQKDARO
b2NrMRAwDgYDVQQDDAdOb2NrIENBMB4XDTE4MDgwMzA5MTUwNFoXDTI4MDczMTA5
MTUwNFowUTELMAkGA1UEBhMCR0IxEDAOBgNVBAgMB0VuZ2xhbmQxDzANBgNVBAcM
BkxvbmRvbjENMAsGA1UECgwETm9jazEQMA4GA1UEAwwHTm9jayBDQTCCASIwDQYJ
KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMMCWVdFKwX7srn7hVnAG76WAvHSXkPJ
OnmNX1J/GlIJej7jncv2yaQRdvJ/TT5ihR6LzP++dn4/6FRM/lNURFQgue4HSG6k
SFOAxx8MB0hkU0YyKVC0cUQopX11ownv+FEWZ4M2HHcWwBgW/K46e3wxDGUBo3Ib
yVnSLk0VUn2ZYnU5iJgEa8uj+WVQtY/5Vhg2xPwv4U0+dNhcHeEEfiTwz1FhT9hQ
GuRP74l7hzbeq5IpACR1QRygoqEsAzy3ZM9gNqbWezwpt4pKE2n8t9d4wVo+OaP/
YduE6HEuQe5zea7VlDHLhIbfiFTONMaGrMdlyTJRQrUVXv+iIGDcEhUCAwEAATAN
BgkqhkiG9w0BAQsFAAOCAQEAfVyCTYlxH5S+8qMC+Cv8ycm/QFxK1JqgqEhruZaa
CKR6FuXy25OpI5S/dlbr2MImordRUFEhM3AmJffFutiBAT/N9imsJNVXCXDXW4Lt
JIBZpQmByqK15vveTFWHJqW7W5jwqZArGOqCv0CwlamshSRw9qy5rU5IfbF5rx7K
9JKco0v5jhHYcq1AtMNOYLMQv3svvEW5qS5IftyWyoxiMw4/j1/12BQzWLC65XIP
HWRTDqGIYfiC/PT+SNh9yPBzwgtbfIK7Xddf14j9qAGbyvQO9ky6ew06TxhY7T5X
q/56JPe8kSXCR5KculAZ5eMQgvtpUNzPgQ26BX1ToNMYWQ==
-----END CERTIFICATE-----
nock-13.2.4/tests/servers/ca.key 0000664 0000000 0000000 00000003217 14177263367 0016506 0 ustar 00root root 0000000 0000000 -----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAwwJZV0UrBfuyufuFWcAbvpYC8dJeQ8k6eY1fUn8aUgl6PuOd
y/bJpBF28n9NPmKFHovM/752fj/oVEz+U1REVCC57gdIbqRIU4DHHwwHSGRTRjIp
ULRxRCilfXWjCe/4URZngzYcdxbAGBb8rjp7fDEMZQGjchvJWdIuTRVSfZlidTmI
mARry6P5ZVC1j/lWGDbE/C/hTT502Fwd4QR+JPDPUWFP2FAa5E/viXuHNt6rkikA
JHVBHKCioSwDPLdkz2A2ptZ7PCm3ikoTafy313jBWj45o/9h24TocS5B7nN5rtWU
McuEht+IVM40xoasx2XJMlFCtRVe/6IgYNwSFQIDAQABAoIBAE+d9OXpioA93CGM
rEwRYAJ28qrSbcQVMzePXZyr4g4eanekrLcqgfbnXn3xNZND2/+1qjO8ClrPMsbA
TJGu9Nq4JdElzg/GKPVWvXVSjuKie1FMh4u4sAnY4oAPeEpFXEeW8xoiDIsekb0E
HZPwspvo1puiiJ289H8kjdzQ2MYIEtTKNJShtea3F+QEJExaaUK6SlwLo2pmiPvD
umgNPr9UXFMrtU+d13JWmXcUZ5KT3Yk6Ij2ShD3/W7gAO7TTZth4mcef3Bhoay+z
Xf3/GyPzHLnytQatubJCltSIk3cgKjKLENWn5lf1HfXBLxZozl054Snjjm4LnGDH
15JT08ECgYEA/KESvj1yhCI7DjJVNtLtf57eqxxHLigsSzNq3oADdIwk6kBjtb1E
nAT+F6vtfO/nfhuuh6eYaJYUt+jv0fdYq+ObYAIY5d6Hl3Wj+mIumi5khd9Qudmq
UTmngErgzF2LLYkyuPuc3bN4kWM/J7pKalyaoGtw60ah2fZbKDBRkLECgYEAxZx1
TuBDwHMflkHNYsb4egfWq316RpwVKcjyrlsCLY5RpLggZQpqO7c4s5QiaHhlp0k6
E4iJlyUzPNNGClIc7d6F6Paas+S0IDalkJ8zpVQPG3KDgAaeu1jQR3wU6jAxMwth
UwKWNhUqWFytGD7qelRw/ZdKMb0sSPA/DcDa0KUCgYEA4Bmins+zfjM/X+CWZwPF
Wqh7rh5vpipM4IjEDIxShFithn+H8/fpnN1w6V7CVUobeGrl78BkGqLHzjz8QK3C
IvjNI+W4YHF+poTc6Yee/3aYBYmL+tFznIogZFYIBEIW7FYAgMfy51gFZDM+GufO
i3uKTzP//zWw7cD0LDpwoIECgYA2UebRMsaM/VhedmId1/HvoX36D/jvtfH/VXSY
Rv4XRbrdm5uUCsPe/GOCwaKfsxDGZlOnkO25dYlbG/xx09aN8JBA1KD7+E8nV741
Pf31YWDxu424QJmbiDNgoxQgt/SeQm+TYO+nmDPWrEsMkibkT5frrY3AlG668gdz
IWNE3QKBgQC+bGWCKvtcAeY03OxRZWjMC8oMmsyNk0U0QAZA7hvnPlAKdvRcrC9O
sB6Mo/bGIV9Umce4dNlvinZjS+n1srBnJ+uJqoR9SINXVqD6S+qD325p+I0YnU4U
GqvwKO2IdCNizQA5gJTr4cYw0gvIueixtmi6mku/htPC+PzCDZxsmQ==
-----END RSA PRIVATE KEY-----
nock-13.2.4/tests/servers/index.js 0000664 0000000 0000000 00000003440 14177263367 0017054 0 ustar 00root root 0000000 0000000 'use strict'
// With OpenSSL installed, you can set up your CA and certificates with
// the following commands, valid for 10 years:
//
// openssl genrsa -out localhost.key 2048
// # Set the common name to "localhost"
// openssl req -new -key localhost.key -out localhost.csr
// openssl genrsa -out ca.key 2048
// # Set the common name to "Nock CA"
// openssl req -new -x509 -key ca.key -out ca.crt -days 3650
// openssl x509 -req -in localhost.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out localhost.crt -days 3650
// rm ca.srl localhost.csr
//
const http = require('http')
const https = require('https')
const path = require('path')
const fs = require('fs')
const servers = []
afterEach(() => {
while (servers.length) {
const server = servers.pop()
server.close()
}
})
const defaultRequestListener = (req, res) => {
res.writeHead(200)
res.write('OK')
res.end()
}
async function startHttpServer(requestListener = defaultRequestListener) {
const server = http.createServer(requestListener)
await new Promise(resolve => server.listen(resolve))
servers.push(server)
server.port = server.address().port
server.origin = `http://localhost:${server.port}`
return server
}
async function startHttpsServer(requestListener = defaultRequestListener) {
const server = https.createServer(
{
key: fs.readFileSync(path.resolve(__dirname, './localhost.key')),
cert: fs.readFileSync(path.resolve(__dirname, './localhost.crt')),
},
requestListener
)
await new Promise(resolve => server.listen(resolve))
servers.push(server)
server.port = server.address().port
server.origin = `https://localhost:${server.port}`
return server
}
module.exports = {
ca: fs.readFileSync(path.resolve(__dirname, './ca.crt')),
startHttpServer,
startHttpsServer,
}
nock-13.2.4/tests/servers/localhost.crt 0000664 0000000 0000000 00000002167 14177263367 0020116 0 ustar 00root root 0000000 0000000 -----BEGIN CERTIFICATE-----
MIIDIDCCAggCCQDYVIrmRw4nbjANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJH
QjEQMA4GA1UECAwHRW5nbGFuZDEPMA0GA1UEBwwGTG9uZG9uMQ0wCwYDVQQKDARO
b2NrMRAwDgYDVQQDDAdOb2NrIENBMB4XDTE4MDgwMzA5MTUzNVoXDTI4MDczMTA5
MTUzNVowUzELMAkGA1UEBhMCR0IxEDAOBgNVBAgMB0VuZ2xhbmQxDzANBgNVBAcM
BkxvbmRvbjENMAsGA1UECgwETm9jazESMBAGA1UEAwwJbG9jYWxob3N0MIIBIjAN
BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvjjgBB6NfPVs1pzBJZs2KyStkQ3T
29Z9q95VU4lVcYxTzWRYggHZbrUpTNS5r64bngnoY0y6Q1vqqYPYQ/bkBa4uDoL3
UCEyWLsbS94zhcaCOxxYAhN+o64kPmr2AAFgZvTf5owrBIijArzI9/eXUBRp6uRD
6CXcjMKjODyo61xOzH8geUlEsHSohMiHemh7YcV1bO1NWD7MdJB3oJgTmlkQcC2Q
fl93GUxvADfMjjA1pLN9Q0aK27K7xprhzcI9me2ENHf4jLbI/1ZY/8+AGRUQbB2/
qcFKVRyn3OWvnWO+Y5EpwTiz4HUjxdSQEWMbvGPdIGbYsSIq/2EDivTjSwIDAQAB
MA0GCSqGSIb3DQEBBQUAA4IBAQCNakuvhFw6lXhWJ3V2WcUA+VzXImnJ5L1A6r/i
PaG6ZfXWaM93Cq9EnRlod0kx0eNph16PoPTEQB/Yla5G8+WBgnFKOgKIyeAnNm+G
qQ16lpdXMlJnsdYTuN7G21gOgQ9QCaXpNOw3LKQN67FaVsrPPPfptL1930tf3FeW
FKeur2E9jmZT2tBzn6bLm0RSyuKsAjBKNSQwMwBctdSwVQT3ypzzFRk5sZu97TsK
YzRHO7KlR3xbUJWpRVZrmF2R/AGTalx7Fh/ATYhnMUwRqm8WQ5QkmG0iFOpOtXeA
hNgTrA6or5CnxtENyWEWD05VbEzX45+M3jZ2QN5URMF2djfB
-----END CERTIFICATE-----
nock-13.2.4/tests/servers/localhost.key 0000664 0000000 0000000 00000003217 14177263367 0020113 0 ustar 00root root 0000000 0000000 -----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAvjjgBB6NfPVs1pzBJZs2KyStkQ3T29Z9q95VU4lVcYxTzWRY
ggHZbrUpTNS5r64bngnoY0y6Q1vqqYPYQ/bkBa4uDoL3UCEyWLsbS94zhcaCOxxY
AhN+o64kPmr2AAFgZvTf5owrBIijArzI9/eXUBRp6uRD6CXcjMKjODyo61xOzH8g
eUlEsHSohMiHemh7YcV1bO1NWD7MdJB3oJgTmlkQcC2Qfl93GUxvADfMjjA1pLN9
Q0aK27K7xprhzcI9me2ENHf4jLbI/1ZY/8+AGRUQbB2/qcFKVRyn3OWvnWO+Y5Ep
wTiz4HUjxdSQEWMbvGPdIGbYsSIq/2EDivTjSwIDAQABAoIBAQCyQI/DrHG/yChe
j/P67pB7K1quU/vUxRFszeK9bjMwPWSGUuMRqPP85yy1f54lf40Hspce/laJKogi
o5c0URZqMEeed6GTaBhKx8MTfDxhvpxpEe1yvJvufBAgoZC2fpO8xvlNjMn+7J98
wDW/EDet5gM/BvqPf3NGQFo9J7LPIUlDOtccW6Y011iw1CREnz4Yrd7EglNqzlIj
RtKc1JOJ2hrgZyXP6SMFMboFa7p7Jg/gKs97o33e6OkddkebeGTuRtV8oHogadQo
87pVZVHmNnEQQFka/QLCaxh6J/Z41324tK2VAEHYlj/2vQf7k35K/afFX10wJ7Qh
9DgAJRchAoGBAO3de29g+baAfBRCq7e21Cco82aoEw4cZt3gWA186E19ZT2VfTQ4
iZZzMHujbIJVwkzWLD5bAYlwCP6M1cciP/M0e5V+CMTJhQSSogmvNsY1P3nyM3iu
oDlCEqK5V5BCsdMULY6JpmdPdZOQ/X99hTtO39iicmlUbkfd3XyS2BEbAoGBAMy5
hhkAlr4gkw6rbiwDivrv7Re720TCuYTRSO0uiEJXRW51QKgCj24hZ/VIlhVn8748
sddFu0fIe+Gj3nxigHnDqIQJ8SsuFD1KiR5q9rqM8MgsojX1p8sqt4FM/Psn5dgE
ea+G/6w77Vtv+5ceFoTObNd43EBPY5JSY1FCv8mRAoGBAKlropp/MP1rYHUx04sj
3tIRmeQZfJEFa8NHIpBg0jk3Ql/t1OLYDi+p1fOKQCRJHv6JYbP8MAkLUmy0NSQD
4hbA3/Fndqlre6H5Kw7IzLO6g37BIyYnAxolVI6wgozO5EeazKQEqRBWiUFU+SnQ
ZpAKqudrNSCOsYngnfw3v0vXAoGARjHql9IK3b//jE0dZnwEgEwZyESCR05ZHABC
eAi3cb/Ir7oGZFUUZtePdJvh0g8llPnspHplX5SPXWu5kn6XvKhotHVQOtT+3ZEb
+NEGLiq7OHeNWuETGmdYKj6Ck383oNzP+G5aZezaUrrP0h3f7MN2sF7hbi+KXZZg
NXGknvECgYBvkL0W+6XmbkwHfOhIT2tQm4eCToni+3f0UoZetQrapcXQm5mxDyDH
MXmrVP8rEjjq69Cik5vwEoK6ktlg43JlP+/F+fnD2Oz1BNipLALMspnOkmaIFnTU
RQWfPk56INjB9sosA3ZBDGWFgooiVWEgYSjBJv+HI1Pk49RIyMQprw==
-----END RSA PRIVATE KEY-----
nock-13.2.4/tests/setup.js 0000664 0000000 0000000 00000001123 14177263367 0015410 0 ustar 00root root 0000000 0000000 'use strict'
const nock = require('..')
const chai = require('chai')
const dirtyChai = require('dirty-chai')
const sinon = require('sinon')
const sinonChai = require('sinon-chai')
chai.use(dirtyChai)
chai.use(sinonChai)
afterEach(function () {
nock.restore()
nock.abortPendingRequests()
nock.cleanAll()
nock.enableNetConnect()
nock.emitter.removeAllListeners()
// It's important that Sinon is restored before Nock is reactivated for tests that stub/spy built-in methods,
// otherwise Sinon loses track of the stubs and can't restore them.
sinon.restore()
nock.activate()
})
nock-13.2.4/tests/test_abort.js 0000664 0000000 0000000 00000014040 14177263367 0016420 0 ustar 00root root 0000000 0000000 'use strict'
const { expect } = require('chai')
const http = require('http')
const sinon = require('sinon')
const nock = require('..')
// These tests use `setTimeout` before verifying emitted events to ensure any
// number of `nextTicks` or `setImmediate` can process first.
// Node will emit a `prefinish` event after `socket`, but it's an internal,
// undocumented event that Nock does not emulate.
// The order of tests run sequentially through a ClientRequest's lifetime.
// Starting the top by aborting requests early on then aborting later and later.
describe('`ClientRequest.abort()`', () => {
it('Emits the expected event sequence when `write` is called on an aborted request', done => {
const scope = nock('http://example.test').get('/').reply()
const req = http.request('http://example.test')
const emitSpy = sinon.spy(req, 'emit')
req.abort()
req.write('foo')
setTimeout(() => {
expect(emitSpy).to.have.been.calledOnceWithExactly('abort')
expect(scope.isDone()).to.be.false()
done()
}, 10)
})
it('Emits the expected event sequence when `end` is called on an aborted request', done => {
const scope = nock('http://example.test').get('/').reply()
const req = http.request('http://example.test')
const emitSpy = sinon.spy(req, 'emit')
req.abort()
req.end()
setTimeout(() => {
expect(emitSpy).to.have.been.calledOnceWithExactly('abort')
expect(scope.isDone()).to.be.false()
done()
}, 10)
})
it('Emits the expected event sequence when `flushHeaders` is called on an aborted request', done => {
const scope = nock('http://example.test').get('/').reply()
const req = http.request('http://example.test')
const emitSpy = sinon.spy(req, 'emit')
req.abort()
req.flushHeaders()
setTimeout(() => {
expect(emitSpy).to.have.been.calledOnceWithExactly('abort')
expect(scope.isDone()).to.be.false()
done()
}, 10)
})
it('Emits the expected event sequence when aborted immediately after `end`', done => {
const scope = nock('http://example.test').get('/').reply()
const req = http.request('http://example.test')
const emitSpy = sinon.spy(req, 'emit')
req.end()
req.abort()
setTimeout(() => {
expect(emitSpy).to.have.been.calledOnceWithExactly('abort')
expect(scope.isDone()).to.be.false()
done()
}, 10)
})
it('Emits the expected event sequence when aborted inside a `socket` event listener', done => {
const scope = nock('http://example.test').get('/').reply()
const req = http.request('http://example.test')
const emitSpy = sinon.spy(req, 'emit')
req.on('socket', () => {
req.abort()
})
req.on('error', err => {
expect(err.message).to.equal('socket hang up')
expect(err.code).to.equal('ECONNRESET')
})
req.end()
setTimeout(() => {
const events = emitSpy.args.map(i => i[0])
expect(events).to.deep.equal(['socket', 'abort', 'error', 'close'])
expect(scope.isDone()).to.be.false()
done()
}, 10)
})
it('Emits the expected event sequence when aborted multiple times', done => {
const scope = nock('http://example.test').get('/').reply()
const req = http.request('http://example.test')
const emitSpy = sinon.spy(req, 'emit')
req.on('error', () => {}) // listen for error so it doesn't bubble
req.on('socket', () => {
req.abort()
req.abort()
req.abort()
})
req.end()
setTimeout(() => {
const events = emitSpy.args.map(i => i[0])
// important: `abort` and `error` events only fire once and the `close` event still fires at the end
expect(events).to.deep.equal(['socket', 'abort', 'error', 'close'])
expect(scope.isDone()).to.be.false()
done()
}, 10)
})
// The Interceptor is considered consumed just prior to the `finish` event on the request,
// all tests below assert the Scope is done.
it('Emits the expected event sequence when aborted inside a `finish` event listener', done => {
const scope = nock('http://example.test').get('/').reply()
const req = http.request('http://example.test')
const emitSpy = sinon.spy(req, 'emit')
req.on('finish', () => {
req.abort()
})
req.on('error', err => {
expect(err.message).to.equal('socket hang up')
expect(err.code).to.equal('ECONNRESET')
})
req.end()
setTimeout(() => {
const events = emitSpy.args.map(i => i[0])
expect(events).to.deep.equal([
'socket',
'finish',
'abort',
'error',
'close',
])
scope.done()
done()
}, 10)
})
it('Emits the expected event sequence when aborted after a delay from the `finish` event', done => {
// use the delay functionality to create a window where the abort is called during the artificial connection wait.
const scope = nock('http://example.test').get('/').delay(100).reply()
const req = http.request('http://example.test')
const emitSpy = sinon.spy(req, 'emit')
req.on('finish', () => {
setTimeout(() => {
req.abort()
}, 10)
})
req.on('error', err => {
expect(err.message).to.equal('socket hang up')
expect(err.code).to.equal('ECONNRESET')
})
req.end()
setTimeout(() => {
const events = emitSpy.args.map(i => i[0])
expect(events).to.deep.equal([
'socket',
'finish',
'abort',
'error',
'close',
])
scope.done()
done()
}, 200)
})
it('Emits the expected event sequence when aborted inside a `response` event listener', done => {
const scope = nock('http://example.test').get('/').reply()
const req = http.request('http://example.test')
const emitSpy = sinon.spy(req, 'emit')
req.on('response', () => {
req.abort()
})
req.end()
setTimeout(() => {
const events = emitSpy.args.map(i => i[0])
expect(events).to.deep.equal([
'socket',
'finish',
'response',
'abort',
'close',
])
scope.done()
done()
}, 10)
})
})
nock-13.2.4/tests/test_allow_unmocked.js 0000664 0000000 0000000 00000020212 14177263367 0020312 0 ustar 00root root 0000000 0000000 'use strict'
const { expect } = require('chai')
const http = require('http')
const sinon = require('sinon')
const nock = require('..')
const got = require('./got_client')
const { startHttpServer } = require('./servers')
describe('allowUnmocked option', () => {
it('with allowUnmocked, mocked request still works', async () => {
const scope = nock('http://example.test', { allowUnmocked: true })
.post('/')
.reply(200, '99problems')
const { body, statusCode } = await got.post('http://example.test/')
expect(statusCode).to.equal(200)
expect(body).to.equal('99problems')
scope.done()
})
it('allow unmocked works after one interceptor is removed', async () => {
const { origin } = await startHttpServer((request, response) => {
response.write('live')
response.end()
})
nock(origin, { allowUnmocked: true }).get('/').reply(200, 'Mocked')
expect((await got(origin)).body).to.equal('Mocked')
expect((await got(origin)).body).to.equal('live')
})
it('allow unmocked option allows traffic to server', async () => {
const { origin } = await startHttpServer((request, response) => {
switch (request.url) {
case '/':
response.writeHead(200)
response.write('server served a response')
break
case '/not/available':
response.writeHead(404)
break
case '/abc':
response.writeHead(200)
response.write('server served a response')
break
}
response.end()
})
const scope = nock(origin, { allowUnmocked: true })
.get('/abc')
.reply(304, 'served from our mock')
.get('/wont/get/here')
.reply(304, 'served from our mock')
const client = got.extend({ prefixUrl: origin, throwHttpErrors: false })
const response1 = await client('abc')
expect(response1.statusCode).to.equal(304)
expect(response1.body).to.equal('served from our mock')
expect(scope.isDone()).to.equal(false)
const response2 = await client('not/available')
expect(response2.statusCode).to.equal(404)
expect(scope.isDone()).to.equal(false)
const response3 = await client('')
expect(response3.statusCode).to.equal(200)
expect(response3.body).to.equal('server served a response')
expect(scope.isDone()).to.equal(false)
})
it('allow unmocked post with json data', async () => {
const { origin } = await startHttpServer((request, response) => {
response.writeHead(200)
response.write('{"message":"server response"}')
response.end()
})
nock(origin, { allowUnmocked: true })
.get('/not/accessed')
.reply(200, '{"message":"mocked response"}')
const { body, statusCode } = await got.post(origin, {
json: { some: 'data' },
responseType: 'json',
})
expect(statusCode).to.equal(200)
expect(body).to.deep.equal({ message: 'server response' })
})
it('allow unmocked passthrough with mismatched bodies', async () => {
const { origin } = await startHttpServer((request, response) => {
response.writeHead(200)
response.write('{"message":"server response"}')
response.end()
})
nock(origin, { allowUnmocked: true })
.post('/post', { some: 'other data' })
.reply(404, '{"message":"server response"}')
const { body, statusCode } = await got.post(`${origin}/post`, {
json: { some: 'data' },
responseType: 'json',
})
expect(statusCode).to.equal(200)
expect(body).to.deep.equal({ message: 'server response' })
})
it('match path using regexp with allowUnmocked', async () => {
const scope = nock('http://example.test', { allowUnmocked: true })
.get(/regex$/)
.reply(200, 'Match regex')
const { body, statusCode } = await got(
'http://example.test/resources/regex'
)
expect(statusCode).to.equal(200)
expect(body).to.equal('Match regex')
scope.done()
})
// https://github.com/nock/nock/issues/1076
it('match hostname using regexp with allowUnmocked', async () => {
const scope = nock(/localhost/, { allowUnmocked: true })
.get('/no/regex/here')
.reply(200, 'Match regex')
const { body, statusCode } = await got(
'http://localhost:3000/no/regex/here'
)
expect(statusCode).to.equal(200)
expect(body).to.equal('Match regex')
scope.done()
})
it('allow unmocked passthrough with regex host & mismatched bodies', async () => {
const { origin } = await startHttpServer((request, response) => {
response.writeHead(200)
response.write('{"message":"server response"}')
response.end()
})
nock(/localhost/, { allowUnmocked: true })
.post('/post', { some: 'other data' })
.reply(404, '{"message":"server response"}')
const { body, statusCode } = await got.post(`${origin}/post`, {
json: { some: 'data' },
responseType: 'json',
})
expect(statusCode).to.equal(200)
expect(body).to.deep.equal({ message: 'server response' })
})
// https://github.com/nock/nock/issues/1867
it('match path using callback with allowUnmocked', async () => {
const scope = nock('http://example.test', { allowUnmocked: true })
.get(uri => uri.endsWith('bar'))
.reply()
const { statusCode } = await got('http://example.test/foo/bar')
expect(statusCode).to.equal(200)
scope.done()
})
// https://github.com/nock/nock/issues/835
it('match multiple paths to domain using regexp with allowUnmocked', async () => {
const { origin } = await startHttpServer((request, response) => {
response.write('live')
response.end()
})
const scope1 = nock(/localhost/, { allowUnmocked: true })
.get(/alpha/)
.reply(200, 'this is alpha')
const scope2 = nock(/localhost/, { allowUnmocked: true })
.get(/bravo/)
.reply(200, 'bravo, bravo!')
expect((await got(origin)).body).to.equal('live')
expect((await got(`${origin}/alphalicious`)).body).to.equal('this is alpha')
expect((await got(`${origin}/bravo-company`)).body).to.equal(
'bravo, bravo!'
)
scope1.done()
scope2.done()
})
it('match domain and path with literal query params and allowUnmocked', async () => {
const scope = nock('http://example.test', { allowUnmocked: true })
.get('/foo?bar=baz')
.reply()
const { statusCode } = await got('http://example.test/foo?bar=baz')
expect(statusCode).to.equal(200)
scope.done()
})
it('match domain and path using regexp with query params and allowUnmocked', async () => {
const imgResponse = 'Matched Images Page'
const scope = nock(/example/, { allowUnmocked: true })
.get(/imghp\?hl=en/)
.reply(200, imgResponse)
const { body, statusCode } = await got('http://example.test/imghp?hl=en')
expect(statusCode).to.equal(200)
expect(body).to.equal(imgResponse)
scope.done()
})
// https://github.com/nock/nock/issues/490
it('match when query is specified with allowUnmocked', async () => {
const { origin } = await startHttpServer((request, response) => {
response.write('live')
response.end()
})
const scope = nock(origin, { allowUnmocked: true })
.get('/search')
.query({ q: 'cat pictures' })
.reply(200, '😻')
expect((await got(origin)).body).to.equal('live')
expect((await got(`${origin}/search?q=cat%20pictures`)).body).to.equal('😻')
scope.done()
})
// https://github.com/nock/nock/issues/1832
it('should only emit "finish" once even if an unmocked request is created after playback as started', async () => {
const { origin, port } = await startHttpServer((request, response) =>
response.end()
)
const scope = nock(origin, { allowUnmocked: true }).post('/', 'foo').reply()
const req = http.request({
host: 'localhost',
port,
method: 'POST',
path: '/',
})
const finishSpy = sinon.spy()
req.on('finish', finishSpy)
return new Promise(resolve => {
req.on('response', () => {
expect(finishSpy).to.have.been.calledOnce()
expect(scope.isDone()).to.be.false()
resolve()
})
req.write('bar') // a mismatched body causes a late unmocked request
req.end()
})
})
})
nock-13.2.4/tests/test_allow_unmocked_https.js 0000664 0000000 0000000 00000005740 14177263367 0021545 0 ustar 00root root 0000000 0000000 'use strict'
const { expect } = require('chai')
const nock = require('..')
const got = require('./got_client')
const servers = require('./servers')
describe('allowUnmocked option (https)', () => {
it('Nock with allowUnmocked and an url match', async () => {
const { origin } = await servers.startHttpsServer((req, res) => {
res.writeHead(200)
res.end({ status: 'default' })
})
const scope = nock(origin, { allowUnmocked: true })
.get('/urlMatch')
.reply(201, JSON.stringify({ status: 'intercepted' }))
const { body, statusCode } = await got(`${origin}/urlMatch`, {
https: { certificateAuthority: servers.ca },
})
expect(statusCode).to.equal(201)
expect(body).to.equal('{"status":"intercepted"}')
scope.done()
})
it('allow unmocked option works with https', async () => {
const { origin } = await servers.startHttpsServer((request, response) => {
if (request.url === '/does/not/exist') {
response.writeHead(404)
response.end()
return
}
response.writeHead(200)
response.write('server response')
response.end()
})
const client = got.extend({
prefixUrl: origin,
throwHttpErrors: false,
https: { certificateAuthority: servers.ca },
})
const scope = nock(origin, { allowUnmocked: true })
.get('/abc')
.reply(200, 'mocked response')
.get('/wont/get/here')
.reply(500)
const response1 = await client('abc')
expect(response1.statusCode).to.equal(200)
expect(response1.body).to.equal('mocked response')
expect(scope.isDone()).to.equal(false)
const response2 = await client('does/not/exist')
expect(response2.statusCode).to.equal(404)
expect(scope.isDone()).to.equal(false)
const response3 = await client('')
expect(response3.statusCode).to.equal(200)
expect(response3.body).to.equal('server response')
expect(scope.isDone()).to.equal(false)
})
it('allow unmocked option works with https for a partial match', async () => {
// The `allowUnmocked` option is processed in two places. Once in the intercept when there
// are no interceptors that come close to matching the request. And again in the overrider when
// there are interceptors that partially match, eg just path, but don't completely match.
// This explicitly tests the later case in the overrider by making an HTTPS request for a path
// that has an interceptor but fails to match the query constraint.
const { origin } = await servers.startHttpsServer((request, response) => {
response.writeHead(201)
response.write('foo')
response.end()
})
nock(origin, { allowUnmocked: true })
.get('/foo')
.query({ foo: 'bar' })
.reply(418)
// no query so wont match the interceptor
const { statusCode, body } = await got(`${origin}/foo`, {
https: { certificateAuthority: servers.ca },
})
expect(statusCode).to.equal(201)
expect(body).to.equal('foo')
})
})
nock-13.2.4/tests/test_back.js 0000664 0000000 0000000 00000053342 14177263367 0016221 0 ustar 00root root 0000000 0000000 'use strict'
const crypto = require('crypto')
const http = require('http')
const fs = require('fs')
const { expect } = require('chai')
const path = require('path')
const rimraf = require('rimraf')
const sinon = require('sinon')
const proxyquire = require('proxyquire').preserveCache()
const nock = require('..')
const { startHttpServer } = require('./servers')
const { back: nockBack } = nock
function testNock(done) {
const onData = sinon.spy()
const scope = nock('http://www.example.test')
.get('/')
.reply(200, 'Hello World!')
http
.request(
{
host: 'www.example.test',
path: '/',
port: 80,
},
res => {
expect(res.statusCode).to.equal(200)
res.once('end', () => {
expect(onData).to.have.been.called()
scope.done()
done()
})
res.on('data', data => {
onData()
expect(data).to.be.an.instanceOf(Buffer)
expect(data.toString()).to.equal('Hello World!')
})
}
)
.end()
}
function nockBackWithFixture(mochaDone, scopesLoaded) {
const scopesLength = scopesLoaded ? 1 : 0
nockBack('good_request.json', function (nockDone) {
expect(this.scopes).to.have.length(scopesLength)
http.get('http://www.example.test/', () => {
this.assertScopesFinished()
nockDone()
mochaDone()
})
})
}
const requestListener = (request, response) => {
response.writeHead(217) // non-standard status code to ensure the response is not live
response.write('server served a response')
response.end()
}
// TODO: This was added as a temporary patch. It's possible that we don't need
// both `good_request.json`/`nockBackWithFixture()` on google.com and a second
// pair on localhost. Consolidate them if possible. Otherwise remove this
// comment.
function nockBackWithFixtureLocalhost(mochaDone) {
nockBack('goodRequestLocalhost.json', function (nockDone) {
expect(this.scopes).to.be.empty()
startHttpServer(requestListener).then(server => {
const request = http.request(
{
host: 'localhost',
path: '/',
port: server.address().port,
},
response => {
expect(response.statusCode).to.equal(217)
this.assertScopesFinished()
nockDone()
mochaDone()
}
)
request.on('error', () => expect.fail())
request.end()
})
})
}
describe('Nock Back', () => {
beforeEach(() => {
nockBack.fixtures = path.resolve(__dirname, 'fixtures')
})
it('should throw an exception when fixtures is not set', () => {
nockBack.fixtures = undefined
expect(nockBack).to.throw('Back requires nock.back.fixtures to be set')
})
it('should throw an exception when fixtureName is not a string', () => {
expect(nockBack).to.throw('Parameter fixtureName must be a string')
})
it('should return a promise when neither options nor nockbackFn are specified', done => {
nockBack('test-promise-fixture.json').then(({ nockDone, context }) => {
expect(nockDone).to.be.a('function')
expect(context).to.be.an('object')
done()
})
})
it('should throw an exception when a hook is not a function', () => {
expect(() =>
nockBack('good_request.json', { before: 'not-a-function-innit' })
).to.throw('processing hooks must be a function')
})
it('should return a promise when nockbackFn is not specified', done => {
nockBack('test-promise-fixture.json', { test: 'options' }).then(
({ nockDone, context }) => {
expect(nockDone).to.be.a('function')
expect(context).to.be.an('object')
done()
}
)
})
it('`setMode` throws an exception on unknown mode', () => {
expect(() => nockBack.setMode('bogus')).to.throw('Unknown mode: bogus')
})
it('`assertScopesFinished` throws exception when Back still has pending scopes', done => {
const fixtureName = 'good_request.json'
const fixturePath = path.join(nockBack.fixtures, fixtureName)
nockBack(fixtureName, function (nockDone) {
expect(() => this.assertScopesFinished()).to.throw(
`["GET http://www.example.test:80/"] was not used, consider removing ${fixturePath} to rerecord fixture`
)
nockDone()
done()
})
})
describe('wild mode', () => {
beforeEach(() => {
nockBack.setMode('wild')
})
it('should allow normal nocks to work', testNock)
it('should enable net connect', done => {
nock.disableNetConnect()
nockBack.setMode('wild')
// TODO: It would be nice if there were a cleaner way to assert that net
// connect is allowed.
nockBackWithFixtureLocalhost(done)
})
it(
"shouldn't do anything when fixtures are present",
nockBackWithFixtureLocalhost
)
})
describe('dryrun mode', () => {
beforeEach(() => {
// Manually disable net connectivity to confirm that dryrun enables it.
nock.disableNetConnect()
nockBack.setMode('dryrun')
})
it('goes to internet even when no nockBacks are running', done => {
startHttpServer(requestListener).then(server => {
const request = http.request(
{
host: 'localhost',
path: '/',
port: server.address().port,
},
response => {
expect(response.statusCode).to.equal(217)
done()
}
)
request.on('error', () => expect.fail())
request.end()
})
})
it('normal nocks work', testNock)
it('uses recorded fixtures', done => nockBackWithFixture(done, true))
it("goes to internet, doesn't record new fixtures", done => {
const onData = sinon.spy()
const fixture = 'someDryrunFixture.json'
const fixtureLoc = `${nockBack.fixtures}/${fixture}`
expect(fs.existsSync(fixtureLoc)).to.be.false()
nockBack(fixture, () => {
startHttpServer(requestListener).then(server => {
const request = http.request(
{
host: 'localhost',
path: '/',
port: server.address().port,
},
response => {
expect(response.statusCode).to.equal(217)
response.on('data', onData)
response.on('end', () => {
expect(onData).to.have.been.called()
expect(fs.existsSync(fixtureLoc)).to.be.false()
done()
})
}
)
request.on('error', () => expect.fail())
request.end()
})
})
})
it('should throw the expected exception when fs is not available', () => {
const nockBackWithoutFs = proxyquire('../lib/back', { fs: null })
nockBackWithoutFs.setMode('dryrun')
nockBackWithoutFs.fixtures = path.resolve(__dirname, 'fixtures')
expect(() => nockBackWithoutFs('good_request.json')).to.throw('no fs')
})
})
describe('record mode', () => {
let fixture
let fixtureLoc
beforeEach(() => {
// random fixture file so tests don't interfere with each other
const token = crypto.randomBytes(4).toString('hex')
fixture = `temp_${token}.json`
fixtureLoc = path.resolve(__dirname, 'fixtures', fixture)
nockBack.setMode('record')
})
after(() => {
rimraf.sync(path.resolve(__dirname, 'fixtures', 'temp_*.json'))
})
it('should record when configured correctly', done => {
expect(fs.existsSync(fixtureLoc)).to.be.false()
nockBack(fixture, nockDone => {
startHttpServer(requestListener).then(server => {
const request = http.request(
{
host: 'localhost',
path: '/',
port: server.address().port,
},
response => {
nockDone()
expect(response.statusCode).to.equal(217)
expect(fs.existsSync(fixtureLoc)).to.be.true()
done()
}
)
request.on('error', () => expect.fail())
request.end()
})
})
})
it('should record the expected data', done => {
nockBack(fixture, nockDone => {
startHttpServer(requestListener).then(server => {
const request = http.request(
{
host: 'localhost',
path: '/',
port: server.address().port,
method: 'GET',
},
response => {
response.once('end', () => {
nockDone()
const fixtureContent = JSON.parse(
fs.readFileSync(fixtureLoc).toString('utf8')
)
expect(fixtureContent).to.have.length(1)
const [firstFixture] = fixtureContent
expect(firstFixture).to.include({
method: 'GET',
path: '/',
status: 217,
})
done()
})
response.resume()
}
)
request.on('error', err => expect.fail(err.message))
request.end()
})
})
})
// Adding this test because there was an issue when not calling
// nock.activate() after calling nock.restore().
it('can record twice', done => {
expect(fs.existsSync(fixtureLoc)).to.be.false()
nockBack(fixture, function (nockDone) {
startHttpServer(requestListener).then(server => {
const request = http.request(
{
host: 'localhost',
path: '/',
port: server.address().port,
},
response => {
nockDone()
expect(response.statusCode).to.equal(217)
expect(fs.existsSync(fixtureLoc)).to.be.true()
done()
}
)
request.on('error', () => expect.fail())
request.end()
})
})
})
it("shouldn't allow outside calls", done => {
nockBack('wrong_uri.json', nockDone => {
http
.get('http://other.example.test', () => expect.fail())
.on('error', err => {
expect(err.message).to.equal(
'Nock: Disallowed net connect for "other.example.test:80/"'
)
nockDone()
done()
})
})
})
it('should load recorded tests', done => {
nockBack('good_request.json', function (nockDone) {
expect(this.scopes).to.have.lengthOf.at.least(1)
http.get('http://www.example.test/', () => {
this.assertScopesFinished()
nockDone()
done()
})
})
})
it('should filter after recording', done => {
expect(fs.existsSync(fixtureLoc)).to.be.false()
// You would do some filtering here, but for this test we'll just return
// an empty array.
const afterRecord = () => []
nockBack(fixture, { afterRecord }, function (nockDone) {
startHttpServer(requestListener).then(server => {
const request = http.request(
{
host: 'localhost',
path: '/',
port: server.address().port,
},
response => {
nockDone()
expect(response.statusCode).to.equal(217)
expect(fs.existsSync(fixtureLoc)).to.be.true()
expect(this.scopes).to.be.empty()
done()
}
)
request.on('error', () => expect.fail())
request.end()
})
})
})
it('should format after recording', done => {
expect(fs.existsSync(fixtureLoc)).to.be.false()
const afterRecord = () => 'string-response'
nockBack(fixture, { afterRecord }, function (nockDone) {
startHttpServer(requestListener).then(server => {
const request = http.request(
{
host: 'localhost',
path: '/',
port: server.address().port,
},
response => {
nockDone()
expect(response.statusCode).to.equal(217)
expect(fs.existsSync(fixtureLoc)).to.be.true()
expect(fs.readFileSync(fixtureLoc, 'utf8')).to.equal(
'string-response'
)
done()
}
)
request.on('error', () => expect.fail())
request.end()
})
})
})
it('should pass custom options to recorder', done => {
nockBack(
fixture,
{ recorder: { enable_reqheaders_recording: true } },
nockDone => {
startHttpServer(requestListener).then(server => {
const request = http.request(
{
host: 'localhost',
path: '/',
port: server.address().port,
method: 'GET',
},
response => {
response.once('end', () => {
nockDone()
const fixtureContent = JSON.parse(
fs.readFileSync(fixtureLoc).toString('utf8')
)
expect(fixtureContent).to.have.length(1)
expect(fixtureContent[0].reqheaders).to.be.ok()
done()
})
response.resume()
}
)
request.on('error', () => expect.fail())
request.end()
})
}
)
})
it('should throw the expected exception when fs is not available', () => {
const nockBackWithoutFs = proxyquire('../lib/back', { fs: null })
nockBackWithoutFs.setMode('record')
nockBackWithoutFs.fixtures = path.resolve(__dirname, 'fixtures')
expect(() => nockBackWithoutFs('good_request.json')).to.throw('no fs')
})
})
describe('update mode', () => {
let fixture
let fixtureLoc
let fixturePath
beforeEach(() => {
// random fixture file so tests don't interfere with each other
const token = crypto.randomBytes(4).toString('hex')
fixture = `temp_${token}.json`
fixtureLoc = path.resolve(__dirname, 'fixtures', fixture)
fixturePath = path.resolve(__dirname, 'fixtures')
nockBack.setMode('update')
fs.copyFileSync(
path.resolve(fixturePath, 'wrong_uri.json'),
path.resolve(fixturePath, 'temp_wrong_uri.json')
)
})
after(() => {
rimraf.sync(path.resolve(__dirname, 'fixtures', 'temp_*.json'))
})
it('should record when configured correctly', done => {
expect(fs.existsSync(fixtureLoc)).to.be.false()
nockBack(fixture, nockDone => {
startHttpServer(requestListener).then(server => {
const request = http.request(
{
host: 'localhost',
path: '/',
port: server.address().port,
},
response => {
nockDone()
expect(response.statusCode).to.equal(217)
expect(fs.existsSync(fixtureLoc)).to.be.true()
done()
}
)
request.on('error', () => expect.fail())
request.end()
})
})
})
it('should record the expected data', done => {
nockBack(fixture, nockDone => {
startHttpServer(requestListener).then(server => {
const request = http.request(
{
host: 'localhost',
path: '/',
port: server.address().port,
method: 'GET',
},
response => {
response.once('end', () => {
nockDone()
const fixtureContent = JSON.parse(
fs.readFileSync(fixtureLoc).toString('utf8')
)
expect(fixtureContent).to.have.length(1)
const [firstFixture] = fixtureContent
expect(firstFixture).to.include({
method: 'GET',
path: '/',
status: 217,
})
done()
})
response.resume()
}
)
request.on('error', err => expect.fail(err.message))
request.end()
})
})
})
// Adding this test because there was an issue when not calling
// nock.activate() after calling nock.restore().
it('can record twice', done => {
expect(fs.existsSync(fixtureLoc)).to.be.false()
nockBack(fixture, function (nockDone) {
startHttpServer(requestListener).then(server => {
const request = http.request(
{
host: 'localhost',
path: '/',
port: server.address().port,
},
response => {
nockDone()
expect(response.statusCode).to.equal(217)
expect(fs.existsSync(fixtureLoc)).to.be.true()
done()
}
)
request.on('error', () => expect.fail())
request.end()
})
})
})
it('should allow outside calls', done => {
nockBack('temp_wrong_uri.json', nockDone => {
startHttpServer(requestListener).then(server => {
const request = http.request(
{
host: 'localhost',
path: '/',
port: server.address().port,
},
response => {
nockDone()
expect(response.statusCode).to.equal(217)
expect(
fs.existsSync(`${fixturePath}/temp_wrong_uri.json`)
).to.be.true()
done()
}
)
request.on('error', () => expect.fail())
request.end()
})
})
})
it("shouldn't load recorded tests", done => {
fs.copyFileSync(
path.resolve(fixturePath, 'good_request.json'),
path.resolve(fixturePath, 'temp_good_request.json')
)
nockBack('temp_good_request.json', function (nockDone) {
expect(this.scopes).to.have.lengthOf.at.least(0)
http
.get('http://www.example.test/', () => {
expect.fail()
})
.on('error', () => {
nockDone()
done()
})
})
})
it('should filter after recording', done => {
expect(fs.existsSync(fixtureLoc)).to.be.false()
// You would do some filtering here, but for this test we'll just return
// an empty array.
const afterRecord = () => []
nockBack(fixture, { afterRecord }, function (nockDone) {
startHttpServer(requestListener).then(server => {
const request = http.request(
{
host: 'localhost',
path: '/',
port: server.address().port,
},
response => {
nockDone()
expect(response.statusCode).to.equal(217)
expect(fs.existsSync(fixtureLoc)).to.be.true()
expect(this.scopes).to.be.empty()
done()
}
)
request.on('error', () => expect.fail())
request.end()
})
})
})
it('should format after recording', done => {
expect(fs.existsSync(fixtureLoc)).to.be.false()
const afterRecord = () => 'string-response'
nockBack(fixture, { afterRecord }, function (nockDone) {
startHttpServer(requestListener).then(server => {
const request = http.request(
{
host: 'localhost',
path: '/',
port: server.address().port,
},
response => {
nockDone()
expect(response.statusCode).to.equal(217)
expect(fs.existsSync(fixtureLoc)).to.be.true()
expect(fs.readFileSync(fixtureLoc, 'utf8')).to.equal(
'string-response'
)
done()
}
)
request.on('error', () => expect.fail())
request.end()
})
})
})
it('should pass custom options to recorder', done => {
nockBack(
fixture,
{ recorder: { enable_reqheaders_recording: true } },
nockDone => {
startHttpServer(requestListener).then(server => {
const request = http.request(
{
host: 'localhost',
path: '/',
port: server.address().port,
method: 'GET',
},
response => {
response.once('end', () => {
nockDone()
const fixtureContent = JSON.parse(
fs.readFileSync(fixtureLoc).toString('utf8')
)
expect(fixtureContent).to.have.length(1)
expect(fixtureContent[0].reqheaders).to.be.ok()
done()
})
response.resume()
}
)
request.on('error', () => expect.fail())
request.end()
})
}
)
})
it('should throw the expected exception when fs is not available', () => {
const nockBackWithoutFs = proxyquire('../lib/back', { fs: null })
nockBackWithoutFs.setMode('update')
nockBackWithoutFs.fixtures = path.resolve(__dirname, 'fixtures')
expect(() => nockBackWithoutFs('good_request.json')).to.throw('no fs')
})
})
describe('lockdown mode', () => {
beforeEach(() => {
nockBack.setMode('lockdown')
})
it('normal nocks work', testNock)
it('nock back loads scope', done => nockBackWithFixture(done, true))
it('no unnocked http calls work', done => {
const req = http.request(
{
host: 'other.example.test',
path: '/',
},
() => expect.fail('Should not come here!')
)
req.on('error', err => {
expect(err.message.trim()).to.equal(
'Nock: Disallowed net connect for "other.example.test:80/"'
)
done()
})
req.end()
})
})
})
nock-13.2.4/tests/test_back_filters.js 0000664 0000000 0000000 00000006117 14177263367 0017747 0 ustar 00root root 0000000 0000000 'use strict'
const { expect } = require('chai')
const fs = require('fs')
const path = require('path')
const rimraf = require('rimraf')
const got = require('./got_client')
const { startHttpServer } = require('./servers')
const nock = require('../')
const nockBack = nock.back
const originalMode = nockBack.currentMode
const fixturesDir = path.resolve(__dirname, 'fixtures')
const fixtureFilename = 'recording_filters_test.json'
const fixtureFullPath = path.resolve(fixturesDir, fixtureFilename)
const getFixtureContent = () =>
JSON.parse(fs.readFileSync(fixtureFullPath).toString())
describe('nockBack filters', () => {
beforeEach(() => {
nockBack.fixtures = fixturesDir
nockBack.setMode('record')
})
afterEach(() => {
rimraf.sync(fixtureFullPath)
})
it('should pass filteringPath options', async () => {
const server = await startHttpServer()
const nockBackOptions = {
before(scope) {
scope.filteringPath = path =>
path.replace(/timestamp=[0-9]+/, 'timestamp=1111')
},
}
const back1 = await nockBack(fixtureFilename, nockBackOptions)
const response1 = await got(`${server.origin}/?timestamp=1111`)
back1.nockDone()
const fixtureContent = getFixtureContent()
expect(fixtureContent).to.have.lengthOf(1)
expect(fixtureContent[0].path).to.equal('/?timestamp=1111')
const back2 = await nockBack(fixtureFilename, nockBackOptions)
const response2 = await got(`${server.origin}/?timestamp=2222`)
back2.nockDone()
expect(response2.body).to.deep.equal(response1.body)
const fixtureContentReloaded = getFixtureContent()
expect(fixtureContentReloaded).to.have.lengthOf(1)
expect(fixtureContentReloaded[0].path).to.equal('/?timestamp=1111')
})
it('should pass filteringRequestBody options', async () => {
const server = await startHttpServer()
const nockBackOptions = {
before(scope) {
scope.filteringRequestBody = (body, recordedBody) => {
const regExp = /token=[a-z-]+/
const recordedBodyMatched = recordedBody.match(regExp)
if (recordedBodyMatched && regExp.test(body)) {
return body.replace(regExp, recordedBodyMatched[0])
}
return body
}
},
}
const back1 = await nockBack(fixtureFilename, nockBackOptions)
const response1 = await got.post(server.origin, {
form: { token: 'aaa-bbb-ccc' },
})
back1.nockDone()
const fixtureContent = getFixtureContent()
expect(fixtureContent).to.have.lengthOf(1)
expect(fixtureContent[0].body).to.equal('token=aaa-bbb-ccc')
const back2 = await nockBack(fixtureFilename, nockBackOptions)
const response2 = await got.post(server.origin, {
form: { token: 'ddd-eee-fff' },
})
back2.nockDone()
expect(response2.text).to.deep.equal(response1.text)
const fixtureContentReloaded = getFixtureContent()
expect(fixtureContentReloaded).to.have.lengthOf(1)
expect(fixtureContentReloaded[0].body).to.equal('token=aaa-bbb-ccc')
})
it('should be able to reset the mode', () => {
nockBack.setMode(originalMode)
})
})
nock-13.2.4/tests/test_basic_auth.js 0000664 0000000 0000000 00000002710 14177263367 0017414 0 ustar 00root root 0000000 0000000 'use strict'
const { expect } = require('chai')
const assertRejects = require('assert-rejects')
const nock = require('..')
const got = require('./got_client')
describe('basic auth with username and password', () => {
beforeEach(done => {
nock('http://example.test')
.get('/test')
.basicAuth({ user: 'foo', pass: 'bar' })
.reply(200, 'Here is the content')
done()
})
it('succeeds when it matches', async () => {
const response = await got('http://example.test/test', {
username: 'foo',
password: 'bar',
})
expect(response.statusCode).to.equal(200)
expect(response.body).to.equal('Here is the content')
})
it('fails when it doesnt match', async () => {
await assertRejects(
got('http://example.test/test'),
/Nock: No match for request/
)
})
})
describe('basic auth with username only', () => {
beforeEach(done => {
nock('http://example.test')
.get('/test')
.basicAuth({ user: 'foo' })
.reply(200, 'Here is the content')
done()
})
it('succeeds when it matches', async () => {
const response = await got('http://example.test/test', {
username: 'foo',
password: '',
})
expect(response.statusCode).to.equal(200)
expect(response.body).to.equal('Here is the content')
})
it('fails when it doesnt match', async () => {
await assertRejects(
got('http://example.test/test'),
/Nock: No match for request/
)
})
})
nock-13.2.4/tests/test_body_match.js 0000664 0000000 0000000 00000021643 14177263367 0017431 0 ustar 00root root 0000000 0000000 'use strict'
const assertRejects = require('assert-rejects')
const { expect } = require('chai')
const FormData = require('form-data')
const nock = require('../')
const got = require('./got_client')
describe('`matchBody()`', () => {
it('match json body regardless of key ordering', async () => {
const scope = nock('http://example.test')
.post('/', { foo: 'bar', bar: 'foo' })
.reply(200, 'Heyyyy!')
const { body } = await got.post('http://example.test/', {
json: { bar: 'foo', foo: 'bar' },
})
expect(body).to.equal('Heyyyy!')
scope.done()
})
it('match form body regardless of field ordering', async () => {
const scope = nock('http://example.test')
.post('/', { foo: 'bar', bar: 'foo' })
.reply(200, 'Heyyyy!')
const { body } = await got.post('http://example.test/', {
form: { bar: 'foo', foo: 'bar' },
})
expect(body).to.equal('Heyyyy!')
scope.done()
})
it('match json body specified as json string', async () => {
const scope = nock('http://example.test')
.post('/', JSON.stringify({ bar: 'foo', foo: 'bar' }))
.reply(200, 'Heyyyy!')
const { body } = await got.post('http://example.test/', {
json: { bar: 'foo', foo: 'bar' },
})
expect(body).to.equal('Heyyyy!')
scope.done()
})
it('match body is regex trying to match string (matches)', async () => {
const scope = nock('http://example.test').post('/', /abc/).reply(201)
const { statusCode } = await got.post('http://example.test/', {
json: { nested: { value: 'abc' } },
})
expect(statusCode).to.equal(201)
scope.done()
})
it('match body is regex trying to match string (does not match)', async () => {
const scope1 = nock('http://example.test').post('/', /def/).reply(201)
const scope2 = nock('http://example.test').post('/', /./).reply(202)
const { statusCode } = await got.post('http://example.test/', {
json: { nested: { value: 'abc' } },
})
expect(statusCode).to.equal(202)
expect(scope1.isDone()).to.be.false()
scope2.done()
})
it('match body with regex', async () => {
const scope = nock('http://example.test')
.post('/', { auth: { passwd: /a.+/ } })
.reply(200)
const { statusCode } = await got.post('http://example.test', {
json: { auth: { passwd: 'abc' } },
})
expect(statusCode).to.equal(200)
scope.done()
})
it('match body (with space character) with regex', async () => {
const scope = nock('http://example.test').post('/', /a bc/).reply(200)
const { statusCode } = await got.post('http://example.test', {
json: { auth: { passwd: 'a bc' } },
})
expect(statusCode).to.equal(200)
scope.done()
})
it('match body with regex inside array', async () => {
const scope = nock('http://example.test')
.post('/', { items: [{ name: /t.+/ }] })
.reply(200)
const { statusCode } = await got.post('http://example.test', {
json: { items: [{ name: 'test' }] },
})
expect(statusCode).to.equal(200)
scope.done()
})
it('match body with empty object inside', async () => {
const scope = nock('http://example.test').post('/', { obj: {} }).reply(200)
const { statusCode } = await got.post('http://example.test', {
json: { obj: {} },
})
expect(statusCode).to.equal(200)
scope.done()
})
it('match body with nested object inside', async () => {
const scope = nock('http://example.test').post('/', /x/).reply(200)
const { statusCode } = await got.post('http://example.test', {
json: { obj: { x: 1 } },
})
expect(statusCode).to.equal(200)
scope.done()
})
it("doesn't match body with mismatching keys", async () => {
nock('http://example.test').post('/', { a: 'a' }).reply(200)
const request = got.post('http://example.test', {
json: { a: 'a', b: 'b' },
})
await assertRejects(request, /Nock: No match for request/)
})
// https://github.com/nock/nock/issues/1713
it("doesn't match body with same number of keys but different keys", async () => {
nock('http://example.test').post('/', { a: {} }).reply()
const request = got.post('http://example.test', { json: { b: 123 } })
await assertRejects(request, /Nock: No match for request/)
})
it('match body with form multipart', async () => {
const form = new FormData()
const boundary = form.getBoundary()
form.append('field', 'value')
const scope = nock('http://example.test')
.post(
'/',
`--${boundary}\r\nContent-Disposition: form-data; name="field"\r\n\r\nvalue\r\n--${boundary}--\r\n`
)
.reply(200)
const { statusCode } = await got.post('http://example.test', { body: form })
expect(statusCode).to.equal(200)
scope.done()
})
it('array like urlencoded form posts are correctly parsed', async () => {
const scope = nock('http://example.test')
.post('/', {
arrayLike: [
{
fieldA: '0',
fieldB: 'data',
fieldC: 'value',
},
],
})
.reply()
const { statusCode } = await got.post('http://example.test', {
form: {
'arrayLike[0].fieldA': '0',
'arrayLike[0].fieldB': 'data',
'arrayLike[0].fieldC': 'value',
},
})
expect(statusCode).to.equal(200)
scope.done()
})
// This test pokes at an inherent shortcoming of URL encoded form data. "technically" form data values
// can ONLY be strings. However, years of HTML abuse have lead to non-standard ways of handling more complex data.
// https://url.spec.whatwg.org/#urlencoded-serializing
// > The application/x-www-form-urlencoded format is in many ways an aberrant monstrosity...
// Mikeal's Request uses `querystring` by default, optionally `qs` or `form-data`. Got uses `URLSearchParams`.
// All of which handle "arrays" as values differently.
// Nock uses `querystring`, as the consensus seems to be that it's the most widely used and intuitive, but it means
// this test only passes with Got if the array is stringified.
it('urlencoded form posts are matched with non-string values', async () => {
const scope = nock('http://example.test')
.post('/', {
boolean: true,
number: 1,
values: 'false,-1,test',
})
.reply()
const { statusCode } = await got.post('http://example.test', {
// "body": "boolean=true&number=1&values=false%2C-1%2Ctest"
form: {
boolean: true,
number: 1,
values: [false, -1, 'test'],
},
})
expect(statusCode).to.equal(200)
scope.done()
})
it('urlencoded form posts are matched with regexp', async () => {
const scope = nock('http://example.test')
.post('/', {
regexp: /^xyz$/,
})
.reply()
const { statusCode } = await got.post('http://example.test', {
form: {
regexp: 'xyz',
},
})
expect(statusCode).to.equal(200)
scope.done()
})
it('match utf-8 buffer body with utf-8 buffer', async () => {
const scope = nock('http://example.test')
.post('/', Buffer.from('hello'))
.reply(200)
const { statusCode } = await got.post('http://example.test', {
body: Buffer.from('hello'),
})
expect(statusCode).to.equal(200)
scope.done()
})
it("doesn't match utf-8 buffer body with mismatching utf-8 buffer", async () => {
nock('http://example.test').post('/', Buffer.from('goodbye')).reply(200)
const request = got.post('http://example.test', {
body: Buffer.from('hello'),
})
await assertRejects(request, /Nock: No match for request/)
})
it('match binary buffer body with binary buffer', async () => {
const scope = nock('http://example.test')
.post('/', Buffer.from([0xff, 0xff, 0xff]))
.reply(200)
const { statusCode } = await got.post('http://example.test', {
body: Buffer.from([0xff, 0xff, 0xff]),
})
expect(statusCode).to.equal(200)
scope.done()
})
it("doesn't match binary buffer body with mismatching binary buffer", async () => {
nock('http://example.test')
.post('/', Buffer.from([0xff, 0xff, 0xfa]))
.reply(200)
const request = got.post('http://example.test', {
body: Buffer.from([0xff, 0xff, 0xff]),
})
await assertRejects(request, /Nock: No match for request/)
})
it("doesn't match binary buffer body with mismatching utf-8 buffer", async () => {
nock('http://example.test')
.post('/', Buffer.from([0xff, 0xff, 0xff]))
.reply(200)
const request = got.post('http://example.test', {
body: Buffer.from('hello'),
})
await assertRejects(request, /Nock: No match for request/)
})
it("doesn't match utf-8 buffer body with mismatching binary buffer", async () => {
nock('http://example.test').post('/', Buffer.from('hello')).reply(200)
const request = got.post('http://example.test', {
body: Buffer.from([0xff, 0xff, 0xff]),
})
await assertRejects(request, /Nock: No match for request/)
})
})
nock-13.2.4/tests/test_client_request.js 0000664 0000000 0000000 00000006162 14177263367 0020345 0 ustar 00root root 0000000 0000000 'use strict'
const { expect } = require('chai')
const http = require('http')
const sinon = require('sinon')
const nock = require('..')
const { startHttpServer } = require('./servers')
// Because `Got` makes use of the `http(s).request` convenience function, it can not be used during these tests.
describe('Direct use of `ClientRequest`', () => {
it('should intercept GET requests', done => {
const dataSpy = sinon.spy()
const scope = nock('http://example.test').get('/dsad').reply(202, 'HEHE!')
const req = new http.ClientRequest({
host: 'example.test',
path: '/dsad',
})
req.on('response', function (res) {
expect(res.statusCode).to.equal(202)
res.on('end', function () {
expect(dataSpy).to.have.been.calledOnce()
scope.done()
done()
})
res.on('data', function (data) {
dataSpy()
expect(data).to.be.instanceof(Buffer)
expect(data.toString()).to.equal('HEHE!')
})
})
req.end()
})
it('should intercept POST requests', done => {
const dataSpy = sinon.spy()
const scope = nock('http://example.test')
.post('/posthere/please', 'heyhey this is the body')
.reply(201, 'DOOONE!')
const req = new http.ClientRequest({
host: 'example.test',
path: '/posthere/please',
method: 'POST',
})
req.write('heyhey this is the body')
req.on('response', function (res) {
expect(res.statusCode).to.equal(201)
res.on('end', function () {
expect(dataSpy).to.have.been.calledOnce()
scope.done()
done()
})
res.on('data', function (data) {
dataSpy()
expect(data).to.be.instanceof(Buffer)
expect(data.toString()).to.equal('DOOONE!')
})
})
req.end()
})
it('should execute optional callback', done => {
const scope = nock('http://example.test').get('/').reply(201)
const reqOpts = {
host: 'example.test',
path: '/',
method: 'GET',
}
const req = new http.ClientRequest(reqOpts, res => {
expect(res.statusCode).to.equal(201)
scope.done()
done()
})
req.end()
})
it('should throw an expected error when creating with empty options', () => {
expect(() => new http.ClientRequest()).to.throw(
'Creating a ClientRequest with empty `options` is not supported in Nock'
)
})
it('should pass thru a live request when no interceptors and net connect is allowed', async () => {
const { origin } = await startHttpServer((request, response) => {
response.writeHead(201)
response.end()
})
const req = new http.ClientRequest(origin)
await new Promise(resolve => {
req.on('response', res => {
expect(res.statusCode).to.equal(201)
resolve()
})
req.end()
})
})
it('should emit an expected error when no interceptors and net connect is disallowed', done => {
nock.disableNetConnect()
new http.ClientRequest({ port: 12345, path: '/' }).on('error', err => {
expect(err.message).to.equal(
'Nock: Disallowed net connect for "localhost:12345/"'
)
done()
})
})
})
nock-13.2.4/tests/test_common.js 0000664 0000000 0000000 00000036030 14177263367 0016604 0 ustar 00root root 0000000 0000000 'use strict'
// Nock's strategy is to test as much as possible either through the public API
// or, when that is not possible, through the mock surface.
//
// Whenever tests can be written against the public API or the mock surface, do
// that rather than add tests here.
//
// This helps ensure that the code in the common module stays tight, and that
// it's all necessary for handling the supported use cases. The project enforces
// 100% test coverage, so when utility code falls out of test, we know it's time
// to remove it.
const http = require('http')
const { expect } = require('chai')
const sinon = require('sinon')
const semver = require('semver')
const nock = require('..')
const common = require('../lib/common')
const matchBody = require('../lib/match_body')
// match_body has its own test file that tests the functionality from the API POV.
// Since it's not in common.js does it make more sense for these six unit tests to move into that file?
describe('Body Match', () => {
describe('unit', () => {
it('ignores new line characters from strings', () => {
const result = matchBody(
{},
'something //here is something more \n',
'something //here is something more \n\r'
)
expect(result).to.equal(true)
})
it("when spec is a function, it's called with newline characters intact", () => {
const exampleBody = 'something //here is something more \n'
const matchCbSpy = sinon.spy()
matchBody({}, matchCbSpy, exampleBody)
expect(matchCbSpy).to.have.been.calledOnceWithExactly(exampleBody)
})
it('should not throw, when headers come node-fetch style as array', () => {
const result = matchBody(
{ headers: { 'Content-Type': ['multipart/form-data;'] } },
{},
'test'
)
expect(result).to.equal(false)
})
it("should not ignore new line characters from strings when Content-Type contains 'multipart'", () => {
const result = matchBody(
{ headers: { 'Content-Type': 'multipart/form-data;' } },
'something //here is something more \nHello',
'something //here is something more \nHello'
)
expect(result).to.equal(true)
})
it("should not ignore new line characters from strings when Content-Type contains 'multipart' (arrays come node-fetch style as array)", () => {
const result = matchBody(
{ headers: { 'Content-Type': ['multipart/form-data;'] } },
'something //here is something more \nHello',
'something //here is something more \nHello'
)
expect(result).to.equal(true)
})
it('should use strict equality for deep comparisons', () => {
const result = matchBody({}, { number: 1 }, '{"number": "1"}')
expect(result).to.equal(false)
})
})
})
describe('`normalizeRequestOptions()`', () => {
it('should normalize hosts with port', () => {
const result = common.normalizeRequestOptions({
host: 'example.test:12345',
port: 12345,
})
const expected = {
host: 'example.test:12345',
hostname: 'example.test',
port: 12345,
proto: 'http',
}
expect(result).to.deep.equal(expected)
})
it('should normalize hosts without port', () => {
const result = common.normalizeRequestOptions({
hostname: 'example.test',
})
const expected = {
host: 'example.test:80',
hostname: 'example.test',
port: 80,
proto: 'http',
}
expect(result).to.deep.equal(expected)
})
it('should not error and add defaults for empty options', () => {
const result = common.normalizeRequestOptions({})
const expected = {
host: 'localhost:80',
// Should this be included?
// hostname: 'localhost'
port: 80,
proto: 'http',
}
expect(result).to.deep.equal(expected)
})
})
describe('`isUtf8Representable()`', () => {
it("should return false for buffers that aren't utf8 representable", () => {
expect(common.isUtf8Representable(Buffer.from('8001', 'hex'))).to.equal(
false
)
})
it('should returns true for buffers containing strings', () => {
expect(common.isUtf8Representable(Buffer.from('8001', 'utf8'))).to.equal(
true
)
})
})
it('`isJSONContent()`', () => {
expect(common.isJSONContent({ 'content-type': 'application/json' })).to.equal(
true
)
expect(
common.isJSONContent({ 'content-type': 'application/json; charset=utf-8' })
).to.equal(true)
expect(common.isJSONContent({ 'content-type': 'text/plain' })).to.equal(false)
})
describe('`headersFieldNamesToLowerCase()`', () => {
it('should return a lower-cased copy of the input', () => {
const input = {
HoSt: 'example.test',
'Content-typE': 'plain/text',
}
const inputClone = { ...input }
const result = common.headersFieldNamesToLowerCase(input, true)
const expected = {
host: 'example.test',
'content-type': 'plain/text',
}
expect(result).to.deep.equal(expected)
expect(input).to.deep.equal(inputClone) // assert the input is not mutated
})
it('throws on conflicting keys', () => {
expect(() =>
common.headersFieldNamesToLowerCase(
{
HoSt: 'example.test',
HOST: 'example.test',
},
true
)
).to.throw(
'Failed to convert header keys to lower case due to field name conflict: host'
)
})
})
describe('`headersFieldsArrayToLowerCase()`', () => {
it('should work on arrays', () => {
// Sort for comparison because order doesn't matter.
const result = common
.headersFieldsArrayToLowerCase(['HoSt', 'Content-typE'])
.sort()
expect(result).to.deep.equal(['content-type', 'host'])
})
it('should de-duplicate arrays', () => {
// Sort for comparison because order doesn't matter.
const result = common
.headersFieldsArrayToLowerCase([
'hosT',
'HoSt',
'Content-typE',
'conTenT-tYpe',
])
.sort()
expect(result).to.deep.equal(['content-type', 'host'])
})
})
describe('`deleteHeadersField()`', () => {
it('should delete fields with case-insensitive field names', () => {
// Prepare.
const headers = {
HoSt: 'example.test',
'Content-typE': 'plain/text',
}
// Confidence check.
expect(headers).to.have.property('HoSt')
expect(headers).to.have.property('Content-typE')
// Act.
common.deleteHeadersField(headers, 'HOST')
common.deleteHeadersField(headers, 'CONTENT-TYPE')
// Assert.
expect(headers).to.not.have.property('HoSt')
expect(headers).to.not.have.property('Content-typE')
})
it('should remove multiple fields with same case-insensitive names', () => {
const headers = {
foo: 'one',
FOO: 'two',
'X-Foo': 'three',
}
common.deleteHeadersField(headers, 'foo')
expect(headers).to.deep.equal({ 'X-Foo': 'three' })
})
it('should throw for invalid headers', () => {
expect(() => common.deleteHeadersField('foo', 'Content-Type')).to.throw(
'headers must be an object'
)
})
it('should throw for invalid field name', () => {
expect(() => common.deleteHeadersField({}, /cookie/)).to.throw(
'field name must be a string'
)
})
})
describe('`matchStringOrRegexp()`', () => {
it('should match if pattern is string and target matches', () => {
const result = common.matchStringOrRegexp('to match', 'to match')
expect(result).to.equal(true)
})
it("should not match if pattern is string and target doesn't match", () => {
const result = common.matchStringOrRegexp('to match', 'not to match')
expect(result).to.equal(false)
})
it('should match pattern is number and target matches', () => {
const result = common.matchStringOrRegexp(123, 123)
expect(result).to.equal(true)
})
it('should handle undefined target when pattern is string', () => {
const result = common.matchStringOrRegexp(undefined, 'to not match')
expect(result).to.equal(false)
})
it('should handle undefined target when pattern is regex', () => {
const result = common.matchStringOrRegexp(undefined, /not/)
expect(result).to.equal(false)
})
it('should match if pattern is regex and target matches', () => {
const result = common.matchStringOrRegexp('to match', /match/)
expect(result).to.equal(true)
})
it("should not match if pattern is regex and target doesn't match", () => {
const result = common.matchStringOrRegexp('to match', /not/)
expect(result).to.equal(false)
})
})
describe('`overrideRequests()`', () => {
afterEach(() => {
common.restoreOverriddenRequests()
})
it('should throw if called a second time', () => {
nock.restore()
common.overrideRequests()
// Second call throws.
expect(() => common.overrideRequests()).to.throw(
"Module's request already overridden for http protocol."
)
})
})
it('`restoreOverriddenRequests()` can be called more than once', () => {
common.restoreOverriddenRequests()
common.restoreOverriddenRequests()
})
describe('`stringifyRequest()`', () => {
it('should include non-default ports', () => {
const options = {
method: 'GET',
port: 3000,
proto: 'http',
hostname: 'example.test',
path: '/',
headers: {},
}
const result = common.stringifyRequest(options, 'foo')
// We have to parse the object instead of comparing the raw string because the order of keys are not guaranteed.
expect(JSON.parse(result)).to.deep.equal({
method: 'GET',
url: 'http://example.test:3000/',
headers: {},
body: 'foo',
})
})
it('should not include default http port', () => {
const options = {
method: 'GET',
port: 80,
proto: 'http',
hostname: 'example.test',
path: '/',
headers: {},
}
const result = common.stringifyRequest(options, 'foo')
expect(JSON.parse(result)).to.deep.equal({
method: 'GET',
url: 'http://example.test/',
headers: {},
body: 'foo',
})
})
it('should not include default https port', () => {
const options = {
method: 'POST',
port: 443,
proto: 'https',
hostname: 'example.test',
path: '/the/path',
headers: {},
}
const result = common.stringifyRequest(options, 'foo')
expect(JSON.parse(result)).to.deep.equal({
method: 'POST',
url: 'https://example.test/the/path',
headers: {},
body: 'foo',
})
})
it('should default optional options', () => {
const options = {
port: 80,
proto: 'http',
hostname: 'example.test',
headers: {},
}
const result = common.stringifyRequest(options, 'foo')
expect(JSON.parse(result)).to.deep.equal({
method: 'GET',
url: 'http://example.test',
headers: {},
body: 'foo',
})
})
it('should pass headers through', () => {
const options = {
method: 'GET',
port: 80,
proto: 'http',
hostname: 'example.test',
path: '/',
headers: { cookie: 'fiz=baz', 'set-cookie': ['hello', 'world'] },
}
const result = common.stringifyRequest(options, 'foo')
expect(JSON.parse(result)).to.deep.equal({
method: 'GET',
url: 'http://example.test/',
headers: { cookie: 'fiz=baz', 'set-cookie': ['hello', 'world'] },
body: 'foo',
})
})
it('should always treat the body as a string', () => {
const options = {
method: 'GET',
port: 80,
proto: 'http',
hostname: 'example.test',
path: '/',
headers: {},
}
const result = common.stringifyRequest(options, '{"hello":"world"}')
expect(JSON.parse(result)).to.deep.equal({
method: 'GET',
url: 'http://example.test/',
headers: {},
body: '{"hello":"world"}',
})
})
})
it('`headersArrayToObject()`', () => {
const headers = [
'Content-Type',
'application/json; charset=utf-8',
'Last-Modified',
'foobar',
'Expires',
'fizbuzz',
]
expect(common.headersArrayToObject(headers)).to.deep.equal({
'content-type': 'application/json; charset=utf-8',
'last-modified': 'foobar',
expires: 'fizbuzz',
})
const headersMultipleSetCookies = headers.concat([
'Set-Cookie',
'foo=bar; Domain=.github.com; Path=/',
'Set-Cookie',
'fiz=baz; Domain=.github.com; Path=/',
'set-cookie',
'foo=baz; Domain=.github.com; Path=/',
])
expect(common.headersArrayToObject(headersMultipleSetCookies)).to.deep.equal({
'content-type': 'application/json; charset=utf-8',
'last-modified': 'foobar',
expires: 'fizbuzz',
'set-cookie': [
'foo=bar; Domain=.github.com; Path=/',
'fiz=baz; Domain=.github.com; Path=/',
'foo=baz; Domain=.github.com; Path=/',
],
})
expect(() => common.headersArrayToObject(123)).to.throw(
'Expected a header array'
)
})
it('`percentEncode()` encodes extra reserved characters', () => {
expect(common.percentEncode('foo+(*)!')).to.equal('foo%2B%28%2A%29%21')
})
describe('`normalizeClientRequestArgs()`', () => {
it('should throw for invalid URL', () => {
// See https://github.com/nodejs/node/pull/38614 release in node v16.2.0
const isNewErrorText = semver.gte(process.versions.node, '16.2.0')
const errorText = isNewErrorText ? 'Invalid URL' : 'example.test'
// no schema
expect(() => http.get('example.test')).to.throw(TypeError, errorText)
})
it('can include auth info', async () => {
const scope = nock('http://example.test')
.get('/')
.basicAuth({ user: 'user', pass: 'pw' })
.reply()
http.get('http://user:pw@example.test')
scope.isDone()
})
it('should handle a single callback', async () => {
// TODO: Only passing a callback isn't currently supported by Nock,
// but should be in the future as Node allows it.
const cb = () => {}
const { options, callback } = common.normalizeClientRequestArgs(cb)
expect(options).to.deep.equal({})
expect(callback).to.equal(cb)
})
})
describe('`dataEqual()`', () => {
it('treats explicit and implicit undefined object values as equal', () => {
const result = common.dataEqual({ a: 'a', b: undefined }, { a: 'a' })
expect(result).to.equal(true)
})
it('does not conflate object and array keys', () => {
const result = common.dataEqual(['a', 'b'], { 0: 'a', 1: 'b' })
expect(result).to.equal(false)
})
it('treats JSON path notated and nested objects as equal', () => {
const result = common.dataEqual(
{ 'foo[bar][0]': 'baz' },
{ foo: { bar: ['baz'] } }
)
expect(result).to.equal(true)
})
it('does not equate arrays of different length', () => {
const result = common.dataEqual(['a'], ['a', 'b'])
expect(result).to.equal(false)
})
})
it('testing timers are deleted correctly', done => {
const timeoutSpy = sinon.spy()
const intervalSpy = sinon.spy()
const immediateSpy = sinon.spy()
common.setTimeout(timeoutSpy, 0)
common.setInterval(intervalSpy, 0)
common.setImmediate(immediateSpy)
common.removeAllTimers()
setImmediate(() => {
expect(timeoutSpy).to.not.have.been.called()
expect(intervalSpy).to.not.have.been.called()
expect(immediateSpy).to.not.have.been.called()
done()
})
})
nock-13.2.4/tests/test_content_encoding.js 0000664 0000000 0000000 00000002341 14177263367 0020632 0 ustar 00root root 0000000 0000000 'use strict'
const { expect } = require('chai')
const zlib = require('zlib')
const nock = require('..')
const got = require('./got_client')
describe('Content Encoding', () => {
it('should accept gzipped content', async () => {
const message = 'Lorem ipsum dolor sit amet'
const compressed = zlib.gzipSync(message)
const scope = nock('http://example.test')
.get('/foo')
.reply(200, compressed, {
'X-Transfer-Length': String(compressed.length),
'Content-Length': undefined,
'Content-Encoding': 'gzip',
})
const { body, statusCode } = await got('http://example.test/foo')
expect(statusCode).to.equal(200)
expect(body).to.equal(message)
scope.done()
})
it('Delaying the body works with content encoded responses', async () => {
const message = 'Lorem ipsum dolor sit amet'
const compressed = zlib.gzipSync(message)
const scope = nock('http://example.test')
.get('/')
.delay({
body: 100,
})
.reply(200, compressed, {
'Content-Encoding': 'gzip',
})
const { statusCode, body } = await got('http://example.test/')
expect(statusCode).to.equal(200)
expect(body).to.equal(message)
scope.done()
})
})
nock-13.2.4/tests/test_default_reply_headers.js 0000664 0000000 0000000 00000012213 14177263367 0021643 0 ustar 00root root 0000000 0000000 'use strict'
const { expect } = require('chai')
const nock = require('..')
const got = require('./got_client')
describe('`defaultReplyHeaders()`', () => {
it('when no headers are specified on the request, default reply headers work', async () => {
nock('http://example.test')
.defaultReplyHeaders({
'X-Powered-By': 'Meeee',
'X-Another-Header': ['foo', 'bar'],
})
.get('/')
.reply(200, '')
const { headers, rawHeaders } = await got('http://example.test/')
expect(headers).to.deep.equal({
'x-powered-by': 'Meeee',
'x-another-header': 'foo, bar',
})
expect(rawHeaders).to.deep.equal([
'X-Powered-By',
'Meeee',
'X-Another-Header',
['foo', 'bar'],
])
})
it('default reply headers can be provided as a raw array', async () => {
const defaultHeaders = [
'X-Powered-By',
'Meeee',
'X-Another-Header',
['foo', 'bar'],
]
nock('http://example.test')
.defaultReplyHeaders(defaultHeaders)
.get('/')
.reply(200, '')
const { headers, rawHeaders } = await got('http://example.test/')
expect(headers).to.deep.equal({
'x-powered-by': 'Meeee',
'x-another-header': 'foo, bar',
})
expect(rawHeaders).to.deep.equal(defaultHeaders)
})
it('default reply headers can be provided as a Map', async () => {
const defaultHeaders = new Map([
['X-Powered-By', 'Meeee'],
['X-Another-Header', ['foo', 'bar']],
])
nock('http://example.test')
.defaultReplyHeaders(defaultHeaders)
.get('/')
.reply(200, '')
const { headers, rawHeaders } = await got('http://example.test/')
expect(headers).to.deep.equal({
'x-powered-by': 'Meeee',
'x-another-header': 'foo, bar',
})
expect(rawHeaders).to.deep.equal([
'X-Powered-By',
'Meeee',
'X-Another-Header',
['foo', 'bar'],
])
})
it('when headers are specified on the request, they override default reply headers', async () => {
nock('http://example.test')
.defaultReplyHeaders({
'X-Powered-By': 'Meeee',
'X-Another-Header': 'Hey man!',
})
.get('/')
.reply(200, '', { A: 'b' })
const { headers } = await got('http://example.test/')
expect(headers).to.deep.equal({
'x-powered-by': 'Meeee',
'x-another-header': 'Hey man!',
a: 'b',
})
})
it('default reply headers as functions work', async () => {
const date = new Date().toUTCString()
const message = 'A message.'
nock('http://example.test')
.defaultReplyHeaders({
'Content-Length': (req, res, body) => body.length,
Date: () => date,
Foo: () => 'foo',
})
.get('/')
.reply(200, message, { foo: 'bar' })
const { headers } = await got('http://example.test')
expect(headers).to.deep.equal({
'content-length': message.length.toString(),
date,
foo: 'bar',
})
})
it('reply should not cause an error on header conflict', async () => {
const scope = nock('http://example.test').defaultReplyHeaders({
'content-type': 'application/json',
})
scope.get('/').reply(200, '', {
'Content-Type': 'application/xml',
})
const { statusCode, headers, body } = await got('http://example.test/')
expect(statusCode).to.equal(200)
expect(headers['content-type']).to.equal('application/xml')
expect(body).to.equal('')
})
it('direct reply headers override defaults when casing differs', async () => {
const scope = nock('http://example.test')
.defaultReplyHeaders({
'X-Default-Only': 'default',
'X-Overridden': 'default',
})
.get('/')
.reply(200, 'Success!', {
'X-Reply-Only': 'from-reply',
'x-overridden': 'from-reply',
})
const { headers, rawHeaders } = await got('http://example.test/')
expect(headers).to.deep.equal({
'x-default-only': 'default',
'x-reply-only': 'from-reply',
'x-overridden': 'from-reply', // note this overrode the default value, despite the case difference
})
expect(rawHeaders).to.deep.equal([
'X-Reply-Only',
'from-reply',
'x-overridden',
'from-reply',
'X-Default-Only',
'default',
// note 'X-Overridden' from the defaults is not included
])
scope.done()
})
it('dynamic reply headers override defaults when casing differs', async () => {
const scope = nock('http://example.test')
.defaultReplyHeaders({
'X-Default-Only': 'default',
'X-Overridden': 'default',
})
.get('/')
.reply(() => [
200,
'Success!',
{
'X-Reply-Only': 'from-reply',
'x-overridden': 'from-reply',
},
])
const { headers, rawHeaders } = await got('http://example.test/')
expect(headers).to.deep.equal({
'x-default-only': 'default',
'x-reply-only': 'from-reply',
'x-overridden': 'from-reply',
})
expect(rawHeaders).to.deep.equal([
'X-Reply-Only',
'from-reply',
'x-overridden',
'from-reply',
'X-Default-Only',
'default',
])
scope.done()
})
})
nock-13.2.4/tests/test_define.js 0000664 0000000 0000000 00000015022 14177263367 0016544 0 ustar 00root root 0000000 0000000 'use strict'
const http = require('http')
const { expect } = require('chai')
const assertRejects = require('assert-rejects')
const nock = require('..')
const got = require('./got_client')
describe('`define()`', () => {
it('is backward compatible', async () => {
expect(
nock.define([
{
scope: 'http://example.test',
// "port" has been deprecated
port: 12345,
method: 'GET',
path: '/',
// "reply" has been deprecated
reply: '500',
},
])
).to.be.ok()
await assertRejects(
got('http://example.test:12345/'),
({ response: { statusCode } }) => {
expect(statusCode).to.equal(500)
return true
}
)
})
it('throws when reply is not a numeric string', () => {
expect(() =>
nock.define([
{
scope: 'http://example.test:1451',
method: 'GET',
path: '/',
reply: 'frodo',
},
])
).to.throw('`reply`, when present, must be a numeric string')
})
it('applies default status code when none is specified', async () => {
const body = '�'
expect(
nock.define([
{
scope: 'http://example.test',
method: 'POST',
path: '/',
body,
response: '�',
},
])
).to.have.lengthOf(1)
const { statusCode } = await got.post('http://example.test/', { body })
expect(statusCode).to.equal(200)
})
it('works when scope and port are both specified', async () => {
const body = 'Hello, world!'
expect(
nock.define([
{
scope: 'http://example.test:1451',
port: 1451,
method: 'POST',
path: '/',
body,
response: '�',
},
])
).to.be.ok()
const { statusCode } = await got.post('http://example.test:1451/', { body })
expect(statusCode).to.equal(200)
})
it('throws the expected error when scope and port conflict', () => {
expect(() =>
nock.define([
{
scope: 'http://example.test:8080',
port: 5000,
method: 'POST',
path: '/',
body: 'Hello, world!',
response: '�',
},
])
).to.throw(
'Mismatched port numbers in scope and port properties of nock definition.'
)
})
it('throws the expected error when method is missing', () => {
expect(() =>
nock.define([
{
scope: 'http://example.test',
path: '/',
body: 'Hello, world!',
response: 'yo',
},
])
).to.throw('Method is required')
})
it('works with non-JSON responses', async () => {
const exampleBody = '�'
const exampleResponseBody = 'hey: �'
expect(
nock.define([
{
scope: 'http://example.test',
method: 'POST',
path: '/',
body: exampleBody,
status: 200,
response: exampleResponseBody,
},
])
).to.be.ok()
const { statusCode, body } = await got.post('http://example.test/', {
body: exampleBody,
responseType: 'buffer',
})
expect(statusCode).to.equal(200)
expect(body).to.be.an.instanceOf(Buffer)
expect(body.toString()).to.equal(exampleResponseBody)
})
// TODO: There seems to be a bug here. When testing via `got` with
// `{ encoding: false }` the body that comes back should be a buffer, but is
// not. It's difficult to get this test to pass after porting it.
// I think this bug has been fixed in Got v10, so this should be unblocked.
it('works with binary buffers', done => {
const exampleBody = '8001'
const exampleResponse = '8001'
expect(
nock.define([
{
scope: 'http://example.test',
method: 'POST',
path: '/',
body: exampleBody,
status: 200,
response: exampleResponse,
},
])
).to.be.ok()
const req = http.request(
{
host: 'example.test',
method: 'POST',
path: '/',
},
res => {
expect(res.statusCode).to.equal(200)
const dataChunks = []
res.on('data', chunk => {
dataChunks.push(chunk)
})
res.once('end', () => {
const response = Buffer.concat(dataChunks)
expect(response.toString('hex')).to.equal(exampleResponse)
done()
})
}
)
req.on('error', () => {
// This should never happen.
expect.fail()
done()
})
req.write(Buffer.from(exampleBody, 'hex'))
req.end()
})
it('uses reqheaders', done => {
const auth = 'foo:bar'
const authHeader = `Basic ${Buffer.from('foo:bar').toString('base64')}`
const reqheaders = {
host: 'example.test',
authorization: authHeader,
}
expect(
nock.define([
{
scope: 'http://example.test',
method: 'GET',
path: '/',
status: 200,
reqheaders,
},
])
).to.be.ok()
// Make a request which should match the mock that was configured above.
// This does not hit the network.
const req = http.request(
{
host: 'example.test',
method: 'GET',
path: '/',
auth,
},
res => {
expect(res.statusCode).to.equal(200)
res.once('end', () => {
expect(res.req.getHeaders(), reqheaders)
done()
})
// Streams start in 'paused' mode and must be started.
// See https://nodejs.org/api/stream.html#stream_class_stream_readable
res.resume()
}
)
req.end()
})
it('uses badheaders', done => {
expect(
nock.define([
{
scope: 'http://example.test',
method: 'GET',
path: '/',
status: 401,
badheaders: ['x-foo'],
},
{
scope: 'http://example.test',
method: 'GET',
path: '/',
status: 200,
reqheaders: {
'x-foo': 'bar',
},
},
])
).to.be.ok()
const req = http.request(
{
host: 'example.test',
method: 'GET',
path: '/',
headers: {
'x-foo': 'bar',
},
},
res => {
expect(res.statusCode).to.equal(200)
res.once('end', () => {
done()
})
// Streams start in 'paused' mode and must be started.
// See https://nodejs.org/api/stream.html#stream_class_stream_readable
res.resume()
}
)
req.end()
})
})
nock-13.2.4/tests/test_delay.js 0000664 0000000 0000000 00000027162 14177263367 0016420 0 ustar 00root root 0000000 0000000 'use strict'
const fs = require('fs')
const { expect } = require('chai')
const path = require('path')
const http = require('http')
const stream = require('stream')
const assertRejects = require('assert-rejects')
const sinon = require('sinon')
const nock = require('..')
const got = require('./got_client')
const textFilePath = path.resolve(__dirname, './assets/reply_file_1.txt')
const textFileContents = fs.readFileSync(textFilePath, { encoding: 'utf8' })
async function resolvesInAtLeast(promise, durationMillis) {
const startTime = process.hrtime()
const result = await promise
checkDuration(startTime, durationMillis)
return result
}
function checkDuration(start, durationMillis) {
const hrtime = process.hrtime(start)
const milliseconds = ((hrtime[0] * 1e9 + hrtime[1]) / 1e6) | 0
// When asserting delays, we know the code should take at least the delay amount of time to execute,
// however, the overhead of running the code adds a few milliseconds to anything we are testing.
// We'd like to test some sort of upper bound too, but that has been problematic with different systems
// having a wide rage of overhead.
// We've also seen discrepancies with timings that sometimes result in the passed milliseconds
// being one shy of the expected duration. Subtracting 5ms makes it more resilient.
// https://github.com/nock/nock/issues/2045
// TODO: find a better way to test delays while ensuring the delays aren't too long.
expect(milliseconds).to.be.at.least(
durationMillis - 5,
'delay minimum not satisfied'
)
// .and.at.most(durationMillis + bufferMillis, 'delay upper bound exceeded')
}
describe('`delay()`', () => {
let interceptor
let connSpy
let bodySpy
// As a rule, the tests in this repo have a strategy of only testing the API and not spying on
// internals for unit tests. These next few tests break that rule to assert the proxy behavior of
// `delay()`. This is simply to reduce the need of double testing the behavior of `delayBody()`
// and `delayConnection()` and should not be used as an example for writing new tests.
beforeEach(() => {
interceptor = nock('http://example.test').get('/')
connSpy = sinon.spy(interceptor, 'delayConnection')
bodySpy = sinon.spy(interceptor, 'delayBody')
})
it('should proxy a single number argument', () => {
interceptor.delay(42)
expect(connSpy).to.have.been.calledOnceWithExactly(42)
expect(bodySpy).to.have.been.calledOnceWithExactly(0)
})
it('should proxy values from an object argument', () => {
interceptor.delay({ head: 42, body: 17 })
expect(connSpy).to.have.been.calledOnceWithExactly(42)
expect(bodySpy).to.have.been.calledOnceWithExactly(17)
})
it('should default missing values from an object argument', () => {
interceptor.delay({})
expect(connSpy).to.have.been.calledOnceWithExactly(0)
expect(bodySpy).to.have.been.calledOnceWithExactly(0)
})
it('should throw on invalid arguments', () => {
expect(() => interceptor.delay('one million seconds')).to.throw(
'Unexpected input'
)
})
it('should delay the response when called with "body" and "head"', done => {
nock('http://example.test')
.get('/')
.delay({
head: 200,
body: 300,
})
.reply(200, 'OK')
const start = process.hrtime()
http.get('http://example.test', res => {
checkDuration(start, 200)
res.once('data', function (data) {
checkDuration(start, 500)
expect(data.toString()).to.equal('OK')
res.once('end', done)
})
})
})
})
describe('`delayBody()`', () => {
it('should delay the clock between the `response` event and the first `data` event', done => {
nock('http://example.test').get('/').delayBody(200).reply(201, 'OK')
http.get('http://example.test', res => {
const start = process.hrtime()
res.once('data', () => {
checkDuration(start, 200)
done()
})
})
})
it('should delay the overall response', async () => {
const scope = nock('http://example.test')
.get('/')
.delayBody(200)
.reply(200, 'OK')
const { body } = await resolvesInAtLeast(got('http://example.test/'), 200)
expect(body).to.equal('OK')
scope.done()
})
it('should not have an impact on a response timeout', async () => {
const scope = nock('http://example.test')
.get('/')
.delayConnection(300)
.delayBody(300)
.reply(201, 'OK')
const { body, statusCode } = await got('http://example.test/', {
timeout: {
response: 500,
},
})
expect(statusCode).to.equal(201)
expect(body).to.equal('OK')
scope.done()
})
it('should work with a response stream', async () => {
const scope = nock('http://example.test')
.get('/')
.delayBody(200)
.reply(200, () => fs.createReadStream(textFilePath, { encoding: 'utf8' }))
const { body } = await resolvesInAtLeast(got('http://example.test/'), 200)
expect(body).to.equal(textFileContents)
scope.done()
})
it('should work with a response stream of binary buffers', async () => {
const scope = nock('http://example.test')
.get('/')
.delayBody(200)
// No encoding specified, which causes the file to be streamed using
// buffers instead of strings.
.reply(200, () => fs.createReadStream(textFilePath))
const { body } = await resolvesInAtLeast(got('http://example.test/'), 200)
expect(body).to.equal(textFileContents)
scope.done()
})
it('should work with a delayed response stream', async () => {
const passthrough = new stream.Transform({
transform(chunk, encoding, callback) {
this.push(chunk.toString())
callback()
},
})
const scope = nock('http://example.test')
.get('/')
.delayBody(100)
.reply(200, () => passthrough)
setTimeout(() => fs.createReadStream(textFilePath).pipe(passthrough), 125)
const { body } = await got('http://example.test/')
expect(body).to.equal(textFileContents)
scope.done()
})
})
describe('`delayConnection()`', () => {
it('should cause a timeout error when larger than options.timeout', async () => {
const scope = nock('http://example.test')
.get('/')
.delayConnection(1000)
.reply(200, {})
await assertRejects(
got('http://example.test', { timeout: 10 }),
err => err.code === 'ETIMEDOUT'
)
scope.done()
})
it('should delay the clock before the `response` event', done => {
nock('http://example.test').get('/').delayConnection(200).reply()
const req = http.request('http://example.test', () => {
checkDuration(start, 200)
done()
})
req.end()
const start = process.hrtime()
})
it('should delay the overall response', async () => {
const scope = nock('http://example.test')
.get('/')
.delayConnection(200)
.reply(200, 'OK')
const { body } = await resolvesInAtLeast(got('http://example.test'), 200)
expect(body).to.equal('OK')
scope.done()
})
it('should provide the proper arguments when using reply a callback', async () => {
const replyStub = sinon.stub().returns('')
const scope = nock('http://example.test')
.post('/')
.delayConnection(100)
.reply(200, replyStub)
await got.post('http://example.test', { body: 'OK' })
expect(replyStub).to.have.been.calledOnceWithExactly('/', 'OK')
scope.done()
})
it('should delay a JSON response when using a reply callback', async () => {
const scope = nock('http://example.test')
.get('/')
.delayConnection(100)
.reply(200, () => ({ a: 1 }))
const { body, headers, statusCode } = await got('http://example.test')
expect(body).to.equal('{"a":1}')
expect(headers).to.have.property('content-type', 'application/json')
expect(statusCode).to.equal(200)
scope.done()
})
it('should work with `replyWithFile()`', async () => {
const scope = nock('http://example.test')
.get('/')
.delayConnection(200)
.replyWithFile(200, textFilePath)
const { body } = await resolvesInAtLeast(got('http://example.test'), 200)
expect(body).to.equal(textFileContents)
scope.done()
})
it('should work with a generic stream from the reply callback', async () => {
const scope = nock('http://example.test')
.get('/')
.delayConnection(200)
.reply(200, () => fs.createReadStream(textFilePath))
const { body } = await resolvesInAtLeast(got('http://example.test'), 200)
expect(body).to.equal(textFileContents)
scope.done()
})
it('should work with a generic stream from the reply callback', async () => {
const scope = nock('http://example.test')
.get('/')
.delayConnection(200)
.reply(200, () => fs.createReadStream(textFilePath))
const { body, statusCode } = await resolvesInAtLeast(
got('http://example.test'),
200
)
expect(statusCode).to.equal(200)
expect(body).to.equal(textFileContents)
scope.done()
})
it('should delay errors when `replyWithError()` is used', async () => {
nock('http://example.test')
.get('/')
.delayConnection(100)
.replyWithError('this is an error message')
await resolvesInAtLeast(
assertRejects(got('http://example.test'), /this is an error message/),
100
)
})
it('emits a timeout - with setTimeout', done => {
nock('http://example.test').get('/').delayConnection(10000).reply(200, 'OK')
const onEnd = sinon.spy()
const req = http.request('http://example.test', res => {
res.once('end', onEnd)
})
req.setTimeout(5000, () => {
expect(onEnd).not.to.have.been.called()
done()
})
req.end()
})
it('emits a timeout - with options.timeout', done => {
nock('http://example.test').get('/').delayConnection(10000).reply(200, 'OK')
const onEnd = sinon.spy()
const req = http.request('http://example.test', { timeout: 5000 }, res => {
res.once('end', onEnd)
})
req.on('timeout', function () {
expect(onEnd).not.to.have.been.called()
done()
})
req.end()
})
it('emits a timeout - with Agent.timeout', done => {
nock('http://example.test').get('/').delayConnection(10000).reply(200, 'OK')
const onEnd = sinon.spy()
const agent = new http.Agent({ timeout: 5000 })
const req = http.request('http://example.test', { agent }, res => {
res.once('end', onEnd)
})
req.on('timeout', function () {
expect(onEnd).not.to.have.been.called()
done()
})
req.end()
})
it('emits a timeout - options.timeout takes precedence over Agent.timeout', done => {
nock('http://example.test').get('/').delayConnection(10000).reply(200, 'OK')
const onEnd = sinon.spy()
const agent = new http.Agent({ timeout: 30000 })
const req = http.request(
'http://example.test',
{ agent, timeout: 5000 },
res => {
res.once('end', onEnd)
}
)
req.on('timeout', function () {
expect(onEnd).not.to.have.been.called()
done()
})
req.end()
})
it('does not emit a timeout when timeout > delayConnection', done => {
const responseText = 'okeydoke!'
const scope = nock('http://example.test')
.get('/')
.delayConnection(300)
.reply(200, responseText)
const req = http.request('http://example.test', res => {
res.setEncoding('utf8')
let body = ''
res.on('data', chunk => {
body += chunk
})
res.once('end', () => {
expect(body).to.equal(responseText)
scope.done()
done()
})
})
req.setTimeout(60000, () => {
expect.fail('socket timed out unexpectedly')
})
req.end()
})
})
nock-13.2.4/tests/test_destroy.js 0000664 0000000 0000000 00000002567 14177263367 0017015 0 ustar 00root root 0000000 0000000 'use strict'
const { expect } = require('chai')
const http = require('http')
const nock = require('..')
describe('`res.destroy()`', () => {
it('should emit error event if called with error', done => {
nock('http://example.test').get('/').reply(404)
const respErr = new Error('Response error')
http
.get('http://example.test/', res => {
expect(res.statusCode).to.equal(404)
res.destroy(respErr)
})
.once('error', err => {
expect(err).to.equal(respErr)
done()
})
})
it('should not emit error event if called without error', done => {
nock('http://example.test').get('/').reply(403)
http
.get('http://example.test/', res => {
expect(res.statusCode).to.equal(403)
res.destroy()
done()
})
.once('error', () => {
expect.fail('should not emit error')
})
})
it('should not emit an response if destroyed first', done => {
nock('http://example.test').get('/').reply()
const req = http
.get('http://example.test/', () => {
expect.fail('should not emit a response')
})
.on('error', () => {}) // listen for error so "socket hang up" doesn't bubble
.on('socket', () => {
setImmediate(() => req.destroy())
})
// give the `setImmediate` calls enough time to cycle.
setTimeout(() => done(), 10)
})
})
nock-13.2.4/tests/test_dynamic_mock.js 0000664 0000000 0000000 00000003604 14177263367 0017752 0 ustar 00root root 0000000 0000000 'use strict'
const { expect } = require('chai')
const nock = require('..')
const got = require('./got_client')
// "dynamic" refers to `reply` getting a single callback argument that returns or calls the callback with an array of [status, [body, headers]]]
describe('dynamic `reply()` function', () => {
it('can provide only the status code by returning an array', async () => {
const scope = nock('http://example.test')
.get('/')
.reply(() => [201])
const { statusCode, body } = await got('http://example.test')
expect(statusCode).to.equal(201)
expect(body).to.equal('')
scope.done()
})
it('can provide the status code and body by returning an array', async () => {
const scope = nock('http://example.test')
.get('/')
.reply(function () {
return [201, 'DEF']
})
const { statusCode, body } = await got('http://example.test')
expect(statusCode).to.equal(201)
expect(body).to.equal('DEF')
scope.done()
})
it('can provide the status code, body, and headers by returning an array', async () => {
const scope = nock('http://example.test')
.get('/')
.reply(function () {
return [201, 'DEF', { 'X-Foo': 'bar' }]
})
const { statusCode, body, headers } = await got('http://example.test')
expect(statusCode).to.equal(201)
expect(body).to.equal('DEF')
expect(headers).to.deep.equal({ 'x-foo': 'bar' })
scope.done()
})
it('should provide the status code and body by passing them to the asynchronous callback', async () => {
const scope = nock('http://example.test')
.get('/')
.reply(function (path, reqBody, cb) {
setTimeout(function () {
cb(null, [201, 'GHI'])
}, 1e3)
})
const { statusCode, body } = await got('http://example.test')
expect(statusCode).to.equal(201)
expect(body).to.equal('GHI')
scope.done()
})
})
nock-13.2.4/tests/test_events.js 0000664 0000000 0000000 00000005453 14177263367 0016625 0 ustar 00root root 0000000 0000000 'use strict'
const { expect } = require('chai')
const http = require('http')
const path = require('path')
const sinon = require('sinon')
const nock = require('..')
const got = require('./got_client')
function ignore() {}
it('emits request and replied events when request has no body', async () => {
const scope = nock('http://example.test').get('/').reply()
const onRequest = sinon.spy()
const onReplied = sinon.spy()
scope.on('request', onRequest)
scope.on('replied', onReplied)
await got('http://example.test')
scope.done()
expect(onRequest).to.have.been.calledOnce()
expect(onReplied).to.have.been.calledOnce()
})
it('emits request and request body', async () => {
const data = 'example=123'
const scope = nock('http://example.test').post('/please').reply()
const onRequest = sinon.spy()
const onReplied = sinon.spy()
scope.on('request', function (req, interceptor, body) {
onRequest()
expect(req.path).to.equal('/please')
expect(interceptor.interceptionCounter).to.equal(1)
expect(body).to.deep.equal(data)
expect(onReplied).to.not.have.been.called()
})
scope.on('replied', function (req, interceptor) {
onReplied()
expect(req.path).to.equal('/please')
expect(interceptor.interceptionCounter).to.equal(1)
})
await got.post('http://example.test/please', {
body: data,
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': Buffer.byteLength(data),
},
})
scope.done()
expect(onRequest).to.have.been.calledOnce()
expect(onReplied).to.have.been.calledOnce()
})
it('emits request and replied events when response body is a stream', async () => {
const textFilePath = path.resolve(__dirname, './assets/reply_file_1.txt')
const scope = nock('http://example.test')
.get('/')
.replyWithFile(200, textFilePath)
const onRequest = sinon.spy()
const onReplied = sinon.spy()
scope.on('request', onRequest)
scope.on('replied', onReplied)
await got('http://example.test')
scope.done()
expect(onRequest).to.have.been.calledOnce()
expect(onReplied).to.have.been.calledOnce()
})
it('emits no match when no match and no mock', done => {
nock.emitter.once('no match', () => {
done()
})
http.get('http://example.test/abc').once('error', ignore)
})
it('emits no match when no match and mocked', done => {
nock('http://example.test').get('/').reply(418)
nock.emitter.on('no match', req => {
expect(req.path).to.equal('/definitelymaybe')
done()
})
http.get('http://example.test/definitelymaybe').once('error', ignore)
})
it('emits no match when netConnect is disabled', done => {
nock.disableNetConnect()
nock.emitter.on('no match', req => {
expect(req.hostname).to.equal('example.test')
done()
})
http.get('http://example.test').once('error', ignore)
})
nock-13.2.4/tests/test_fake_timer.js 0000664 0000000 0000000 00000000652 14177263367 0017423 0 ustar 00root root 0000000 0000000 'use strict'
const fakeTimers = require('@sinonjs/fake-timers')
const nock = require('..')
const got = require('./got_client')
// https://github.com/nock/nock/issues/1334
it('should still return successfully when fake timer is enabled', async () => {
const clock = fakeTimers.install()
const scope = nock('http://example.test').get('/').reply()
await got('http://example.test')
clock.uninstall()
scope.done()
})
nock-13.2.4/tests/test_gzip_request.js 0000664 0000000 0000000 00000003614 14177263367 0020037 0 ustar 00root root 0000000 0000000 'use strict'
const { expect } = require('chai')
const http = require('http')
const zlib = require('zlib')
const nock = require('..')
it('should accept and decode gzip encoded application/json', done => {
const message = {
my: 'contents',
}
nock('http://example.test')
.post('/')
.reply(function (url, actual) {
expect(actual).to.deep.equal(message)
done()
return [200]
})
const req = http.request({
hostname: 'example.test',
path: '/',
method: 'POST',
headers: {
'content-encoding': 'gzip',
'content-type': 'application/json',
},
})
const compressedMessage = zlib.gzipSync(JSON.stringify(message))
req.write(compressedMessage)
req.end()
})
it('should accept and decode gzip encoded application/json, when headers come from a client as an array', done => {
const compressedMessage = zlib.gzipSync(JSON.stringify({ my: 'contents' }))
const scope = nock('http://example.test')
.post('/', compressedMessage)
.reply(200)
const req = http.request({
hostname: 'example.test',
path: '/',
method: 'POST',
headers: {
'content-encoding': ['gzip'],
'content-type': ['application/json'],
},
})
req.on('response', () => {
scope.done()
done()
})
req.write(compressedMessage)
req.end()
})
it('should accept and decode deflate encoded application/json', done => {
const message = {
my: 'contents',
}
nock('http://example.test')
.post('/')
.reply(function (url, actual) {
expect(actual).to.deep.equal(message)
done()
return [200]
})
const req = http.request({
hostname: 'example.test',
path: '/',
method: 'POST',
headers: {
'content-encoding': 'deflate',
'content-type': 'application/json',
},
})
const compressedMessage = zlib.deflateSync(JSON.stringify(message))
req.write(compressedMessage)
req.end()
})
nock-13.2.4/tests/test_header_matching.js 0000664 0000000 0000000 00000043142 14177263367 0020420 0 ustar 00root root 0000000 0000000 'use strict'
const http = require('http')
const assertRejects = require('assert-rejects')
const { expect } = require('chai')
const sinon = require('sinon')
const nock = require('..')
const got = require('./got_client')
describe('Header matching', () => {
describe('`Scope.matchHeader()`', () => {
it('should match headers with function: gets the expected argument', async () => {
const matchHeaderStub = sinon.stub().returns(true)
const scope = nock('http://example.test')
.matchHeader('x-my-headers', matchHeaderStub)
// `.matchHeader()` is called on the interceptor. It precedes the call to
// `.get()`.
.get('/')
.reply(200, 'Hello World!')
const { statusCode, body } = await got('http://example.test/', {
headers: { 'X-My-Headers': 456 },
})
// TODO: It's surprising that this function receives a number instead of
// a string. Probably this behavior should be changed.
expect(matchHeaderStub).to.have.been.calledOnceWithExactly(456)
expect(statusCode).to.equal(200)
expect(body).to.equal('Hello World!')
scope.done()
})
it('should not match headers with function: does not match when match declined', async () => {
nock('http://example.test')
.matchHeader('x-my-headers', () => false)
// `.matchHeader()` is called on the interceptor. It precedes the call to
// `.get()`.
.get('/')
.reply(200, 'Hello World!')
await assertRejects(
got('http://example.test/', {
headers: { 'X-My-Headers': 456 },
}),
/Nock: No match for request/
)
})
it('should not consume mock request when match is declined by function', async () => {
const scope = nock('http://example.test')
.matchHeader('x-my-headers', () => false)
// `.matchHeader()` is called on the interceptor. It precedes the call to
// `.get()`.
.get('/')
.reply(200, 'Hello World!')
await assertRejects(
got('http://example.test/', {
headers: { '-My-Headers': 456 },
}),
/Nock: No match for request/
)
expect(scope.isDone()).to.be.false()
})
it('should match headers on all Interceptors created from Scope', async () => {
const scope = nock('http://example.test')
.matchHeader('accept', 'application/json')
.get('/one')
.reply(200, { hello: 'world' })
.get('/two')
.reply(200, { a: 1, b: 2, c: 3 })
const response1 = await got('http://example.test/one', {
headers: { Accept: 'application/json' },
})
expect(response1.statusCode).to.equal(200)
expect(response1.body).to.equal('{"hello":"world"}')
const response2 = await got('http://example.test/two', {
headers: { Accept: 'application/json' },
})
expect(response2.statusCode).to.equal(200)
expect(response2.body).to.equal('{"a":1,"b":2,"c":3}')
scope.done()
})
})
describe('`Interceptor.matchHeader()`', () => {
it('should match a simple header', async () => {
const scope = nock('http://example.test')
.get('/')
.matchHeader('x-my-headers', 'My custom Header value')
.reply(200, 'Hello World!')
const { statusCode, body } = await got('http://example.test/', {
headers: { 'X-My-Headers': 'My custom Header value' },
})
expect(statusCode).to.equal(200)
expect(body).to.equal('Hello World!')
scope.done()
})
// https://github.com/nock/nock/issues/399
// https://github.com/nock/nock/issues/822
it('should match headers coming in as an array', async () => {
const scope = nock('http://example.test')
.get('/')
.matchHeader('x-my-headers', 'My custom Header value')
.reply()
const { statusCode } = await got('http://example.test/', {
headers: { 'X-My-Headers': ['My custom Header value'] },
})
expect(statusCode).to.equal(200)
scope.done()
})
it('should match multiple headers', async () => {
const scope = nock('http://example.test')
.get('/')
.matchHeader('x-my-headers', 'My custom Header value')
.reply(200, 'Hello World!')
.get('/')
.matchHeader('x-my-headers', 'other value')
.reply(200, 'Hello World other value!')
const response1 = await got('http://example.test/', {
headers: { 'X-My-Headers': 'other value' },
})
expect(response1.statusCode).to.equal(200)
expect(response1.body).to.equal('Hello World other value!')
const response2 = await got('http://example.test/', {
headers: { 'X-My-Headers': 'My custom Header value' },
})
expect(response2.statusCode).to.equal(200)
expect(response2.body).to.equal('Hello World!')
scope.done()
})
it('should match headers with regexp', async () => {
const scope = nock('http://example.test')
.get('/')
.matchHeader('x-my-headers', /My He.d.r [0-9.]+/)
.reply(200, 'Hello World!')
const { statusCode, body } = await got('http://example.test/', {
headers: { 'X-My-Headers': 'My Header 1.0' },
})
expect(statusCode).to.equal(200)
expect(body).to.equal('Hello World!')
scope.done()
})
it('should match headers provided as numbers with regexp', async () => {
const scope = nock('http://example.test')
.get('/')
.matchHeader('x-my-headers', /\d+/)
.reply(200, 'Hello World!')
const { statusCode, body } = await got('http://example.test/', {
headers: { 'X-My-Headers': 123 },
})
expect(statusCode).to.equal(200)
expect(body).to.equal('Hello World!')
scope.done()
})
it('should match headers with function that gets the expected argument', async () => {
const matchHeaderStub = sinon.stub().returns(true)
const scope = nock('http://example.test')
.get('/')
.matchHeader('x-my-headers', matchHeaderStub)
.reply(200, 'Hello World!')
const { statusCode, body } = await got('http://example.test/', {
headers: { 'X-My-Headers': 456 },
})
// TODO: It's surprising that this function receives a number instead of
// a string. Probably this behavior should be changed.
expect(matchHeaderStub).to.have.been.calledOnceWithExactly(456)
expect(statusCode).to.equal(200)
expect(body).to.equal('Hello World!')
scope.done()
})
it('should match headers with function and allow unmocked: matches when match accepted', async () => {
const scope = nock('http://example.test', { allowUnmocked: true })
.get('/')
.matchHeader('x-my-headers', () => true)
.reply(200, 'Hello World!')
const { statusCode, body } = await got('http://example.test/', {
headers: { 'X-My-Headers': 456 },
})
expect(statusCode).to.equal(200)
expect(body).to.equal('Hello World!')
scope.done()
})
it('should not match headers with function: does not match when match declined', async () => {
nock('http://example.test')
.get('/')
.matchHeader('x-my-headers', () => false)
.reply(200, 'Hello World!')
await assertRejects(
got('http://example.test/', {
headers: { 'X-My-Headers': 456 },
}),
/Nock: No match for request/
)
})
it('should not consume mock request when match is declined by function', async () => {
const scope = nock('http://example.test')
.get('/')
.matchHeader('x-my-headers', () => false)
.reply(200, 'Hello World!')
await assertRejects(
got('http://example.test/', {
headers: { '-My-Headers': 456 },
}),
/Nock: No match for request/
)
expect(scope.isDone()).to.be.false()
})
it('should match basic authentication header', async () => {
const username = 'testuser'
const password = 'testpassword'
const authString = Buffer.from(`${username}:${password}`).toString(
'base64'
)
const expectedAuthHeader = `Basic ${authString}`
const scope = nock('http://example.test')
.get('/')
.matchHeader('Authorization', val => val === expectedAuthHeader)
.reply(200, 'Hello World!')
const { statusCode, body } = await got('http://example.test/', {
username,
password,
})
expect(statusCode).to.equal(200)
expect(body).to.equal('Hello World!')
scope.done()
})
})
describe('`Scope#reqheaders`', () => {
it('should fail when specified request header is missing', async () => {
nock('http://example.test', {
reqheaders: {
'X-App-Token': 'apptoken',
'X-Auth-Token': 'apptoken',
},
})
.post('/')
.reply(200, { status: 'ok' })
await assertRejects(
got.post('http://example.test/', {
headers: { 'X-App-Token': 'apptoken' },
}),
/Nock: No match for request/
)
})
it('should match when request header matches regular expression', async () => {
const scope = nock('http://example.test', {
reqheaders: { 'X-My-Super-Power': /.+/ },
})
.post('/')
.reply()
const { statusCode } = await got.post('http://example.test/', {
headers: { 'X-My-Super-Power': 'mullet growing' },
})
expect(statusCode).to.equal(200)
scope.done()
})
it('should not match when request header does not match regular expression', async () => {
const scope = nock('http://example.test', {
reqheaders: {
'X-My-Super-Power': /Mullet.+/,
},
})
.post('/')
.reply()
await assertRejects(
got.post('http://example.test/', {
headers: { 'X-My-Super-Power': 'mullet growing' },
}),
/Nock: No match/
)
expect(scope.isDone()).to.be.false()
})
// https://github.com/nock/nock/issues/399
// https://github.com/nock/nock/issues/822
it('should match when headers are coming in as an array', async () => {
const scope = nock('http://example.test', {
reqheaders: { 'x-my-headers': 'My custom Header value' },
})
.get('/')
.reply()
const { statusCode } = await got('http://example.test/', {
headers: { 'X-My-Headers': ['My custom Header value'] },
})
expect(statusCode).to.equal(200)
scope.done()
})
it('should throw if reqheaders are not an object', async () => {
const options = {
reqheaders: 'Content-Type: text/plain',
}
expect(() => nock('http://example.test', options).get('/')).to.throw(
'Headers must be provided as an object'
)
})
it('should matche when request header satisfies the header function', async () => {
const scope = nock('http://example.test', {
reqheaders: {
'X-My-Super-Power': value => value === 'mullet growing',
},
})
.post('/')
.reply()
const { statusCode } = await got.post('http://example.test/', {
headers: { 'X-My-Super-Power': 'mullet growing' },
})
expect(statusCode).to.equal(200)
scope.done()
})
it('should not match when request header does not satisfy the header function', async () => {
const scope = nock('http://example.test', {
reqheaders: {
'X-My-Super-Power': value => value === 'Mullet Growing',
},
})
.post('/')
.reply()
await assertRejects(
got.post('http://example.test/', {
headers: { 'X-My-Super-Power': 'mullet growing' },
}),
/Nock: No match/
)
expect(scope.isDone()).to.be.false()
})
it('should not fail when specified request header is not missing', async () => {
const scope = nock('http://example.test', {
reqheaders: {
'X-App-Token': 'apptoken',
'X-Auth-Token': 'apptoken',
},
})
.post('/')
.reply()
const { statusCode } = await got.post('http://example.test/', {
headers: {
'X-App-Token': 'apptoken',
'X-Auth-Token': 'apptoken',
},
})
expect(statusCode).to.equal(200)
scope.done()
})
it('should be case insensitive', async () => {
const scope = nock('http://example.test', {
reqheaders: {
'x-app-token': 'apptoken',
'x-auth-token': 'apptoken',
},
})
.post('/')
.reply()
const { statusCode } = await got.post('http://example.test/', {
headers: {
'X-App-TOKEN': 'apptoken',
'X-Auth-TOKEN': 'apptoken',
},
})
expect(statusCode).to.equal(200)
scope.done()
})
it('should only match the last duplicate request header', done => {
const scope = nock('http://example.test', {
reqheaders: {
'x-auth-token': 'biz',
},
})
.get('/')
.reply()
// Can't use Got here because it would change these headers
const req = http.get('http://example.test', {
headers: {
'x-auth-token': 'foo',
'X-Auth-Token': 'bar',
'X-AUTH-TOKEN': 'biz',
},
})
req.on('response', res => {
expect(res.statusCode).to.equal(200)
scope.done()
done()
})
})
// https://github.com/nock/nock/issues/966
it('mocking succeeds when mocked and specified request headers have falsy values', async () => {
const scope = nock('http://example.test', {
reqheaders: {
'x-foo': 0,
},
})
.post('/')
.reply()
const { statusCode } = await got.post('http://example.test/', {
headers: {
'X-Foo': 0,
},
})
expect(statusCode).to.equal(200)
scope.done()
})
it('multiple interceptors override headers from unrelated request', async () => {
nock.define([
{
scope: 'https://example.test:443',
method: 'get',
path: '/bar',
reqheaders: {
'x-foo': 'bar',
},
status: 200,
response: {},
},
{
scope: 'https://example.test:443',
method: 'get',
path: '/baz',
reqheaders: {
'x-foo': 'baz',
},
status: 200,
response: {},
},
])
const res1 = await got('https://example.test/bar', {
headers: { 'x-foo': 'bar' },
})
expect(res1.statusCode).to.equal(200)
const res2 = await got('https://example.test/baz', {
headers: { 'x-foo': 'baz' },
})
expect(res2.statusCode).to.equal(200)
})
})
describe('`Scope#badheaders`', () => {
it('should prevent match when badheaders are present', async () => {
const scope = nock('http://example.test', {
badheaders: ['cookie'],
})
.get('/')
.reply()
await assertRejects(
got('http://example.test/', {
headers: { Cookie: 'cookie', Donut: 'donut' },
}),
/Nock: No match for request/
)
expect(scope.isDone()).to.be.false()
})
it('should not prevent match when badheaders are absent but other headers are present', async () => {
const scope = nock('http://example.test', {
badheaders: ['cookie'],
})
.get('/')
.reply()
await got('http://example.test/', { headers: { Donut: 'donut' } })
scope.done()
})
})
describe('Host header handling', () => {
// The next three tests cover the special case for the Host header where it's only used for
// matching if it's defined on the scope and the request. See https://github.com/nock/nock/pull/196
it('Host header is used for matching if defined on the scope and request', async () => {
const scope = nock('http://example.test', {
reqheaders: { host: 'example.test' },
})
.get('/')
.reply()
const { statusCode } = await got('http://example.test/', {
headers: { Host: 'example.test' },
})
expect(statusCode).to.equal(200)
scope.done()
})
it('Host header is ignored during matching if not defined on the request', async () => {
const scope = nock('http://example.test', {
reqheaders: { host: 'some.other.domain.test' },
})
.get('/')
.reply()
const { statusCode } = await got('http://example.test/')
expect(statusCode).to.equal(200)
scope.done()
})
it('Host header is used to reject a match if defined on the scope and request', async () => {
nock('http://example.test', {
reqheaders: { host: 'example.test' },
})
.get('/')
.reply()
await assertRejects(
got('http://example.test/', {
headers: { Host: 'some.other.domain.test' },
}),
/Nock: No match for request/
)
})
})
})
it('header manipulation', done => {
// This test seems to depend on behavior of the `http` module.
const scope = nock('http://example.test')
.get('/accounts')
.reply(200, { accounts: [{ id: 1, name: 'Joe Blow' }] })
const req = http.request({ host: 'example.test', path: '/accounts' }, res => {
res.on('end', () => {
scope.done()
done()
})
// Streams start in 'paused' mode and must be started.
// See https://nodejs.org/api/stream.html#stream_class_stream_readable
res.resume()
})
req.setHeader('X-Custom-Header', 'My Value')
expect(req.getHeader('X-Custom-Header')).to.equal('My Value')
req.removeHeader('X-Custom-Header')
expect(req.getHeader('X-Custom-Header')).to.be.undefined()
req.end()
})
nock-13.2.4/tests/test_intercept.js 0000664 0000000 0000000 00000074703 14177263367 0017322 0 ustar 00root root 0000000 0000000 'use strict'
const http = require('http')
const https = require('https')
const { expect } = require('chai')
const sinon = require('sinon')
const assertRejects = require('assert-rejects')
const url = require('url')
const nock = require('..')
const got = require('./got_client')
const acceptableGlobalKeys = new Set([
...Object.keys(global),
'_key',
'__core-js_shared__',
'fetch',
'Response',
'Headers',
'Request',
])
describe('Intercept', () => {
it('invalid or missing method parameter throws an exception', () => {
expect(() => nock('https://example.test').intercept('/somepath')).to.throw(
'The "method" parameter is required for an intercept call.'
)
})
it("should throw when the path doesn't include a leading slash and there is no base path", () => {
expect(() => nock('http://example.test').get('no-leading-slash')).to.throw(
"Non-wildcard URL path strings must begin with a slash (otherwise they won't match anything)"
)
})
// https://github.com/nock/nock/issues/1730
it('should throw when the path is empty and there is no base path', () => {
expect(() => nock('http://example.test').get('')).to.throw(
"Non-wildcard URL path strings must begin with a slash (otherwise they won't match anything) (got: )"
)
})
it('should intercept a basic GET request', async () => {
const scope = nock('http://example.test').get('/').reply(201)
const { statusCode } = await got('http://example.test/')
expect(statusCode).to.equal(201)
scope.done()
})
it('should intercept a request with a base path', async () => {
const scope = nock('http://example.test/abc').get('/def').reply(201)
const { statusCode } = await got('http://example.test/abc/def')
expect(statusCode).to.equal(201)
scope.done()
})
it('should intercept a request with a base path and no interceptor path', async () => {
const scope = nock('http://example.test/abc').get('').reply(201)
const { statusCode } = await got('http://example.test/abc')
expect(statusCode).to.equal(201)
scope.done()
})
it('should intercept a request with a base path and an interceptor path without a leading slash', async () => {
const scope = nock('http://example.test/abc').get('def').reply(201)
const { statusCode } = await got('http://example.test/abcdef')
expect(statusCode).to.equal(201)
scope.done()
})
it('should intercept a basic POST request', async () => {
const scope = nock('http://example.test').post('/form').reply(201, 'OK!')
const { statusCode, body } = await got.post('http://example.test/form', {
responseType: 'buffer',
})
expect(statusCode).to.equal(201)
expect(body).to.be.an.instanceOf(Buffer)
expect(body.toString('utf8')).to.equal('OK!')
scope.done()
})
it('post with empty response body', async () => {
const scope = nock('http://example.test').post('/form').reply()
const { statusCode, body } = await got.post('http://example.test/form', {
responseType: 'buffer',
})
expect(statusCode).to.equal(200)
expect(body).to.be.an.instanceOf(Buffer)
expect(body).to.have.lengthOf(0)
scope.done()
})
it('post, lowercase', done => {
const onData = sinon.spy()
const scope = nock('http://example.test').post('/form').reply(200, 'OK!')
// Since this is testing a lowercase `method`, it's using the `http` module.
const req = http.request(
{
host: 'example.test',
method: 'post',
path: '/form',
port: 80,
},
res => {
expect(res.statusCode).to.equal(200)
res.on('data', data => {
onData()
expect(data).to.be.an.instanceOf(Buffer)
expect(data.toString()).to.equal('OK!')
})
res.on('end', () => {
expect(onData).to.have.been.calledOnce()
scope.done()
done()
})
}
)
req.end()
})
it('post with regexp as spec', async () => {
const input = 'key=val'
const scope = nock('http://example.test')
.post('/echo', /key=v.?l/g)
.reply(200, (uri, body) => ['OK', uri, body].join(' '))
const { body } = await got.post('http://example.test/echo', { body: input })
expect(body).to.equal('OK /echo key=val')
scope.done()
})
it('post with function as spec', async () => {
const scope = nock('http://example.test')
.post('/echo', body => body === 'key=val')
.reply(200, (uri, body) => ['OK', uri, body].join(' '))
const { body } = await got.post('http://example.test/echo', {
body: 'key=val',
})
expect(body).to.equal('OK /echo key=val')
scope.done()
})
it('post with chaining on call', async () => {
const input = 'key=val'
const scope = nock('http://example.test')
.post('/echo', input)
.reply(200, (uri, body) => ['OK', uri, body].join(' '))
const { body } = await got.post('http://example.test/echo', { body: input })
expect(body).to.equal('OK /echo key=val')
scope.done()
})
it('should intercept a basic DELETE request', async () => {
const scope = nock('https://example.test').delete('/').reply(204)
const { statusCode } = await got.delete('https://example.test')
expect(statusCode).to.equal(204)
scope.done()
})
// Not sure what is the intent of this test.
it('reply with callback and filtered path and body', async () => {
const scope = nock('http://example.test')
.filteringPath(/.*/, '*')
.filteringRequestBody(/.*/, '*')
.post('*', '*')
.reply(200, (uri, body) => ['OK', uri, body].join(' '))
const { body } = await got.post('http://example.test/original/path', {
body: 'original=body',
})
expect(body).to.equal('OK /original/path original=body')
scope.done()
})
it('should intercept a basic HEAD request', async () => {
const scope = nock('http://example.test').head('/').reply(201, 'OK!')
const { statusCode } = await got.head('http://example.test/')
expect(statusCode).to.equal(201)
scope.done()
})
it('body data is differentiating', async () => {
const scope = nock('http://example.test')
.post('/', 'abc')
.reply(200, 'Hey 1')
.post('/', 'def')
.reply(200, 'Hey 2')
const response1 = await got.post('http://example.test/', { body: 'abc' })
expect(response1).to.include({ statusCode: 200, body: 'Hey 1' })
const response2 = await got.post('http://example.test/', { body: 'def' })
expect(response2).to.include({ statusCode: 200, body: 'Hey 2' })
scope.done()
})
it('chaining', async () => {
const scope = nock('http://example.test')
.get('/')
.reply(200, 'Hello World!')
.post('/form')
.reply(201, 'OK!')
const response1 = await got.post('http://example.test/form')
expect(response1).to.include({ statusCode: 201, body: 'OK!' })
const response2 = await got('http://example.test/')
expect(response2).to.include({ statusCode: 200, body: 'Hello World!' })
scope.done()
})
it('encoding', async () => {
const scope = nock('http://example.test')
.get('/')
.reply(200, 'Hello World!')
const { body } = await got('http://example.test/', { encoding: 'base64' })
expect(body).to.be.a('string').and.equal('SGVsbG8gV29ybGQh')
scope.done()
})
it('on interceptor, filter path with function', async () => {
// Interceptor.filteringPath simply proxies to Scope.filteringPath, this test covers the proxy,
// testing the logic of filteringPath itself is done in test_scope.js.
const scope = nock('http://example.test')
.get('/?a=2&b=1')
.filteringPath(() => '/?a=2&b=1')
.reply(200, 'Hello World!')
const { statusCode } = await got('http://example.test/', {
searchParams: { a: '1', b: '2' },
})
expect(statusCode).to.equal(200)
scope.done()
})
it('chaining API', async () => {
const scope = nock('http://example.test')
.get('/one')
.reply(200, 'first one')
.get('/two')
.reply(200, 'second one')
const response1 = await got('http://example.test/one')
expect(response1).to.include({ statusCode: 200, body: 'first one' })
const response2 = await got('http://example.test/two')
expect(response2).to.include({ statusCode: 200, body: 'second one' })
scope.done()
})
it('same URI', async () => {
const scope = nock('http://example.test')
.get('/abc')
.reply(200, 'first one')
.get('/abc')
.reply(201, 'second one')
const response1 = await got('http://example.test/abc')
expect(response1).to.include({ statusCode: 200, body: 'first one' })
const response2 = await got('http://example.test/abc')
expect(response2).to.include({ statusCode: 201, body: 'second one' })
scope.done()
})
// TODO Should this test be kept?
it('can use hostname instead of host', done => {
const scope = nock('http://example.test')
.get('/')
.reply(200, 'Hello World!')
const req = http.request(
{
hostname: 'example.test',
path: '/',
},
res => {
expect(res.statusCode).to.equal(200)
res.on('end', () => {
scope.done()
done()
})
// Streams start in 'paused' mode and must be started.
// See https://nodejs.org/api/stream.html#stream_class_stream_readable
res.resume()
}
)
req.end()
})
it('hostname is case insensitive', done => {
const scope = nock('http://example.test').get('/path').reply()
const req = http.request(
{
hostname: 'EXAMPLE.test',
path: '/path',
method: 'GET',
},
() => {
scope.done()
done()
}
)
req.end()
})
it('can take a port', async () => {
const scope = nock('http://example.test:3333').get('/').reply()
const { statusCode } = await got('http://example.test:3333/')
expect(statusCode).to.equal(200)
scope.done()
})
it('can use https', async () => {
const scope = nock('https://example.test').get('/').reply()
const { statusCode } = await got('https://example.test/', {
responseType: 'buffer',
})
expect(statusCode).to.equal(200)
scope.done()
})
it('emits error when listeners are added after `req.end()` call', done => {
nock('http://example.test').get('/').reply()
const req = http.request(
{
host: 'example.test',
path: '/wrong-path',
},
res => {
expect.fail(new Error('should not come here!'))
}
)
req.end()
req.on('error', err => {
expect(err.message.trim()).to.equal(
`Nock: No match for request ${JSON.stringify(
{
method: 'GET',
url: 'http://example.test/wrong-path',
headers: {},
},
null,
2
)}`
)
done()
})
})
it('emits error if https route is missing', done => {
nock('https://example.test').get('/').reply(200, 'Hello World!')
const req = https.request(
{
host: 'example.test',
path: '/abcdef892932',
},
res => {
expect.fail(new Error('should not come here!'))
}
)
req.on('error', err => {
expect(err.message.trim()).to.equal(
`Nock: No match for request ${JSON.stringify(
{
method: 'GET',
url: 'https://example.test/abcdef892932',
headers: {},
},
null,
2
)}`
)
done()
})
req.end()
})
it('emits error if https route is missing, non-standard port', done => {
nock('https://example.test:123').get('/').reply(200, 'Hello World!')
const req = https.request(
{
host: 'example.test',
port: 123,
path: '/dsadsads',
},
res => {
expect.fail(new Error('should not come here!'))
}
)
req.on('error', err => {
expect(err.message.trim()).to.equal(
`Nock: No match for request ${JSON.stringify(
{
method: 'GET',
url: 'https://example.test:123/dsadsads',
headers: {},
},
null,
2
)}`
)
done()
})
req.end()
})
it('scopes are independent', async () => {
const scope1 = nock('http://example.test')
.get('/')
.reply(200, 'Hello World!')
const scope2 = nock('http://example.test')
.get('/')
.reply(200, 'Hello World!')
await got('http://example.test/')
expect(scope1.isDone()).to.be.true()
expect(scope2.isDone()).to.be.false()
})
it('two scopes with the same request are consumed', async () => {
const scope1 = nock('http://example.test')
.get('/')
.reply(200, 'Hello World!')
const scope2 = nock('http://example.test')
.get('/')
.reply(200, 'Hello World!')
await got('http://example.test/')
await got('http://example.test/')
scope1.done()
scope2.done()
})
// TODO: Move this test to test_header_matching.
it('username and password works', done => {
const scope = nock('http://example.test')
.get('/')
.reply(200, 'Welcome, username')
http
.request(
{
hostname: 'example.test',
auth: 'username:password',
path: '/',
},
res => {
scope.done()
done()
}
)
.end()
})
it('Matches with a username and password in the URL', async () => {
const scope = nock('http://example.test')
.get('/abc')
.reply(function () {
// TODO Investigate why we don't get an authorization header.
// expect(this.req.headers).to.include({ Authorization: 'foobar' })
return [200]
})
const { statusCode } = await got(
'http://username:password@example.test/abc'
)
expect(statusCode).to.equal(200)
scope.done()
})
it('different port works', done => {
const scope = nock('http://example.test:8081').get('/').reply()
http
.request(
{
hostname: 'example.test',
port: 8081,
path: '/',
},
res => {
scope.done()
done()
}
)
.end()
})
it('explicitly specifiying port 80 works', done => {
const scope = nock('http://example.test:80').get('/').reply()
http
.request(
{
hostname: 'example.test',
port: 80,
path: '/',
},
res => {
scope.done()
done()
}
)
.end()
})
it('post with object', done => {
const scope = nock('http://example.test')
.post('/claim', { some_data: 'something' })
.reply()
http
.request(
{
hostname: 'example.test',
port: 80,
method: 'POST',
path: '/claim',
},
res => {
scope.done()
done()
}
)
.end('{"some_data":"something"}')
})
it('accept string as request target', done => {
const responseBody = 'Hello World!'
const onData = sinon.spy()
const scope = nock('http://example.test').get('/').reply(200, responseBody)
http.get('http://example.test', res => {
expect(res.statusCode).to.equal(200)
res.on('data', data => {
onData()
expect(data).to.be.an.instanceOf(Buffer)
expect(data.toString()).to.equal(responseBody)
})
res.on('end', () => {
expect(onData).to.have.been.calledOnce()
scope.done()
done()
})
})
})
it('sending binary and receiving JSON should work', async () => {
const scope = nock('http://example.test')
.post('/')
.reply(201, { foo: '61' }, { 'Content-Type': 'application/json' })
const { statusCode, body } = await got.post('http://example.test/', {
// This is an encoded JPEG.
body: Buffer.from('ffd8ffe000104a46494600010101006000600000ff', 'hex'),
headers: { Accept: 'application/json', 'Content-Length': 23861 },
})
expect(statusCode).to.equal(201)
expect(body).to.be.a('string').and.have.lengthOf(12)
expect(JSON.parse(body)).to.deep.equal({ foo: '61' })
scope.done()
})
it('do not match when conditionally = false but should match after trying again when = true', async () => {
let enabled = false
const scope = nock('http://example.test', { conditionally: () => enabled })
.get('/')
.reply(200)
await assertRejects(
got('http://example.test/'),
/Nock: No match for request/
)
expect(scope.isDone()).to.be.false()
enabled = true
const { statusCode } = await got('http://example.test/')
expect(statusCode).to.equal(200)
scope.done()
})
// TODO: Try to convert to async/got.
it('get correct filtering with scope and request headers filtering', done => {
const responseText = 'OK!'
const requestHeaders = { host: 'foo.example.test' }
const scope = nock('http://foo.example.test', {
filteringScope: scope => /^http:\/\/.*\.example\.test/.test(scope),
})
.get('/path')
.reply(200, responseText, { 'Content-Type': 'text/plain' })
const onData = sinon.spy()
const req = http.get('http://bar.example.test/path', res => {
expect(req.getHeaders()).to.deep.equal({ host: requestHeaders.host })
res.on('data', data => {
onData()
expect(data.toString()).to.equal(responseText)
})
res.on('end', () => {
expect(onData).to.have.been.calledOnce()
scope.done()
done()
})
})
})
it('different subdomain with reply callback and filtering scope', async () => {
const responseText = 'OK!'
// We scope for www.example.test but through scope filtering we will accept
// any .example.test.
const scope = nock('http://example.test', {
filteringScope: scope => /^http:\/\/.*\.example/.test(scope),
})
.get('/')
.reply(200, () => responseText)
const { body } = await got('http://a.example.test')
expect(body).to.equal(responseText)
scope.done()
})
it('succeeds even when host request header is not specified', done => {
const scope = nock('http://example.test').post('/resource').reply()
const opts = {
method: 'POST',
headers: {
'X-App-TOKEN': 'apptoken',
'X-Auth-TOKEN': 'apptoken',
},
}
const req = http.request('http://example.test/resource', opts, res => {
res.on('end', () => {
scope.done()
done()
})
res.resume()
})
req.end()
})
// https://github.com/nock/nock/issues/158
// mikeal/request with strictSSL: true
// https://github.com/request/request/blob/3c0cddc7c8eb60b470e9519da85896ed7ee0081e/request.js#L943-L950
it('should denote the response client is authorized for HTTPS requests', done => {
const scope = nock('https://example.test').get('/what').reply()
https.get('https://example.test/what', res => {
expect(res).to.have.nested.property('socket.authorized').that.is.true()
res.on('end', () => {
scope.done()
done()
})
res.resume()
})
})
it('match domain using regexp', async () => {
const scope = nock(/regexexample\.test/)
.get('/resources')
.reply()
const { statusCode } = await got('http://regexexample.test/resources')
expect(statusCode).to.equal(200)
scope.done()
})
// https://github.com/nock/nock/issues/1137
it('match domain using regexp with path as callback', async () => {
const scope = nock(/.*/)
.get(() => true)
.reply(200, 'Match regex')
const { statusCode } = await got('http://example.test/resources')
expect(statusCode).to.equal(200)
scope.done()
})
// https://github.com/nock/nock/issues/508
it('match multiple interceptors with regexp domain', async () => {
nock(/chainregex/)
.get('/')
.reply(200, 'Match regex')
.get('/')
.reply(500, 'Match second intercept')
const response1 = await got('http://chainregex.test/')
expect(response1).to.include({ statusCode: 200, body: 'Match regex' })
const response2 = await got('http://chainregex.test/', {
throwHttpErrors: false,
})
expect(response2).to.include({
statusCode: 500,
body: 'Match second intercept',
})
})
it('interceptors should work in any order', async () => {
nock('http://some.test')
.get('/path1?query=1')
.reply(200, 'response for path1/query1')
.get('/path2?query=2')
.reply(200, 'response for path2/query2')
// Calling second request before first
const response2 = await got('http://some.test/path2?query=2')
expect(response2).to.include({
statusCode: 200,
body: 'response for path2/query2',
})
// Calling first request after second
const response1 = await got('http://some.test/path1?query=1')
expect(response1).to.include({
statusCode: 200,
body: 'response for path1/query1',
})
})
it('interceptors should work in any order with filteringScope', async () => {
nock('http://some.test', {
filteringScope: scope => true,
})
.get('/path1?query=1')
.reply(200, 'response for path1/query1')
.get('/path2?query=2')
.reply(200, 'response for path2/query2')
// Calling second request before first
const response2 = await got('http://other.test/path2?query=2')
expect(response2).to.include({
statusCode: 200,
body: 'response for path2/query2',
})
// Calling first request after second
const response1 = await got('http://other.test/path1?query=1')
expect(response1).to.include({
statusCode: 200,
body: 'response for path1/query1',
})
})
// FIXME: This marked as `skip` because it is an existing bug.
// https://github.com/nock/nock/issues/1108
it.skip('match hostname as regex and string in tandem', async () => {
const scope1 = nock(/.*/).get('/hello/world').reply()
const scope2 = nock('http://example.test').get('/hello/planet').reply()
const response1 = await got('http://example.test/hello/world')
expect(response1.statusCode).to.equal(200)
scope1.done()
const response2 = await got('http://example.test/hello/planet')
expect(response2.statusCode).to.equal(200)
scope2.done()
})
it('match domain using intercept callback', async () => {
const validUrl = ['/cats', '/dogs']
nock('http://example.test')
.get(function (uri) {
return validUrl.indexOf(uri) >= 0
})
.reply(200, 'Match intercept')
.get('/cats')
.reply(200, 'Match intercept 2')
const response1 = await got('http://example.test/cats')
expect(response1).to.include({ statusCode: 200, body: 'Match intercept' })
const response2 = await got('http://example.test/cats')
expect(response2).to.include({ statusCode: 200, body: 'Match intercept 2' })
})
it('match path using regexp', async () => {
nock('http://example.test')
.get(/regex$/)
.reply(200, 'Match regex')
const { statusCode, body } = await got(
'http://example.test/resources/regex'
)
expect(statusCode).to.equal(200)
expect(body).to.equal('Match regex')
})
// https://github.com/nock/nock/issues/2134
it('match path using regexp with global flag', async () => {
nock('http://example.test').get(/foo/g).reply(200, 'Match regex')
const { statusCode, body } = await got('http://example.test/foo/bar')
expect(statusCode).to.equal(200)
expect(body).to.equal('Match regex')
})
it('match path using function', async () => {
const path = '/match/uri/function'
const urlFunction = uri => uri === path
nock(`http://example.test`)
.delete(urlFunction)
.reply(200, 'Match DELETE')
.get(urlFunction)
.reply(200, 'Match GET')
.head(urlFunction)
.reply(200, 'Match HEAD')
.merge(urlFunction)
.reply(200, 'Match MERGE')
.options(urlFunction)
.reply(200, 'Match OPTIONS')
.patch(urlFunction)
.reply(200, 'Match PATCH')
.post(urlFunction)
.reply(200, 'Match POST')
.put(urlFunction)
.reply(200, 'Match PUT')
const postResponse = await got.post(
'http://example.test/match/uri/function'
)
expect(postResponse).to.include({ statusCode: 200, body: `Match POST` })
const getResponse = await got('http://example.test/match/uri/function')
expect(getResponse).to.include({ statusCode: 200, body: `Match GET` })
await assertRejects(
got.head('http://example.test/do/not/match'),
/Nock: No match for request/
)
})
it('you must setup an interceptor for each request', async () => {
nock('http://example.test').get('/hey').reply(200, 'First match')
const { statusCode, body } = await got('http://example.test/hey')
expect(statusCode).to.equal(200)
expect(body).to.equal('First match')
await assertRejects(
got('http://example.test/hey'),
/Nock: No match for request/
)
})
// TODO: What is the intention of this test?
it('no content type provided', done => {
const scope = nock('http://example.test')
.replyContentLength()
.post('/httppost', () => true)
.reply(401, '')
http
.request(
{
host: 'example.test',
path: '/httppost',
method: 'POST',
headers: {},
},
res => {
res.on('data', () => {})
res.once('end', () => {
scope.done()
done()
})
}
)
.end('WHAA')
})
// https://github.com/nock/nock/issues/835
it('match domain and path using regexp', async () => {
const responseBody = 'this is the response'
const scope = nock(/example/)
.get(/img/)
.reply(200, responseBody)
const { statusCode, body } = await got('http://example.test/imghp?hl=en')
expect(statusCode).to.equal(200)
expect(body).to.equal(responseBody)
scope.done()
})
// https://github.com/nock/nock/issues/1003
it('correctly parse request without specified path', done => {
const scope1 = nock('https://example.test').get('/').reply(200)
https
.request({ hostname: 'example.test' }, res => {
expect(res.statusCode).to.equal(200)
res.on('data', () => {})
res.on('end', () => {
scope1.done()
done()
})
})
.end()
})
it('data is sent with flushHeaders', done => {
const scope1 = nock('https://example.test')
.get('/')
.reply(200, 'this is data')
const onData = sinon.spy()
https
.request({ hostname: 'example.test' }, res => {
expect(res.statusCode).to.equal(200)
res.on('data', data => {
onData()
expect(data.toString()).to.equal('this is data')
})
res.on('end', () => {
expect(onData).to.have.been.calledOnce()
scope1.done()
done()
})
})
.flushHeaders()
})
it('wildcard param URL should not throw error', done => {
expect(() => nock('http://example.test').get('*')).not.to.throw()
done()
})
it('with filteringScope, URL path without leading slash does not throw error', done => {
expect(() =>
nock('http://example.test', { filteringScope: () => {} }).get('')
).not.to.throw()
done()
})
it('no new keys were added to the global namespace', done => {
const leaks = Object.keys(global).filter(
key => !acceptableGlobalKeys.has(key)
)
expect(leaks).to.deep.equal([])
done()
})
// These tests use `http` directly because `got` never calls `http` with the
// three arg form.
it('first arg as URL instance', done => {
const scope = nock('http://example.test').get('/').reply()
http.get(new url.URL('http://example.test'), () => {
scope.done()
done()
})
})
it('three argument form of http.request: URL, options, and callback', done => {
const responseText = 'this is data'
const scope = nock('http://example.test')
.get('/hello')
.reply(201, responseText)
http.get(new url.URL('http://example.test'), { path: '/hello' }, res => {
expect(res.statusCode).to.equal(201)
const onData = sinon.spy()
res.on('data', chunk => {
expect(chunk.toString()).to.equal(responseText)
onData()
})
res.on('end', () => {
// TODO Investigate why this doesn't work.
// expect(onData).to.have.been.calledOnceWithExactly(responseText)
expect(onData).to.have.been.calledOnce()
scope.done()
done()
})
})
})
/*
* This test imitates a feature of node-http-proxy (https://github.com/nodejitsu/node-http-proxy) -
* modifying headers for an in-flight request by modifying them.
* https://github.com/nock/nock/pull/1484
*/
it('works when headers are removed on the socket event', done => {
// Set up a nock that will fail if it gets an "authorization" header.
const scope = nock('http://example.test', { badheaders: ['authorization'] })
.get('/endpoint')
.reply()
// Create a server to act as our reverse proxy.
const server = http.createServer((request, response) => {
// Make a request to the nock instance with the same request that came in.
const proxyReq = http.request({
host: 'example.test',
// Get the path from the incoming request and pass it through.
path: `/${request.url.split('/').slice(1).join('/')}`,
headers: request.headers,
})
// When we connect, remove the authorization header (node-http-proxy uses
// this event to do it).
proxyReq.on('socket', () => {
proxyReq.removeHeader('authorization')
// End the request here, otherwise it ends up matching the request before
// socket gets called because socket runs on `process.nextTick()`.
proxyReq.end()
})
proxyReq.on('response', proxyRes => {
proxyRes.pipe(response)
})
proxyReq.on('error', error => {
expect.fail(error)
done()
})
})
server
.listen(() => {
// Now that the server's started up, make a request to it with an authorization header.
const req = http.request(
{
hostname: 'localhost',
path: '/endpoint',
port: server.address().port,
method: 'GET',
headers: { authorization: 'blah' },
},
res => {
// If we get a request, all good :)
expect(res.statusCode).to.equal(200)
scope.done()
server.close(done)
}
)
req.on('error', error => {
expect.fail(error)
done()
})
req.end()
})
.on('error', error => {
expect.fail(error)
done()
})
})
})
nock-13.2.4/tests/test_intercept_parallel.js 0000664 0000000 0000000 00000004375 14177263367 0021174 0 ustar 00root root 0000000 0000000 'use strict'
const { expect } = require('chai')
const sinon = require('sinon')
const nock = require('..')
const got = require('./got_client')
// Tests for a regression where multiple ClientRequests call `.end` during the
// same event loop iteration. https://github.com/nock/nock/issues/1937
describe('interception in parallel', () => {
const origin = 'https://example.test'
const makeRequest = opts =>
got(origin, opts)
.then(res => res.statusCode)
.catch(reason => {
if (reason.code === 'ERR_NOCK_NO_MATCH') return 418
throw reason
})
it('consumes multiple requests, using multiple Interceptors on the same Scope', async () => {
const scope = nock(origin)
scope.get('/').reply(200)
scope.get('/').reply(201)
const results = await Promise.all([
makeRequest(),
makeRequest(),
makeRequest(),
])
expect(results.sort()).to.deep.equal([200, 201, 418])
scope.done()
})
it('consumes multiple requests, using a single Interceptor', async () => {
const scope = nock(origin).get('/').times(2).reply(200)
const results = await Promise.all([
makeRequest(),
makeRequest(),
makeRequest(),
])
expect(results.sort()).to.deep.equal([200, 200, 418])
scope.done()
})
it('consumes multiple requests, using multiple Scopes', async () => {
nock(origin).get('/').reply(200)
nock(origin).get('/').reply(201)
const results = await Promise.all([
makeRequest(),
makeRequest(),
makeRequest(),
])
expect(results.sort()).to.deep.equal([200, 201, 418])
expect(nock.isDone()).to.equal(true)
})
it('provides the correct request instance on the Interceptor inside reply callbacks', async () => {
const fooHeadersStub = sinon.stub()
nock(origin)
.persist()
.get('/')
.reply(function () {
fooHeadersStub(this.req.headers.foo)
return [200]
})
await Promise.all([
makeRequest({ headers: { foo: 'A' } }),
makeRequest({ headers: { foo: 'B' } }),
])
expect(fooHeadersStub).to.have.calledTwice()
expect(fooHeadersStub).to.have.been.calledWithExactly('A')
expect(fooHeadersStub).to.have.been.calledWithExactly('B')
expect(nock.isDone()).to.equal(true)
})
})
nock-13.2.4/tests/test_ipv6.js 0000664 0000000 0000000 00000003161 14177263367 0016177 0 ustar 00root root 0000000 0000000 'use strict'
const http = require('http')
const { expect } = require('chai')
const sinon = require('sinon')
const nock = require('..')
describe('IPv6', () => {
it('IPV6 URL in http.get get gets mocked', done => {
const responseBody = 'Hello World!'
const scope = nock('http://[2607:f0d0:1002:51::4]:8080')
.get('/')
.reply(200, responseBody)
http.get('http://[2607:f0d0:1002:51::4]:8080/', res => {
expect(res).to.include({ statusCode: 200 })
const onData = sinon.spy()
res.on('data', data => {
onData()
expect(data).to.be.an.instanceOf(Buffer)
expect(data.toString()).to.equal(responseBody)
})
res.on('end', () => {
expect(onData).to.have.been.calledOnce()
scope.done()
done()
})
})
})
it('IPV6 hostname in http.request get gets mocked', done => {
const responseBody = 'Hello World!'
const scope = nock('http://[2607:f0d0:1002:51::5]:8080')
.get('/')
.reply(200, responseBody)
http
.request(
{
hostname: '2607:f0d0:1002:51::5',
path: '/',
method: 'GET',
port: 8080,
},
res => {
expect(res).to.include({ statusCode: 200 })
const onData = sinon.spy()
res.on('data', data => {
onData()
expect(data).to.be.an.instanceOf(Buffer)
expect(data.toString()).to.equal(responseBody)
})
res.on('end', () => {
expect(onData).to.have.been.calledOnce()
scope.done()
done()
})
}
)
.end()
})
})
nock-13.2.4/tests/test_logging.js 0000664 0000000 0000000 00000003237 14177263367 0016745 0 ustar 00root root 0000000 0000000 'use strict'
const debug = require('debug')
const sinon = require('sinon')
const { expect } = require('chai')
const nock = require('..')
const got = require('./got_client')
describe('Logging using the `debug` package', () => {
let logFn
beforeEach(() => {
logFn = sinon.stub(debug, 'log')
debug.enable('nock*')
})
afterEach(() => {
debug.disable('nock*')
})
it('match debugging works', async () => {
nock('http://example.test').post('/deep/link').reply(200, 'Hello World!')
const exampleBody = 'Hello yourself!'
await got.post('http://example.test/deep/link', { body: exampleBody })
// the log function will have been a few dozen times, there are a few specific to matching we want to validate:
// the log when an interceptor is chosen
expect(logFn).to.have.been.calledWith(
sinon.match('matched base path (1 interceptor)')
)
// the log of the Interceptor match
expect(logFn).to.have.been.calledWith(
// debug namespace for the scope that includes the host
sinon.match('nock.scope:example.test'),
// This is a JSON blob which contains, among other things the complete
// request URL.
sinon.match('"href":"http://example.test/deep/link"'),
// This is the JSON-stringified body.
`"${exampleBody}"`
)
expect(logFn).to.have.been.calledWith(sinon.match('query matching skipped'))
expect(logFn).to.have.been.calledWith(
sinon.match(
'matching http://example.test:80/deep/link to POST http://example.test:80/deep/link: true'
)
)
expect(logFn).to.have.been.calledWith(
sinon.match('interceptor identified, starting mocking')
)
})
})
nock-13.2.4/tests/test_net_connect.js 0000664 0000000 0000000 00000006305 14177263367 0017615 0 ustar 00root root 0000000 0000000 'use strict'
const { expect } = require('chai')
const assertRejects = require('assert-rejects')
const sinon = require('sinon')
const nock = require('..')
const got = require('./got_client')
const servers = require('./servers')
describe('`disableNetConnect()`', () => {
it('prevents connection to unmocked hosts', async () => {
nock.disableNetConnect()
nock('http://www.example.test').get('/').reply(200)
await assertRejects(
got('https://other.example.test/'),
/Nock: Disallowed net connect for "other.example.test:443\/"/
)
})
it('prevents connections when no hosts are mocked', async () => {
nock.disableNetConnect()
await assertRejects(got('http://example.test'), err => {
expect(err).to.include({
code: 'ENETUNREACH',
message: 'Nock: Disallowed net connect for "example.test:80/"',
})
expect(err.stack).to.be.a('string')
return true
})
})
})
describe('`enableNetConnect()`', () => {
it('enables real HTTP request only for specified domain, via string', async () => {
const onResponse = sinon.spy()
const { origin } = await servers.startHttpServer((request, response) => {
onResponse()
response.writeHead(200)
response.end()
})
nock.enableNetConnect('localhost')
await got(origin)
expect(onResponse).to.have.been.calledOnce()
})
it('disallows request for other domains, via string', async () => {
nock.enableNetConnect('localhost')
await assertRejects(
got('https://example.test/'),
/Nock: Disallowed net connect for "example.test:443\/"/
)
})
it('enables real HTTP request only for specified domain, via regexp', async () => {
const onResponse = sinon.spy()
const { origin } = await servers.startHttpServer((request, response) => {
onResponse()
response.writeHead(200)
response.end()
})
nock.enableNetConnect(/ocalhos/)
await got(origin)
expect(onResponse).to.have.been.calledOnce()
})
it('disallows request for other domains, via regexp', async () => {
nock.enableNetConnect(/ocalhos/)
await assertRejects(
got('https://example.test/'),
/Nock: Disallowed net connect for "example.test:443\/"/
)
})
it('enables real HTTP request only for specified domain, via function', async () => {
const onResponse = sinon.spy()
const { origin } = await servers.startHttpServer((request, response) => {
onResponse()
response.writeHead(200)
response.end()
})
nock.enableNetConnect(host => host.includes('ocalhos'))
await got(origin)
expect(onResponse).to.have.been.calledOnce()
})
it('disallows request for other domains, via function', async () => {
nock.enableNetConnect(host => host.includes('ocalhos'))
await assertRejects(
got('https://example.test/'),
/Nock: Disallowed net connect for "example.test:443\/"/
)
})
it('passes the domain to be tested, via function', async () => {
const matcher = sinon.stub().returns(false)
nock.enableNetConnect(matcher)
await got('https://example.test/').catch(() => undefined) // ignore rejection, expected
expect(matcher).to.have.been.calledOnceWithExactly('example.test:443')
})
})
nock-13.2.4/tests/test_nock_lifecycle.js 0000664 0000000 0000000 00000014022 14177263367 0020262 0 ustar 00root root 0000000 0000000 'use strict'
const http = require('http')
const { expect } = require('chai')
const nock = require('..')
const sinon = require('sinon')
const assertRejects = require('assert-rejects')
const got = require('./got_client')
const servers = require('./servers')
describe('Nock lifecycle functions', () => {
describe('`activate()`', () => {
it('double activation throws exception', () => {
nock.restore()
expect(nock.isActive()).to.be.false()
nock.activate()
expect(nock.isActive()).to.be.true()
expect(() => nock.activate()).to.throw(Error, 'Nock already active')
expect(nock.isActive()).to.be.true()
})
it('(re-)activate after restore', async () => {
const onResponse = sinon.spy()
const { origin } = await servers.startHttpServer((request, response) => {
onResponse()
if (request.url === '/') {
response.writeHead(200)
response.write('server served a response')
}
response.end()
})
const scope = nock(origin).get('/').reply(304, 'served from our mock')
nock.restore()
expect(nock.isActive()).to.be.false()
expect(await got(origin)).to.include({ statusCode: 200 })
expect(scope.isDone()).to.be.false()
nock.activate()
expect(nock.isActive()).to.be.true()
expect(await got(origin)).to.include({ statusCode: 304 })
expect(scope.isDone()).to.be.true()
expect(onResponse).to.have.been.calledOnce()
})
})
describe('`cleanAll()`', () => {
it('removes a half-consumed mock', async () => {
nock('http://example.test').get('/').twice().reply()
await got('http://example.test/')
nock.cleanAll()
await assertRejects(got('http://example.test/'), err => {
expect(err).to.include({ name: 'RequestError', code: 'ENOTFOUND' })
return true
})
})
it('removes pending mocks from all scopes', () => {
const scope1 = nock('http://example.test')
.get('/somepath')
.reply(200, 'hey')
expect(scope1.pendingMocks()).to.deep.equal([
'GET http://example.test:80/somepath',
])
const scope2 = nock('http://example.test')
.get('/somepath')
.reply(200, 'hey')
expect(scope2.pendingMocks()).to.deep.equal([
'GET http://example.test:80/somepath',
])
nock.cleanAll()
expect(scope1.pendingMocks()).to.be.empty()
expect(scope2.pendingMocks()).to.be.empty()
})
it('removes persistent mocks', async () => {
nock('http://example.test').persist().get('/').reply()
nock.cleanAll()
await assertRejects(got('http://example.test/'), err => {
expect(err).to.include({
name: 'RequestError',
code: 'ENOTFOUND',
})
return true
})
})
it('should be safe to call in the middle of a request', done => {
// This covers a race-condition where cleanAll() is called while a request
// is in mid-flight. The request itself should continue to process normally.
// Notably, `cleanAll` is being called before the Interceptor is marked as
// consumed and removed from the global map. Having this test wait until the
// response event means we verify it didn't throw an error when attempting
// to remove an Interceptor that doesn't exist in the global map `allInterceptors`.
nock('http://example.test').get('/').reply()
const req = http.request('http://example.test', () => {
done()
})
req.once('socket', () => {
nock.cleanAll()
})
req.end()
})
})
describe('`isDone()`', () => {
it('returns false while a mock is pending, and true after it is consumed', async () => {
const scope = nock('http://example.test').get('/').reply()
expect(nock.isDone()).to.be.false()
await got('http://example.test/')
expect(nock.isDone()).to.be.true()
scope.done()
})
})
describe('`pendingMocks()`', () => {
it('returns the expected array while a mock is pending, and an empty array after it is consumed', async () => {
nock('http://example.test').get('/').reply()
expect(nock.pendingMocks()).to.deep.equal(['GET http://example.test:80/'])
await got('http://example.test/')
expect(nock.pendingMocks()).to.be.empty()
})
})
describe('`activeMocks()`', () => {
it('returns the expected array for incomplete mocks', () => {
nock('http://example.test').get('/').reply(200)
expect(nock.activeMocks()).to.deep.equal(['GET http://example.test:80/'])
})
it("activeMocks doesn't return completed mocks", async () => {
nock('http://example.test').get('/').reply()
await got('http://example.test/')
expect(nock.activeMocks()).to.be.empty()
})
})
describe('resetting nock catastrophically while a request is in progress', () => {
it('is handled gracefully', async () => {
// While invoking cleanAll() from a nock request handler isn't very
// realistic, it's possible that user code under test could crash, causing
// before or after hooks to fire, which invoke `nock.cleanAll()`. A little
// extreme, though if this does happen, we may as well be graceful about it.
function somethingBad() {
nock.cleanAll()
}
const responseBody = 'hi'
const scope = nock('http://example.test')
.get('/somepath')
.reply(200, (uri, requestBody) => {
somethingBad()
return responseBody
})
const { body } = await got('http://example.test/somepath')
expect(body).to.equal(responseBody)
scope.done()
})
})
describe('`abortPendingRequests()`', () => {
it('prevents the request from completing', done => {
const onRequest = sinon.spy()
nock('http://example.test').get('/').delayConnection(100).reply(200, 'OK')
http.get('http://example.test', onRequest)
setTimeout(() => {
expect(onRequest).not.to.have.been.called()
done()
}, 200)
process.nextTick(nock.abortPendingRequests)
})
})
})
nock-13.2.4/tests/test_nock_off.js 0000664 0000000 0000000 00000002366 14177263367 0017105 0 ustar 00root root 0000000 0000000 'use strict'
const { expect } = require('chai')
const http = require('http')
const nock = require('..')
const got = require('./got_client')
const httpsServer = require('./servers')
describe('NOCK_OFF env var', () => {
let original
beforeEach(() => {
original = process.env.NOCK_OFF
process.env.NOCK_OFF = 'true'
})
afterEach(() => {
process.env.NOCK_OFF = original
})
it('when true, https mocks reach the live server', async () => {
const responseBody = 'the real thing'
const { origin } = await httpsServer.startHttpsServer(
(request, response) => {
response.writeHead(200)
response.end(responseBody)
}
)
const scope = nock(origin, { allowUnmocked: true })
.get('/')
.reply(200, 'mock')
const { body } = await got(origin, {
https: { certificateAuthority: httpsServer.ca },
})
expect(body).to.equal(responseBody)
scope.done()
})
it('when true before import, Nock does not activate', async () => {
nock.restore()
const originalClient = http.ClientRequest
delete require.cache[require.resolve('..')]
const newNock = require('..')
expect(http.ClientRequest).to.equal(originalClient)
expect(newNock.isActive()).to.equal(false)
})
})
nock-13.2.4/tests/test_persist_optionally.js 0000664 0000000 0000000 00000013670 14177263367 0021264 0 ustar 00root root 0000000 0000000 'use strict'
// `persist()` and `optionally()` are closely related. Their tests are both
// contained in this file.
const http = require('http')
const path = require('path')
const assertRejects = require('assert-rejects')
const { expect } = require('chai')
const nock = require('..')
const got = require('./got_client')
const textFilePath = path.resolve(__dirname, './assets/reply_file_1.txt')
describe('`optionally()`', () => {
it('optional mocks do not appear in `pendingMocks()`', () => {
nock('http://example.test').get('/nonexistent').optionally().reply(200)
expect(nock.pendingMocks()).to.be.empty()
})
it('when called with `true`, makes the mock optional', () => {
nock('http://example.test').get('/nonexistent').optionally(true).reply(200)
expect(nock.pendingMocks()).to.be.empty()
})
it('when called with `false`, the mock is still required', () => {
nock('http://example.test').get('/nonexistent').optionally(false).reply(200)
expect(nock.pendingMocks()).to.have.lengthOf(1)
})
it('when called with non-boolean, throws the expected error', () => {
const interceptor = nock('http://example.test').get('/')
expect(() => interceptor.optionally('foo')).to.throw(
Error,
'Invalid arguments: argument should be a boolean'
)
})
it('optional mocks can be matched', done => {
nock('http://example.test').get('/abc').optionally().reply(200)
http.get({ host: 'example.test', path: '/abc' }, res => {
expect(res.statusCode).to.equal(200)
expect(nock.pendingMocks()).to.be.empty()
done()
})
})
it('before matching, `isDone()` is true', () => {
const scope = nock('http://example.test')
.get('/abc')
.optionally()
.reply(200)
expect(scope.isDone()).to.be.true()
})
describe('in conjunction with `persist()`', () => {
it('when optional mocks are also persisted, they do not appear as pending', async () => {
const scope = nock('http://example.test')
.get('/')
.optionally()
.reply(200)
.persist()
expect(nock.pendingMocks()).to.be.empty()
const response1 = await got('http://example.test/')
expect(response1.statusCode).to.equal(200)
expect(nock.pendingMocks()).to.be.empty()
const response2 = await got('http://example.test/')
expect(response2.statusCode).to.equal(200)
expect(nock.pendingMocks()).to.be.empty()
scope.done()
})
})
it('optional repeated mocks execute repeatedly', done => {
nock('http://example.test').get('/456').optionally().times(2).reply(200)
http.get({ host: 'example.test', path: '/456' }, res => {
expect(res.statusCode).to.equal(200)
http.get({ host: 'example.test', path: '/456' }, res => {
expect(res.statusCode).to.equal(200)
done()
})
})
})
it("optional mocks appear in `activeMocks()` only until they're matched", done => {
nock('http://example.test').get('/optional').optionally().reply(200)
expect(nock.activeMocks()).to.deep.equal([
'GET http://example.test:80/optional',
])
http.get({ host: 'example.test', path: '/optional' }, res => {
expect(nock.activeMocks()).to.be.empty()
done()
})
})
})
describe('`persist()`', () => {
it('`activeMocks()` always returns persisted mocks, even after matching', async () => {
const scope = nock('http://example.test')
.get('/persisted')
.reply(200)
.persist()
expect(nock.activeMocks()).to.deep.equal([
'GET http://example.test:80/persisted',
])
await got('http://example.test/persisted')
expect(nock.activeMocks()).to.deep.equal([
'GET http://example.test:80/persisted',
])
scope.done()
})
it('persisted mocks match repeatedly', async () => {
const scope = nock('http://example.test')
.persist()
.get('/')
.reply(200, 'Persisting all the way')
expect(scope.isDone()).to.be.false()
await got('http://example.test/')
expect(scope.isDone()).to.be.true()
await got('http://example.test/')
expect(scope.isDone()).to.be.true()
})
it('persisted mocks appear in `pendingMocks()`', async () => {
const scope = nock('http://example.test')
.get('/abc')
.reply(200, 'Persisted reply')
.persist()
expect(scope.pendingMocks()).to.deep.equal([
'GET http://example.test:80/abc',
])
})
it('persisted mocks are removed from `pendingMocks()` once they are matched once', async () => {
const scope = nock('http://example.test')
.get('/def')
.reply(200, 'Persisted reply')
.persist()
await got('http://example.test/def')
expect(scope.pendingMocks()).to.deep.equal([])
})
it('persisted mocks can use `replyWithFile()`', async () => {
nock('http://example.test')
.persist()
.get('/')
.replyWithFile(200, textFilePath)
.get('/test')
.reply(200, 'Yay!')
for (let i = 0; i < 2; ++i) {
const { statusCode, body } = await got('http://example.test/')
expect(statusCode).to.equal(200)
expect(body).to.equal('Hello from the file!')
}
})
it('can call `persist(false)` to stop persisting', async () => {
const scope = nock('http://example.test')
.persist(true)
.get('/')
.reply(200, 'Persisting all the way')
expect(scope.isDone()).to.be.false()
await got('http://example.test/')
expect(scope.isDone()).to.be.true()
expect(nock.activeMocks()).to.deep.equal(['GET http://example.test:80/'])
scope.persist(false)
await got('http://example.test/')
expect(nock.activeMocks()).to.be.empty()
expect(scope.isDone()).to.be.true()
await assertRejects(
got('http://example.test/'),
/Nock: No match for request/
)
})
it('when called with an invalid argument, throws the expected error', () => {
expect(() => nock('http://example.test').persist('string')).to.throw(
Error,
'Invalid arguments: argument should be a boolean'
)
})
})
nock-13.2.4/tests/test_query.js 0000664 0000000 0000000 00000022603 14177263367 0016462 0 ustar 00root root 0000000 0000000 'use strict'
const { expect } = require('chai')
const sinon = require('sinon')
const url = require('url')
const nock = require('..')
const got = require('./got_client')
const assertRejects = require('assert-rejects')
describe('query params in path', () => {
it('matches that query string', async () => {
const scope = nock('http://example.test').get('/foo?bar=baz').reply()
const { statusCode } = await got('http://example.test/foo?bar=baz')
expect(statusCode).to.equal(200)
scope.done()
})
})
describe('`query()`', () => {
describe('when called with an object', () => {
it('matches a query string of the same name=value', async () => {
const scope = nock('http://example.test')
.get('/')
.query({ foo: 'bar' })
.reply()
const { statusCode } = await got('http://example.test/?foo=bar')
expect(statusCode).to.equal(200)
scope.done()
})
it('matches multiple query strings of the same name=value', async () => {
const scope = nock('http://example.test')
.get('/')
.query({ foo: 'bar', baz: 'foz' })
.reply()
const { statusCode } = await got('http://example.test/?foo=bar&baz=foz')
expect(statusCode).to.equal(200)
scope.done()
})
it('matches multiple query strings of the same name=value regardless of order', async () => {
const scope = nock('http://example.test')
.get('/')
.query({ foo: 'bar', baz: 'foz' })
.reply()
const { statusCode } = await got('http://example.test/?baz=foz&foo=bar')
expect(statusCode).to.equal(200)
scope.done()
})
it('matches query values regardless of their type of declaration', async () => {
const scope = nock('http://example.test')
.get('/')
.query({ num: 1, bool: true, empty: null, str: 'fou' })
.reply()
const { statusCode } = await got(
'http://example.test/?num=1&bool=true&empty=&str=fou'
)
expect(statusCode).to.equal(200)
scope.done()
})
it("doesn't match query values of requests without query string", async () => {
const scope1 = nock('http://example.test')
.get('/')
.query({ num: 1, bool: true, empty: null, str: 'fou' })
.reply(200, 'scope1')
const scope2 = nock('http://example.test').get('/').reply(200, 'scope2')
const { statusCode, body } = await got('http://example.test/')
expect(statusCode).to.equal(200)
expect(body).to.equal('scope2')
scope2.done()
expect(scope1.isDone()).to.be.false()
})
it('matches a query string using regexp', async () => {
const scope = nock('http://example.test')
.get('/')
.query({ foo: /.*/ })
.reply()
const { statusCode } = await got('http://example.test/?foo=bar')
expect(statusCode).to.equal(200)
scope.done()
})
it('throws if query params have already been defined', () => {
const interceptor = nock('http://example.test').get('/?foo=bar')
expect(() => {
interceptor.query({ foo: 'baz' })
}).to.throw(Error, 'Query parameters have already been defined')
})
it('throws if it was already called', () => {
const interceptor = nock('http://example.test')
.get('/')
.query({ foo: 'bar' })
expect(() => {
interceptor.query({ baz: 'qux' })
}).to.throw(Error, 'Query parameters have already been defined')
})
it('matches a query string that contains special RFC3986 characters', async () => {
const scope = nock('http://example.test')
.get('/')
.query({ 'foo&bar': 'hello&world' })
.reply()
const { statusCode } = await got('http://example.test/', {
searchParams: { 'foo&bar': 'hello&world' },
})
expect(statusCode).to.equal(200)
scope.done()
})
it('expects unencoded query params', async () => {
const scope = nock('http://example.test')
.get('/')
.query({ foo: 'hello%20world' })
.reply()
await assertRejects(
got('http://example.test/?foo=hello%20world'),
/Nock: No match for request/
)
const { statusCode } = await got(
'http://example.test/?foo=hello%2520world'
)
expect(statusCode).to.equal(200)
scope.done()
})
it('matches a query string with pre-encoded values', async () => {
const scope = nock('http://example.test', { encodedQueryParams: true })
.get('/')
.query({ foo: 'hello%20world' })
.reply()
const { statusCode } = await got('http://example.test/?foo=hello%20world')
expect(statusCode).to.equal(200)
scope.done()
})
it('when called with "{}" will allow a match against ending in ?', async () => {
const scope = nock('http://example.test')
.get('/noquerystring')
.query({})
.reply()
const { statusCode } = await got('http://example.test/noquerystring?')
expect(statusCode).to.equal(200)
scope.done()
})
it('will not match when a query string does not match name=value', async () => {
nock('http://example.test').get('/').query({ foo: 'bar' }).reply()
await assertRejects(
got('http://example.test/?foo=baz'),
/Nock: No match for request/
)
})
it('will not match when a query string is present that was not registered', async () => {
nock('http://example.test').get('/').query({ foo: 'bar' }).reply()
await assertRejects(
got('http://example.test/?foo=bar&baz=foz'),
/Nock: No match for request/
)
})
it('will not match when a query string is malformed', async () => {
// This is a valid query string so it's not really malformed, just not
// matching. Should this test be removed?
nock('http://example.test').get('/').query({ foo: 'bar' }).reply()
await assertRejects(
got('http://example.test/?foobar'),
/Nock: No match for request/
)
})
it('will not match when a query string has fewer correct values than expected', async () => {
nock('http://example.test')
.get('/')
.query({
num: 1,
bool: true,
empty: null,
str: 'fou',
})
.reply()
await assertRejects(
got('http://example.test/?num=1str=fou'),
/Nock: No match for request/
)
})
it('query matching should not consider request arrays equal to comma-separated expectations', async () => {
nock('http://example.test').get('/').query({ foo: 'bar,baz' }).reply()
await assertRejects(
got('http://example.test?foo[]=bar&foo[]=baz'),
/Nock: No match for request/
)
})
it('query matching should not consider comma-separated requests equal to array expectations', async () => {
nock('http://example.test')
.get('/')
.query({ foo: ['bar', 'baz'] })
.reply()
await assertRejects(
got('http://example.test?foo=bar%2Cbaz'),
/Nock: No match for request/
)
})
})
describe('when called with URLSearchParams', () => {
it('matches', async () => {
const params = new url.URLSearchParams({ foo: 'bar' })
const scope = nock('http://example.test').get('/').query(params).reply()
const { statusCode } = await got('http://example.test?foo=bar')
expect(statusCode).to.equal(200)
scope.done()
})
})
describe('when called with invalid arguments', () => {
it('throws the expected error', () => {
const interceptor = nock('http://example.test').get('/')
expect(() => {
interceptor.query('foo=bar')
}).to.throw(Error, 'Argument Error: foo=bar')
})
})
describe('when called with `true`', () => {
it('will allow all query strings to pass', async () => {
const scope = nock('http://example.test').get('/').query(true).reply()
const { statusCode } = await got('http://example.test/?foo=hello%20world')
expect(statusCode).to.equal(200)
scope.done()
})
it('will match when the path has no query', async () => {
const scope = nock('http://example.test').get('/').query(true).reply()
const { statusCode } = await got('http://example.test/')
expect(statusCode).to.equal(200)
scope.done()
})
})
describe('when called with a function', () => {
it('function called with actual queryObject', async () => {
const queryFn = sinon.stub().returns(true)
const scope = nock('http://example.test').get('/').query(queryFn).reply()
const { statusCode } = await got('http://example.test/?foo=bar&a=1&b=2')
expect(statusCode).to.equal(200)
expect(queryFn).to.have.been.calledOnceWithExactly({
foo: 'bar',
a: '1',
b: '2',
})
scope.done()
})
it('function return true the query treat as matched', async () => {
const scope = nock('http://example.test')
.get('/')
.query(() => true)
.reply()
const { statusCode } = await got(
'http://example.test/?ignore=the&actual=query'
)
expect(statusCode).to.equal(200)
scope.done()
})
it('function return false the query treat as un-matched', async () => {
nock('http://example.test')
.get('/')
.query(() => false)
.reply()
await assertRejects(
got('http://example.test/?i=should&pass=?'),
/Nock: No match for request/
)
})
})
})
nock-13.2.4/tests/test_query_complex.js 0000664 0000000 0000000 00000007137 14177263367 0020216 0 ustar 00root root 0000000 0000000 'use strict'
const nock = require('..')
const got = require('./got_client')
describe('`query()` complex encoding', () => {
it('query with array', async () => {
// In Node 10.x this can be updated:
// const exampleQuery = new URLSearchParams([
// ['list', 123],
// ['list', 456],
// ['list', 789],
// ['a', 'b'],
// ])
const expectedQuery = { list: [123, 456, 789], a: 'b' }
const encodedQuery = 'list=123&list=456&list=789&a=b'
const scope = nock('http://example.test')
.get('/test')
.query(expectedQuery)
.reply()
await got(`http://example.test/test?${encodedQuery}`)
scope.done()
})
// These tests enforce the historical behavior of query strings as encoded by
// the `qs` library. These are not standard, although they are compatible with
// the `qs` option to `request`.
it('query with array which contains unencoded value', async () => {
const expectedQuery = {
list: ['hello%20world', '2hello%20world', 3],
a: 'b',
}
const encodedQuery =
'list%5B0%5D=hello%2520world&list%5B1%5D=2hello%2520world&list%5B2%5D=3&a=b'
const scope = nock('http://example.test')
.get('/test')
.query(expectedQuery)
.reply()
await got(`http://example.test/test?${encodedQuery}`)
scope.done()
})
it('query with array which contains pre-encoded values ', async () => {
const expectedQuery = { list: ['hello%20world', '2hello%20world'] }
const queryString = 'list%5B0%5D=hello%20world&list%5B1%5D=2hello%20world'
const scope = nock('http://example.test', { encodedQueryParams: true })
.get('/test')
.query(expectedQuery)
.reply()
await got(`http://example.test/test?${queryString}`)
scope.done()
})
it('query with object', async () => {
const expectedQuery = {
a: {
b: ['c', 'd'],
},
e: [1, 2, 3, 4],
q: '(nodejs)',
}
const encodedQuery =
'a[b][0]=c&a[b][1]=d&e[0]=1&e[1]=2&e[2]=3&e[3]=4&q=(nodejs)'
const scope = nock('http://example.test')
.get('/test')
.query(expectedQuery)
.reply()
await got(`http://example.test/test?${encodedQuery}`)
scope.done()
})
it('query with object which contains unencoded value', async () => {
const exampleQuery = {
a: {
b: 'hello%20world',
},
}
const encodedQuery = 'a%5Bb%5D=hello%2520world'
const scope = nock('http://example.test')
.get('/test')
.query(exampleQuery)
.reply()
await got(`http://example.test/test?${encodedQuery}`)
scope.done()
})
it('query with object which contains pre-encoded values', async () => {
const queryString = 'a%5Bb%5D=hello%20world'
const exampleQuery = {
a: {
b: 'hello%20world',
},
}
const scope = nock('http://example.test', { encodedQueryParams: true })
.get('/test')
.query(exampleQuery)
.reply()
await got(`http://example.test/test?${queryString}`)
scope.done()
})
it('query with array and regexp', async () => {
// In Node 10.x this can be updated:
// const exampleQuery = new URLSearchParams([
// ['list', 123],
// ['list', 456],
// ['list', 789],
// ['foo', 'bar'],
// ['a', 'b'],
// ]).toString()
const encodedQuery = 'list=123&list=456&list=789&foo=bar&a=b'
const expectedQuery = {
list: [123, 456, 789],
foo: /.*/,
a: 'b',
}
const scope = nock('http://example.test')
.get('/test')
.query(expectedQuery)
.reply()
await got(`http://example.test/test?${encodedQuery}`)
scope.done()
})
})
nock-13.2.4/tests/test_recorder.js 0000664 0000000 0000000 00000101146 14177263367 0017122 0 ustar 00root root 0000000 0000000 'use strict'
const http = require('http')
const https = require('https')
const { URLSearchParams } = require('url')
const zlib = require('zlib')
const sinon = require('sinon')
const { expect } = require('chai')
const nock = require('..')
const got = require('./got_client')
const servers = require('./servers')
describe('Recorder', () => {
let globalCount
beforeEach(() => {
globalCount = Object.keys(global).length
})
afterEach(() => {
let leaks = Object.keys(global).splice(globalCount, Number.MAX_VALUE)
if (leaks.length === 1 && leaks[0] === '_key') {
leaks = []
}
expect(leaks).to.be.empty()
})
it('does not record requests from previous sessions', async () => {
const { origin } = await servers.startHttpServer()
nock.restore()
nock.recorder.clear()
nock.recorder.rec(true)
const req1 = http.get(`${origin}/foo`)
const req1Promise = new Promise(resolve => {
req1.on('response', res => {
res.on('end', resolve)
res.resume()
})
})
// start a new recording session while the first request is still in flight
nock.restore()
nock.recorder.rec(true)
await got.post(`${origin}/bar`)
// wait for the first request to end
await req1Promise
// validate only the request from the second session is in the outputs
const outputs = nock.recorder.play()
expect(outputs).to.have.lengthOf(1)
expect(outputs[0]).to.match(/\.post\('\/bar'\)/)
})
it('when request port is different, use the alternate port', async () => {
nock.restore()
nock.recorder.clear()
nock.recorder.rec(true)
const { origin, port } = await servers.startHttpServer()
expect(port).not.to.equal(80)
await got.post(origin)
const recorded = nock.recorder.play()
expect(recorded).to.have.lengthOf(1)
expect(recorded[0]).to.include(`nock('http://localhost:${port}',`)
})
it('recording turns off nock interception (backward compatibility behavior)', () => {
// We ensure that there are no overrides.
nock.restore()
expect(nock.isActive()).to.be.false()
// We active the nock overriding - as it's done by merely loading nock.
nock.activate()
expect(nock.isActive()).to.be.true()
// We start recording.
nock.recorder.rec()
// Nothing happens (nothing has been thrown) - which was the original behavior -
// and mocking has been deactivated.
expect(nock.isActive()).to.be.false()
})
it('records', async () => {
const gotRequest = sinon.spy()
nock.restore()
nock.recorder.clear()
expect(nock.recorder.play()).to.be.empty()
const { origin, port } = await servers.startHttpServer(
(request, response) => {
gotRequest()
response.writeHead(200)
response.end()
}
)
nock.recorder.rec(true)
await got.post(origin)
expect(gotRequest).to.have.been.calledOnce()
nock.restore()
const recorded = nock.recorder.play()
expect(recorded).to.have.lengthOf(1)
expect(recorded[0]).to.be.a('string')
// TODO: Use chai-string?
expect(
recorded[0].startsWith(
`\nnock('http://localhost:${port}', {"encodedQueryParams":true})\n .post('/')`
)
).to.be.true()
})
it('records objects', async () => {
const gotRequest = sinon.spy()
nock.restore()
nock.recorder.clear()
expect(nock.recorder.play()).to.be.empty()
const { origin } = await servers.startHttpServer((request, response) => {
gotRequest()
response.writeHead(200)
response.end()
})
nock.recorder.rec({
dont_print: true,
output_objects: true,
})
const requestBody = '0123455'
await got.post(origin, { body: requestBody })
expect(gotRequest).to.have.been.calledOnce()
nock.restore()
const recorded = nock.recorder.play()
expect(recorded).to.have.lengthOf(1)
expect(recorded[0]).to.include({
scope: origin,
method: 'POST',
body: requestBody,
})
})
it('logs recorded objects', async () => {
const gotRequest = sinon.spy()
const loggingFn = sinon.spy()
nock.restore()
nock.recorder.clear()
expect(nock.recorder.play()).to.be.empty()
const { origin } = await servers.startHttpServer((request, response) => {
gotRequest()
response.writeHead(200)
response.end()
})
nock.recorder.rec({
logging: loggingFn,
output_objects: true,
})
await got.post(origin)
expect(gotRequest).to.have.been.calledOnce()
expect(loggingFn).to.have.been.calledOnce()
expect(
loggingFn
.getCall(0)
.args[0].startsWith(
'\n<<<<<<-- cut here -->>>>>>\n{\n "scope": "http://localhost:'
)
).to.be.true()
})
it('records objects and correctly stores JSON object in body', async () => {
nock.restore()
nock.recorder.clear()
expect(nock.recorder.play()).to.be.empty()
const { origin } = await servers.startHttpServer()
nock.recorder.rec({
dont_print: true,
output_objects: true,
})
const exampleBody = { foo: 123 }
await got.post(origin, {
headers: { 'content-type': 'application/json' },
body: JSON.stringify(exampleBody),
})
nock.restore()
const recorded = nock.recorder.play()
nock.recorder.clear()
nock.activate()
expect(recorded).to.have.lengthOf(1)
// TODO See https://github.com/nock/nock/issues/1229
// This is the current behavior: store body as decoded JSON.
expect(recorded[0]).to.deep.include({ body: exampleBody })
// This is the desired behavior: store the body as encoded JSON. The second
// test shows desired behavior: store body as encoded JSON so that JSON
// strings can be correctly matched at runtime. Because headers are not
// stored in the recorder output, it is impossible for the loader to
// differentiate a stored JSON string from a non-JSON body.
// expect(recorded[0]).to.include({ body: JSON.stringify(exampleBody) })
})
it('records and replays objects correctly', async () => {
const exampleText = 'example'
const { origin } = await servers.startHttpServer((request, response) => {
switch (require('url').parse(request.url).pathname) {
case '/':
response.writeHead(302, { Location: '/abc' })
break
case '/abc':
response.write(exampleText)
break
}
response.end()
})
nock.restore()
nock.recorder.clear()
expect(nock.recorder.play()).to.be.empty()
nock.recorder.rec({
dont_print: true,
output_objects: true,
})
const response1 = await got(origin)
expect(response1.body).to.equal(exampleText)
nock.restore()
const recorded = nock.recorder.play()
nock.recorder.clear()
nock.activate()
expect(recorded).to.have.lengthOf(2)
const nocks = nock.define(recorded)
const response2 = await got(origin)
expect(response2.body).to.equal(exampleText)
nocks.forEach(nock => nock.done())
})
it('records and replays correctly with filteringRequestBody', async () => {
const responseBody = 'example'
const { origin } = await servers.startHttpServer((request, response) => {
response.write(responseBody)
response.end()
})
nock.restore()
nock.recorder.clear()
expect(nock.recorder.play()).to.be.empty()
nock.recorder.rec({
dont_print: true,
output_objects: true,
})
const response1 = await got(origin)
expect(response1.body).to.equal(responseBody)
expect(response1.headers).to.be.ok()
nock.restore()
const recorded = nock.recorder.play()
nock.recorder.clear()
nock.activate()
expect(recorded).to.have.lengthOf(1)
const onFilteringRequestBody = sinon.spy()
const [definition] = recorded
definition.filteringRequestBody = (body, aRecodedBody) => {
onFilteringRequestBody()
expect(body).to.equal(aRecodedBody)
return body
}
const nocks = nock.define([definition])
const response2 = await got(origin)
expect(response2.body).to.equal(responseBody)
nocks.forEach(nock => nock.done())
expect(onFilteringRequestBody).to.have.been.calledOnce()
})
// https://github.com/nock/nock/issues/29
it('http request without callback should not crash', done => {
const serverFinished = sinon.spy()
nock.restore()
nock.recorder.clear()
expect(nock.recorder.play()).to.be.empty()
servers.startHttpServer().then(({ port }) => {
nock.recorder.rec(true)
const req = http.request({
host: 'localhost',
port,
method: 'GET',
path: '/',
})
req.on('response', res => {
res.once('end', () => {
expect(serverFinished).to.have.been.calledOnce()
done()
})
res.resume()
})
req.end()
serverFinished()
})
})
it('checks that data is specified', () => {
nock.restore()
nock.recorder.clear()
nock.recorder.rec(true)
const req = http.request({
method: 'POST',
host: 'localhost',
path: '/',
port: '80',
body: undefined,
})
expect(() => req.write()).to.throw(Error, 'Data was undefined.')
req.abort()
})
it('when request body is json, it goes unstringified', async () => {
const { origin } = await servers.startHttpServer()
nock.restore()
nock.recorder.clear()
nock.recorder.rec(true)
const payload = { a: 1, b: true }
await got.post(origin, { body: JSON.stringify(payload) })
const recorded = nock.recorder.play()
expect(recorded).to.have.lengthOf(1)
expect(recorded[0]).to.include('.post(\'/\', {"a":1,"b":true})')
})
it('when request body is json, it goes unstringified in objects', async () => {
const { origin } = await servers.startHttpServer()
nock.restore()
nock.recorder.clear()
nock.recorder.rec({ dont_print: true, output_objects: true })
const payload = { a: 1, b: true }
await got.post(origin, { body: JSON.stringify(payload) })
const recorded = nock.recorder.play()
expect(recorded).to.have.lengthOf(1)
expect(recorded[0]).to.be.an('object')
expect(recorded[0].body).to.be.an('object').and.deep.equal(payload)
})
it('records nonstandard ports', done => {
nock.restore()
nock.recorder.clear()
expect(nock.recorder.play()).to.be.empty()
const requestBody = 'ABCDEF'
const responseBody = '012345'
const requestListener = (req, res) => {
res.end(responseBody)
}
servers.startHttpServer(requestListener).then(({ origin, port }) => {
nock.recorder.rec({
dont_print: true,
output_objects: true,
})
// Confidence check that we have a non-standard port.
expect(port).to.be.greaterThan(8000)
const req = http.request(
{
host: 'localhost',
port,
path: '/',
},
res => {
res.resume()
res.once('end', () => {
nock.restore()
const recorded = nock.recorder.play()
expect(recorded).to.have.lengthOf(1)
expect(recorded[0]).to.be.an('object').and.include({
scope: origin,
method: 'GET',
body: requestBody,
status: 200,
response: responseBody,
})
done()
})
}
)
req.end(requestBody)
})
})
it('`req.end()` accepts and calls a callback when recording', done => {
const onEnd = sinon.spy()
nock.restore()
nock.recorder.clear()
expect(nock.recorder.play()).to.be.empty()
servers.startHttpServer().then(({ port }) => {
nock.recorder.rec({ dont_print: true })
const req = http.request(
{
hostname: 'localhost',
port,
path: '/',
method: 'GET',
},
res => {
expect(onEnd).to.have.been.calledOnce()
expect(res.statusCode).to.equal(200)
res.on('end', () => {
done()
})
res.resume()
}
)
req.end(onEnd)
})
})
// https://nodejs.org/api/http.html#http_request_end_data_encoding_callback
it('when recording, when `req.end()` is called with only data and a callback, the callback is invoked and the data is sent', done => {
const onEnd = sinon.spy()
let requestBody = ''
const requestListener = (request, response) => {
request.on('data', data => {
requestBody += data
})
request.on('end', () => {
response.writeHead(200)
response.end()
})
}
nock.restore()
nock.recorder.clear()
expect(nock.recorder.play()).to.be.empty()
servers.startHttpServer(requestListener).then(({ port }) => {
nock.recorder.rec({ dont_print: true })
const req = http.request(
{
hostname: 'localhost',
port,
path: '/',
method: 'POST',
},
res => {
expect(onEnd).to.have.been.calledOnce()
expect(res.statusCode).to.equal(200)
res.on('end', () => {
expect(requestBody).to.equal('foobar')
done()
})
res.resume()
}
)
req.end('foobar', onEnd)
})
})
it('`rec()` throws when reinvoked with already recorder requests', () => {
nock.restore()
nock.recorder.clear()
expect(nock.recorder.play()).to.be.empty()
nock.recorder.rec()
expect(() => nock.recorder.rec()).to.throw(
Error,
'Nock recording already in progress'
)
})
it('records https correctly', done => {
const requestBody = '012345'
const responseBody = 'example'
const requestListener = (request, response) => {
response.write(responseBody)
response.end()
}
nock.restore()
nock.recorder.clear()
expect(nock.recorder.play()).to.be.empty()
nock.recorder.rec({
dont_print: true,
output_objects: true,
})
servers.startHttpsServer(requestListener).then(({ origin, port }) => {
https
.request(
{
method: 'POST',
host: 'localhost',
port,
path: '/',
rejectUnauthorized: false,
},
res => {
res.resume()
res.once('end', () => {
nock.restore()
const recorded = nock.recorder.play()
expect(recorded).to.have.lengthOf(1)
expect(recorded[0]).to.be.an('object').and.to.include({
scope: origin,
method: 'POST',
body: requestBody,
status: 200,
response: responseBody,
})
done()
})
}
)
.end(requestBody)
})
})
it('records request headers correctly as an object', done => {
nock.restore()
nock.recorder.clear()
expect(nock.recorder.play()).to.be.empty()
servers.startHttpServer().then(({ port }) => {
nock.recorder.rec({
dont_print: true,
output_objects: true,
enable_reqheaders_recording: true,
})
http
.request(
{
hostname: 'localhost',
port,
path: '/',
method: 'GET',
auth: 'foo:bar',
},
res => {
res.resume()
res.once('end', () => {
nock.restore()
const recorded = nock.recorder.play()
expect(recorded).to.have.lengthOf(1)
expect(recorded[0])
.to.be.an('object')
.and.deep.include({
reqheaders: {
host: `localhost:${port}`,
authorization: `Basic ${Buffer.from('foo:bar').toString(
'base64'
)}`,
},
})
done()
})
}
)
.end()
})
})
it('records request headers correctly when not outputting objects', async () => {
const gotRequest = sinon.spy()
nock.restore()
nock.recorder.clear()
expect(nock.recorder.play()).to.be.empty()
const { origin } = await servers.startHttpServer((request, response) => {
gotRequest()
response.writeHead(200)
response.end()
})
nock.recorder.rec({
dont_print: true,
enable_reqheaders_recording: true,
})
await got.post(origin, { headers: { 'X-Foo': 'bar' } })
expect(gotRequest).to.have.been.calledOnce()
nock.restore()
const recorded = nock.recorder.play()
expect(recorded).to.have.lengthOf(1)
expect(recorded[0])
.to.be.a('string')
.and.include(' .matchHeader("x-foo", "bar")')
})
it('records and replays gzipped nocks correctly', async () => {
const exampleText = 'example'
const { origin } = await servers.startHttpServer((request, response) => {
zlib.gzip(exampleText, (err, result) => {
expect(err).to.be.null()
response.writeHead(200, { 'content-encoding': 'gzip' })
response.end(result)
})
})
nock.restore()
nock.recorder.clear()
expect(nock.recorder.play()).to.be.empty()
nock.recorder.rec({
dont_print: true,
output_objects: true,
})
const response1 = await got(origin)
expect(response1.body).to.equal(exampleText)
expect(response1.headers).to.include({ 'content-encoding': 'gzip' })
nock.restore()
const recorded = nock.recorder.play()
nock.recorder.clear()
nock.activate()
expect(recorded).to.have.lengthOf(1)
const nocks = nock.define(recorded)
const response2 = await got(origin)
expect(response2.body).to.equal(exampleText)
expect(response2.headers).to.include({ 'content-encoding': 'gzip' })
nocks.forEach(nock => nock.done())
})
it('records and replays the response body', async () => {
const exampleBody = 'example'
const { origin } = await servers.startHttpServer((request, response) => {
switch (require('url').parse(request.url).pathname) {
case '/':
response.writeHead(302, { Location: '/abc' })
break
case '/abc':
response.write(exampleBody)
break
}
response.end()
})
nock.restore()
nock.recorder.clear()
expect(nock.recorder.play()).to.be.empty()
nock.recorder.rec({
dont_print: true,
output_objects: true,
})
const response1 = await got(origin)
expect(response1.body).to.equal(exampleBody)
nock.restore()
const recorded = nock.recorder.play()
nock.recorder.clear()
nock.activate()
// Two requests, on account of the redirect.
expect(recorded).to.have.lengthOf(2)
const nocks = nock.define(recorded)
const response2 = await got(origin)
expect(response2.body).to.equal(exampleBody)
nocks.forEach(nock => nock.done())
})
it('when encoding is set during recording, body is still recorded correctly', done => {
const responseBody = 'example'
const requestListener = (request, response) => {
response.write(responseBody)
response.end()
}
nock.restore()
nock.recorder.clear()
expect(nock.recorder.play()).to.be.empty()
servers.startHttpServer(requestListener).then(({ port }) => {
nock.recorder.rec({
dont_print: true,
output_objects: true,
})
const req = http.request(
{ host: 'localhost', port, path: '/', method: 'POST' },
res => {
res.setEncoding('hex')
const hexChunks = []
res.on('data', data => {
hexChunks.push(data)
})
res.on('end', () => {
nock.restore()
const recorded = nock.recorder.play()
nock.recorder.clear()
nock.activate()
// Confidence check: we're getting hex.
expect(hexChunks.join('')).to.equal(
Buffer.from(responseBody, 'utf8').toString('hex')
)
// Assert: we're recording utf-8.
expect(recorded).to.have.lengthOf(1)
expect(recorded[0]).to.include({ response: responseBody })
done()
})
}
)
req.end()
})
})
it("doesn't record request headers by default", done => {
nock.restore()
nock.recorder.clear()
expect(nock.recorder.play()).to.be.empty()
servers.startHttpServer().then(({ port }) => {
nock.recorder.rec({
dont_print: true,
output_objects: true,
})
http
.request(
{
hostname: 'localhost',
port,
path: '/',
method: 'GET',
auth: 'foo:bar',
},
res => {
res.resume()
res.once('end', () => {
nock.restore()
const recorded = nock.recorder.play()
expect(recorded).to.have.lengthOf(1)
expect(recorded[0]).to.be.an('object')
expect(recorded[0].reqheaders).to.be.undefined()
done()
})
}
)
.end()
})
})
it('will call a custom logging function', done => {
// This also tests that use_separator is on by default.
nock.restore()
nock.recorder.clear()
expect(nock.recorder.play()).to.be.empty()
servers.startHttpServer().then(({ port }) => {
const loggingFn = sinon.spy()
nock.recorder.rec({ logging: loggingFn })
http
.request(
{
hostname: 'localhost',
port,
path: '/',
method: 'GET',
auth: 'foo:bar',
},
res => {
res.resume()
res.once('end', () => {
nock.restore()
expect(loggingFn).to.have.been.calledOnce()
expect(loggingFn.getCall(0).args[0]).to.be.a('string')
done()
})
}
)
.end()
})
})
it('use_separator:false is respected', done => {
nock.restore()
nock.recorder.clear()
expect(nock.recorder.play()).to.be.empty()
servers.startHttpServer().then(({ port }) => {
const loggingFn = sinon.spy()
nock.recorder.rec({
logging: loggingFn,
output_objects: true,
use_separator: false,
})
http
.request(
{
hostname: 'localhost',
port,
path: '/',
method: 'GET',
auth: 'foo:bar',
},
res => {
res.resume()
res.once('end', () => {
nock.restore()
expect(loggingFn).to.have.been.calledOnce()
// This is still an object, because the "cut here" strings have not
// been appended.
expect(loggingFn.getCall(0).args[0]).to.be.an('object')
done()
})
}
)
.end()
})
})
it('records request headers except user-agent if enable_reqheaders_recording is set to true', done => {
nock.restore()
nock.recorder.clear()
expect(nock.recorder.play()).to.be.empty()
servers.startHttpServer().then(({ port }) => {
nock.recorder.rec({
dont_print: true,
output_objects: true,
enable_reqheaders_recording: true,
})
http
.request(
{
hostname: 'localhost',
port,
path: '/',
method: 'GET',
auth: 'foo:bar',
},
res => {
res.resume()
res.once('end', () => {
nock.restore()
const recorded = nock.recorder.play()
expect(recorded).to.have.lengthOf(1)
expect(recorded[0]).to.be.an('object')
expect(recorded[0].reqheaders).to.be.an('object')
expect(recorded[0].reqheaders['user-agent']).to.be.undefined()
done()
})
}
)
.end()
})
})
it('records query parameters', async () => {
const { origin } = await servers.startHttpServer()
nock.restore()
nock.recorder.clear()
expect(nock.recorder.play()).to.be.empty()
nock.recorder.rec({
dont_print: true,
output_objects: true,
})
await got(origin, {
searchParams: { q: 'test search' },
})
nock.restore()
const recorded = nock.recorder.play()
expect(recorded).to.have.lengthOf(1)
expect(recorded[0]).to.include({ path: '/?q=test+search' })
})
it('encodes the query parameters when not outputting objects', async () => {
const { origin } = await servers.startHttpServer()
nock.restore()
nock.recorder.clear()
expect(nock.recorder.play()).to.be.empty()
nock.recorder.rec({
dont_print: true,
output_objects: false,
})
await got(origin, {
searchParams: { q: 'test search++' },
})
nock.restore()
const recorded = nock.recorder.play()
expect(recorded).to.have.lengthOf(1)
expect(recorded[0]).to.include('test%20search%2B%2B')
})
// https://github.com/nock/nock/issues/193
it('works with clients listening for readable', done => {
nock.restore()
nock.recorder.clear()
expect(nock.recorder.play()).to.be.empty()
const requestBody = 'ABCDEF'
const responseBody = '012345'
const requestListener = (req, res) => {
res.end(responseBody)
}
servers.startHttpServer(requestListener).then(({ origin, port }) => {
nock.recorder.rec({ dont_print: true, output_objects: true })
http
.request(
{
host: 'localhost',
port,
path: '/',
},
res => {
let readableCount = 0
let chunkCount = 0
res.on('readable', () => {
++readableCount
let chunk
while ((chunk = res.read()) !== null) {
expect(chunk.toString()).to.equal(responseBody)
++chunkCount
}
})
res.once('end', () => {
expect(readableCount).to.equal(1)
expect(chunkCount).to.equal(1)
const recorded = nock.recorder.play()
expect(recorded).to.have.lengthOf(1)
expect(recorded[0]).to.be.an('object').and.include({
scope: origin,
method: 'GET',
body: requestBody,
status: 200,
response: responseBody,
})
done()
})
}
)
.end(requestBody)
})
})
it('outputs query string parameters using query()', async () => {
const { origin } = await servers.startHttpServer()
nock.restore()
nock.recorder.clear()
expect(nock.recorder.play()).to.be.empty()
nock.recorder.rec(true)
await got(origin, {
searchParams: { param1: 1, param2: 2 },
})
const recorded = nock.recorder.play()
expect(recorded).to.have.lengthOf(1)
expect(recorded[0])
.to.be.a('string')
.and.include(`.query({"param1":"1","param2":"2"})`)
})
it('outputs query string arrays correctly', async () => {
const { origin } = await servers.startHttpServer()
nock.restore()
nock.recorder.clear()
expect(nock.recorder.play()).to.be.empty()
nock.recorder.rec(true)
await got(origin, {
searchParams: new URLSearchParams([
['foo', 'bar'],
['foo', 'baz'],
]),
})
const recorded = nock.recorder.play()
expect(recorded).to.have.lengthOf(1)
expect(recorded[0])
.to.be.a('string')
.and.include(`.query({"foo":["bar","baz"]})`)
})
it('removes query params from the path and puts them in query()', done => {
nock.restore()
nock.recorder.clear()
expect(nock.recorder.play()).to.be.empty()
servers.startHttpServer().then(({ port }) => {
nock.recorder.rec(true)
http
.request(
{
method: 'POST',
host: 'localhost',
port,
path: '/?param1=1¶m2=2',
},
res => {
res.resume()
res.once('end', () => {
const recorded = nock.recorder.play()
expect(recorded).to.have.lengthOf(1)
expect(recorded[0])
.to.be.a('string')
.and.include(`nock('http://localhost:${port}',`)
.and.include(`.query({"param1":"1","param2":"2"})`)
done()
})
}
)
.end('ABCDEF')
})
})
// https://github.com/nock/nock/issues/2136
it('escapes single quotes in the path', async () => {
const { origin } = await servers.startHttpServer()
nock.restore()
nock.recorder.clear()
expect(nock.recorder.play()).to.be.empty()
nock.recorder.rec(true)
await got(`${origin}/foo'bar'baz`)
const recorded = nock.recorder.play()
expect(recorded).to.have.lengthOf(1)
expect(recorded[0])
.to.be.a('string')
.and.include(`.get('/foo\\'bar\\'baz')`)
})
it('respects http.request() consumers', done => {
const requestListener = (req, res) => {
res.write('foo')
setTimeout(() => {
res.end('bar')
}, 25)
}
servers.startHttpServer(requestListener).then(({ port }) => {
nock.restore()
nock.recorder.clear()
nock.recorder.rec({
dont_print: true,
output_objects: true,
})
const req = http.request(
{
host: 'localhost',
port,
path: '/',
},
res => {
let buffer = Buffer.from('')
setTimeout(() => {
res
.on('data', data => {
buffer = Buffer.concat([buffer, data])
})
.on('end', () => {
nock.restore()
expect(buffer.toString()).to.equal('foobar')
done()
})
})
},
50
)
req.end()
})
})
it('records and replays binary response correctly', done => {
nock.restore()
nock.recorder.clear()
expect(nock.recorder.play()).to.be.empty()
nock.recorder.rec({
output_objects: true,
dont_print: true,
})
const transparentGifHex =
'47494638396101000100800000000000ffffff21f90401000000002c000000000100010000020144003b'
const transparentGifBuffer = Buffer.from(transparentGifHex, 'hex')
const requestListener = (request, response) => {
response.writeHead(201, {
'Content-Type': 'image/gif',
'Content-Length': transparentGifBuffer.length,
})
response.write(transparentGifBuffer, 'binary')
response.end()
}
servers.startHttpServer(requestListener).then(server => {
const options = {
method: 'PUT',
host: 'localhost',
port: server.port,
path: '/clear.gif',
headers: {
'Content-Type': 'image/gif',
'Content-Length': transparentGifBuffer.length,
},
}
const postRequest1 = http.request(options, response => {
const data = []
response.on('data', chunk => {
data.push(chunk)
})
response.on('end', () => {
expect(Buffer.concat(data).toString('hex')).to.equal(
transparentGifHex
)
const recordedFixtures = nock.recorder.play()
server.close(error => {
server = undefined
expect(error).to.be.undefined()
nock.restore()
nock.activate()
nock.define(recordedFixtures)
// Send same post request again.
const postRequest2 = http.request(options, response => {
const data = []
response.on('data', chunk => {
data.push(chunk)
})
response.on('end', () => {
expect(Buffer.concat(data).toString('hex')).to.equal(
transparentGifHex
)
done()
})
})
postRequest2.write(transparentGifBuffer)
postRequest2.end()
})
})
})
postRequest1.write(transparentGifBuffer)
postRequest1.end()
})
})
// https://github.com/nock/nock/issues/2086
it('should not resume the response stream', done => {
nock.recorder.rec(true)
servers.startHttpServer().then(({ origin }) => {
const req = http.request(origin)
req.on('response', res => {
// wait for an iteration of the event loop to prove that the `end`
// listener is being added after a delay. We want to show that callers
// have time to register listeners before they manually call `resume`.
setImmediate(() => {
res.on('end', () => done())
res.resume()
})
})
req.end()
})
})
})
nock-13.2.4/tests/test_redirects.js 0000664 0000000 0000000 00000001040 14177263367 0017271 0 ustar 00root root 0000000 0000000 'use strict'
const { expect } = require('chai')
const nock = require('..')
const got = require('./got_client')
it('follows redirects', async () => {
const scope = nock('http://example.test')
.get('/YourAccount')
.reply(302, undefined, {
Location: 'http://example.test/Login',
})
.get('/Login')
.reply(200, 'Here is the login page')
const { statusCode, body } = await got('http://example.test/YourAccount')
expect(statusCode).to.equal(200)
expect(body).to.equal('Here is the login page')
scope.done()
})
nock-13.2.4/tests/test_remove_interceptor.js 0000664 0000000 0000000 00000013065 14177263367 0021232 0 ustar 00root root 0000000 0000000 'use strict'
const { expect } = require('chai')
const nock = require('..')
const got = require('./got_client')
describe('`removeInterceptor()`', () => {
context('when invoked with an Interceptor instance', () => {
it('remove interceptor removes given interceptor', async () => {
const givenInterceptor = nock('http://example.test').get('/somepath')
givenInterceptor.reply(200, 'hey')
expect(nock.removeInterceptor(givenInterceptor)).to.be.true()
const newScope = nock('http://example.test')
.get('/somepath')
.reply(202, 'other-content')
const { statusCode, body } = await got('http://example.test/somepath')
expect(statusCode).to.equal(202)
expect(body).to.equal('other-content')
newScope.done()
})
it('reflects the removal in `pendingMocks()`', () => {
const givenInterceptor = nock('http://example.test').get('/somepath')
const scope = givenInterceptor.reply(200, 'hey')
expect(scope.pendingMocks()).to.deep.equal([
'GET http://example.test:80/somepath',
])
expect(nock.removeInterceptor(givenInterceptor)).to.be.true()
expect(scope.pendingMocks()).to.deep.equal([])
})
it('removes given interceptor for https', async () => {
const givenInterceptor = nock('https://example.test').get('/somepath')
const scope = givenInterceptor.reply(200, 'hey')
expect(scope.pendingMocks()).to.deep.equal([
'GET https://example.test:443/somepath',
])
expect(nock.removeInterceptor(givenInterceptor)).to.be.true()
const newScope = nock('https://example.test')
.get('/somepath')
.reply(202, 'other-content')
const { statusCode, body } = await got('https://example.test/somepath')
expect(statusCode).to.equal(202)
expect(body).to.equal('other-content')
newScope.done()
})
it('works on an interceptor with a regex for a path', async () => {
const givenInterceptor = nock('http://example.test').get(/somePath$/)
const scope = givenInterceptor.reply(200, 'hey')
expect(scope.pendingMocks()).to.deep.equal([
'GET http://example.test:80//somePath$/',
])
expect(nock.removeInterceptor(givenInterceptor)).to.be.true()
const newScope = nock('http://example.test')
.get(/somePath$/)
.reply(202, 'other-content')
const { statusCode, body } = await got('http://example.test/get-somePath')
expect(statusCode).to.equal(202)
expect(body).to.equal('other-content')
newScope.done()
})
})
context('when invoked with an object', () => {
it('removes a matching interceptor and returns true', async () => {
nock('http://example.test').get('/somepath').reply(200, 'hey')
expect(
nock.removeInterceptor({
hostname: 'example.test',
path: '/somepath',
})
).to.be.true()
const newScope = nock('http://example.test')
.get('/somepath')
.reply(202, 'other-content')
const { statusCode, body } = await got('http://example.test/somepath')
expect(statusCode).to.equal(202)
expect(body).to.equal('other-content')
newScope.done()
})
it('when no interceptor is found, returns false', () => {
expect(
nock.removeInterceptor({
hostname: 'example.org',
path: '/somepath',
})
).to.be.false()
})
it('can match a request with a proto', () => {
const scope = nock('https://example.test')
.get('/somepath')
.reply(200, 'hey')
expect(scope.pendingMocks()).to.deep.equal([
'GET https://example.test:443/somepath',
])
expect(
nock.removeInterceptor({
proto: 'https',
hostname: 'example.test',
path: '/somepath',
})
).to.be.true()
expect(scope.pendingMocks()).to.deep.equal([])
})
it('can match a request with a method', () => {
const scope = nock('http://example.test')
.post('/somepath')
.reply(200, 'hey')
expect(scope.pendingMocks()).to.deep.equal([
'POST http://example.test:80/somepath',
])
expect(
nock.removeInterceptor({
method: 'post',
hostname: 'example.test',
path: '/somepath',
})
).to.be.true()
expect(scope.pendingMocks()).to.deep.equal([])
})
it('can match the default path `/` when no path is specified', () => {
const scope = nock('http://example.test').get('/').reply(200, 'hey')
expect(scope.pendingMocks()).to.deep.equal([
'GET http://example.test:80/',
])
expect(
nock.removeInterceptor({
hostname: 'example.test',
})
).to.be.true()
expect(scope.pendingMocks()).to.deep.equal([])
})
it('only removes interceptors whose path matches', () => {
const scope1 = nock('http://example.test')
.get('/somepath')
.reply(200, 'hey')
const scope2 = nock('http://example.test')
.get('/anotherpath')
.reply(200, 'hey')
expect(scope1.pendingMocks()).to.deep.equal([
'GET http://example.test:80/somepath',
])
expect(scope2.pendingMocks()).to.deep.equal([
'GET http://example.test:80/anotherpath',
])
expect(
nock.removeInterceptor({
hostname: 'example.test',
path: '/anotherpath',
})
).to.be.true()
expect(scope1.pendingMocks()).to.deep.equal([
'GET http://example.test:80/somepath',
])
expect(scope2.pendingMocks()).to.deep.equal([])
})
})
})
nock-13.2.4/tests/test_repeating.js 0000664 0000000 0000000 00000005327 14177263367 0017277 0 ustar 00root root 0000000 0000000 'use strict'
const { expect } = require('chai')
const nock = require('..')
const got = require('./got_client')
const assertRejects = require('assert-rejects')
describe('repeating', () => {
it('`once()`', async () => {
const scope = nock('http://example.test')
.get('/')
.once()
.reply(200, 'Hello World!')
const { statusCode } = await got('http://example.test/')
expect(statusCode).to.equal(200)
await assertRejects(
got('http://example.test/'),
/Nock: No match for request/
)
scope.done()
})
it('`twice()`', async () => {
const scope = nock('http://example.test')
.get('/')
.twice()
.reply(200, 'Hello World!')
// eslint-disable-next-line no-unused-vars
for (const _ of Array(2)) {
const { statusCode } = await got('http://example.test/')
expect(statusCode).to.equal(200)
}
await assertRejects(
got('http://example.test/'),
/Nock: No match for request/
)
scope.done()
})
it('`thrice()`', async () => {
const scope = nock('http://example.test')
.get('/')
.thrice()
.reply(200, 'Hello World!')
// eslint-disable-next-line no-unused-vars
for (const _ of Array(3)) {
const { statusCode } = await got('http://example.test/')
expect(statusCode).to.equal(200)
}
await assertRejects(
got('http://example.test/'),
/Nock: No match for request/
)
scope.done()
})
describe('`times()`', () => {
it('repeating 4 times', async () => {
const scope = nock('http://example.test')
.get('/')
.times(4)
.reply(200, 'Hello World!')
// eslint-disable-next-line no-unused-vars
for (const _ of Array(4)) {
const { statusCode } = await got('http://example.test/')
expect(statusCode).to.equal(200)
}
await assertRejects(
got('http://example.test/'),
/Nock: No match for request/
)
scope.done()
})
it('invalid argument is ignored', async () => {
const scope = nock('http://example.test')
.get('/')
.times(0)
.reply(200, 'Hello World!')
const { statusCode } = await got('http://example.test/')
expect(statusCode).to.equal(200)
await assertRejects(
got('http://example.test/'),
/Nock: No match for request/
)
scope.done()
})
})
it('`isDone()` considers repeated responses', async () => {
const scope = nock('http://example.test').get('/').times(2).reply(204)
// eslint-disable-next-line no-unused-vars
for (const _ of Array(2)) {
expect(scope.isDone()).to.be.false()
await got('http://example.test/')
}
expect(scope.isDone()).to.be.true()
})
})
nock-13.2.4/tests/test_reply_body.js 0000664 0000000 0000000 00000010574 14177263367 0017471 0 ustar 00root root 0000000 0000000 'use strict'
// Tests for the body argument passed to `.reply()`.
const { expect } = require('chai')
const nock = require('..')
const got = require('./got_client')
describe('`reply()` body', () => {
it('stringifies an object', async () => {
const responseBody = { hello: 'world' }
const scope = nock('http://example.test').get('/').reply(200, responseBody)
const { statusCode, headers, body } = await got('http://example.test/')
expect(statusCode).to.equal(200)
expect(headers).not.to.have.property('date')
expect(headers).not.to.have.property('content-length')
expect(headers).to.include({ 'content-type': 'application/json' })
expect(body).to.be.a('string').and.equal(JSON.stringify(responseBody))
scope.done()
})
it('stringifies an array', async () => {
const responseBody = [{ hello: 'world' }]
const scope = nock('http://example.test').get('/').reply(200, responseBody)
const { statusCode, headers, body } = await got('http://example.test/')
expect(statusCode).to.equal(200)
expect(headers).not.to.have.property('date')
expect(headers).not.to.have.property('content-length')
expect(headers).to.include({ 'content-type': 'application/json' })
expect(body).to.be.a('string').and.equal(JSON.stringify(responseBody))
scope.done()
})
// While `false` and `null` are falsy, they are valid JSON value so they
// should be returned as strings that `JSON.parse()` would convert back to
// native values.
it('stringifies a boolean (including `false`)', async () => {
const scope = nock('http://example.test').get('/').reply(204, false)
const { statusCode, body } = await got('http://example.test/')
expect(statusCode).to.equal(204)
// `'false'` is json-stringified `false`.
expect(body).to.be.a('string').and.equal('false')
scope.done()
})
it('stringifies null', async () => {
const scope = nock('http://example.test').get('/').reply(204, null)
const { statusCode, body } = await got('http://example.test/')
expect(statusCode).to.equal(204)
// `'null'` is json-stringified `null`.
expect(body).to.be.a('string').and.equal('null')
scope.done()
})
describe('content-type header', () => {
it('is set for a JSON-encoded response', async () => {
const scope = nock('http://example.test').get('/').reply(200, { A: 'b' })
const { headers } = await got('http://example.test/')
expect(headers).to.include({ 'content-type': 'application/json' })
scope.done()
})
it("doesn't overwrite existing content-type header", async () => {
const scope = nock('http://example.test')
.get('/')
.reply(200, { A: 'b' }, { 'Content-Type': 'unicorns' })
const { headers } = await got('http://example.test/')
expect(headers).to.include({ 'content-type': 'unicorns' })
scope.done()
})
it("isn't set for a blank response", async () => {
const scope = nock('http://example.test').get('/').reply()
const { headers } = await got('http://example.test/')
expect(headers).not.to.have.property('content-type')
scope.done()
})
})
it('unencodable object throws the expected error', () => {
const unencodableObject = {
toJSON() {
throw Error('bad!')
},
}
expect(() =>
nock('http://localhost').get('/').reply(200, unencodableObject)
).to.throw(Error, 'Error encoding response body into JSON')
})
it('without a body, defaults to empty', async () => {
const scope = nock('http://example.test').get('/').reply(204)
const { statusCode, body } = await got('http://example.test/')
expect(statusCode).to.equal(204)
expect(body).to.be.a('string').and.equal('')
scope.done()
})
})
describe('`reply()` status code', () => {
it('reply with missing status code defaults to 200', async () => {
const scope = nock('http://example.test').get('/').reply()
const { statusCode, body } = await got('http://example.test/')
expect(statusCode).to.equal(200)
expect(body).to.be.a('string').and.equal('')
scope.done()
})
it('reply with invalid status code throws', () => {
const scope = nock('http://localhost').get('/')
expect(() => scope.reply('200')).to.throw(
Error,
'Invalid string value for status code'
)
expect(() => scope.reply(false)).to.throw(
Error,
'Invalid boolean value for status code'
)
})
})
nock-13.2.4/tests/test_reply_function_async.js 0000664 0000000 0000000 00000012626 14177263367 0021556 0 ustar 00root root 0000000 0000000 'use strict'
// Tests for invoking `.reply()` with a function which invokes the error-first
// callback with the response body or an array containing the status code and
// optional response body and headers.
const { expect } = require('chai')
const assertRejects = require('assert-rejects')
const sinon = require('sinon')
const nock = require('..')
const got = require('./got_client')
describe('asynchronous `reply()` function', () => {
describe('using callback', () => {
it('reply can take a callback', async () => {
const scope = nock('http://example.test')
.get('/')
.reply(200, (path, requestBody, callback) =>
callback(null, 'Hello World!')
)
const { body } = await got('http://example.test/', {
responseType: 'buffer',
})
expect(body).to.be.an.instanceOf(Buffer)
expect(body.toString('utf8')).to.equal('Hello World!')
scope.done()
})
it('reply takes a callback for status code', async () => {
const responseBody = 'Hello, world!'
const scope = nock('http://example.test')
.get('/')
.reply((path, requestBody, callback) => {
setTimeout(
() =>
callback(null, [
202,
responseBody,
{ 'X-Custom-Header': 'abcdef' },
]),
1
)
})
const { statusCode, headers, body } = await got('http://example.test/')
expect(statusCode).to.equal(202)
expect(headers).to.deep.equal({ 'x-custom-header': 'abcdef' })
expect(body).to.equal(responseBody)
scope.done()
})
it('should get request headers', async () => {
const scope = nock('http://example.test')
.get('/yo')
.reply(201, function (path, reqBody, cb) {
expect(this.req.path).to.equal('/yo')
expect(this.req.headers).to.deep.equal({
'accept-encoding': 'gzip, deflate, br',
host: 'example.test',
'x-my-header': 'some-value',
'x-my-other-header': 'some-other-value',
'user-agent': 'got (https://github.com/sindresorhus/got)',
})
setTimeout(function () {
cb(null, 'foobar')
}, 1e3)
})
const { statusCode, body } = await got('http://example.test/yo', {
headers: {
'x-my-header': 'some-value',
'x-my-other-header': 'some-other-value',
},
})
expect(statusCode).to.equal(201)
expect(body).to.equal('foobar')
scope.done()
})
it('reply should throw on error on the callback', async () => {
nock('http://example.test')
.get('/')
.reply(500, (path, requestBody, callback) =>
callback(new Error('Database failed'))
)
await assertRejects(got('http://example.test'), /Database failed/)
})
it('an error passed to the callback propagates when [err, fullResponseArray] is expected', async () => {
nock('http://example.test')
.get('/')
.reply((path, requestBody, callback) => {
callback(Error('boom'))
})
await assertRejects(got('http://example.test'), /boom/)
})
it('subsequent calls to the reply callback are ignored', async () => {
const replyFnCalled = sinon.spy()
const scope = nock('http://example.test')
.get('/')
.reply(201, (path, requestBody, callback) => {
replyFnCalled()
callback(null, 'one')
callback(null, 'two')
callback(new Error('three'))
})
const { statusCode, body } = await got('http://example.test/')
expect(replyFnCalled).to.have.been.calledOnce()
expect(statusCode).to.equal(201)
expect(body).to.equal('one')
scope.done()
})
})
describe('using async/promises', () => {
it('reply can take a status code with an 2-arg async function, and passes it the correct arguments', async () => {
const scope = nock('http://example.com')
.post('/foo')
.reply(201, async (path, requestBody) => {
expect(path).to.equal('/foo')
expect(requestBody).to.equal('request-body')
return 'response-body'
})
const { statusCode, body } = await got.post('http://example.com/foo', {
body: 'request-body',
})
expect(statusCode).to.equal(201)
expect(body).to.equal('response-body')
scope.done()
})
it('reply can take a status code with a 0-arg async function, and passes it the correct arguments', async () => {
const scope = nock('http://example.com')
.get('/')
.reply(async () => [201, 'Hello World!'])
const { statusCode, body } = await got('http://example.com/')
expect(statusCode).to.equal(201)
expect(body).to.equal('Hello World!')
scope.done()
})
it('when reply is called with a status code and an async function that throws, it propagates the error', async () => {
nock('http://example.test')
.get('/')
.reply(201, async () => {
throw Error('oh no!')
})
await assertRejects(got('http://example.test'), /oh no!/)
})
it('when reply is called with an async function that throws, it propagates the error', async () => {
nock('http://example.test')
.get('/')
.reply(async () => {
throw Error('oh no!')
})
await assertRejects(got('http://example.test'), /oh no!/)
})
})
})
nock-13.2.4/tests/test_reply_function_sync.js 0000664 0000000 0000000 00000031323 14177263367 0021410 0 ustar 00root root 0000000 0000000 'use strict'
// Tests for invoking `.reply()` with a synchronous function which return the
// response body or an array containing the status code and optional response
// body and headers.
const assertRejects = require('assert-rejects')
const { expect } = require('chai')
const sinon = require('sinon')
const nock = require('..')
const got = require('./got_client')
describe('synchronous `reply()` function', () => {
describe('when invoked with status code followed by function', () => {
it('passes through a string', async () => {
const scope = nock('http://example.test')
.get('/')
.reply(201, () => 'OK!')
const { statusCode, body } = await got('http://example.test')
expect(statusCode).to.equal(201)
expect(body).to.be.a('string').and.to.equal('OK!')
scope.done()
})
it('stringifies an object', async () => {
const exampleResponse = { message: 'OK!' }
const scope = nock('http://example.test')
.get('/')
.reply(201, () => exampleResponse)
const { statusCode, body } = await got('http://example.test')
expect(statusCode).to.equal(201)
expect(body)
.to.be.a('string')
.and.to.equal(JSON.stringify(exampleResponse))
scope.done()
})
it('stringifies a number', async () => {
const scope = nock('http://example.test')
.get('/')
.reply(201, () => 123)
const { statusCode, body } = await got('http://example.test')
expect(statusCode).to.equal(201)
expect(body).to.be.a('string').and.to.equal('123')
scope.done()
})
it('stringifies an array', async () => {
const scope = nock('http://example.test')
.get('/')
.reply(201, () => [123])
const { statusCode, body } = await got('http://example.test')
expect(statusCode).to.equal(201)
expect(body).to.be.a('string').and.to.equal('[123]')
scope.done()
})
it('stringifies a boolean', async () => {
const scope = nock('http://example.test')
.get('/')
.reply(201, () => false)
const { statusCode, body } = await got('http://example.test')
expect(statusCode).to.equal(201)
expect(body).to.be.a('string').and.to.equal('false')
scope.done()
})
it('stringifies null', async () => {
const scope = nock('http://example.test')
.get('/')
.reply(201, () => null)
const { statusCode, body } = await got('http://example.test')
expect(statusCode).to.equal(201)
expect(body).to.be.a('string').and.to.equal('null')
scope.done()
})
it("isn't invoked until request matches", async () => {
const onReply = sinon.spy()
const scope = nock('http://example.test')
.get('/')
.reply(200, (uri, body) => {
onReply()
return ''
})
expect(onReply).not.to.have.been.called()
await got('http://example.test/')
expect(onReply).to.have.been.calledOnce()
scope.done()
})
context('when the request has a string body', () => {
it('passes through a string', async () => {
const exampleRequestBody = 'key=val'
const exampleResponseBody = 'foo'
const scope = nock('http://example.test')
.post('/endpoint', exampleRequestBody)
.reply(404, () => exampleResponseBody)
await assertRejects(
got.post('http://example.test/endpoint', {
body: exampleRequestBody,
}),
({ response: { statusCode, body } }) => {
expect(statusCode).to.equal(404)
expect(body).to.equal(exampleResponseBody)
return true
}
)
scope.done()
})
})
describe('the reply function arguments', () => {
context('when the request has a non-JSON string', () => {
it('receives the URL and body', async () => {
const exampleRequestBody = 'key=val'
const replyFnCalled = sinon.spy()
const scope = nock('http://example.test')
.post('/endpoint', exampleRequestBody)
.reply(404, (uri, requestBody) => {
replyFnCalled()
expect(uri).to.equal('/endpoint')
expect(requestBody).to.equal(exampleRequestBody)
})
await assertRejects(
got.post('http://example.test/endpoint', {
body: exampleRequestBody,
}),
({ response: { statusCode, body } }) => {
expect(statusCode).to.equal(404)
expect(body).to.equal('')
return true
}
)
expect(replyFnCalled).to.have.been.called()
scope.done()
})
})
context('when the request has a JSON string', () => {
it('when content-type is json, receives the parsed body', async () => {
const exampleRequestBody = JSON.stringify({ id: 1, name: 'bob' })
const replyFnCalled = sinon.spy()
const scope = nock('http://example.test')
.post('/')
.reply(201, (uri, requestBody) => {
replyFnCalled()
expect(requestBody)
.to.be.an('object')
.and.to.deep.equal(JSON.parse(exampleRequestBody))
})
const { statusCode } = await got.post('http://example.test/', {
headers: { 'Content-Type': 'application/json' },
body: exampleRequestBody,
})
expect(replyFnCalled).to.have.been.called()
expect(statusCode).to.equal(201)
scope.done()
})
// Regression test for https://github.com/nock/nock/issues/1642
it('when content-type is json (as array), receives the parsed body', async () => {
const exampleRequestBody = JSON.stringify({ id: 1, name: 'bob' })
const replyFnCalled = sinon.spy()
const scope = nock('http://example.test')
.post('/')
.reply(201, (uri, requestBody) => {
replyFnCalled()
expect(requestBody)
.to.be.an('object')
.and.to.to.deep.equal(JSON.parse(exampleRequestBody))
})
const { statusCode } = await got.post('http://example.test/', {
// Providing the field value as an array is probably a bug on the callers behalf,
// but it is still allowed by Node
headers: { 'Content-Type': ['application/json', 'charset=utf8'] },
body: exampleRequestBody,
})
expect(replyFnCalled).to.have.been.called()
expect(statusCode).to.equal(201)
scope.done()
})
it('without content-type header, receives the body as string', async () => {
const exampleRequestBody = JSON.stringify({ id: 1, name: 'bob' })
const replyFnCalled = sinon.spy()
const scope = nock('http://example.test')
.post('/')
.reply(201, (uri, requestBody) => {
replyFnCalled()
expect(requestBody)
.to.be.a('string')
.and.to.equal(exampleRequestBody)
})
const { statusCode } = await got.post('http://example.test/', {
body: exampleRequestBody,
})
expect(replyFnCalled).to.have.been.called()
expect(statusCode).to.equal(201)
scope.done()
})
})
})
})
// This signature is supported today, however it seems unnecessary. This is
// just as easily accomplished with a function returning an array:
// `.reply(() => [201, 'ABC', { 'X-My-Headers': 'My custom header value' }])`
it('invoked with status code, function returning array, and headers', async () => {
const scope = nock('http://example.test')
.get('/')
.reply(201, () => 'ABC', { 'X-My-Headers': 'My custom header value' })
const { headers } = await got('http://example.test/')
expect(headers).to.deep.equal({ 'x-my-headers': 'My custom header value' })
scope.done()
})
describe('when invoked with function returning array', () => {
it('handles status code alone', async () => {
const scope = nock('http://example.test')
.get('/')
.reply(() => [202])
const { statusCode, body } = await got('http://example.test/')
expect(statusCode).to.equal(202)
expect(body).to.equal('')
scope.done()
})
it('handles status code and string body', async () => {
const exampleResponse = 'This is a body'
const scope = nock('http://example.test')
.get('/')
.reply(() => [401, exampleResponse])
await assertRejects(
got('http://example.test/'),
({ response: { statusCode, body } }) => {
expect(statusCode).to.equal(401)
expect(body).to.equal(exampleResponse)
return true
}
)
scope.done()
})
it('handles status code and body object', async () => {
const exampleResponse = { message: 'OK!' }
const scope = nock('http://example.test')
.get('/')
.reply(() => [202, exampleResponse])
const { statusCode, body } = await got('http://example.test/')
expect(statusCode).to.equal(202)
expect(body).to.equal(JSON.stringify(exampleResponse))
scope.done()
})
it('handles status code and body as number', async () => {
const scope = nock('http://example.test')
.get('/')
.reply(() => [202, 123])
const { statusCode, body } = await got('http://example.test/')
expect(statusCode).to.equal(202)
expect(body).to.be.a('string').and.to.to.equal('123')
scope.done()
})
it('handles status code, string body, and headers object', async () => {
const exampleBody = 'this is the body'
const scope = nock('http://example.test')
.get('/')
.reply(() => [
202,
exampleBody,
{ 'x-key': 'value', 'x-key-2': 'value 2' },
])
const { statusCode, body, headers, rawHeaders } = await got(
'http://example.test/'
)
expect(statusCode).to.equal(202)
expect(body).to.equal(exampleBody)
expect(headers).to.deep.equal({
'x-key': 'value',
'x-key-2': 'value 2',
})
expect(rawHeaders).to.deep.equal(['x-key', 'value', 'x-key-2', 'value 2'])
scope.done()
})
it('handles status code, object body, and headers object', async () => {
const exampleBody = { foo: 'bar' }
const scope = nock('http://example.test')
.get('/')
.reply(() => [
202,
exampleBody,
{ 'x-key': 'value', 'x-key-2': 'value 2' },
])
const { statusCode, body, headers, rawHeaders } = await got(
'http://example.test/'
)
expect(statusCode).to.equal(202)
expect(body).to.equal(JSON.stringify(exampleBody))
expect(headers).to.deep.equal({
'content-type': 'application/json',
'x-key': 'value',
'x-key-2': 'value 2',
})
expect(rawHeaders).to.deep.equal([
'x-key',
'value',
'x-key-2',
'value 2',
'Content-Type',
'application/json',
])
scope.done()
})
it('when given a non-array, raises the expected error', async () => {
nock('http://example.test')
.get('/abc')
.reply(() => 'ABC')
await assertRejects(got('http://example.test/abc'), err => {
expect(err).to.be.an.instanceOf(Error).and.include({
message: 'A single function provided to .reply MUST return an array',
})
return true
})
})
it('when given an empty array, raises the expected error', async () => {
nock('http://example.test')
.get('/abc')
.reply(() => [])
await assertRejects(got('http://example.test/abc'), err => {
expect(err).to.be.an.instanceOf(Error).and.include({
message: 'Invalid undefined value for status code',
})
return true
})
})
it('when given an array with too many entries, raises the expected error', async () => {
nock('http://example.test')
.get('/abc')
.reply(() => [
'user',
'probably',
'intended',
'this',
'to',
'be',
'JSON',
])
await assertRejects(got('http://example.test/abc'), err => {
expect(err).to.be.an.instanceOf(Error).and.include({
message:
'The array returned from the .reply callback contains too many values',
})
return true
})
})
it('when given extraneous arguments, raises the expected error', () => {
const interceptor = nock('http://example.test').get('/')
expect(() =>
interceptor.reply(() => [200], { 'x-my-header': 'some-value' })
).to.throw(Error, 'Invalid arguments')
})
})
})
nock-13.2.4/tests/test_reply_headers.js 0000664 0000000 0000000 00000027120 14177263367 0020142 0 ustar 00root root 0000000 0000000 'use strict'
// Tests for header objects passed to `.reply()`, including header objects
// containing lambdas.
const { IncomingMessage } = require('http')
const { expect } = require('chai')
const sinon = require('sinon')
const fakeTimers = require('@sinonjs/fake-timers')
const fs = require('fs')
const path = require('path')
const nock = require('..')
const got = require('./got_client')
const textFilePath = path.resolve(__dirname, './assets/reply_file_1.txt')
describe('`reply()` headers', () => {
describe('using parameter value', () => {
it('as array', async () => {
const scope = nock('http://example.test')
.get('/')
.reply(200, 'Hello World!', [
'X-My-Header',
'My Header value',
'X-Other-Header',
'My Other Value',
])
const { headers, rawHeaders } = await got('http://example.test/')
expect(headers).to.deep.equal({
'x-my-header': 'My Header value',
'x-other-header': 'My Other Value',
})
expect(rawHeaders).to.deep.equal([
'X-My-Header',
'My Header value',
'X-Other-Header',
'My Other Value',
])
scope.done()
})
it('given an invalid array, raises the expected error', async () => {
const scope = nock('http://example.test').get('/')
expect(() =>
scope.reply(200, 'Hello World!', ['one', 'two', 'three'])
).to.throw(
Error,
'Raw headers must be provided as an array with an even number of items. [fieldName, value, ...]'
)
})
// https://nodejs.org/api/http.html#http_message_headers
it('folds duplicate headers the same as Node', async () => {
const replyHeaders = [
'Content-Type',
'text/html; charset=utf-8',
'set-cookie',
['set-cookie1=foo', 'set-cookie2=bar'],
'set-cookie',
'set-cookie3=baz',
'CONTENT-TYPE',
'text/xml',
'cookie',
'cookie1=foo; cookie2=bar',
'cookie',
'cookie3=baz',
'x-custom',
'custom1',
'X-Custom',
['custom2', 'custom3'],
]
const scope = nock('http://example.test')
.get('/')
.reply(200, 'Hello World!', replyHeaders)
const { headers, rawHeaders } = await got('http://example.test/')
expect(headers).to.deep.equal({
'content-type': 'text/html; charset=utf-8',
'set-cookie': ['set-cookie1=foo', 'set-cookie2=bar', 'set-cookie3=baz'],
cookie: 'cookie1=foo; cookie2=bar; cookie3=baz',
'x-custom': 'custom1, custom2, custom3',
})
expect(rawHeaders).to.deep.equal(replyHeaders)
scope.done()
})
it('as object', async () => {
const scope = nock('http://example.test')
.get('/')
.reply(200, 'Hello World!', { 'X-My-Headers': 'My Header value' })
const { headers, rawHeaders } = await got('http://example.test/')
expect(headers).to.deep.equal({ 'x-my-headers': 'My Header value' })
expect(rawHeaders).to.deep.equal(['X-My-Headers', 'My Header value'])
scope.done()
})
it('as Map', async () => {
const replyHeaders = new Map([
['X-My-Header', 'My Header value'],
['X-Other-Header', 'My Other Value'],
])
const scope = nock('http://example.test')
.get('/')
.reply(200, 'Hello World!', replyHeaders)
const { headers, rawHeaders } = await got('http://example.test/')
expect(headers).to.deep.equal({
'x-my-header': 'My Header value',
'x-other-header': 'My Other Value',
})
expect(rawHeaders).to.deep.equal([
'X-My-Header',
'My Header value',
'X-Other-Header',
'My Other Value',
])
scope.done()
})
it('given invalid data types, raises the expected error', async () => {
const scope = nock('http://example.test').get('/')
expect(() => scope.reply(200, 'Hello World!', 'foo: bar')).to.throw(
Error,
'Headers must be provided as an array of raw values, a Map, or a plain Object. foo: bar'
)
expect(() => scope.reply(200, 'Hello World!', false)).to.throw(
Error,
'Headers must be provided as an array of raw values, a Map, or a plain Object. false'
)
})
})
describe('using synchronous reply function', () => {
it('as array', async () => {
const scope = nock('http://example.test')
.get('/')
.reply(() => [
200,
'Hello World!',
[
'X-My-Header',
'My Header value',
'X-Other-Header',
'My Other Value',
],
])
const { headers, rawHeaders } = await got('http://example.test/')
expect(headers).to.deep.equal({
'x-my-header': 'My Header value',
'x-other-header': 'My Other Value',
})
expect(rawHeaders).to.deep.equal([
'X-My-Header',
'My Header value',
'X-Other-Header',
'My Other Value',
])
scope.done()
})
it('as object', async () => {
const scope = nock('http://example.test')
.get('/')
.reply(() => [
200,
'Hello World!',
{ 'X-My-Headers': 'My Header value' },
])
const { headers, rawHeaders } = await got('http://example.test/')
expect(headers).to.deep.equal({ 'x-my-headers': 'My Header value' })
expect(rawHeaders).to.deep.equal(['X-My-Headers', 'My Header value'])
scope.done()
})
it('as Map', async () => {
const replyHeaders = new Map([
['X-My-Header', 'My Header value'],
['X-Other-Header', 'My Other Value'],
])
const scope = nock('http://example.test')
.get('/')
.reply(() => [200, 'Hello World!', replyHeaders])
const { headers, rawHeaders } = await got('http://example.test/')
expect(headers).to.deep.equal({
'x-my-header': 'My Header value',
'x-other-header': 'My Other Value',
})
expect(rawHeaders).to.deep.equal([
'X-My-Header',
'My Header value',
'X-Other-Header',
'My Other Value',
])
scope.done()
})
})
describe('using functions', () => {
it('sends the result back in the response', async () => {
const scope = nock('http://example.test')
.get('/')
.reply(200, 'boo!', {
'X-My-Headers': () => 'yo!',
})
const { headers, rawHeaders } = await got('http://example.test/')
expect(headers).to.deep.equal({ 'x-my-headers': 'yo!' })
expect(rawHeaders).to.deep.equal(['X-My-Headers', 'yo!'])
scope.done()
})
it('receives the correct arguments', async () => {
const myHeaderFnCalled = sinon.spy()
const { ClientRequest: OverriddenClientRequest } = require('http')
const scope = nock('http://example.test')
.post('/')
.reply(200, 'boo!', {
'X-My-Headers': (req, res, body) => {
myHeaderFnCalled()
expect(req).to.be.an.instanceof(OverriddenClientRequest)
expect(res).to.be.an.instanceof(IncomingMessage)
expect(body).to.equal('boo!')
return 'gotcha'
},
})
await got.post('http://example.test/')
expect(myHeaderFnCalled).to.have.been.called()
scope.done()
})
it('is evaluated exactly once', async () => {
const myHeaderFnCalled = sinon.spy()
const scope = nock('http://example.test')
.get('/')
.reply(200, 'boo!', {
'X-My-Headers': () => {
myHeaderFnCalled()
return 'heya'
},
})
await got('http://example.test/')
expect(myHeaderFnCalled).to.have.been.calledOnce()
scope.done()
})
it('when keys are duplicated, is evaluated once per input field name, in correct order', async () => {
const replyHeaders = [
'X-MY-HEADER',
() => 'one',
'x-my-header',
() => 'two',
]
const scope = nock('http://example.test')
.get('/')
.reply(200, 'Hello World!', replyHeaders)
const { headers, rawHeaders } = await got('http://example.test/')
expect(headers).to.deep.equal({ 'x-my-header': 'one, two' })
expect(rawHeaders).to.deep.equal([
'X-MY-HEADER',
'one',
'x-my-header',
'two',
])
scope.done()
})
it('is re-evaluated for a subsequent request', async () => {
let counter = 0
const scope = nock('http://example.test')
.get('/')
.times(2)
.reply(200, 'boo!', {
'X-My-Headers': () => `${++counter}`,
})
const { headers, rawHeaders } = await got('http://example.test/')
expect(headers).to.deep.equal({ 'x-my-headers': '1' })
expect(rawHeaders).to.deep.equal(['X-My-Headers', '1'])
expect(counter).to.equal(1)
const { headers: headers2, rawHeaders: rawHeaders2 } = await got(
'http://example.test/'
)
expect(headers2).to.deep.equal({ 'x-my-headers': '2' })
expect(rawHeaders2).to.deep.equal(['X-My-Headers', '2'])
expect(counter).to.equal(2)
scope.done()
})
})
})
describe('`replyContentLength()`', () => {
it('sends explicit content-length header with response', async () => {
const response = { hello: 'world' }
const scope = nock('http://example.test')
.replyContentLength()
.get('/')
.reply(200, response)
const { headers } = await got('http://example.test/')
expect(headers['content-length']).to.equal(
`${JSON.stringify(response).length}`
)
scope.done()
})
it('sends explicit content-length header with string response', async () => {
const response = '...'
const scope = nock('http://example.test')
.replyContentLength()
.get('/')
.reply(200, response)
const { headers } = await got('http://example.test/')
expect(headers['content-length']).to.equal(`${response.length}`)
scope.done()
})
it('sends explicit content-length header with buffer response', async () => {
const response = Buffer.from([1, 2, 3, 4, 5, 6])
const scope = nock('http://example.test')
.replyContentLength()
.get('/')
.reply(200, response)
const { headers } = await got('http://example.test/')
expect(headers['content-length']).to.equal(`${response.byteLength}`)
scope.done()
})
it('should not send content-length when responding with a stream', async () => {
const scope = nock('http://example.test')
.replyContentLength()
.get('/')
.reply(200, () => fs.createReadStream(textFilePath))
const { headers } = await got('http://example.test/')
expect(headers['content-length']).to.be.undefined()
scope.done()
})
})
describe('`replyDate()`', () => {
it('sends explicit date header with response', async () => {
const date = new Date()
const scope = nock('http://example.test').replyDate(date).get('/').reply()
const { headers } = await got('http://example.test/')
expect(headers.date).to.equal(date.toUTCString())
scope.done()
})
describe('with mock timers', () => {
let clock
beforeEach(() => {
clock = fakeTimers.install()
})
afterEach(() => {
if (clock) {
clock.uninstall()
clock = undefined
}
})
it('sends date header with response', async () => {
const scope = nock('http://example.test').replyDate().get('/').reply()
const req = got('http://example.test/')
clock.tick()
const { headers } = await req
const date = new Date()
expect(headers).to.include({ date: date.toUTCString() })
scope.done()
})
})
})
nock-13.2.4/tests/test_reply_with_error.js 0000664 0000000 0000000 00000002207 14177263367 0020712 0 ustar 00root root 0000000 0000000 'use strict'
// Tests for `.replyWithError()`.
const http = require('http')
const { expect } = require('chai')
const nock = require('..')
describe('`replyWithError()`', () => {
it('returns an error through the request', done => {
const scope = nock('http://example.test')
.post('/echo')
.replyWithError('Service not found')
const req = http.request({
host: 'example.test',
method: 'POST',
path: '/echo',
port: 80,
})
req.on('error', e => {
expect(e)
.to.be.an.instanceof(Error)
.and.include({ message: 'Service not found' })
scope.done()
done()
})
req.end()
})
it('allows json response', done => {
const scope = nock('http://example.test')
.post('/echo')
.replyWithError({ message: 'Service not found', code: 'test' })
const req = http.request({
host: 'example.test',
method: 'POST',
path: '/echo',
port: 80,
})
req.on('error', e => {
expect(e).to.deep.equal({
message: 'Service not found',
code: 'test',
})
scope.done()
done()
})
req.end()
})
})
nock-13.2.4/tests/test_reply_with_file.js 0000664 0000000 0000000 00000004211 14177263367 0020475 0 ustar 00root root 0000000 0000000 'use strict'
// Tests for `.replyWithFile()`.
const fs = require('fs')
const path = require('path')
const sinon = require('sinon')
const { expect } = require('chai')
const proxyquire = require('proxyquire').preserveCache()
const nock = require('..')
const got = require('./got_client')
const textFilePath = path.resolve(__dirname, './assets/reply_file_1.txt')
const binaryFilePath = path.resolve(__dirname, './assets/reply_file_2.txt.gz')
describe('`replyWithFile()`', () => {
it('reply with file', async () => {
const scope = nock('http://example.test')
.get('/')
.replyWithFile(200, textFilePath)
const { statusCode, body } = await got('http://example.test/')
expect(statusCode).to.equal(200)
expect(body).to.equal('Hello from the file!')
scope.done()
})
it('reply with file with headers', async () => {
const scope = nock('http://example.test')
.get('/')
.replyWithFile(200, binaryFilePath, {
'content-encoding': 'gzip',
})
const { statusCode, body } = await got('http://example.test/')
expect(statusCode).to.equal(200)
expect(body).to.have.lengthOf(20)
scope.done()
})
it('reply with file with repeated', async () => {
sinon.spy(fs)
const scope = nock('http://example.test')
.get('/')
.times(2)
.replyWithFile(200, binaryFilePath, {
'content-encoding': 'gzip',
})
const response1 = await got('http://example.test/')
expect(response1.statusCode).to.equal(200)
expect(response1.body).to.have.lengthOf(20)
const response2 = await got('http://example.test/')
expect(response2.statusCode).to.equal(200)
expect(response2.body).to.have.lengthOf(20)
expect(fs.createReadStream.callCount).to.equal(2)
scope.done()
})
describe('with no fs', () => {
const { Scope } = proxyquire('../lib/scope', {
'./interceptor': proxyquire('../lib/interceptor', {
fs: null,
}),
})
it('throws the expected error', () => {
expect(() =>
new Scope('http://example.test')
.get('/')
.replyWithFile(200, textFilePath)
).to.throw(Error, 'No fs')
})
})
})
nock-13.2.4/tests/test_request_overrider.js 0000664 0000000 0000000 00000054675 14177263367 0021104 0 ustar 00root root 0000000 0000000 'use strict'
// Tests of the RequestOverrider, which mocks http.ClientRequest and
// https.ClientRequest. The goal is to provide parity of behavior, both
// documented and undocumented, with the real version.
//
// While most of nock's tests are functional tests which invoke Nock's public
// API and make assertions about requests, usually with got, the tests of the
// request overrider tend to use http directly, and make lower-level
// assertions about how the mock client responds. Here the code under test is
// the part of Nock that must interface with all http clients.
const http = require('http')
const https = require('https')
const { URL } = require('url')
const { expect } = require('chai')
const sinon = require('sinon')
const nock = require('..')
const FormData = require('form-data')
const got = require('./got_client')
const servers = require('./servers')
describe('Request Overrider', () => {
it('response is an http.IncomingMessage instance', done => {
const responseText = 'incoming message!'
const scope = nock('http://example.test')
.get('/somepath')
.reply(200, responseText)
http
.request(
{
host: 'example.test',
path: '/somepath',
},
res => {
res.resume()
expect(res).to.be.an.instanceof(http.IncomingMessage)
scope.done()
done()
}
)
.end()
})
it('emits the response event', done => {
const scope = nock('http://example.test').get('/').reply()
const req = http.get('http://example.test')
req.on('response', () => {
scope.done()
done()
})
})
it('write callback called', done => {
const scope = nock('http://example.test')
.filteringRequestBody(/mia/, 'nostra')
.post('/', 'mamma nostra')
.reply()
const reqWriteCallback = sinon.spy()
const req = http.request(
{
host: 'example.test',
method: 'POST',
path: '/',
port: 80,
},
res => {
expect(reqWriteCallback).to.have.been.calledOnce()
expect(res.statusCode).to.equal(200)
res.on('end', () => {
scope.done()
done()
})
// Streams start in 'paused' mode and must be started.
// See https://nodejs.org/api/stream.html#stream_class_stream_readable
res.resume()
}
)
req.write('mamma mia', null, () => {
reqWriteCallback()
req.end()
})
})
it('write callback is not called if the provided chunk is undefined', done => {
const scope = nock('http://example.test').post('/').reply()
const reqWriteCallback = sinon.spy()
const req = http.request(
{
host: 'example.test',
method: 'POST',
path: '/',
},
res => {
expect(res.statusCode).to.equal(200)
res.on('end', () => {
expect(reqWriteCallback).to.not.have.been.called()
scope.done()
done()
})
// Streams start in 'paused' mode and must be started.
// See https://nodejs.org/api/stream.html#stream_class_stream_readable
res.resume()
}
)
req.write(undefined, null, reqWriteCallback)
req.end()
})
it('end callback called', done => {
const scope = nock('http://example.test')
.filteringRequestBody(/mia/, 'nostra')
.post('/', 'mamma nostra')
.reply()
const reqEndCallback = sinon.spy()
const req = http.request(
{
host: 'example.test',
method: 'POST',
path: '/',
port: 80,
},
res => {
expect(reqEndCallback).to.have.been.calledOnce()
expect(res.statusCode).to.equal(200)
res.on('end', () => {
scope.done()
done()
})
// Streams start in 'paused' mode and must be started.
// See https://nodejs.org/api/stream.html#stream_class_stream_readable
res.resume()
}
)
req.end('mamma mia', null, reqEndCallback)
})
// https://github.com/nock/nock/issues/1509
it('end callback called when end has callback, but no buffer', done => {
const scope = nock('http://example.test').post('/').reply()
const reqEndCallback = sinon.spy()
const req = http.request(
{
host: 'example.test',
method: 'POST',
path: '/',
port: 80,
},
res => {
expect(reqEndCallback).to.have.been.calledOnce()
expect(res.statusCode).to.equal(200)
res.on('end', () => {
scope.done()
done()
})
// Streams start in 'paused' mode and must be started.
// See https://nodejs.org/api/stream.html#stream_class_stream_readable
res.resume()
}
)
req.end(reqEndCallback)
})
it('request.end called with all three arguments', done => {
const scope = nock('http://example.test').post('/', 'foobar').reply()
const reqEndCallback = sinon.spy()
const req = http.request(
{
host: 'example.test',
method: 'POST',
path: '/',
},
res => {
expect(reqEndCallback).to.have.been.calledOnce()
res.on('end', () => {
scope.done()
done()
})
res.resume()
}
)
// hex(foobar) == 666F6F626172
req.end('666F6F626172', 'hex', reqEndCallback)
})
it('request.end called with only data and encoding', done => {
const scope = nock('http://example.test').post('/', 'foobar').reply()
const req = http.request(
{
host: 'example.test',
method: 'POST',
path: '/',
},
res => {
res.on('end', () => {
scope.done()
done()
})
res.resume()
}
)
// hex(foobar) == 666F6F626172
req.end('666F6F626172', 'hex')
})
it('request.end called with only data and a callback', done => {
const scope = nock('http://example.test').post('/', 'foobar').reply()
const reqEndCallback = sinon.spy()
const req = http.request(
{
host: 'example.test',
method: 'POST',
path: '/',
},
res => {
expect(reqEndCallback).to.have.been.calledOnce()
res.on('end', () => {
scope.done()
done()
})
res.resume()
}
)
req.end('foobar', reqEndCallback)
})
// https://github.com/nock/nock/issues/2112
it('request.end can be called multiple times without a chunk and not error', done => {
const scope = nock('http://example.test').get('/').reply()
const req = http.request(
{
host: 'example.test',
method: 'GET',
path: '/',
},
res => {
res.on('end', () => {
scope.done()
done()
})
res.resume()
}
)
req.end()
req.end()
req.end()
})
it('should emit an error if `write` is called after `end`', done => {
nock('http://example.test').get('/').reply()
const req = http.request('http://example.test')
req.on('error', err => {
expect(err.message).to.equal('write after end')
expect(err.code).to.equal('ERR_STREAM_WRITE_AFTER_END')
done()
})
req.end()
req.write('foo')
})
// http://github.com/nock/nock/issues/139
it('should emit "finish" on the request before emitting "end" on the response', done => {
const scope = nock('http://example.test').post('/').reply()
const onFinish = sinon.spy()
const req = http.request(
{
host: 'example.test',
method: 'POST',
path: '/',
port: 80,
},
res => {
expect(onFinish).to.have.been.calledOnce()
expect(res.statusCode).to.equal(200)
res.on('end', () => {
expect(onFinish).to.have.been.calledOnce()
scope.done()
done()
})
// Streams start in 'paused' mode and must be started.
// See https://nodejs.org/api/stream.html#stream_class_stream_readable
res.resume()
}
)
req.on('finish', onFinish)
req.end('mamma mia')
})
it('should update the writable attributes before emitting the "finish" event', done => {
nock('http://example.test').post('/').reply()
const req = http.request({
host: 'example.test',
method: 'POST',
path: '/',
port: 80,
})
// `writableEnded` was added in v12.9.0 to rename `finished` which was deprecated in v13.4.0. it's just an alias,
// but it only denotes that `end` was called on the request not that the socket has finished flushing (hence the rename).
expect(req.finished).to.be.false()
const hasWriteable = 'writableEnded' in req // to support v10
expect(req.writableEnded).to.equal(hasWriteable ? false : undefined)
// `writableFinished` denotes all data has been flushed to the underlying system, immediately before
// the 'finish' event is emitted. Nock's "socket" is instantaneous so these attributes never differ.
expect(req.writableFinished).to.equal(hasWriteable ? false : undefined)
req.on('finish', () => {
expect(req.finished).to.be.true()
expect(req.writableEnded).to.equal(hasWriteable ? true : undefined)
expect(req.writableFinished).to.equal(hasWriteable ? true : undefined)
done()
})
req.end('mamma mia')
})
// TODO Convert to async / got.
it('pause response before data', done => {
const scope = nock('http://example.test')
.get('/pauser')
.reply(200, 'nobody')
const req = http.request({
host: 'example.test',
path: '/pauser',
})
const didTimeout = sinon.spy()
const onData = sinon.spy()
req.on('response', res => {
res.pause()
setTimeout(() => {
didTimeout()
res.resume()
}, 500)
res.on('data', () => {
onData()
expect(didTimeout).to.have.been.calledOnce()
})
res.on('end', () => {
expect(onData).to.have.been.calledOnce()
scope.done()
done()
})
})
req.end()
})
it('accept URL as request target', done => {
const onData = sinon.spy()
const scope = nock('http://example.test')
.get('/')
.reply(200, 'Hello World!')
http.get(new URL('http://example.test'), res => {
expect(res.statusCode).to.equal(200)
res.on('data', data => {
onData()
expect(data).to.be.an.instanceof(Buffer)
expect(data.toString()).to.equal('Hello World!')
})
res.on('end', () => {
expect(onData).to.have.been.calledOnce()
scope.done()
done()
})
})
})
it('request has path', done => {
const scope = nock('http://example.test')
.get('/the/path/to/infinity')
.reply(200)
const req = http.request(
{
hostname: 'example.test',
port: 80,
method: 'GET',
path: '/the/path/to/infinity',
},
res => {
scope.done()
expect(req.path).to.equal('/the/path/to/infinity')
done()
}
)
req.end()
})
it('has a req property on the response', done => {
const scope = nock('http://example.test').get('/like-wtf').reply(200)
const req = http.request('http://example.test/like-wtf', res => {
res.on('end', () => {
expect(res.req).to.be.an.instanceof(http.ClientRequest)
scope.done()
done()
})
// Streams start in 'paused' mode and must be started.
// See https://nodejs.org/api/stream.html#stream_class_stream_readable
res.resume()
})
req.end()
})
// Hopefully address https://github.com/nock/nock/issues/146, at least in spirit.
it('request with a large buffer', async () => {
const replyLength = 1024 * 1024
const responseBody = Buffer.from(new Array(replyLength + 1).join('.'))
// Confidence check.
expect(responseBody.length).to.equal(replyLength)
const scope = nock('http://example.test')
.get('/')
.reply(200, responseBody, { 'Content-Encoding': 'gzip' })
const { body } = await got('http://example.test', {
responseType: 'buffer',
decompress: false,
})
expect(body).to.deep.equal(responseBody)
scope.done()
})
it('.setNoDelay', done => {
nock('http://example.test').get('/yay').reply(200, 'Hi')
const req = http.request(
{
host: 'example.test',
path: '/yay',
port: 80,
},
res => {
expect(res.statusCode).to.equal(200)
res.on('end', done)
// Streams start in 'paused' mode and must be started.
// See https://nodejs.org/api/stream.html#stream_class_stream_readable
res.resume()
}
)
req.setNoDelay(true)
req.end()
})
it('request emits socket', done => {
nock('http://example.test').get('/').reply(200, 'hey')
const req = http.get('http://example.test')
// Using `this`, so can't use arrow function.
req.once('socket', function (socket) {
// https://github.com/nock/nock/pull/769
// https://github.com/nock/nock/pull/779
expect(this).to.equal(req)
expect(socket).to.be.an.instanceof(Object)
done()
})
})
it('socket is shared and aliased correctly', done => {
nock('http://example.test').get('/').reply()
const req = http.get('http://example.test')
req.once('response', res => {
expect(req.socket).to.equal(req.connection)
expect(req.socket).to.equal(res.socket)
expect(res.socket).to.equal(res.client)
expect(res.socket).to.equal(res.connection)
done()
})
})
it('socket emits connect and secureConnect', done => {
nock('https://example.test').post('/').reply(200, 'hey')
const req = https.request({
host: 'example.test',
path: '/',
method: 'POST',
})
const onConnect = sinon.spy()
const onSecureConnect = sinon.spy()
req.on('socket', socket => {
socket.once('connect', () => {
onConnect()
req.end()
})
socket.once('secureConnect', onSecureConnect)
})
req.once('response', res => {
res.setEncoding('utf8')
res.on('data', data => {
expect(data).to.equal('hey')
expect(onConnect).to.have.been.calledOnce()
expect(onSecureConnect).to.have.been.calledOnce()
done()
})
})
})
it('socket has address() method', done => {
nock('http://example.test').get('/').reply()
const req = http.get('http://example.test')
req.once('socket', socket => {
expect(socket.address()).to.deep.equal({
port: 80,
family: 'IPv4',
address: '127.0.0.1',
})
done()
})
})
it('socket has address() method, https/IPv6', done => {
nock('https://example.test').get('/').reply()
const req = https.get('https://example.test', { family: 6 })
req.once('socket', socket => {
expect(socket.address()).to.deep.equal({
port: 443,
family: 'IPv6',
address: '::1',
})
done()
})
})
it('socket has setKeepAlive() method', done => {
nock('http://example.test').get('/').reply(200, 'hey')
const req = http.get('http://example.test')
req.once('socket', socket => {
socket.setKeepAlive(true)
done()
})
})
it('socket has ref() and unref() method', done => {
nock('http://example.test').get('/').reply(200, 'hey')
const req = http.get('http://example.test')
req.once('socket', socket => {
expect(socket).to.respondTo('ref').and.to.to.respondTo('unref')
// FIXME: These functions, and many of the other Socket functions, should
// actually return `this`.
// https://github.com/nock/nock/pull/1770#discussion_r343425097
expect(socket.ref()).to.be.undefined()
expect(socket.unref()).to.be.undefined()
done()
})
})
it('socket has destroy() method', done => {
nock('http://example.test').get('/').reply(200, 'hey')
const req = http.get('http://example.test')
req.on('error', () => {}) // listen for error so it doesn't bubble
req.once('socket', socket => {
socket.destroy()
done()
})
})
it('calling Socket#destroy() multiple times only emits a single `close` event', done => {
nock('http://example.test').get('/').reply(200, 'hey')
const req = http.get('http://example.test')
req.on('error', () => {}) // listen for error so it doesn't bubble
req.once('socket', socket => {
const closeSpy = sinon.spy()
socket.on('close', closeSpy)
socket.destroy().destroy().destroy()
setTimeout(() => {
expect(closeSpy).to.have.been.calledOnce()
done()
}, 10)
})
})
it('socket has getPeerCertificate() method which returns a random base64 string', done => {
nock('http://example.test').get('/').reply()
const req = http.get('http://example.test')
req.once('socket', socket => {
const first = socket.getPeerCertificate()
const second = socket.getPeerCertificate()
expect(first).to.be.a('string')
expect(second).to.be.a('string').and.not.equal(first)
done()
})
})
it('abort destroys socket', done => {
nock('http://example.test').get('/').reply(200, 'hey')
const req = http.get('http://example.test')
// Ignore errors.
req.once('error', () => {})
req.once('socket', socket => {
req.abort()
expect(socket.destroyed).to.be.true()
done()
})
})
it('should throw expected error when creating request with missing options', done => {
expect(() => http.request()).to.throw(
Error,
'Making a request with empty `options` is not supported in Nock'
)
done()
})
// https://github.com/nock/nock/issues/1558
it("mocked requests have 'method' property", done => {
const scope = nock('http://example.test').get('/somepath').reply(200, {})
const req = http.request({
host: 'example.test',
path: '/somepath',
method: 'GET',
port: 80,
})
expect(req.method).to.equal('GET')
req.on('response', res => {
expect(res.req.method).to.equal('GET')
scope.done()
done()
})
req.end()
})
// https://github.com/nock/nock/issues/1493
it("response has 'complete' property and it's true after end", done => {
const scope = nock('http://example.test')
.get('/')
.reply(200, 'Hello World!')
const req = http.request(
{
host: 'example.test',
method: 'GET',
path: '/',
port: 80,
},
res => {
res.on('end', () => {
expect(res.complete).to.be.true()
scope.done()
done()
})
// Streams start in 'paused' mode and must be started.
// See https://nodejs.org/api/stream.html#stream_class_stream_readable
res.resume()
}
)
req.end()
})
it('Request with `Expect: 100-continue` triggers continue event', done => {
// This is a replacement for a wide-bracket regression test that was added
// for https://github.com/nock/nock/issues/256.
//
// The behavior was subsequently changed so 'continue' is emitted only when
// the `Expect: 100-continue` header is present.
//
// This test was adapted from this test from Node:
// https://github.com/nodejs/node/blob/1b2d3f7ae7f0391908b70b0333a5adef3c8cb79d/test/parallel/test-http-expect-continue.js#L35
//
// Related:
// https://tools.ietf.org/html/rfc2616#section-8.2.3
// https://github.com/nodejs/node/issues/10487
const exampleRequestBody = 'this is the full request body'
const scope = nock('http://example.test')
.post('/', exampleRequestBody)
.reply()
const req = http.request({
host: 'example.test',
method: 'POST',
path: '/',
port: 80,
headers: { Expect: '100-continue' },
})
const onData = sinon.spy()
req.on('response', res => {
expect(res.statusCode).to.equal(200)
// The `end` event will not fire without a `data` listener, though it
// will never fire since the body is empty. This is consistent with
// the Node docs:
// https://nodejs.org/api/http.html#http_class_http_clientrequest
res.on('data', onData)
res.on('end', () => {
expect(onData).not.to.have.been.called()
scope.done()
done()
})
})
req.on('continue', () => {
req.end(exampleRequestBody)
})
})
// https://github.com/nock/nock/issues/1836
it('when http.get and http.request have been overridden before nock overrides them, http.get calls through to the expected method', async () => {
// Obtain the original `http.request()` and stub it out, as a library might.
nock.restore()
const overriddenRequest = sinon.stub(http, 'request').callThrough()
const overriddenGet = sinon.stub(http, 'get').callThrough()
// Let Nock override them again.
nock.activate()
const { origin } = await servers.startHttpServer((request, response) => {
response.writeHead(200)
response.end()
})
const req = http.get(origin)
expect(overriddenGet).to.have.been.calledOnce()
expect(overriddenRequest).not.to.have.been.called()
req.abort()
})
// https://github.com/nock/nock/issues/1836
it('when http.get and http.request have been overridden before nock overrides them, http.request calls through to the expected method', async () => {
// Obtain the original `http.request()` and stub it out, as a library might.
nock.restore()
const overriddenRequest = sinon.stub(http, 'request').callThrough()
const overriddenGet = sinon.stub(http, 'get').callThrough()
// Let Nock override them again.
nock.activate()
const req = http.request({
host: 'localhost',
path: '/',
port: 1234,
})
expect(overriddenRequest).to.have.been.calledOnce()
expect(overriddenGet).not.to.have.been.called()
req.abort()
})
// https://github.com/nock/nock/issues/2231
it('mocking a request which sends an empty buffer should finalize', async () => {
const prefixUrl = 'http://www.test.com'
const bufferEndpoint = 'upload/buffer/'
nock(prefixUrl).post(`/${bufferEndpoint}`).reply(200, 'BUFFER_SENT')
const formData = new FormData()
formData.append('fileData', Buffer.alloc(0), 'chunk')
const options = {
prefixUrl,
body: formData,
}
const { body: response } = await got.post(bufferEndpoint, options)
expect(response).to.equal('BUFFER_SENT')
})
// https://github.com/nock/nock/issues/2298
it('should handle non-default agents', async () => {
nock('https://example.test').get('/').reply(200, 'OK')
const agent = {
foo: 'bar',
}
const { statusCode } = await got('https://example.test', {
agent: { https: agent },
})
expect(statusCode).to.equal(200)
})
})
nock-13.2.4/tests/test_scope.js 0000664 0000000 0000000 00000012714 14177263367 0016430 0 ustar 00root root 0000000 0000000 'use strict'
const path = require('path')
const { expect } = require('chai')
const sinon = require('sinon')
const proxyquire = require('proxyquire').preserveCache()
const url = require('url')
const Interceptor = require('../lib/interceptor')
const nock = require('..')
const got = require('./got_client')
it('scope exposes interceptors', () => {
const scopes = nock.load(
path.join(__dirname, 'fixtures', 'good_request.json')
)
expect(scopes).to.be.an.instanceOf(Array)
expect(scopes).to.have.lengthOf.at.least(1)
scopes.forEach(scope => {
scope.interceptors.forEach(interceptor => {
expect(interceptor).to.be.an.instanceOf(Interceptor)
interceptor.delayConnection(100)
})
})
})
describe('`Scope#constructor`', () => {
it('accepts the output of url.parse', async () => {
const scope = nock(url.parse('http://example.test')).get('/').reply()
const { statusCode } = await got('http://example.test')
expect(statusCode).to.equal(200)
scope.done()
})
// TODO: https://github.com/nock/nock/pull/1879
it.skip('accepts a WHATWG URL instance', async () => {
const scope = nock(new url.URL('http://example.test')).get('/').reply()
const { statusCode } = await got('http://example.test')
expect(statusCode).to.equal(200)
scope.done()
})
it('fails when provided a WHATWG URL instance', () => {
// This test just proves the lack of current support. When this feature is added,
// this test should be removed and the test above un-skipped.
expect(() => nock(new url.URL('http://example.test'))).to.throw()
})
})
describe('`Scope#remove()`', () => {
it('removes an active mock', () => {
const scope = nock('http://example.test').get('/').reply(200)
const key = 'GET http://example.test:80/'
// Confidence check.
expect(scope.activeMocks()).to.deep.equal([key])
// Act.
scope.remove(key, scope.interceptors[0])
// Assert.
expect(scope.activeMocks()).to.deep.equal([])
})
it('when a mock is persisted, does nothing', () => {
const scope = nock('http://example.test').persist().get('/').reply(200)
const key = 'GET http://example.test:80/'
// Confidence check.
expect(scope.activeMocks()).to.deep.equal([key])
// Act.
scope.remove(key, scope.interceptors[0])
// Assert.
expect(scope.activeMocks()).to.deep.equal([key])
})
it('when the key is nonexistent, does nothing', () => {
const scope = nock('http://example.test').get('/').reply(200)
const key = 'GET http://example.test:80/'
// Confidence check.
expect(scope.activeMocks()).to.deep.equal([key])
// Act.
scope.remove('GET http://bogus.test:80/', scope.interceptors[0])
// Assert.
expect(scope.activeMocks()).to.deep.equal([key])
})
})
it('loadDefs throws expected when fs is not available', () => {
const { loadDefs } = proxyquire('../lib/scope', { fs: null })
expect(() => loadDefs()).to.throw(Error, 'No fs')
})
describe('`Scope#isDone()`', () => {
it('returns false while a mock is pending, and true after it is consumed', async () => {
const scope = nock('http://example.test').get('/').reply()
expect(scope.isDone()).to.be.false()
await got('http://example.test/')
expect(scope.isDone()).to.be.true()
scope.done()
})
})
describe('`filteringPath()`', function () {
it('filter path with function', async function () {
const scope = nock('http://example.test')
.filteringPath(() => '/?a=2&b=1')
.get('/?a=2&b=1')
.reply()
const { statusCode } = await got('http://example.test/', {
searchParams: { a: '1', b: '2' },
})
expect(statusCode).to.equal(200)
scope.done()
})
it('filter path with regexp', async () => {
const scope = nock('http://example.test')
.filteringPath(/\d/g, '3')
.get('/?a=3&b=3')
.reply()
const { statusCode } = await got('http://example.test/', {
searchParams: { a: '1', b: '2' },
})
expect(statusCode).to.equal(200)
scope.done()
})
it('filteringPath with invalid argument throws expected', () => {
expect(() => nock('http://example.test').filteringPath('abc123')).to.throw(
Error,
'Invalid arguments: filtering path should be a function or a regular expression'
)
})
})
describe('filteringRequestBody()', () => {
it('filter body with function', async () => {
const onFilteringRequestBody = sinon.spy()
const scope = nock('http://example.test')
.filteringRequestBody(body => {
onFilteringRequestBody()
expect(body).to.equal('mamma mia')
return 'mamma tua'
})
.post('/', 'mamma tua')
.reply()
const { statusCode } = await got.post('http://example.test/', {
body: 'mamma mia',
})
expect(statusCode).to.equal(200)
expect(onFilteringRequestBody).to.have.been.calledOnce()
scope.done()
})
it('filter body with regexp', async () => {
const scope = nock('http://example.test')
.filteringRequestBody(/mia/, 'nostra')
.post('/', 'mamma nostra')
.reply(200, 'Hello World!')
const { statusCode } = await got.post('http://example.test/', {
body: 'mamma mia',
})
expect(statusCode).to.equal(200)
scope.done()
})
it('filteringRequestBody with invalid argument throws expected', () => {
expect(() =>
nock('http://example.test').filteringRequestBody('abc123')
).to.throw(
Error,
'Invalid arguments: filtering request body should be a function or a regular expression'
)
})
})
nock-13.2.4/tests/test_socket.js 0000664 0000000 0000000 00000005060 14177263367 0016603 0 ustar 00root root 0000000 0000000 'use strict'
const { expect } = require('chai')
const http = require('http')
const https = require('https')
const { Readable } = require('stream')
const nock = require('..')
it('should expose TLSSocket attributes for HTTPS requests', done => {
nock('https://example.test').get('/').reply()
https.get('https://example.test').on('socket', socket => {
expect(socket.authorized).to.equal(true)
expect(socket.encrypted).to.equal(true)
done()
})
})
it('should not have TLSSocket attributes for HTTP requests', done => {
nock('http://example.test').get('/').reply()
http.get('http://example.test').on('socket', socket => {
expect(socket.authorized).to.equal(undefined)
expect(socket.encrypted).to.equal(undefined)
done()
})
})
describe('`Socket#setTimeout()`', () => {
it('adds callback as a one-time listener for parity with a real socket', done => {
nock('http://example.test').get('/').delayConnection(100).reply()
const onTimeout = () => {
done()
}
http.get('http://example.test').on('socket', socket => {
socket.setTimeout(50, onTimeout)
})
})
it('can be called without a callback', done => {
nock('http://example.test').get('/').delayConnection(100).reply()
http.get('http://example.test').on('socket', socket => {
socket.setTimeout(50)
socket.on('timeout', () => {
done()
})
})
})
})
describe('`Socket#destroy()`', () => {
it('can destroy the socket if stream is not finished', async () => {
const scope = nock('http://example.test')
scope.intercept('/somepath', 'GET').reply(() => {
const buffer = Buffer.allocUnsafe(10000000)
const data = new MemoryReadableStream(buffer, { highWaterMark: 128 })
return [200, data]
})
const req = http.get('http://example.test/somepath')
const stream = await new Promise(resolve => req.on('response', resolve))
// close after first chunk of data
stream.on('data', () => stream.destroy())
await new Promise((resolve, reject) => {
stream.on('error', reject)
stream.on('close', resolve)
stream.on('end', resolve)
})
})
})
class MemoryReadableStream extends Readable {
constructor(content) {
super()
this._content = content
this._currentOffset = 0
}
_read(size) {
if (this._currentOffset >= this._content.length) {
this.push(null)
return
}
const nextOffset = this._currentOffset + size
const content = this._content.slice(this._currentOffset, nextOffset)
this._currentOffset = nextOffset
this.push(content)
}
}
nock-13.2.4/tests/test_stream.js 0000664 0000000 0000000 00000016107 14177263367 0016612 0 ustar 00root root 0000000 0000000 'use strict'
const events = require('events')
const http = require('http')
const path = require('path')
const stream = require('stream')
const util = require('util')
const { expect } = require('chai')
const sinon = require('sinon')
const nock = require('..')
const got = require('./got_client')
const textFilePath = path.resolve(__dirname, './assets/reply_file_1.txt')
it('reply with file and pipe response', done => {
const scope = nock('http://example.test')
.get('/')
.replyWithFile(200, textFilePath)
let text = ''
const fakeStream = new stream.Stream()
fakeStream.writable = true
fakeStream.write = d => {
text += d
}
fakeStream.end = () => {
expect(text).to.equal('Hello from the file!')
scope.done()
done()
}
got.stream('http://example.test/').pipe(fakeStream)
})
// TODO Convert to async / got.
it('pause response after data', done => {
const response = new stream.PassThrough()
const scope = nock('http://example.test')
.get('/')
// Node does not pause the 'end' event so we need to use a stream to simulate
// multiple 'data' events.
.reply(200, response)
http.get('http://example.test', res => {
const didTimeout = sinon.spy()
setTimeout(() => {
didTimeout()
res.resume()
}, 500)
res.on('data', () => res.pause())
res.on('end', () => {
expect(didTimeout).to.have.been.calledOnce()
scope.done()
done()
})
// Manually simulate multiple 'data' events.
response.emit('data', 'one')
setTimeout(() => {
response.emit('data', 'two')
response.end()
}, 0)
})
})
// https://github.com/nock/nock/issues/1493
it("response has 'complete' property and it's true after end", done => {
const response = new stream.PassThrough()
const scope = nock('http://example.test')
.get('/')
// Node does not pause the 'end' event so we need to use a stream to simulate
// multiple 'data' events.
.reply(200, response)
http.get('http://example.test', res => {
const onData = sinon.spy()
res.on('data', onData)
res.on('end', () => {
expect(onData).to.have.been.called()
expect(res.complete).to.be.true()
scope.done()
done()
})
// Manually simulate multiple 'data' events.
response.emit('data', 'one')
response.end()
})
})
// TODO Convert to async / got.
it('response pipe', done => {
const dest = (() => {
function Constructor() {
events.EventEmitter.call(this)
this.buffer = Buffer.alloc(0)
this.writable = true
}
util.inherits(Constructor, events.EventEmitter)
Constructor.prototype.end = function () {
this.emit('end')
}
Constructor.prototype.write = function (chunk) {
const buf = Buffer.alloc(this.buffer.length + chunk.length)
this.buffer.copy(buf)
chunk.copy(buf, this.buffer.length)
this.buffer = buf
return true
}
return new Constructor()
})()
const scope = nock('http://example.test').get('/').reply(200, 'nobody')
http.get(
{
host: 'example.test',
path: '/',
},
res => {
const onPipeEvent = sinon.spy()
dest.on('pipe', onPipeEvent)
dest.on('end', () => {
scope.done()
expect(onPipeEvent).to.have.been.calledOnce()
expect(dest.buffer.toString()).to.equal('nobody')
done()
})
res.pipe(dest)
}
)
})
// TODO Convert to async / got.
it('response pipe without implicit end', done => {
const dest = (() => {
function Constructor() {
events.EventEmitter.call(this)
this.buffer = Buffer.alloc(0)
this.writable = true
}
util.inherits(Constructor, events.EventEmitter)
Constructor.prototype.end = function () {
this.emit('end')
}
Constructor.prototype.write = function (chunk) {
const buf = Buffer.alloc(this.buffer.length + chunk.length)
this.buffer.copy(buf)
chunk.copy(buf, this.buffer.length)
this.buffer = buf
return true
}
return new Constructor()
})()
const scope = nock('http://example.test').get('/').reply(200, 'nobody')
http.get(
{
host: 'example.test',
path: '/',
},
res => {
dest.on('end', () => expect.fail('should not call end implicitly'))
res.on('end', () => {
scope.done()
done()
})
res.pipe(dest, { end: false })
}
)
})
it('response is streams2 compatible', done => {
const responseText = 'streams2 streams2 streams2'
nock('http://example.test').get('/somepath').reply(200, responseText)
http
.request(
{
host: 'example.test',
path: '/somepath',
},
function (res) {
res.setEncoding('utf8')
let body = ''
res.on('readable', function () {
let buf
while ((buf = res.read())) body += buf
})
res.once('end', function () {
expect(body).to.equal(responseText)
done()
})
}
)
.end()
})
it('when a stream is used for the response body, it will not be read until after the response event', done => {
let responseEvent = false
const responseText = 'Hello World\n'
class SimpleStream extends stream.Readable {
_read() {
expect(responseEvent).to.be.true()
this.push(responseText)
this.push(null)
}
}
nock('http://localhost')
.get('/')
.reply(201, () => new SimpleStream())
http.get('http://localhost/', res => {
responseEvent = true
res.setEncoding('utf8')
let body = ''
expect(res.statusCode).to.equal(201)
res.on('data', function (chunk) {
body += chunk
})
res.once('end', function () {
expect(body).to.equal(responseText)
done()
})
})
})
// https://github.com/nock/nock/issues/193
it('response readable pull stream works as expected', done => {
nock('http://example.test')
.get('/ssstream')
.reply(200, 'this is the response body yeah')
const req = http.request(
{
host: 'example.test',
path: '/ssstream',
port: 80,
},
res => {
let ended = false
let responseBody = ''
expect(res.statusCode).to.equal(200)
res.on('readable', function () {
let chunk
while ((chunk = res.read()) !== null) {
responseBody += chunk.toString()
}
if (chunk === null && !ended) {
ended = true
expect(responseBody).to.equal('this is the response body yeah')
done()
}
})
}
)
req.end()
})
it('error events on reply streams proxy to the response', done => {
// This test could probably be written to use got, however, that lib has a lot
// of built in error handling and this test would get convoluted.
const replyBody = new stream.PassThrough()
const scope = nock('http://example.test').get('/').reply(201, replyBody)
http.get(
{
host: 'example.test',
method: 'GET',
path: '/',
},
res => {
res.on('error', err => {
expect(err).to.equal('oh no!')
scope.done()
done()
})
replyBody.end(() => {
replyBody.emit('error', 'oh no!')
})
}
)
})
nock-13.2.4/tests/test_url_encoding.js 0000664 0000000 0000000 00000000526 14177263367 0017765 0 ustar 00root root 0000000 0000000 'use strict'
const { expect } = require('chai')
const nock = require('..')
const got = require('./got_client')
it('url encoding', async () => {
const scope = nock('http://example.test').get('/key?a=[1]').reply(200)
const { statusCode } = await got('http://example.test/key?a=[1]')
expect(statusCode).to.equal(200)
scope.done()
})
nock-13.2.4/types/ 0000775 0000000 0000000 00000000000 14177263367 0013717 5 ustar 00root root 0000000 0000000 nock-13.2.4/types/index.d.ts 0000664 0000000 0000000 00000016633 14177263367 0015631 0 ustar 00root root 0000000 0000000 // TypeScript Version: 3.5
import { ReadStream } from 'fs'
import { ClientRequest, IncomingMessage, RequestOptions } from 'http'
import { ParsedUrlQuery } from 'querystring'
import { Url, URLSearchParams } from 'url'
export = nock
declare function nock(
basePath: string | RegExp | Url,
options?: nock.Options
): nock.Scope
declare namespace nock {
function cleanAll(): void
function activate(): void
function isActive(): boolean
function isDone(): boolean
function pendingMocks(): string[]
function activeMocks(): string[]
function removeInterceptor(interceptor: Interceptor | ReqOptions): boolean
function disableNetConnect(): void
function enableNetConnect(
matcher?: string | RegExp | ((host: string) => boolean)
): void
function load(path: string): Scope[]
function loadDefs(path: string): Definition[]
function define(defs: Definition[]): Scope[]
function restore(): void
function abortPendingRequests(): void
let back: Back
let emitter: NodeJS.EventEmitter
let recorder: Recorder
type InterceptFunction = (
uri: string | RegExp | { (uri: string): boolean },
requestBody?: RequestBodyMatcher,
interceptorOptions?: Options
) => Interceptor
// Essentially valid, decoded JSON with the addition of possible RegExp. TS doesn't currently have
// a great way to represent JSON type data, this data matcher design is based off this comment.
// https://github.com/microsoft/TypeScript/issues/1897#issuecomment-338650717
type DataMatcher =
| boolean
| number
| string
| null
| undefined
| RegExp
| DataMatcherArray
| DataMatcherMap
interface DataMatcherArray extends ReadonlyArray {}
interface DataMatcherMap {
[key: string]: DataMatcher
}
type RequestBodyMatcher =
| string
| Buffer
| RegExp
| DataMatcherArray
| DataMatcherMap
| { (body: any): boolean }
type RequestHeaderMatcher =
| string
| RegExp
| { (fieldValue: string): boolean }
type Body = string | Record // a string or decoded JSON
type ReplyBody = Body | Buffer | ReadStream
type ReplyHeaderFunction = (
req: ClientRequest,
res: IncomingMessage,
body: string | Buffer
) => string | string[]
type ReplyHeaderValue = string | string[] | ReplyHeaderFunction
type ReplyHeaders =
| Record
| Map
| ReplyHeaderValue[]
type StatusCode = number
type ReplyFnResult =
| readonly [StatusCode]
| readonly [StatusCode, ReplyBody]
| readonly [StatusCode, ReplyBody, ReplyHeaders]
interface ReplyFnContext extends Interceptor {
req: ClientRequest & {
headers: Record
}
}
interface Scope extends NodeJS.EventEmitter {
get: InterceptFunction
post: InterceptFunction
put: InterceptFunction
head: InterceptFunction
patch: InterceptFunction
merge: InterceptFunction
delete: InterceptFunction
options: InterceptFunction
intercept: (
uri: string | RegExp | { (uri: string): boolean },
method: string,
requestBody?: RequestBodyMatcher,
options?: Options
) => Interceptor
defaultReplyHeaders(headers: ReplyHeaders): this
matchHeader(name: string, value: RequestHeaderMatcher): this
filteringPath(regex: RegExp, replace: string): this
filteringPath(fn: (path: string) => string): this
filteringRequestBody(regex: RegExp, replace: string): this
filteringRequestBody(fn: (body: string) => string): this
persist(flag?: boolean): this
replyContentLength(): this
replyDate(d?: Date): this
done(): void
isDone(): boolean
pendingMocks(): string[]
activeMocks(): string[]
}
interface Interceptor {
query(
matcher:
| boolean
| string
| DataMatcherMap
| URLSearchParams
| { (parsedObj: ParsedUrlQuery): boolean }
): this
// tslint (as of 5.16) is under the impression that the callback types can be unified,
// however, doing so causes the params to lose their inherited types during use.
// the order of the overrides is important for determining the param types in the replay fns.
/* tslint:disable:unified-signatures */
reply(
replyFnWithCallback: (
this: ReplyFnContext,
uri: string,
body: Body,
callback: (
err: NodeJS.ErrnoException | null,
result: ReplyFnResult
) => void
) => void
): Scope
reply(
replyFn: (
this: ReplyFnContext,
uri: string,
body: Body
) => ReplyFnResult | Promise
): Scope
reply(
statusCode: StatusCode,
replyBodyFnWithCallback: (
this: ReplyFnContext,
uri: string,
body: Body,
callback: (err: NodeJS.ErrnoException | null, result: ReplyBody) => void
) => void,
headers?: ReplyHeaders
): Scope
reply(
statusCode: StatusCode,
replyBodyFn: (
this: ReplyFnContext,
uri: string,
body: Body
) => ReplyBody | Promise,
headers?: ReplyHeaders
): Scope
reply(responseCode?: StatusCode, body?: Body, headers?: ReplyHeaders): Scope
/* tslint:enable:unified-signatures */
replyWithError(errorMessage: string | object): Scope
replyWithFile(
statusCode: StatusCode,
fileName: string,
headers?: ReplyHeaders
): Scope
matchHeader(name: string, value: RequestHeaderMatcher): this
basicAuth(options: { user: string; pass?: string }): this
times(newCounter: number): this
once(): this
twice(): this
thrice(): this
optionally(flag?: boolean): this
delay(opts: number | { head?: number; body?: number }): this
delayBody(timeMs: number): this
delayConnection(timeMs: number): this
}
interface Options {
allowUnmocked?: boolean
reqheaders?: Record
badheaders?: string[]
filteringScope?: { (scope: string): boolean }
encodedQueryParams?: boolean
}
interface Recorder {
rec(options?: boolean | RecorderOptions): void
clear(): void
play(): string[] | Definition[]
}
interface RecorderOptions {
dont_print?: boolean
output_objects?: boolean
enable_reqheaders_recording?: boolean
logging?: (content: string) => void
use_separator?: boolean
}
interface Definition {
scope: string
path: string
port?: number | string
method?: string
status?: number
body?: RequestBodyMatcher
reqheaders?: Record
response?: ReplyBody
headers?: ReplyHeaders
options?: Options
}
type BackMode = 'wild' | 'dryrun' | 'record' | 'update' | 'lockdown'
interface Back {
currentMode: BackMode
fixtures: string
setMode(mode: BackMode): void
(fixtureName: string, nockedFn: (nockDone: () => void) => void): void
(
fixtureName: string,
options: BackOptions,
nockedFn: (nockDone: () => void) => void
): void
(fixtureName: string, options?: BackOptions): Promise<{
nockDone: () => void
context: BackContext
}>
}
interface BackContext {
isLoaded: boolean
scopes: Scope[]
assertScopesFinished(): void
}
interface BackOptions {
before?: (def: Definition) => void
after?: (scope: Scope) => void
afterRecord?: (defs: Definition[]) => Definition[]
recorder?: RecorderOptions
}
}
type ReqOptions = RequestOptions & { proto?: string }
nock-13.2.4/types/tests.ts 0000664 0000000 0000000 00000045002 14177263367 0015432 0 ustar 00root root 0000000 0000000 import nock from 'nock'
import * as fs from 'fs'
import url, { URLSearchParams } from 'url'
let scope: nock.Scope = nock('http://example.test')
let inst: nock.Interceptor
let str = 'foo'
let strings = ['foo', 'bar']
let defs: nock.Definition[]
let options: nock.Options = {}
const buffer = Buffer.from('')
const num = 42
const obj: { [k: string]: any } = {}
const objWithUndefinedValue: { a: string; b?: string } = { a: 'a' }
const regex = /test/
scope.head(str) // $ExpectType Interceptor
inst = scope.get(str)
inst = scope.get(str, str)
inst = scope.get(str, str, options)
inst = scope.options(str)
inst = scope.options(str, str)
inst = scope.options(str, str, options)
inst = scope.patch(str)
inst = scope.patch(str, str)
inst = scope.patch(str, obj)
inst = scope.patch(str, obj, options)
inst = scope.patch(str, regex)
inst = scope.post(str)
inst = scope.post(str, str)
inst = scope.post(str, str, options)
inst = scope.post(str, obj)
inst = scope.post(str, regex)
inst = scope.post(str, objWithUndefinedValue)
inst = scope.post(str, str)
inst = scope.post(str, strings)
inst = scope.post(str, [num, str, regex])
inst = scope.post(str, [num, num, num] as const)
inst = scope.post(str, regex)
inst = scope.post(str, buffer)
inst = scope.post(str, true) // $ExpectError
inst = scope.post(str, null) // $ExpectError
inst = scope.post(str, num) // $ExpectError
inst = scope.put(str)
inst = scope.put(str, str)
inst = scope.put(str, str, options)
inst = scope.put(str, obj)
inst = scope.put(str, regex)
inst = scope.delete(str)
inst = scope.delete(str, str)
inst = scope.delete(str, str, options)
inst = scope.delete(str, obj)
inst = scope.delete(str, regex)
inst = scope.merge(str)
inst = scope.merge(str, str)
inst = scope.merge(str, str, options)
inst = scope.merge(str, obj)
inst = scope.merge(str, regex)
inst = inst.query(true)
inst = inst.query(obj)
inst = inst.query(objWithUndefinedValue)
inst = inst.query({ foo: regex })
inst = inst.query(strings) // $ExpectError
inst = inst.query(buffer) // $ExpectError
inst = inst.query(regex) // $ExpectError
inst = scope.intercept(str, str)
inst = scope.intercept(str, str, str)
inst = scope.intercept(str, str, obj)
inst = scope.intercept(str, str, regex)
inst = scope.intercept(str, str, str, obj)
inst = scope.intercept(str, str, obj, obj)
inst = scope.intercept(str, str, regex, obj)
scope = inst.reply()
scope = inst.reply(num)
scope = inst.reply(num, str)
scope = inst.reply(num, str, obj)
scope = inst.reply(num, obj, obj)
scope = inst.reply(num, (uri: string, body: string) => str)
scope = inst.reply(num, async (uri: string, body: string) => str)
scope = inst.reply(num, (uri: string, body: string) => str, obj)
scope = inst.reply((uri: string, body) => [num, str] as const)
scope = inst.reply(async (uri: string, body) => [num] as const)
scope = inst.reply((uri: string, body) => [num, str, obj])
scope = inst.replyWithFile(num, str)
inst = inst.times(4)
inst = inst.once()
inst = inst.twice()
inst = inst.thrice()
inst = inst.optionally()
scope = scope.defaultReplyHeaders({ 'X-Foo': 'bar' })
scope = scope.matchHeader(str, str)
scope = scope.matchHeader(str, regex)
scope = scope.matchHeader(str, (val: string) => true)
inst = inst.delay(num)
inst = inst.delayConnection(num)
scope = scope.filteringPath(regex, str)
scope = scope.filteringPath((path: string) => {
return str
})
scope = scope.filteringRequestBody(regex, str)
scope = scope.filteringRequestBody((path: string) => {
return str
})
scope = scope.persist()
scope = scope.persist(false)
scope = scope.replyContentLength()
scope = scope.replyDate()
scope = scope.replyDate(new Date())
inst = inst.delay(2000)
inst = inst.delay({ head: 1000, body: 1000 })
inst = inst.delayBody(2000)
inst = inst.delayConnection(2000)
scope.done() // $ExpectType void
scope.isDone() // $ExpectType boolean
nock.recorder.rec()
nock.recorder.rec(true)
nock.recorder.rec({
dont_print: true,
output_objects: true,
})
nock.recorder.clear()
strings = nock.recorder.play() as string[]
defs = nock.recorder.play() as nock.Definition[]
// Usage
// $ExpectType Scope
nock('http://example.test').get('/users/1').reply(200, {
_id: '123ABC',
_rev: '946B7D1C',
username: 'foo',
email: 'foo.bar@example.test',
})
// Using URL as input
// Not supported yet
// scope = nock(new URL('https://example.test/'))
// .get('/resource')
// .reply(200, 'url matched')
// specifying URL from url.parse output
scope = nock(url.parse('https://example.test/'))
.get('/resource')
.reply(200, 'url matched')
// Specifying hostname
scope = nock('http://example.test')
.get('/resource')
.reply(200, 'domain matched')
scope = nock('http://example.test')
scope = nock(/example\.com/)
.get('/resource')
.reply(200, 'domain regex matched')
// Specifying path
scope = nock('http://example.test').get('/resource').reply(200, 'path matched')
scope = nock('http://example.test')
.get(/source$/)
.reply(200, 'path using regex matched')
scope = nock('http://example.test')
.get(uri => {
return uri.indexOf('cats') >= 0
})
.reply(200, 'path using function matched')
// Specifying request body
scope = nock('http://example.test')
.post('/users', {
username: 'foo',
email: 'foo.bar@example.test',
})
.reply(201, {
ok: true,
id: '123ABC',
rev: '946B7D1C',
})
nock('https://example.test')
.post('/path', {
number: 1,
bool: false,
empty: null,
array: ['foo', 2, true, null, { number: 3 }],
})
.reply(200)
scope = nock('http://example.test')
.post('/users', /email=.?@example.test/gi)
.reply(201, {
ok: true,
id: '123ABC',
rev: '946B7D1C',
})
scope = nock('http://example.test')
.post('/users', {
username: 'foo',
password: /a.+/,
email: 'foo.bar@example.test',
})
.reply(201, {
ok: true,
id: '123ABC',
rev: '946B7D1C',
})
scope = nock('http://example.test')
.post('/users', body => {
return body.id === '123ABC'
})
.reply(201, {
ok: true,
id: '123ABC',
rev: '946B7D1C',
})
// Specifying request query string
nock('http://example.test')
.get('/users')
.query({ name: 'pedro', surname: 'teixeira' })
.reply(200, { results: [{ id: 'foo' }] })
nock('http://example.test')
.get('/users')
.query({
names: ['alice', 'bob'],
tags: {
alice: ['admin', 'tester'],
bob: ['tester'],
},
})
.reply(200, { results: [{ id: 'foo' }] })
nock('http://example.test')
.get('/users')
.query(actualQueryObject => {
// do some compare with the actual Query Object
// return true for matched
// return false for not matched
return true
})
.reply(200, { results: [{ id: 'foo' }] })
nock('http://example.test')
.get('/users')
.query(true)
.reply(200, { results: [{ id: 'foo' }] })
nock('http://example.test', { encodedQueryParams: true })
.get('/users')
.query('foo%5Bbar%5D%3Dhello%20world%21')
.reply(200, { results: [{ id: 'foo' }] })
nock('http://example.test')
.get('/')
.query(
new URLSearchParams([
['foo', 'one'],
['foo', 'two'],
])
)
.reply()
// Specifying replies
scope = nock('http://example.test').get('/users/1').reply(404)
scope = nock('http://example.test').get('/').reply(200, 'Hello from Google!')
scope = nock('http://example.test').get('/').reply(200, {
username: 'foo',
email: 'foo.bar@example.test',
_id: '4324243fsd',
})
scope = nock('http://example.test')
.get('/resource')
.reply(async () => [500, ''] as const)
scope = nock('http://example.test')
.get('/resource')
.reply(() => Promise.resolve([500, '']))
scope = nock('http://example.test')
.get('/')
.replyWithFile(200, __dirname + '/replies/user.json')
scope = nock('http://example.test')
.filteringRequestBody(/.*/, '*')
.post('/echo', '*')
.reply(201, (uri: string, requestBody) => {
return requestBody
})
scope = nock('http://example.test')
.filteringRequestBody(/.*/, '*')
.post('/echo', '*')
.reply((uri, requestBody, cb) => {
fs.readFile('cat-poems.txt', cb as any) // Error-first callback
})
scope = nock('http://example.test')
.filteringRequestBody(/.*/, '*')
.post('/echo', '*')
.reply((uri, requestBody) => {
str = uri
return [
201,
'THIS IS THE REPLY BODY',
{ header: 'value' }, // optional headers
]
})
scope = nock('http://example.test')
.filteringRequestBody(/.*/, '*')
.post('/echo', '*')
.reply((uri, requestBody, cb) => {
setTimeout(() => {
cb(null, [201, 'THIS IS THE REPLY BODY'])
}, 1e3)
})
scope = nock('http://example.test')
.get('/cat-poems')
.reply(200, (uri: string, requestBody) => {
return fs.createReadStream('cat-poems.txt')
})
/// Access original request and headers
scope = nock('http://example.test')
.get('/cat-poems')
.reply(function (uri, requestBody) {
str = this.req.path
console.log('path:', this.req.path)
console.log('headers:', this.req.headers)
// ...
})
// Replying with errors
nock('http://example.test')
.get('/cat-poems')
.replyWithError('something awful happened')
nock('http://example.test')
.get('/cat-poems')
.replyWithError({ message: 'something awful happened', code: 'AWFUL_ERROR' })
nock('http://example.test')
.get('/cat-poems')
.replyWithError(Error('something awful happened'))
// Specifying headers
/// Specifying Request Headers
scope = nock('http://example.test', {
reqheaders: {
authorization: 'Basic Auth',
},
})
.get('/')
.reply(200)
scope = nock('http://example.test', {
reqheaders: {
'X-My-Headers': headerValue => {
if (headerValue) {
return true
}
return false
},
'X-My-Awesome-Header': /Awesome/i,
},
})
.get('/')
.reply(200)
scope = nock('http://example.test', {
badheaders: ['cookie', 'x-forwarded-for'],
})
.get('/')
.reply(200)
scope = nock('http://example.test')
.get('/')
.basicAuth({
user: 'john',
pass: 'doe',
})
.reply(200)
/// Specifying Reply Headers
scope = nock('http://example.test').get('/').reply(200, 'Hello World!', {
'X-My-Headers': 'My Header value',
})
scope = nock('http://example.test')
.get('/')
.reply(200, 'Hello World!', {
'X-My-Headers': ['My Header value 1', 'My Header value 2'],
})
scope = nock('http://example.test')
.get('/')
.reply(200, 'Hello World!', new Map([['X-Header-One', 'foo']]))
scope = nock('http://example.test')
.get('/')
.reply(200, 'Hello World!', {
'X-My-Headers': (req, res, body) => {
return body.toString()
},
})
// Default Reply Headers
scope = nock('http://example.test')
.defaultReplyHeaders({
'X-Powered-By': 'Rails',
'Content-Type': 'application/json',
})
.get('/')
.reply(200, 'The default headers should come too')
scope = nock('http://example.test')
.defaultReplyHeaders({
'Content-Length': (req, res, body) => {
return body.length.toString()
},
})
.get('/')
.reply(200, 'The default headers should come too')
// Including Content-Length Header Automatically
scope = nock('http://example.test')
.replyContentLength()
.get('/')
.reply(200, { hello: 'world' })
// Including Date Header Automatically
scope = nock('http://example.test')
.replyDate(new Date(2015, 0, 1)) // defaults to now, must use a Date object
.get('/')
.reply(200, { hello: 'world' })
// HTTP Verbs
nock('http://example.test').intercept('/path', 'PATCH').reply(304)
// Support for HTTP and HTTPS
scope = nock('https://secure.example.test')
// Non-standard ports
scope = nock('http://example.test:8081')
// Repeat response n times
nock('http://example.test').get('/').times(4).reply(200, 'Ok')
nock('http://example.test').get('/').once().reply(200, 'Ok')
nock('http://example.test').get('/').twice().reply(200, 'Ok')
nock('http://example.test').get('/').thrice().reply(200, 'Ok')
// Make responding optional
nock('http://example.test').get('/').optionally().reply(200, 'Ok')
// Delay the response body
nock('http://example.test')
.get('/')
.delayBody(2000) // 2 seconds
.reply(200, '')
// Delay the response
nock('http://example.test')
.get('/')
.delay(2000) // 2 seconds delay will be applied to the response header.
.reply(200, '')
nock('http://example.test')
.get('/')
.delay({
head: 2000, // header will be delayed for 2 seconds, i.e. the whole response will be delayed for 2 seconds.
body: 3000, // body will be delayed for another 3 seconds after header is sent out.
})
.reply(200, '')
// Chaining
scope = nock('http://example.test')
.get('/users/1')
.reply(404)
.post('/users', {
username: 'foo',
email: 'foo.bar@example.test',
})
.reply(201, {
ok: true,
id: '123ABC',
rev: '946B7D1C',
})
.get('/users/123ABC')
.reply(200, {
_id: '123ABC',
_rev: '946B7D1C',
username: 'foo',
email: 'foo.bar@example.test',
})
// Scope filtering
scope = nock('https://api.example.test', {
filteringScope: (scope: string) => {
return /^https:\/\/api[0-9]*.example.test/.test(scope)
},
})
.get('/1/metadata/auto/Photos?include_deleted=false&list=true')
.reply(200)
// Path filtering
scope = nock('http://example.test')
.filteringPath(/password=[^&]*/g, 'password=XXX')
.get('/users/1?password=XXX')
.reply(200, 'user')
scope = nock('http://example.test')
.filteringPath(path => {
return '/ABC'
})
.get('/ABC')
.reply(200, 'user')
// Request Body filtering
scope = nock('http://example.test')
.filteringRequestBody(/password=[^&]*/g, 'password=XXX')
.post('/users/1', 'data=ABC&password=XXX')
.reply(201, 'OK')
scope = nock('http://example.test')
.filteringRequestBody(body => {
return 'ABC'
})
.post('/', 'ABC')
.reply(201, 'OK')
// Request Headers Matching on the Scope Level
scope = nock('http://example.test')
.matchHeader('accept', 'application/json')
.get('/')
.reply(200, {
data: 'hello world',
})
scope = nock('http://example.test')
.matchHeader('User-Agent', /Mozilla\/.*/)
.get('/')
.reply(200, {
data: 'hello world',
})
scope = nock('http://example.test')
.matchHeader('content-length', val => {
return Number(val) >= 1000
})
.get('/')
.reply(200, {
data: 'hello world',
})
// Request Headers Matching on the Interceptor Level
scope = nock('http://example.test')
.get('/')
.matchHeader('accept', 'application/json')
.reply(200, {
data: 'hello world',
})
scope = nock('http://example.test')
.get('/')
.matchHeader('User-Agent', /Mozilla\/.*/)
.reply(200, {
data: 'hello world',
})
scope = nock('http://example.test')
.get('/')
.matchHeader('content-length', val => {
return Number(val) >= 1000
})
.reply(200, {
data: 'hello world',
})
// Allow unmocked requests on a mocked hostname
options = { allowUnmocked: true }
scope = nock('http://example.test', options).get('/my/url').reply(200, 'OK!')
// Expectations
const google = nock('http://example.test')
.get('/')
.reply(200, 'Hello from Google!')
setTimeout(() => {
google.done() // will throw an assertion error if meanwhile a "GET http://example.test" was not performed.
}, 5000)
/// .isDone()
scope = nock('http://example.test').get('/').reply(200)
scope.isDone() // will return false
nock.isDone()
/// .cleanAll()
nock.cleanAll()
/// .persist()
scope = nock('http://example.test')
.persist()
.get('/')
.reply(200, 'Persisting all the way')
/// .pendingMocks()
strings = scope.pendingMocks()
strings = nock.pendingMocks()
if (!scope.isDone()) {
console.error('pending mocks: %j', scope.pendingMocks())
}
console.error('pending mocks: %j', nock.pendingMocks())
/// .activeMocks()
nock.activeMocks() // $ExpectType string[]
nock('http://example.test').activeMocks() // $ExpectType string[]
// Restoring
nock.restore()
// Enable/Disable real HTTP request
nock.disableNetConnect()
nock.enableNetConnect()
// using a string
nock.enableNetConnect('example.test')
// or a RegExp
nock.enableNetConnect(/example\.(com|test)/)
// or a Function
nock.enableNetConnect(host => host.includes('example.com'))
nock.disableNetConnect()
nock.enableNetConnect('127.0.0.1') // Allow localhost connections so we can test local routes and mock servers.
nock.cleanAll()
nock.enableNetConnect()
// Recording
nock.recorder.rec()
/// dont_print option
nock.recorder.rec({
dont_print: true,
})
// ... some HTTP calls
const nockCalls = nock.recorder.play()
/// output_objects option
nock.recorder.rec({
output_objects: true,
})
// ... some HTTP calls
const nockCallObjects = nock.recorder.play()
let nocks = nock.load(str)
nocks.forEach(nock => {
nock = nock.filteringRequestBody((body: string) => {
return body
})
})
// Pre-process the nock definitions as scope filtering has to be defined before the nocks are defined (due to its very hacky nature).
const nockDefs = nock.loadDefs(str)
nockDefs.forEach(def => {
// Do something with the definition object e.g. scope filtering.
def.options = def.options || {}
def.options.filteringScope = (scope: string) => {
return /^https:\/\/api[0-9]*.example.test/.test(scope)
}
})
// Load the nocks from pre-processed definitions.
nocks = nock.define(nockDefs)
/// enable_reqheaders_recording option
nock.recorder.rec({
dont_print: true,
output_objects: true,
enable_reqheaders_recording: true,
})
/// logging option
const nullAppender = (content: string) => {}
nock.recorder.rec({
logging: nullAppender,
})
/// use_separator option
nock.recorder.rec({
use_separator: false,
})
// .removeInterceptor()
nock.removeInterceptor({
hostname: 'localhost',
path: '/mockedResource',
})
nock.removeInterceptor({
hostname: 'localhost',
path: '/login',
method: 'POST',
proto: 'https',
})
const interceptor = nock('http://example.test').get('somePath')
nock.removeInterceptor(interceptor)
// Events
/// Global no match event
nock.emitter.on('no match', (req: any) => {})
// Nock Back
/// Setup
nock.back.fixtures = '/path/to/fixtures/'
nock.back.setMode('record')
/// Usage
const before = (def: nock.Definition) => {
def.options = def.options || {}
def.options.filteringScope = (scope: string) => {
return /^https:\/\/api[0-9]*.example.test/.test(scope)
}
}
const after = (scope: nock.Scope) => {
scope = scope.filteringRequestBody((body: string): string => {
return body
})
}
// recording of the fixture
declare var request: any
nock.back('fixture.json', { before, after }, (nockDone: () => void) => {
request.get('http://example.test', (err: any, res: any, body: string) => {
nockDone()
// usage of the created fixture
nock.back('fixture.json', (nockDone: () => void) => {
nockDone() // never gets here
})
})
})
// in promise mode
nock.back('promisedFixture.json').then(({ nockDone, context }) => {
context.assertScopesFinished()
// do your tests returning a promise and chain it with
Promise.resolve('foo').then(nockDone)
})
nock-13.2.4/types/tsconfig.json 0000664 0000000 0000000 00000000305 14177263367 0016424 0 ustar 00root root 0000000 0000000 {
"compilerOptions": {
"module": "commonjs",
"lib": ["es6"],
"strict": true,
"noEmit": true,
"esModuleInterop": true,
"baseUrl": ".",
"paths": { "nock": ["."] }
}
}
nock-13.2.4/types/tslint.json 0000664 0000000 0000000 00000000214 14177263367 0016124 0 ustar 00root root 0000000 0000000 {
"extends": "@definitelytyped/dtslint/dtslint.json",
"rules": {
"semicolon": false,
"space-before-function-paren": false
}
}