pax_global_header00006660000000000000000000000064145672033270014523gustar00rootroot0000000000000052 comment=ba9fc424d5a17cbdde62745d4bdd8159331a1b8d nock-13.5.4/000077500000000000000000000000001456720332700125475ustar00rootroot00000000000000nock-13.5.4/.all-contributorsrc000066400000000000000000000106051456720332700164020ustar00rootroot00000000000000{ "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" ] }, { "login": "Uzlopak", "name": "Aras Abbasi", "avatar_url": "https://avatars.githubusercontent.com/u/5059100?v=4", "profile": "https://github.com/Uzlopak", "contributions": [ "code", "test", "maintenance" ] }, { "login": "rsaryev", "name": "Saryev Rustam", "avatar_url": "https://avatars.githubusercontent.com/u/70219513?v=4", "profile": "https://github.com/rsaryev", "contributions": [ "code", "test" ] }, { "login": "mikicho", "name": "Michael Solomon", "avatar_url": "https://avatars.githubusercontent.com/u/11459632?v=4", "profile": "https://github.com/mikicho", "contributions": [ "maintenance", "code", "doc" ] } ], "contributorsPerLine": 7, "skipCi": true, "commitType": "docs", "commitConvention": "angular" } nock-13.5.4/.eslintignore000066400000000000000000000001051456720332700152460ustar00rootroot00000000000000/coverage /tests/browserify-public/browserify-bundle.js node_modules nock-13.5.4/.eslintrc.yml000066400000000000000000000021411456720332700151710ustar00rootroot00000000000000env: 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 # TODO remove once we drop support for Node 10 node/no-deprecated-api: 'off' # 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.5.4/.github/000077500000000000000000000000001456720332700141075ustar00rootroot00000000000000nock-13.5.4/.github/ISSUE_TEMPLATE/000077500000000000000000000000001456720332700162725ustar00rootroot00000000000000nock-13.5.4/.github/ISSUE_TEMPLATE/01_bug_report.yml000066400000000000000000000046761456720332700215020ustar00rootroot00000000000000--- 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/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.5.4/.github/ISSUE_TEMPLATE/02_feature_request.yml000066400000000000000000000022761456720332700225300ustar00rootroot00000000000000--- 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/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.5.4/.github/ISSUE_TEMPLATE/config.yml000066400000000000000000000002611456720332700202610ustar00rootroot00000000000000blank_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.5.4/.github/dependabot.yml000066400000000000000000000004271456720332700167420ustar00rootroot00000000000000version: 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.5.4/.github/lock.yml000066400000000000000000000013501456720332700155610ustar00rootroot00000000000000# 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.5.4/.github/stale.yml000066400000000000000000000020021456720332700157340ustar00rootroot00000000000000# 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.5.4/.github/toc.yml000066400000000000000000000000151456720332700154130ustar00rootroot00000000000000bullets: '-' nock-13.5.4/.github/workflows/000077500000000000000000000000001456720332700161445ustar00rootroot00000000000000nock-13.5.4/.github/workflows/continuous-delivery.yaml000066400000000000000000000012741456720332700230630ustar00rootroot00000000000000name: Continuous Delivery 'on': push: branches: - '*.x' - main - beta - next jobs: build: name: Release runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 with: persist-credentials: false - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: 'lts/*' 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.5.4/.github/workflows/continuous-integration.yaml000066400000000000000000000056741456720332700235730ustar00rootroot00000000000000name: Continuous Integration 'on': pull_request: types: - opened - synchronize push: branches: - main permissions: contents: read jobs: format: name: Format runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 with: persist-credentials: false - name: Setup Node uses: actions/setup-node@v4 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@v4 with: persist-credentials: false - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: lts/* 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@v4 with: persist-credentials: false - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: lts/* cache: 'npm' - name: Install dependencies run: npm ci --ignore-scripts --no-audit --no-progress --prefer-offline - name: Lint run: | npm run lint:ts # verify against ranges defined as supported in engines.node test_matrix: strategy: fail-fast: false matrix: node-version: - 10 - 12 - 14 - 16 - 18 - 20 os: - macos-latest - ubuntu-latest - windows-latest runs-on: ${{ matrix.os }} timeout-minutes: 5 steps: - name: Checkout uses: actions/checkout@v4 with: persist-credentials: false - name: Setup Node.js uses: actions/setup-node@v4 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 - name: Test jest run: npm run test:jest if: matrix.node-version >= 14 # separate job to set as required in branch protection, # as the build names above change each time Node versions change test: runs-on: ubuntu-latest needs: - test_matrix if: ${{ !cancelled() }} steps: - name: All matrix versions passed if: ${{ !(contains(needs.*.result, 'failure')) }} run: exit 0 - name: Some matrix version failed if: ${{ contains(needs.*.result, 'failure') }} run: exit 1 nock-13.5.4/.github/workflows/fix-formatting.yaml000066400000000000000000000020401456720332700217620ustar00rootroot00000000000000name: Fix formatting 'on': push: branches: - dependabot/npm_and_yarn/prettier-* - dependabot/npm_and_yarn/eslint-* workflow_dispatch: {} permissions: contents: read jobs: fixFormatting: permissions: contents: write # for Git to git push runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: fetch-depth: 0 persist-credentials: true ref: ${{ github.head_ref }} - uses: actions/setup-node@v4 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.5.4/.gitignore000066400000000000000000000001621456720332700145360ustar00rootroot00000000000000.cache .idea .nyc_output .vscode coverage node_modules npm-debug.log tests/browserify-public/browserify-bundle.js nock-13.5.4/.mocharc.js000066400000000000000000000001051456720332700145730ustar00rootroot00000000000000module.exports = { checkLeaks: true, file: ['tests/setup.js'], } nock-13.5.4/.npmignore000066400000000000000000000001031456720332700145400ustar00rootroot00000000000000node_modules .gitignore coverage .nyc_output tests CONTRIBUTORS.md nock-13.5.4/.nycrc.yml000066400000000000000000000001611456720332700144640ustar00rootroot00000000000000all: true check-coverage: true branches: 100 lines: 100 include: - lib reporters: - lcov - text-summary nock-13.5.4/.prettierignore000066400000000000000000000001621456720332700156110ustar00rootroot00000000000000package.json package-lock.json tsconfig.json /.nyc_output /coverage /tests/browserify-public/browserify-bundle.js nock-13.5.4/.prettierrc.yml000066400000000000000000000001101456720332700155230ustar00rootroot00000000000000semi: false singleQuote: true bracketSpacing: true arrowParens: 'avoid' nock-13.5.4/CHANGELOG.md000066400000000000000000000007641456720332700143670ustar00rootroot00000000000000# 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.5.4/CODE_OF_CONDUCT.md000066400000000000000000000062541456720332700153550ustar00rootroot00000000000000# 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.5.4/CONTRIBUTING.md000066400000000000000000000262451456720332700150110ustar00rootroot00000000000000# 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 format:fix` 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.5.4/CONTRIBUTORS.md000066400000000000000000001433741456720332700150420ustar00rootroot00000000000000# 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.5.4/LICENSE000066400000000000000000000021131456720332700135510ustar00rootroot00000000000000MIT 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.5.4/README.md000066400000000000000000001666451456720332700140500ustar00rootroot00000000000000# Nock [![npm](https://img.shields.io/npm/v/nock.svg)][npmjs] [![Build Status](https://travis-ci.org/nock/nock.svg)][build] ![Coverage Status](http://img.shields.io/badge/coverage-100%25-brightgreen.svg) [![Backers on Open Collective](https://opencollective.com/nock/backers/badge.svg)](#backers) [![Sponsors on Open Collective](https://opencollective.com/nock/sponsors/badge.svg)](#sponsors) [npmjs]: https://www.npmjs.com/package/nock [build]: https://travis-ci.org/nock/nock > **Notice** > > We have introduced experimental support for fetch. Please share your feedback with us. You can install it by: > > ``` > npm install --save-dev nock@beta > ``` 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) - [.clone()](#clone) - [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) - [Verifying recorded fixtures](#verifying-recorded-fixtures) - [Example](#example-1) - [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, URL, or a RegExp. ```js const scope = nock('http://www.example.com') .get('/resource') .reply(200, 'domain matched') ``` ```js const scope = nock(new URL('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') // Interceptors created after here will only match when the header `accept` equals `application/json`. .matchHeader('accept', 'application/json') .get('/') .reply(200, { data: 'hello world', }) .get('/') // Only this interceptor will match the header value `x-my-action` with `MyFirstAction` .matchHeader('x-my-action', 'MyFirstAction') .reply(200, { data: 'FirstActionResponse', }) .get('/') // Only this interceptor will match the header value `x-my-action` with `MySecondAction` .matchHeader('x-my-action', 'MySecondAction') .reply(200, { data: 'SecondActionResponse', }) ``` 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() } ``` ### .clone() You can clone a scope by calling `.clone()` on it: ```js const scope = nock('http://example.test') const getScope = scope.get('/').reply(200) const postScope = scope.clone().post('/').reply(200) ``` ## 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) - `rawHeaders` - the headers of the reply which are formatted as a flat array containing header name and header value pairs (e.g. `['accept', 'application/json', 'set-cookie', 'my-cookie=value']`) - `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 ### Verifying recorded fixtures Although you can certainly open the recorded JSON fixtures to manually verify requests recorded by nockBack - it's sometimes useful to put those expectations in your tests. The `context.query` function can be used to return all of the interceptors that were recored in a given fixture. By itself, this functions as a negative expectation - you can verify that certain calls do NOT happen in the fixture. Since `assertScopesFinished` can verify there are no _extra_ calls in a fixture - pairing the two methods allows you to verify the exact set of HTTP interactions recorded in the fixture. This is especially useful when re-recording for instance, a service that synchronizes via several HTTP calls to an external API. **NB**: The list of fixtures is only available when reading. It will only be populated for nocks that are played back from fixtures. #### Example ```js it('#synchronize - synchronize with the external API', async localState => { const { nockDone, context } = await back('http-interaction.json') const syncronizer = new Synchronizer(localState) sycnronizer.syncronize() nockDone() context.assertScopesFinished() expect(context.query()).toEqual( expect.arrayContaining([ expect.objectContaining({ method: 'POST', path: '/create/thing', }), expect.objectContaining({ method: 'POST', path: 'create/thing', }), ]), ) }) ``` ## 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/axios/axios/pull/5277 axios.defaults.adapter = '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() }) ``` For Nock + Axios + Jest to work, you'll have to also adapt your jest.config.js, like so: ```js const config = { moduleNameMapper: { // Force CommonJS build for http adapter to be available. // via https://github.com/axios/axios/issues/5101#issuecomment-1276572468 '^axios$': require.resolve('axios'), }, } ``` [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)):
Pedro Teixeira
Pedro Teixeira

💻 🚧
n30n0v
n30n0v

💻
Richard Littauer
Richard Littauer

🚧 💻 📝
Ian Walker-Sperber
Ian Walker-Sperber

💻
Ivan Erceg
Ivan Erceg

💻 🚧
Paul Melnikow
Paul Melnikow

💻 🚧
Gregor Martynus
Gregor Martynus

💻 🚧 💼 💵 📝
Hutson Betts
Hutson Betts

💵
Jonas Lilja
Jonas Lilja

💵 💻
Benjamin Ki
Benjamin Ki

💵
Chad Fawcett
Chad Fawcett

💵
Laurence Dougal Myers
Laurence Dougal Myers

💻
Sébastien Van Bruaene
Sébastien Van Bruaene

💻 ⚠️
Aras Abbasi
Aras Abbasi

💻 ⚠️ 🚧
Saryev Rustam
Saryev Rustam

💻 ⚠️
Michael Solomon
Michael Solomon

🚧 💻 📖
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.5.4/examples/000077500000000000000000000000001456720332700143655ustar00rootroot00000000000000nock-13.5.4/examples/.eslintrc.yml000066400000000000000000000000531456720332700170070ustar00rootroot00000000000000rules: no-console: 'off' strict: 'off' nock-13.5.4/examples/_log.js000066400000000000000000000004271456720332700156460ustar00rootroot00000000000000module.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.5.4/examples/binary-reply.js000066400000000000000000000015551456720332700173460ustar00rootroot00000000000000const 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.5.4/examples/delay-connection.js000066400000000000000000000005651456720332700201640ustar00rootroot00000000000000const 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.5.4/examples/delay-response.js000066400000000000000000000005421456720332700176560ustar00rootroot00000000000000const 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.5.4/examples/net-connect-default-no-mock.js000066400000000000000000000006641456720332700221310ustar00rootroot00000000000000/* 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.5.4/examples/net-connect-default-other-mock.js000066400000000000000000000010131456720332700226230ustar00rootroot00000000000000/* 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.5.4/examples/net-connect-disabled-different-host.js000066400000000000000000000007631456720332700236320ustar00rootroot00000000000000/* 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.5.4/examples/net-connect-mock-same-host-different-path.js000066400000000000000000000007451456720332700246710ustar00rootroot00000000000000/* 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.5.4/examples/socket-delay-abort.js000066400000000000000000000006611456720332700204170ustar00rootroot00000000000000const 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.5.4/examples/socket-delay-no-abort.js000066400000000000000000000005741456720332700210340ustar00rootroot00000000000000const 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.5.4/index.js000066400000000000000000000023631456720332700142200ustar00rootroot00000000000000'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.5.4/lib/000077500000000000000000000000001456720332700133155ustar00rootroot00000000000000nock-13.5.4/lib/back.js000066400000000000000000000207101456720332700145530ustar00rootroot00000000000000'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) }, query: function () { const nested = this.scopes.map(scope => scope.interceptors.map(interceptor => ({ method: interceptor.method, uri: interceptor.uri, basePath: interceptor.basePath, path: interceptor.path, queries: interceptor.queries, counter: interceptor.counter, body: interceptor.body, statusCode: interceptor.statusCode, optional: interceptor.optional, })), ) return [].concat.apply([], nested) }, } 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.5.4/lib/common.js000066400000000000000000000541421456720332700151510ustar00rootroot00000000000000'use strict' const debug = require('debug')('nock.common') 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 = require(proto) 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) } /** * 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 } 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) ) } /** * Returns true if the given value is a plain object and not an Array. * @param {*} value * @returns {boolean} */ function isPlainObject(value) { if (typeof value !== 'object' || value === null) return false if (Object.prototype.toString.call(value) !== '[object Object]') return false const proto = Object.getPrototypeOf(value) if (proto === null) return true const Ctor = Object.prototype.hasOwnProperty.call(proto, 'constructor') && proto.constructor return ( typeof Ctor === 'function' && Ctor instanceof Ctor && Function.prototype.call(Ctor) === Function.prototype.call(value) ) } const prototypePollutionBlockList = ['__proto__', 'prototype', 'constructor'] const blocklistFilter = function (part) { return prototypePollutionBlockList.indexOf(part) === -1 } /** * 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 => { if (input === undefined || input === null) { return input } const keys = Object.keys(input) const result = {} let resultPtr = result for (let path of keys) { const originalPath = path if (path.indexOf('[') >= 0) { path = path.replace(/\[/g, '.').replace(/]/g, '') } const parts = path.split('.') const check = parts.filter(blocklistFilter) if (check.length !== parts.length) { return undefined } resultPtr = result const lastIndex = parts.length - 1 for (let i = 0; i < parts.length; ++i) { const part = parts[i] if (i === lastIndex) { if (Array.isArray(resultPtr)) { resultPtr[+part] = input[originalPath] } else { resultPtr[part] = input[originalPath] } } else { if (resultPtr[part] === undefined || resultPtr[part] === null) { const nextPart = parts[i + 1] if (/^\d+$/.test(nextPart)) { resultPtr[part] = [] } else { resultPtr[part] = {} } } resultPtr = resultPtr[part] } } } return result } module.exports = { contentEncoding, dataEqual, deleteHeadersField, expand, forEachHeader, formatQueryValue, headersArrayToObject, headersFieldNamesToLowerCase, headersFieldsArrayToLowerCase, headersInputToRawArray, isContentEncoded, isJSONContent, isPlainObject, isRequestDestroyed, isStream, isUtf8Representable, matchStringOrRegexp, normalizeClientRequestArgs, normalizeOrigin, normalizeRequestOptions, overrideRequests, percentDecode, percentEncode, removeAllTimers, restoreOverriddenRequests, setImmediate, setInterval, setTimeout, stringifyRequest, } nock-13.5.4/lib/global_emitter.js000066400000000000000000000001361456720332700166440ustar00rootroot00000000000000'use strict' const { EventEmitter } = require('events') module.exports = new EventEmitter() nock-13.5.4/lib/intercept.js000066400000000000000000000332011456720332700156470ustar00rootroot00000000000000'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 ( options instanceof Interceptor ? interceptor === options : 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, ) const scopes = new Set([].concat(...nestedInterceptors).map(i => i.scope)) return [...scopes] } 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') } // ----- 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) } } }) overrideClientRequest() } module.exports = { addInterceptor, remove, removeAll, removeInterceptor, isOn, activate, isActive, isDone, pendingMocks, activeMocks, enableNetConnect, disableNetConnect, restoreOverriddenClientRequest, abortPendingRequests: common.removeAllTimers, } nock-13.5.4/lib/intercepted_request_router.js000066400000000000000000000261331456720332700213360ustar00rootroot00000000000000'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(...args) { debug('request write') let [buffer, encoding] = args 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) // writable.write encoding param is optional // so if callback is present it's the last argument const callback = args.length > 1 ? args[args.length - 1] : undefined // 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.5.4/lib/interceptor.js000066400000000000000000000433721456720332700162220ustar00rootroot00000000000000'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') } this.filePath = filePath return this.reply( statusCode, () => { const readStream = fs.createReadStream(filePath) readStream.pause() return 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++ 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 || typeof queries === 'string') { // 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.5.4/lib/match_body.js000066400000000000000000000042441456720332700157700ustar00rootroot00000000000000'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 contain '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 must be cast to strings. // dataEqual does strict checking, so 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) } function mapValues(object, cb) { const keys = Object.keys(object) for (const key of keys) { object[key] = cb(object[key], key, object) } return object } /** * 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 mapValues(obj, v => mapValuesDeep(v, cb)) } return cb(obj) } nock-13.5.4/lib/playback_interceptor.js000066400000000000000000000240221456720332700200570ustar00rootroot00000000000000'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.5.4/lib/recorder.js000066400000000000000000000276011456720332700154660ustar00rootroot00000000000000'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.5.4/lib/scope.js000066400000000000000000000255551456720332700150000ustar00rootroot00000000000000'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') const { URL, Url: LegacyUrl } = url let fs try { fs = require('fs') } catch (err) { // do nothing, we're in the browser } /** * Normalizes the passed url for consistent internal processing * @param {string|LegacyUrl|URL} u */ function normalizeUrl(u) { if (!(u instanceof URL)) { if (u instanceof LegacyUrl) { return normalizeUrl(new URL(url.format(u))) } // If the url is invalid, let the URL library report it return normalizeUrl(new URL(u)) } if (!/https?:/.test(u.protocol)) { throw new TypeError( `Protocol '${u.protocol}' not recognized. This commonly occurs when a hostname and port are included without a protocol, producing a URL that is valid but confusing, and probably not what you want.`, ) } return { href: u.href, origin: u.origin, protocol: u.protocol, username: u.username, password: u.password, host: u.host, hostname: // strip brackets from IPv6 typeof u.hostname === 'string' && u.hostname.startsWith('[') ? u.hostname.slice(1, -1) : u.hostname, port: u.port || (u.protocol === 'http:' ? 80 : 443), pathname: u.pathname, search: u.search, searchParams: u.searchParams, hash: u.hash, } } /** * @param {string|RegExp|LegacyUrl|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 = normalizeUrl(basePath) this.port = this.urlParts.port 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 } clone() { return new Scope(this.basePath, this.scopeOptions) } } 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.5.4/lib/socket.js000066400000000000000000000051721456720332700151500ustar00rootroot00000000000000'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() {} write() {} 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.5.4/migration_guides/000077500000000000000000000000001456720332700161005ustar00rootroot00000000000000nock-13.5.4/migration_guides/migrating_to_10.md000066400000000000000000000004371456720332700214110ustar00rootroot00000000000000## 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.5.4/migration_guides/migrating_to_11.md000066400000000000000000000177221456720332700214170ustar00rootroot00000000000000## 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.5.4/migration_guides/migrating_to_12.md000066400000000000000000000023511456720332700214100ustar00rootroot00000000000000## 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.5.4/migration_guides/migrating_to_13.md000066400000000000000000000054101456720332700214100ustar00rootroot00000000000000## 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.5.4/package-lock.json000066400000000000000000036233501456720332700157770ustar00rootroot00000000000000{ "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", "propagate": "^2.0.0" }, "devDependencies": { "@definitelytyped/dtslint": "^0.0.163", "@sinonjs/fake-timers": "^11.2.2", "assert-rejects": "^1.0.0", "chai": "^4.1.2", "dirty-chai": "^2.0.1", "eslint": "^8.8.0", "eslint-config-prettier": "^9.0.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", "jest": "^29.7.0", "mocha": "^9.1.3", "npm-run-all": "^4.1.5", "nyc": "^15.0.0", "prettier": "3.2.4", "proxyquire": "^2.1.0", "rimraf": "^3.0.0", "semantic-release": "^22.0.5", "sinon": "^15.0.1", "sinon-chai": "^3.7.0", "typescript": "^5.0.4" }, "engines": { "node": ">= 10.13" } }, "node_modules/@aashutoshrathi/word-wrap": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/@ampproject/remapping": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.0" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@babel/code-frame": { "version": "7.22.13", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, "dependencies": { "@babel/highlight": "^7.22.13", "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/code-frame/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/code-frame/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/code-frame/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/code-frame/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, "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": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "engines": { "node": ">=0.8.0" } }, "node_modules/@babel/code-frame/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/@babel/code-frame/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/compat-data": { "version": "7.17.7", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.7.tgz", "integrity": "sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { "version": "7.17.8", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.8.tgz", "integrity": "sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.16.7", "@babel/generator": "^7.17.7", "@babel/helper-compilation-targets": "^7.17.7", "@babel/helper-module-transforms": "^7.17.7", "@babel/helpers": "^7.17.8", "@babel/parser": "^7.17.8", "@babel/template": "^7.16.7", "@babel/traverse": "^7.17.3", "@babel/types": "^7.17.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.1.2", "semver": "^6.3.0" }, "engines": { "node": ">=6.9.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/babel" } }, "node_modules/@babel/generator": { "version": "7.23.0", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dev": true, "dependencies": { "@babel/types": "^7.23.0", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { "version": "7.17.7", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz", "integrity": "sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==", "dev": true, "dependencies": { "@babel/compat-data": "^7.17.7", "@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.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { "version": "7.23.0", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "dependencies": { "@babel/template": "^7.22.15", "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, "dependencies": { "@babel/types": "^7.22.5" }, "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.17.7", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.16.7", "@babel/helper-module-imports": "^7.16.7", "@babel/helper-simple-access": "^7.17.7", "@babel/helper-split-export-declaration": "^7.16.7", "@babel/helper-validator-identifier": "^7.16.7", "@babel/template": "^7.16.7", "@babel/traverse": "^7.17.3", "@babel/types": "^7.17.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { "version": "7.17.7", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", "dev": true, "dependencies": { "@babel/types": "^7.17.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { "version": "7.22.6", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "dependencies": { "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "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.17.8", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.8.tgz", "integrity": "sha512-QcL86FGxpfSJwGtAvv4iG93UL6bmqBdmoVY0CMCU2g+oD2ezQse3PT5Pa+jiD6LJndBQi0EDlpzOWNlLuhz5gw==", "dev": true, "dependencies": { "@babel/template": "^7.16.7", "@babel/traverse": "^7.17.3", "@babel/types": "^7.17.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", "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": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "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": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "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": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "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.23.0", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", "dev": true, "bin": { "parser": "bin/babel-parser.js" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-bigint": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-class-properties": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-import-meta": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-json-strings": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-jsx": { "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-numeric-separator": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-top-level-await": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-typescript": { "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/template": { "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "dependencies": { "@babel/code-frame": "^7.22.13", "@babel/parser": "^7.22.15", "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { "version": "7.23.2", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", "dev": true, "dependencies": { "@babel/code-frame": "^7.22.13", "@babel/generator": "^7.23.0", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", "@babel/parser": "^7.23.0", "@babel/types": "^7.23.0", "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.23.0", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.22.5", "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@bcoe/v8-coverage": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, "node_modules/@colors/colors": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", "dev": true, "optional": true, "engines": { "node": ">=0.1.90" } }, "node_modules/@definitelytyped/dts-critic": { "version": "0.0.163", "resolved": "https://registry.npmjs.org/@definitelytyped/dts-critic/-/dts-critic-0.0.163.tgz", "integrity": "sha512-HsTvylj8x2gQaawsOCcN2Xk2Cx0wgV9kaj83hgsO9SITZSPd7dA0UkHyNRadbMkMwqNDKcnizcmWdz0+0gIo8A==", "dev": true, "dependencies": { "@definitelytyped/header-parser": "^0.0.163", "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.163", "resolved": "https://registry.npmjs.org/@definitelytyped/dtslint/-/dtslint-0.0.163.tgz", "integrity": "sha512-U0uw7Zu0QdYSuBMYgxvRYjkhkeulTEg8vDgJ7TiYQUv/wODeujSAmGahQn51E5hOlSMYUw7A9utdbUukxE02SQ==", "dev": true, "dependencies": { "@definitelytyped/dts-critic": "^0.0.163", "@definitelytyped/header-parser": "^0.0.163", "@definitelytyped/typescript-versions": "^0.0.163", "@definitelytyped/utils": "^0.0.163", "@typescript-eslint/eslint-plugin": "^5.55.0", "@typescript-eslint/parser": "^5.55.0", "@typescript-eslint/types": "^5.56.0", "@typescript-eslint/typescript-estree": "^5.55.0", "@typescript-eslint/utils": "^5.55.0", "eslint": "^8.17.0", "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": "dist/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 || >=5.0.0-dev" } }, "node_modules/@definitelytyped/header-parser": { "version": "0.0.163", "resolved": "https://registry.npmjs.org/@definitelytyped/header-parser/-/header-parser-0.0.163.tgz", "integrity": "sha512-Jr+/q+ESfc7uWldz/j11BfpjIN/gB4WmwhFENhWaMwM0W/9p0ShF+OiUqGhk2Q3Iz8v/oyWzSsxyxgasg9kCxQ==", "dev": true, "dependencies": { "@definitelytyped/typescript-versions": "^0.0.163", "@types/parsimmon": "^1.10.1", "parsimmon": "^1.13.0" } }, "node_modules/@definitelytyped/typescript-versions": { "version": "0.0.163", "resolved": "https://registry.npmjs.org/@definitelytyped/typescript-versions/-/typescript-versions-0.0.163.tgz", "integrity": "sha512-+GWtJhC+7UaCUnJ+ZkA7bfGuPd6ZbJKEjbHqh76/gOXsqAUOMEa49ufsLlIPUbkEeQlnDNoTHCegE5X/Q+u+/A==", "dev": true }, "node_modules/@definitelytyped/utils": { "version": "0.0.163", "resolved": "https://registry.npmjs.org/@definitelytyped/utils/-/utils-0.0.163.tgz", "integrity": "sha512-6MX5TxaQbG/j2RkCWbcbLvv+YNipKqY0eQJafDhwC/RprUocpg+uYVNlH8XzdKRWOGJ0pq7SZOsJD4C3A01ZXg==", "dev": true, "dependencies": { "@definitelytyped/typescript-versions": "^0.0.163", "@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": "^6.1.11", "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-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "dev": true, "dependencies": { "eslint-visitor-keys": "^3.3.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "node_modules/@eslint-community/regexpp": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "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/@eslint/js": { "version": "8.56.0", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.13", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^2.0.1", "debug": "^4.1.1", "minimatch": "^3.0.5" }, "engines": { "node": ">=10.10.0" } }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, "engines": { "node": ">=12.22" }, "funding": { "type": "github", "url": "https://github.com/sponsors/nzakas" } }, "node_modules/@humanwhocodes/object-schema": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", "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/@jest/console": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "jest-message-util": "^29.7.0", "jest-util": "^29.7.0", "slash": "^3.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/core": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, "dependencies": { "@jest/console": "^29.7.0", "@jest/reporters": "^29.7.0", "@jest/test-result": "^29.7.0", "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", "jest-changed-files": "^29.7.0", "jest-config": "^29.7.0", "jest-haste-map": "^29.7.0", "jest-message-util": "^29.7.0", "jest-regex-util": "^29.6.3", "jest-resolve": "^29.7.0", "jest-resolve-dependencies": "^29.7.0", "jest-runner": "^29.7.0", "jest-runtime": "^29.7.0", "jest-snapshot": "^29.7.0", "jest-util": "^29.7.0", "jest-validate": "^29.7.0", "jest-watcher": "^29.7.0", "micromatch": "^4.0.4", "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "peerDependenciesMeta": { "node-notifier": { "optional": true } } }, "node_modules/@jest/core/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/@jest/core/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/@jest/environment": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, "dependencies": { "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, "dependencies": { "expect": "^29.7.0", "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, "dependencies": { "jest-get-type": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/fake-timers": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", "jest-message-util": "^29.7.0", "jest-mock": "^29.7.0", "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/fake-timers/node_modules/@sinonjs/commons": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, "dependencies": { "type-detect": "4.0.8" } }, "node_modules/@jest/fake-timers/node_modules/@sinonjs/fake-timers": { "version": "10.3.0", "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, "dependencies": { "@sinonjs/commons": "^3.0.0" } }, "node_modules/@jest/globals": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, "dependencies": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", "@jest/types": "^29.6.3", "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "^29.7.0", "@jest/test-result": "^29.7.0", "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", "istanbul-lib-coverage": "^3.0.0", "istanbul-lib-instrument": "^6.0.0", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", "jest-message-util": "^29.7.0", "jest-util": "^29.7.0", "jest-worker": "^29.7.0", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", "v8-to-istanbul": "^9.0.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "peerDependenciesMeta": { "node-notifier": { "optional": true } } }, "node_modules/@jest/reporters/node_modules/istanbul-lib-instrument": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz", "integrity": "sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==", "dev": true, "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-coverage": "^3.2.0", "semver": "^7.5.4" }, "engines": { "node": ">=10" } }, "node_modules/@jest/reporters/node_modules/semver": { "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, "node_modules/@jest/schemas": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, "dependencies": { "@sinclair/typebox": "^0.27.8" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/source-map": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.18", "callsites": "^3.0.0", "graceful-fs": "^4.2.9" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/test-result": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, "dependencies": { "@jest/console": "^29.7.0", "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/test-sequencer": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, "dependencies": { "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.7.0", "slash": "^3.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/transform": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.7.0", "jest-regex-util": "^29.6.3", "jest-util": "^29.7.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", "write-file-atomic": "^4.0.2" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/transform/node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, "node_modules/@jest/transform/node_modules/write-file-atomic": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" }, "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/@jest/types": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dev": true, "dependencies": { "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dev": true, "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", "dev": true, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", "dev": true, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", "dev": true }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.20", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "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": "3.0.4", "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.4.tgz", "integrity": "sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==", "dev": true, "engines": { "node": ">= 14" } }, "node_modules/@octokit/core": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.4.tgz", "integrity": "sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==", "dev": true, "dependencies": { "@octokit/auth-token": "^3.0.0", "@octokit/graphql": "^5.0.0", "@octokit/request": "^6.0.0", "@octokit/request-error": "^3.0.0", "@octokit/types": "^9.0.0", "before-after-hook": "^2.2.0", "universal-user-agent": "^6.0.0" }, "engines": { "node": ">= 14" } }, "node_modules/@octokit/endpoint": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.6.tgz", "integrity": "sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==", "dev": true, "dependencies": { "@octokit/types": "^9.0.0", "is-plain-object": "^5.0.0", "universal-user-agent": "^6.0.0" }, "engines": { "node": ">= 14" } }, "node_modules/@octokit/graphql": { "version": "5.0.6", "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.6.tgz", "integrity": "sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==", "dev": true, "dependencies": { "@octokit/request": "^6.0.0", "@octokit/types": "^9.0.0", "universal-user-agent": "^6.0.0" }, "engines": { "node": ">= 14" } }, "node_modules/@octokit/openapi-types": { "version": "18.0.0", "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==", "dev": true }, "node_modules/@octokit/plugin-paginate-rest": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-7.1.2.tgz", "integrity": "sha512-Jx8KuKqEAVRsK6fMzZKv3h6UH9/NRDHsDRtUAROqqmZlCptM///Uef7A1ViZ/cbDplekz7VbDWdFLAZ/mpuDww==", "dev": true, "dependencies": { "@octokit/tsconfig": "^2.0.0", "@octokit/types": "^9.3.2" }, "engines": { "node": ">= 18" }, "peerDependencies": { "@octokit/core": ">=4" } }, "node_modules/@octokit/plugin-retry": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-5.0.4.tgz", "integrity": "sha512-hw00fDIhOgijy4aSxS6weWF5uqZVeoiC/AptLLyjL8KFCJRGRaXfcfgj76h/Z3cSLTjRsEIQnNCTig8INttL/g==", "dev": true, "dependencies": { "@octokit/request-error": "^4.0.1", "@octokit/types": "^10.0.0", "bottleneck": "^2.15.3" }, "engines": { "node": ">= 18" }, "peerDependencies": { "@octokit/core": ">=3" } }, "node_modules/@octokit/plugin-retry/node_modules/@octokit/request-error": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-4.0.2.tgz", "integrity": "sha512-uqwUEmZw3x4I9DGYq9fODVAAvcLsPQv97NRycP6syEFu5916M189VnNBW2zANNwqg3OiligNcAey7P0SET843w==", "dev": true, "dependencies": { "@octokit/types": "^10.0.0", "deprecation": "^2.0.0", "once": "^1.4.0" }, "engines": { "node": ">= 18" } }, "node_modules/@octokit/plugin-retry/node_modules/@octokit/types": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/@octokit/types/-/types-10.0.0.tgz", "integrity": "sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==", "dev": true, "dependencies": { "@octokit/openapi-types": "^18.0.0" } }, "node_modules/@octokit/plugin-throttling": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-6.1.0.tgz", "integrity": "sha512-JqMbTiPC0sUSTsLQsdq3JVx1mx8UtTo5mwR80YqPXE93+XhevvSyOR1rO2Z+NbO/r0TK4hqFJSSi/9oIZBxZTg==", "dev": true, "dependencies": { "@octokit/types": "^9.0.0", "bottleneck": "^2.15.3" }, "engines": { "node": ">= 18" }, "peerDependencies": { "@octokit/core": "^4.0.0" } }, "node_modules/@octokit/request": { "version": "6.2.8", "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.8.tgz", "integrity": "sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==", "dev": true, "dependencies": { "@octokit/endpoint": "^7.0.0", "@octokit/request-error": "^3.0.0", "@octokit/types": "^9.0.0", "is-plain-object": "^5.0.0", "node-fetch": "^2.6.7", "universal-user-agent": "^6.0.0" }, "engines": { "node": ">= 14" } }, "node_modules/@octokit/request-error": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz", "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==", "dev": true, "dependencies": { "@octokit/types": "^9.0.0", "deprecation": "^2.0.0", "once": "^1.4.0" }, "engines": { "node": ">= 14" } }, "node_modules/@octokit/tsconfig": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@octokit/tsconfig/-/tsconfig-2.0.0.tgz", "integrity": "sha512-tWnrai3quGt8+gRN2edzo9fmraWekeryXPeXDomMw2oFSpu/lH3VSWGn/q4V+rwjTRMeeXk/ci623/01Zet4VQ==", "dev": true }, "node_modules/@octokit/types": { "version": "9.3.2", "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", "dev": true, "dependencies": { "@octokit/openapi-types": "^18.0.0" } }, "node_modules/@pnpm/config.env-replace": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", "dev": true, "engines": { "node": ">=12.22.0" } }, "node_modules/@pnpm/network.ca-file": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", "dev": true, "dependencies": { "graceful-fs": "4.2.10" }, "engines": { "node": ">=12.22.0" } }, "node_modules/@pnpm/npm-conf": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz", "integrity": "sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==", "dev": true, "dependencies": { "@pnpm/config.env-replace": "^1.1.0", "@pnpm/network.ca-file": "^1.0.1", "config-chain": "^1.1.11" }, "engines": { "node": ">=12" } }, "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.5.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, "node_modules/@semantic-release/commit-analyzer": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-11.0.0.tgz", "integrity": "sha512-uEXyf4Z0AWJuxI9TbSQP5kkIYqus1/E1NcmE7pIv6d6/m/5EJcNWAGR4FOo34vrV26FhEaRVkxFfYzp/M7BKIg==", "dev": true, "dependencies": { "conventional-changelog-angular": "^7.0.0", "conventional-commits-filter": "^4.0.0", "conventional-commits-parser": "^5.0.0", "debug": "^4.0.0", "import-from": "^4.0.0", "lodash-es": "^4.17.21", "micromatch": "^4.0.2" }, "engines": { "node": "^18.17 || >=20.6.1" }, "peerDependencies": { "semantic-release": ">=20.1.0" } }, "node_modules/@semantic-release/error": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-4.0.0.tgz", "integrity": "sha512-mgdxrHTLOjOddRVYIYDo0fR3/v61GNN1YGkfbrjuIKg/uMgCd+Qzo3UAXJ+woLQQpos4pl5Esuw5A7AoNlzjUQ==", "dev": true, "engines": { "node": ">=18" } }, "node_modules/@semantic-release/github": { "version": "9.0.3", "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-9.0.3.tgz", "integrity": "sha512-X6gq4USKVlCxPwIIyXb99jU7gwVWlnsKOevs+OyABRdoqc+OIRITbFmrrYU3eE1vGMGk+Qu/GAoLUQQQwC3YOA==", "dev": true, "dependencies": { "@octokit/core": "^4.2.1", "@octokit/plugin-paginate-rest": "^7.0.0", "@octokit/plugin-retry": "^5.0.0", "@octokit/plugin-throttling": "^6.0.0", "@semantic-release/error": "^4.0.0", "aggregate-error": "^4.0.1", "debug": "^4.3.4", "dir-glob": "^3.0.1", "globby": "^13.1.4", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.0", "issue-parser": "^6.0.0", "lodash-es": "^4.17.21", "mime": "^3.0.0", "p-filter": "^3.0.0", "url-join": "^5.0.0" }, "engines": { "node": ">=18" }, "peerDependencies": { "semantic-release": ">=20.1.0" } }, "node_modules/@semantic-release/github/node_modules/aggregate-error": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", "dev": true, "dependencies": { "clean-stack": "^4.0.0", "indent-string": "^5.0.0" }, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@semantic-release/github/node_modules/clean-stack": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", "dev": true, "dependencies": { "escape-string-regexp": "5.0.0" }, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@semantic-release/github/node_modules/escape-string-regexp": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@semantic-release/github/node_modules/globby": { "version": "13.2.1", "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.1.tgz", "integrity": "sha512-DPCBxctI7dN4EeIqjW2KGqgdcUMbrhJ9AzON+PlxCtvppWhubTLD4+a0GFxiym14ZvacUydTPjLPc2DlKz7EIg==", "dev": true, "dependencies": { "dir-glob": "^3.0.1", "fast-glob": "^3.2.11", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^4.0.0" }, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@semantic-release/github/node_modules/indent-string": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "dev": true, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@semantic-release/github/node_modules/slash": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", "dev": true, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@semantic-release/npm": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-11.0.0.tgz", "integrity": "sha512-ozNCiPUp14Xp2rgeY7j96yFTEhDncLSWOJr0IAUr888+ax6fH5xgYkNVv08vpkV8C5GIXBgnGd9coRiOCD6oqQ==", "dev": true, "dependencies": { "@semantic-release/error": "^4.0.0", "aggregate-error": "^5.0.0", "execa": "^8.0.0", "fs-extra": "^11.0.0", "lodash-es": "^4.17.21", "nerf-dart": "^1.0.0", "normalize-url": "^8.0.0", "npm": "^10.0.0", "rc": "^1.2.8", "read-pkg": "^8.0.0", "registry-auth-token": "^5.0.0", "semver": "^7.1.2", "tempy": "^3.0.0" }, "engines": { "node": "^18.17 || >=20" }, "peerDependencies": { "semantic-release": ">=20.1.0" } }, "node_modules/@semantic-release/npm/node_modules/aggregate-error": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-5.0.0.tgz", "integrity": "sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==", "dev": true, "dependencies": { "clean-stack": "^5.2.0", "indent-string": "^5.0.0" }, "engines": { "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@semantic-release/npm/node_modules/clean-stack": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-5.2.0.tgz", "integrity": "sha512-TyUIUJgdFnCISzG5zu3291TAsE77ddchd0bepon1VVQrKLGKFED4iXFEDQ24mIPdPBbyE16PK3F8MYE1CmcBEQ==", "dev": true, "dependencies": { "escape-string-regexp": "5.0.0" }, "engines": { "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@semantic-release/npm/node_modules/escape-string-regexp": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@semantic-release/npm/node_modules/fs-extra": { "version": "11.1.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", "dev": true, "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" }, "engines": { "node": ">=14.14" } }, "node_modules/@semantic-release/npm/node_modules/hosted-git-info": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.1.tgz", "integrity": "sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==", "dev": true, "dependencies": { "lru-cache": "^10.0.1" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/@semantic-release/npm/node_modules/hosted-git-info/node_modules/lru-cache": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", "dev": true, "engines": { "node": "14 || >=16.14" } }, "node_modules/@semantic-release/npm/node_modules/indent-string": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "dev": true, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@semantic-release/npm/node_modules/json-parse-even-better-errors": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", "dev": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "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/lines-and-columns": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.3.tgz", "integrity": "sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==", "dev": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, "node_modules/@semantic-release/npm/node_modules/normalize-package-data": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.0.tgz", "integrity": "sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==", "dev": true, "dependencies": { "hosted-git-info": "^7.0.0", "is-core-module": "^2.8.1", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/@semantic-release/npm/node_modules/normalize-url": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", "dev": true, "engines": { "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@semantic-release/npm/node_modules/parse-json": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-7.1.0.tgz", "integrity": "sha512-ihtdrgbqdONYD156Ap6qTcaGcGdkdAxodO1wLqQ/j7HP1u2sFYppINiq4jyC8F+Nm+4fVufylCV00QmkTHkSUg==", "dev": true, "dependencies": { "@babel/code-frame": "^7.21.4", "error-ex": "^1.3.2", "json-parse-even-better-errors": "^3.0.0", "lines-and-columns": "^2.0.3", "type-fest": "^3.8.0" }, "engines": { "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@semantic-release/npm/node_modules/parse-json/node_modules/type-fest": { "version": "3.13.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", "dev": true, "engines": { "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@semantic-release/npm/node_modules/read-pkg": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-8.1.0.tgz", "integrity": "sha512-PORM8AgzXeskHO/WEv312k9U03B8K9JSiWF/8N9sUuFjBa+9SF2u6K7VClzXwDXab51jCd8Nd36CNM+zR97ScQ==", "dev": true, "dependencies": { "@types/normalize-package-data": "^2.4.1", "normalize-package-data": "^6.0.0", "parse-json": "^7.0.0", "type-fest": "^4.2.0" }, "engines": { "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@semantic-release/npm/node_modules/semver": { "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "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": "4.5.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.5.0.tgz", "integrity": "sha512-diLQivFzddJl4ylL3jxSkEc39Tpw7o1QeEHIPxVwryDK2lpB7Nqhzhuo6v5/Ls08Z0yPSAhsyAWlv1/H0ciNmw==", "dev": true, "engines": { "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "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": "12.0.0", "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-12.0.0.tgz", "integrity": "sha512-m7Ds8ComP1KJgA2Lke2xMwE1TOOU40U7AzP4lT8hJ2tUAeicziPz/1GeDFmRkTOkMFlfHvE6kuvMkvU+mIzIDQ==", "dev": true, "dependencies": { "conventional-changelog-angular": "^7.0.0", "conventional-changelog-writer": "^7.0.0", "conventional-commits-filter": "^4.0.0", "conventional-commits-parser": "^5.0.0", "debug": "^4.0.0", "get-stream": "^7.0.0", "import-from": "^4.0.0", "into-stream": "^7.0.0", "lodash-es": "^4.17.21", "read-pkg-up": "^10.0.0" }, "engines": { "node": "^18.17 || >=20.6.1" }, "peerDependencies": { "semantic-release": ">=20.1.0" } }, "node_modules/@semantic-release/release-notes-generator/node_modules/get-stream": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-7.0.1.tgz", "integrity": "sha512-3M8C1EOFN6r8AMUhwUAACIoXZJEOufDU5+0gFFN5uNs6XYOralD2Pqkl7m046va6x77FwposWXbAhPPIOus7mQ==", "dev": true, "engines": { "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "dev": true }, "node_modules/@sindresorhus/is": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", "dev": true, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sindresorhus/is?sponsor=1" } }, "node_modules/@sinonjs/commons": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", "dev": true, "dependencies": { "type-detect": "4.0.8" } }, "node_modules/@sinonjs/fake-timers": { "version": "11.2.2", "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-11.2.2.tgz", "integrity": "sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==", "dev": true, "dependencies": { "@sinonjs/commons": "^3.0.0" } }, "node_modules/@sinonjs/fake-timers/node_modules/@sinonjs/commons": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", "dev": true, "dependencies": { "type-detect": "4.0.8" } }, "node_modules/@sinonjs/samsam": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.0.tgz", "integrity": "sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew==", "dev": true, "dependencies": { "@sinonjs/commons": "^2.0.0", "lodash.get": "^4.4.2", "type-detect": "^4.0.8" } }, "node_modules/@sinonjs/text-encoding": { "version": "0.7.2", "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", "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/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "node_modules/@types/babel__generator": { "version": "7.6.8", "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", "dev": true, "dependencies": { "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__template": { "version": "7.4.4", "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__traverse": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", "dev": true, "dependencies": { "@babel/types": "^7.20.7" } }, "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/graceful-fs": { "version": "4.1.9", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, "dependencies": { "@types/node": "*" } }, "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/istanbul-lib-coverage": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", "dev": true }, "node_modules/@types/istanbul-lib-report": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", "dev": true, "dependencies": { "@types/istanbul-lib-coverage": "*" } }, "node_modules/@types/istanbul-reports": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "dev": true, "dependencies": { "@types/istanbul-lib-report": "*" } }, "node_modules/@types/json-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/json-buffer/-/json-buffer-3.0.0.tgz", "integrity": "sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ==", "dev": true }, "node_modules/@types/json-schema": { "version": "7.0.11", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "dev": true }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, "node_modules/@types/keyv": { "version": "3.1.4", "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/node": { "version": "14.18.12", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.12.tgz", "integrity": "sha512-q4jlIR71hUpWTnGhXWcakgkZeHa3CCjcQcnuzU8M891BAWA2jHiziiWEPEkdS5pFsz7H9HJiy8BrK7tBRNrY7A==", "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/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/semver": { "version": "7.3.13", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", "dev": true }, "node_modules/@types/stack-utils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", "dev": true }, "node_modules/@types/yargs": { "version": "17.0.32", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", "dev": true, "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/@types/yargs-parser": { "version": "21.0.3", "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "5.59.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.1.tgz", "integrity": "sha512-AVi0uazY5quFB9hlp2Xv+ogpfpk77xzsgsIEWyVS7uK/c7MZ5tw7ZPbapa0SbfkqE0fsAMkz5UwtgMLVk2BQAg==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.4.0", "@typescript-eslint/scope-manager": "5.59.1", "@typescript-eslint/type-utils": "5.59.1", "@typescript-eslint/utils": "5.59.1", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "natural-compare-lite": "^1.4.0", "semver": "^7.3.7", "tsutils": "^3.21.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { "@typescript-eslint/parser": "^5.0.0", "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { "optional": true } } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { "version": "7.5.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/tsutils": { "version": "3.21.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, "dependencies": { "tslib": "^1.8.1" }, "engines": { "node": ">= 6" }, "peerDependencies": { "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" } }, "node_modules/@typescript-eslint/parser": { "version": "5.59.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.1.tgz", "integrity": "sha512-nzjFAN8WEu6yPRDizIFyzAfgK7nybPodMNFGNH0M9tei2gYnYszRDqVA0xlnRjkl7Hkx2vYrEdb6fP2a21cG1g==", "dev": true, "dependencies": { "@typescript-eslint/scope-manager": "5.59.1", "@typescript-eslint/types": "5.59.1", "@typescript-eslint/typescript-estree": "5.59.1", "debug": "^4.3.4" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { "optional": true } } }, "node_modules/@typescript-eslint/scope-manager": { "version": "5.59.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.1.tgz", "integrity": "sha512-mau0waO5frJctPuAzcxiNWqJR5Z8V0190FTSqRw1Q4Euop6+zTwHAf8YIXNwDOT29tyUDrQ65jSg9aTU/H0omA==", "dev": true, "dependencies": { "@typescript-eslint/types": "5.59.1", "@typescript-eslint/visitor-keys": "5.59.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, "node_modules/@typescript-eslint/type-utils": { "version": "5.59.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.1.tgz", "integrity": "sha512-ZMWQ+Oh82jWqWzvM3xU+9y5U7MEMVv6GLioM3R5NJk6uvP47kZ7YvlgSHJ7ERD6bOY7Q4uxWm25c76HKEwIjZw==", "dev": true, "dependencies": { "@typescript-eslint/typescript-estree": "5.59.1", "@typescript-eslint/utils": "5.59.1", "debug": "^4.3.4", "tsutils": "^3.21.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { "eslint": "*" }, "peerDependenciesMeta": { "typescript": { "optional": true } } }, "node_modules/@typescript-eslint/type-utils/node_modules/tsutils": { "version": "3.21.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, "dependencies": { "tslib": "^1.8.1" }, "engines": { "node": ">= 6" }, "peerDependencies": { "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" } }, "node_modules/@typescript-eslint/types": { "version": "5.59.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.1.tgz", "integrity": "sha512-dg0ICB+RZwHlysIy/Dh1SP+gnXNzwd/KS0JprD3Lmgmdq+dJAJnUPe1gNG34p0U19HvRlGX733d/KqscrGC1Pg==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, "node_modules/@typescript-eslint/typescript-estree": { "version": "5.59.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.1.tgz", "integrity": "sha512-lYLBBOCsFltFy7XVqzX0Ju+Lh3WPIAWxYpmH/Q7ZoqzbscLiCW00LeYCdsUnnfnj29/s1WovXKh2gwCoinHNGA==", "dev": true, "dependencies": { "@typescript-eslint/types": "5.59.1", "@typescript-eslint/visitor-keys": "5.59.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "semver": "^7.3.7", "tsutils": "^3.21.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependenciesMeta": { "typescript": { "optional": true } } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { "version": "7.5.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/tsutils": { "version": "3.21.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, "dependencies": { "tslib": "^1.8.1" }, "engines": { "node": ">= 6" }, "peerDependencies": { "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" } }, "node_modules/@typescript-eslint/utils": { "version": "5.59.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.1.tgz", "integrity": "sha512-MkTe7FE+K1/GxZkP5gRj3rCztg45bEhsd8HYjczBuYm+qFHP5vtZmjx3B0yUCDotceQ4sHgTyz60Ycl225njmA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", "@typescript-eslint/scope-manager": "5.59.1", "@typescript-eslint/types": "5.59.1", "@typescript-eslint/typescript-estree": "5.59.1", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" }, "engines": { "node": ">=8.0.0" } }, "node_modules/@typescript-eslint/utils/node_modules/estraverse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, "engines": { "node": ">=4.0" } }, "node_modules/@typescript-eslint/utils/node_modules/semver": { "version": "7.5.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, "node_modules/@typescript-eslint/visitor-keys": { "version": "5.59.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.1.tgz", "integrity": "sha512-6waEYwBTCWryx0VJmP7JaM4FpipLsFl9CvYf2foAE8Qh/Y0s+bxWysciwOs0LTBED4JCaNxTZ5rGadB14M6dwA==", "dev": true, "dependencies": { "@typescript-eslint/types": "5.59.1", "eslint-visitor-keys": "^3.3.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, "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/@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", "dev": true }, "node_modules/acorn": { "version": "8.11.3", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "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": "7.1.0", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", "dev": true, "dependencies": { "debug": "^4.3.4" }, "engines": { "node": ">= 14" } }, "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": "6.2.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.0.tgz", "integrity": "sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==", "dev": true, "dependencies": { "type-fest": "^3.0.0" }, "engines": { "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/ansi-escapes/node_modules/type-fest": { "version": "3.13.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", "dev": true, "engines": { "node": ">=14.16" }, "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": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==", "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, "optional": 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, "optional": 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": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true, "optional": true }, "node_modules/are-we-there-yet/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, "optional": 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, "optional": 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, "optional": 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-buffer-byte-length": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "is-array-buffer": "^3.0.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/array-ify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", "dev": true }, "node_modules/array-includes": { "version": "3.1.7", "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", "es-abstract": "^1.22.1", "get-intrinsic": "^1.2.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.findlastindex": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0", "get-intrinsic": "^1.2.1" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/array.prototype.flat": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/array.prototype.flatmap": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/arraybuffer.prototype.slice": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.0", "call-bind": "^1.0.2", "define-properties": "^1.2.0", "get-intrinsic": "^1.2.1", "is-array-buffer": "^3.0.2", "is-shared-array-buffer": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "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": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", "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/available-typed-arrays": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", "dev": true, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", "dev": true, "engines": { "node": "*" } }, "node_modules/aws4": { "version": "1.12.0", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", "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/babel-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, "dependencies": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.6.3", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "slash": "^3.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "@babel/core": "^7.8.0" } }, "node_modules/babel-plugin-istanbul": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-instrument": "^5.0.4", "test-exclude": "^6.0.0" }, "engines": { "node": ">=8" } }, "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-coverage": "^3.2.0", "semver": "^6.3.0" }, "engines": { "node": ">=8" } }, "node_modules/babel-plugin-jest-hoist": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", "@types/babel__core": "^7.1.14", "@types/babel__traverse": "^7.0.6" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/babel-preset-current-node-syntax": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", "dev": true, "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", "@babel/plugin-syntax-class-properties": "^7.8.3", "@babel/plugin-syntax-import-meta": "^7.8.3", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", "@babel/plugin-syntax-numeric-separator": "^7.8.3", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-top-level-await": "^7.8.3" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/babel-preset-jest": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, "dependencies": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "@babel/core": "^7.0.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": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", "dev": true, "dependencies": { "tweetnacl": "^0.14.3" } }, "node_modules/before-after-hook": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", "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/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.20.2", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", "dev": true, "funding": [ { "type": "opencollective", "url": "https://opencollective.com/browserslist" }, { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" } ], "dependencies": { "caniuse-lite": "^1.0.30001317", "electron-to-chromium": "^1.4.84", "escalade": "^3.1.1", "node-releases": "^2.0.2", "picocolors": "^1.0.0" }, "bin": { "browserslist": "cli.js" }, "engines": { "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, "node_modules/bser": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, "dependencies": { "node-int64": "^0.4.0" } }, "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": "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==", "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/caniuse-lite": { "version": "1.0.30001325", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001325.tgz", "integrity": "sha512-sB1bZHjseSjDtijV1Hb7PB2Zd58Kyx+n/9EotvZ4Qcz2K3d0lWB8dB4nb8wN/TsOGFq3UuAm0zQZNQ4SoR7TrQ==", "dev": true, "funding": [ { "type": "opencollective", "url": "https://opencollective.com/browserslist" }, { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" } ] }, "node_modules/cardinal": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", "integrity": "sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==", "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": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", "dev": true }, "node_modules/chai": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", "dev": true, "dependencies": { "assertion-error": "^1.1.0", "check-error": "^1.0.3", "deep-eql": "^4.1.3", "get-func-name": "^2.0.2", "loupe": "^2.3.6", "pathval": "^1.1.1", "type-detect": "^4.0.8" }, "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/char-regex": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true, "engines": { "node": ">=10" } }, "node_modules/charm": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/charm/-/charm-1.0.2.tgz", "integrity": "sha512-wqW3VdPnlSWT4eRiYX+hcs+C6ViBPUWk1qTCd+37qw9kEm/a5n2qcyQDMBWvSYKN/ctqZzeXNQaeBjOetJJUkw==", "dev": true, "dependencies": { "inherits": "^2.0.1" } }, "node_modules/check-error": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", "dev": true, "dependencies": { "get-func-name": "^2.0.2" }, "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/chownr": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "dev": true, "engines": { "node": ">=10" } }, "node_modules/ci-info": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/sibiraj-s" } ], "engines": { "node": ">=8" } }, "node_modules/cjs-module-lexer": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", "dev": true }, "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.3", "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", "dev": true, "dependencies": { "string-width": "^4.2.0" }, "engines": { "node": "10.* || >= 12.*" }, "optionalDependencies": { "@colors/colors": "1.5.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/co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true, "engines": { "iojs": ">= 1.0.0", "node": ">= 0.12.0" } }, "node_modules/code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", "dev": true, "optional": true, "engines": { "node": ">=0.10.0" } }, "node_modules/collect-v8-coverage": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", "dev": true }, "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/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/compress-brotli": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/compress-brotli/-/compress-brotli-1.3.6.tgz", "integrity": "sha512-au99/GqZtUtiCBliqLFbWlhnCxn+XSYjwZ77q6mKN4La4qOXDoLVPZ50iXr0WmAyMxl8yqoq3Yq4OeQNPPkyeQ==", "dev": true, "dependencies": { "@types/json-buffer": "~3.0.0", "json-buffer": "~3.0.1" }, "engines": { "node": ">= 12" } }, "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/config-chain": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", "dev": true, "dependencies": { "ini": "^1.3.4", "proto-list": "~1.2.1" } }, "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": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", "dev": true, "optional": true }, "node_modules/conventional-changelog-angular": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz", "integrity": "sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==", "dev": true, "dependencies": { "compare-func": "^2.0.0" }, "engines": { "node": ">=16" } }, "node_modules/conventional-changelog-writer": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-7.0.1.tgz", "integrity": "sha512-Uo+R9neH3r/foIvQ0MKcsXkX642hdm9odUp7TqgFS7BsalTcjzRlIfWZrZR1gbxOozKucaKt5KAbjW8J8xRSmA==", "dev": true, "dependencies": { "conventional-commits-filter": "^4.0.0", "handlebars": "^4.7.7", "json-stringify-safe": "^5.0.1", "meow": "^12.0.1", "semver": "^7.5.2", "split2": "^4.0.0" }, "bin": { "conventional-changelog-writer": "cli.mjs" }, "engines": { "node": ">=16" } }, "node_modules/conventional-changelog-writer/node_modules/semver": { "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, "node_modules/conventional-commits-filter": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-4.0.0.tgz", "integrity": "sha512-rnpnibcSOdFcdclpFwWa+pPlZJhXE7l+XK04zxhbWrhgpR96h33QLz8hITTXbcYICxVr3HZFtbtUAQ+4LdBo9A==", "dev": true, "engines": { "node": ">=16" } }, "node_modules/conventional-commits-parser": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz", "integrity": "sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==", "dev": true, "dependencies": { "is-text-path": "^2.0.0", "JSONStream": "^1.3.5", "meow": "^12.0.1", "split2": "^4.0.0" }, "bin": { "conventional-commits-parser": "cli.mjs" }, "engines": { "node": ">=16" } }, "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": "8.1.3", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.1.3.tgz", "integrity": "sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==", "dev": true, "dependencies": { "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "parse-json": "^5.0.0", "path-type": "^4.0.0" }, "engines": { "node": ">=14" }, "funding": { "url": "https://github.com/sponsors/d-fischer" } }, "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/create-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", "jest-config": "^29.7.0", "jest-util": "^29.7.0", "prompts": "^2.0.1" }, "bin": { "create-jest": "bin/create-jest.js" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "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": "4.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", "dev": true, "dependencies": { "type-fest": "^1.0.1" }, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/crypto-random-string/node_modules/type-fest": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", "dev": true, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", "dev": true, "dependencies": { "assert-plus": "^1.0.0" }, "engines": { "node": ">=0.10" } }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "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/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/dedent": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", "dev": true, "peerDependencies": { "babel-plugin-macros": "^3.1.0" }, "peerDependenciesMeta": { "babel-plugin-macros": { "optional": true } } }, "node_modules/deep-eql": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", "dev": true, "dependencies": { "type-detect": "^4.0.0" }, "engines": { "node": ">=6" } }, "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/deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, "engines": { "node": ">=0.10.0" } }, "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.2.0", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", "dev": true, "dependencies": { "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "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": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", "dev": true, "optional": 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/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/diff": { "version": "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/diff-sequences": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "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": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", "dev": true, "dependencies": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" } }, "node_modules/electron-to-chromium": { "version": "1.4.103", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.103.tgz", "integrity": "sha512-c/uKWR1Z/W30Wy/sx3dkZoj4BijbXX85QKWu9jJfjho3LBAXNEGAEW3oWiGb+dotA6C6BzCTxL2/aLes7jlUeg==", "dev": true }, "node_modules/emittery": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "dev": true, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sindresorhus/emittery?sponsor=1" } }, "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/emojilib": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==", "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": "10.0.0", "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-10.0.0.tgz", "integrity": "sha512-U4xcd/utDYFgMh0yWj07R1H6L5fwhVbmxBCpnL0DbVSDZVnsC82HONw0wxtxNkIAcua3KtbomQvIk5xFZGAQJw==", "dev": true, "dependencies": { "execa": "^8.0.0", "java-properties": "^1.0.2" }, "engines": { "node": "^18.17 || >=20.6.1" } }, "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.22.1", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.0", "arraybuffer.prototype.slice": "^1.0.1", "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.5", "get-intrinsic": "^1.2.1", "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", "gopd": "^1.0.1", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "internal-slot": "^1.0.5", "is-array-buffer": "^3.0.2", "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", "is-typed-array": "^1.1.10", "is-weakref": "^1.0.2", "object-inspect": "^1.12.3", "object-keys": "^1.1.1", "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.5.0", "safe-array-concat": "^1.0.0", "safe-regex-test": "^1.0.0", "string.prototype.trim": "^1.2.7", "string.prototype.trimend": "^1.0.6", "string.prototype.trimstart": "^1.0.6", "typed-array-buffer": "^1.0.0", "typed-array-byte-length": "^1.0.0", "typed-array-byte-offset": "^1.0.0", "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", "which-typed-array": "^1.1.10" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/es-set-tostringtag": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", "dev": true, "dependencies": { "get-intrinsic": "^1.1.3", "has": "^1.0.3", "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-shim-unscopables": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, "dependencies": { "hasown": "^2.0.0" } }, "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.56.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", "@eslint/js": "8.56.0", "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "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.2.2", "eslint-visitor-keys": "^3.4.3", "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3", "strip-ansi": "^6.0.1", "text-table": "^0.2.0" }, "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": "9.1.0", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", "dev": true, "bin": { "eslint-config-prettier": "bin/cli.js" }, "peerDependencies": { "eslint": ">=7.0.0" } }, "node_modules/eslint-config-standard": { "version": "17.1.0", "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz", "integrity": "sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==", "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" } ], "engines": { "node": ">=12.0.0" }, "peerDependencies": { "eslint": "^8.0.1", "eslint-plugin-import": "^2.25.2", "eslint-plugin-n": "^15.0.0 || ^16.0.0 ", "eslint-plugin-promise": "^6.0.0" } }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.13.0", "resolve": "^1.22.4" } }, "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.8.0", "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", "dev": true, "dependencies": { "debug": "^3.2.7" }, "engines": { "node": ">=4" }, "peerDependenciesMeta": { "eslint": { "optional": true } } }, "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.29.1", "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", "dev": true, "dependencies": { "array-includes": "^3.1.7", "array.prototype.findlastindex": "^1.2.3", "array.prototype.flat": "^1.3.2", "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", "eslint-module-utils": "^2.8.0", "hasown": "^2.0.0", "is-core-module": "^2.13.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", "object.fromentries": "^2.0.7", "object.groupby": "^1.0.1", "object.values": "^1.1.7", "semver": "^6.3.1", "tsconfig-paths": "^3.15.0" }, "engines": { "node": ">=4" }, "peerDependencies": { "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" } }, "node_modules/eslint-plugin-import/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-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-mocha": { "version": "10.2.0", "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.2.0.tgz", "integrity": "sha512-ZhdxzSZnd1P9LqDPF0DBcFLpRIGdh1zkF2JHnQklKQOvrQtT73kdP5K9V2mzvbLR+cCAO9OI48NXK/Ax9/ciCQ==", "dev": true, "dependencies": { "eslint-utils": "^3.0.0", "rambda": "^7.4.0" }, "engines": { "node": ">=14.0.0" }, "peerDependencies": { "eslint": ">=7.0.0" } }, "node_modules/eslint-plugin-n": { "version": "15.2.1", "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.2.1.tgz", "integrity": "sha512-uMG50pvKqXK9ab163bSI5OpyZR0F5yIB0pEC4ciGpBLrXVjVDOlx5oTq8GQULWzbelJt7wL5Rw4T+FfAff5Cxg==", "dev": true, "peer": true, "dependencies": { "builtins": "^5.0.1", "eslint-plugin-es": "^4.1.0", "eslint-utils": "^3.0.0", "ignore": "^5.1.1", "is-core-module": "^2.9.0", "minimatch": "^3.1.2", "resolve": "^1.10.1", "semver": "^7.3.7" }, "engines": { "node": ">=12.22.0" }, "funding": { "url": "https://github.com/sponsors/mysticatea" }, "peerDependencies": { "eslint": ">=7.0.0" } }, "node_modules/eslint-plugin-n/node_modules/builtins": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", "dev": true, "peer": true, "dependencies": { "semver": "^7.0.0" } }, "node_modules/eslint-plugin-n/node_modules/semver": { "version": "7.3.7", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "peer": true, "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, "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.1.1", "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", "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.2.2", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "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.4.3", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/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/eslint/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/eslint/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/eslint/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/eslint/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/espree": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "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.2", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.2.tgz", "integrity": "sha512-JVSoLdTlTDkmjFmab7H/9SL9qGSyjElT3myyKp7krqjVFQCDLmj1QFaCLRFBszBKI0XVZaiiXvuPIX3ZwHe1Ng==", "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": "8.0.1", "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", "dev": true, "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^8.0.1", "human-signals": "^5.0.0", "is-stream": "^3.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^5.1.0", "onetime": "^6.0.0", "signal-exit": "^4.1.0", "strip-final-newline": "^3.0.0" }, "engines": { "node": ">=16.17" }, "funding": { "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, "node_modules/execa/node_modules/get-stream": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", "dev": true, "engines": { "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/execa/node_modules/is-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/execa/node_modules/signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, "engines": { "node": ">=14" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", "dev": true, "engines": { "node": ">= 0.8.0" } }, "node_modules/expect": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, "dependencies": { "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", "jest-matcher-utils": "^29.7.0", "jest-message-util": "^29.7.0", "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "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": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", "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": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "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/fb-watchman": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, "dependencies": { "bser": "2.1.1" } }, "node_modules/figures": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/figures/-/figures-6.0.1.tgz", "integrity": "sha512-0oY/olScYD4IhQ8u//gCPA4F3mlTn2dacYmiDm/mbDQvpmLjV4uH+zhsQ5IyXRyvqkvtUkXkNdGvg5OFJTCsuQ==", "dev": true, "dependencies": { "is-unicode-supported": "^2.0.0" }, "engines": { "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/figures/node_modules/is-unicode-supported": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.0.0.tgz", "integrity": "sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==", "dev": true, "engines": { "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "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": "5.1.0", "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-5.1.0.tgz", "integrity": "sha512-+iwzCJ7C5v5KgcBuueqVoNiHVoQpwiUK5XFLjf0affFTep+Wcw93tPvmb8tqujDNmzhBDPddnWV/qgWSXgq+Hg==", "dev": true, "dependencies": { "semver-regex": "^4.0.5" }, "engines": { "node": ">=12" }, "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/for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dev": true, "dependencies": { "is-callable": "^1.1.3" } }, "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": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", "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": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", "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": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true }, "node_modules/from2/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "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-minipass": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "dev": true, "dependencies": { "minipass": "^3.0.0" }, "engines": { "node": ">= 8" } }, "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.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/function.prototype.name": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", "es-abstract": "^1.19.0", "functions-have-names": "^1.2.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/functions-have-names": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/gauge": { "version": "2.7.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", "integrity": "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==", "dev": true, "optional": true, "dependencies": { "aproba": "^1.0.3", "console-control-strings": "^1.0.0", "has-unicode": "^2.0.0", "object-assign": "^4.1.0", "signal-exit": "^3.0.0", "string-width": "^1.0.1", "strip-ansi": "^3.0.1", "wide-align": "^1.1.0" } }, "node_modules/gauge/node_modules/ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "dev": true, "optional": 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": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "dev": true, "optional": true, "dependencies": { "ansi-regex": "^2.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/get-func-name": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", "dev": true, "engines": { "node": "*" } }, "node_modules/get-intrinsic": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", "dev": true, "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", "has-proto": "^1.0.1", "has-symbols": "^1.0.3" }, "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": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", "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.24.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/globalthis": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", "dev": true, "dependencies": { "define-properties": "^1.1.3" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "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/gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dev": true, "dependencies": { "get-intrinsic": "^1.1.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/got": { "version": "11.8.5", "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", "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.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true }, "node_modules/grapheme-splitter": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", "dev": true }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "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.8", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", "dev": true, "dependencies": { "minimist": "^1.2.5", "neo-async": "^2.6.2", "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/har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", "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/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.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "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-property-descriptors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", "dev": true, "dependencies": { "get-intrinsic": "^1.1.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", "dev": true, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "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": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", "dev": true, "optional": 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/hasown": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", "dev": true, "dependencies": { "function-bind": "^1.1.2" }, "engines": { "node": ">= 0.4" } }, "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": "3.0.0", "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-3.0.0.tgz", "integrity": "sha512-jHRQzjSDzMtFy34AGj1DN+vq54WVuhSvKgrHf0OMiFQTwDD4L/qqofVEWjLOBMTn5+lCD3fPg32W9yOfnEJTTw==", "dev": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "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.1", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", "dev": true }, "node_modules/http-proxy-agent": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", "dev": true, "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" }, "engines": { "node": ">= 14" } }, "node_modules/http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", "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": "7.0.0", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.0.tgz", "integrity": "sha512-0euwPCRyAPSgGdzD1IVN9nJYHtBhJwb6XPfbpQcYbPCwrBidX6GzxmchnaF4sfF/jPb74Ojx5g4yTg3sixlyPw==", "dev": true, "dependencies": { "agent-base": "^7.0.2", "debug": "4" }, "engines": { "node": ">= 14" } }, "node_modules/human-signals": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", "dev": true, "engines": { "node": ">=16.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/import-local": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", "dev": true, "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" }, "bin": { "import-local-fixture": "fixtures/cli.js" }, "engines": { "node": ">=8" }, "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.5", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", "dev": true, "dependencies": { "get-intrinsic": "^1.2.0", "has": "^1.0.3", "side-channel": "^1.0.4" }, "engines": { "node": ">= 0.4" } }, "node_modules/into-stream": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-7.0.0.tgz", "integrity": "sha512-2dYz766i9HprMBasCMvHMuazJ7u4WzhJwo5kb3iPSiW/iRYV6uPari3zHoqZlnuaR7V1bEiNMxikhp37rdBXbw==", "dev": true, "dependencies": { "from2": "^2.3.0", "p-is-promise": "^3.0.0" }, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-array-buffer": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.0", "is-typed-array": "^1.1.10" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "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.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-core-module": { "version": "2.13.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dev": true, "dependencies": { "hasown": "^2.0.0" }, "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": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", "dev": true, "optional": true, "dependencies": { "number-is-nan": "^1.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/is-generator-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/is-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.7", "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "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-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-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.2", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", "dev": true, "dependencies": { "call-bind": "^1.0.2" }, "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": "2.0.0", "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-2.0.0.tgz", "integrity": "sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==", "dev": true, "dependencies": { "text-extensions": "^2.0.0" }, "engines": { "node": ">=8" } }, "node_modules/is-typed-array": { "version": "1.1.10", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", "dev": true, "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "for-each": "^0.3.3", "gopd": "^1.0.1", "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, "node_modules/is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-weakref": { "version": "1.0.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": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", "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": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", "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-reports": { "version": "3.1.4", "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", "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/jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, "dependencies": { "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", "import-local": "^3.0.2", "jest-cli": "^29.7.0" }, "bin": { "jest": "bin/jest.js" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "peerDependenciesMeta": { "node-notifier": { "optional": true } } }, "node_modules/jest-changed-files": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, "dependencies": { "execa": "^5.0.0", "jest-util": "^29.7.0", "p-limit": "^3.1.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-changed-files/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/jest-changed-files/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/jest-changed-files/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/jest-changed-files/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/jest-changed-files/node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "dependencies": { "path-key": "^3.0.0" }, "engines": { "node": ">=8" } }, "node_modules/jest-changed-files/node_modules/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/jest-changed-files/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/jest-changed-files/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/jest-circus": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, "dependencies": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", "jest-each": "^29.7.0", "jest-matcher-utils": "^29.7.0", "jest-message-util": "^29.7.0", "jest-runtime": "^29.7.0", "jest-snapshot": "^29.7.0", "jest-util": "^29.7.0", "p-limit": "^3.1.0", "pretty-format": "^29.7.0", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-circus/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/jest-cli": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, "dependencies": { "@jest/core": "^29.7.0", "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "chalk": "^4.0.0", "create-jest": "^29.7.0", "exit": "^0.1.2", "import-local": "^3.0.2", "jest-config": "^29.7.0", "jest-util": "^29.7.0", "jest-validate": "^29.7.0", "yargs": "^17.3.1" }, "bin": { "jest": "bin/jest.js" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "peerDependenciesMeta": { "node-notifier": { "optional": true } } }, "node_modules/jest-cli/node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" }, "engines": { "node": ">=12" } }, "node_modules/jest-cli/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/jest-cli/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/jest-cli/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/jest-cli/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/jest-cli/node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" }, "engines": { "node": ">=12" } }, "node_modules/jest-cli/node_modules/yargs-parser": { "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, "engines": { "node": ">=12" } }, "node_modules/jest-config": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", "@jest/test-sequencer": "^29.7.0", "@jest/types": "^29.6.3", "babel-jest": "^29.7.0", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", "jest-circus": "^29.7.0", "jest-environment-node": "^29.7.0", "jest-get-type": "^29.6.3", "jest-regex-util": "^29.6.3", "jest-resolve": "^29.7.0", "jest-runner": "^29.7.0", "jest-util": "^29.7.0", "jest-validate": "^29.7.0", "micromatch": "^4.0.4", "parse-json": "^5.2.0", "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "@types/node": "*", "ts-node": ">=9.0.0" }, "peerDependenciesMeta": { "@types/node": { "optional": true }, "ts-node": { "optional": true } } }, "node_modules/jest-config/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/jest-config/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/jest-diff": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", "jest-get-type": "^29.6.3", "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-docblock": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, "dependencies": { "detect-newline": "^3.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-each": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "jest-util": "^29.7.0", "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-environment-node": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "jest-mock": "^29.7.0", "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-get-type": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-haste-map": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.6.3", "jest-util": "^29.7.0", "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "optionalDependencies": { "fsevents": "^2.3.2" } }, "node_modules/jest-leak-detector": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, "dependencies": { "jest-get-type": "^29.6.3", "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, "dependencies": { "chalk": "^4.0.0", "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-message-util": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", "pretty-format": "^29.7.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-mock": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-pnp-resolver": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true, "engines": { "node": ">=6" }, "peerDependencies": { "jest-resolve": "*" }, "peerDependenciesMeta": { "jest-resolve": { "optional": true } } }, "node_modules/jest-regex-util": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-resolve": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.7.0", "jest-pnp-resolver": "^1.2.2", "jest-util": "^29.7.0", "jest-validate": "^29.7.0", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-resolve-dependencies": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, "dependencies": { "jest-regex-util": "^29.6.3", "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, "dependencies": { "@jest/console": "^29.7.0", "@jest/environment": "^29.7.0", "@jest/test-result": "^29.7.0", "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", "jest-docblock": "^29.7.0", "jest-environment-node": "^29.7.0", "jest-haste-map": "^29.7.0", "jest-leak-detector": "^29.7.0", "jest-message-util": "^29.7.0", "jest-resolve": "^29.7.0", "jest-runtime": "^29.7.0", "jest-util": "^29.7.0", "jest-watcher": "^29.7.0", "jest-worker": "^29.7.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner/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/jest-runtime": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dev": true, "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", "@jest/globals": "^29.7.0", "@jest/source-map": "^29.6.3", "@jest/test-result": "^29.7.0", "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.7.0", "jest-message-util": "^29.7.0", "jest-mock": "^29.7.0", "jest-regex-util": "^29.6.3", "jest-resolve": "^29.7.0", "jest-snapshot": "^29.7.0", "jest-util": "^29.7.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-snapshot": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/types": "^7.3.3", "@jest/expect-utils": "^29.7.0", "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", "expect": "^29.7.0", "graceful-fs": "^4.2.9", "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", "jest-matcher-utils": "^29.7.0", "jest-message-util": "^29.7.0", "jest-util": "^29.7.0", "natural-compare": "^1.4.0", "pretty-format": "^29.7.0", "semver": "^7.5.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-snapshot/node_modules/semver": { "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, "node_modules/jest-util": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-validate": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "leven": "^3.1.0", "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-validate/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/jest-watcher": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, "dependencies": { "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", "jest-util": "^29.7.0", "string-length": "^4.0.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-watcher/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/jest-watcher/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/jest-worker": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-worker/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/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": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", "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.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, "bin": { "json5": "lib/cli.js" }, "engines": { "node": ">=6" } }, "node_modules/jsonfile": { "version": "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": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", "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.2.1", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.2.1.tgz", "integrity": "sha512-cAJq5cTfxQdq1DHZEVNpnk4mEvhP+8UP8UQftLtTtJ98beKkRHf+62M0mIDM2u/IWXyP8bmGB375/6uGdSX2MA==", "dev": true, "dependencies": { "compress-brotli": "^1.3.6", "json-buffer": "3.0.1" } }, "node_modules/kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/levn": { "version": "0.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-es": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", "dev": true }, "node_modules/lodash.capitalize": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", "integrity": "sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==", "dev": true }, "node_modules/lodash.escaperegexp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==", "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": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", "dev": true }, "node_modules/lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", "dev": true }, "node_modules/lodash.isstring": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", "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.uniqby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==", "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.7", "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", "dev": true, "dependencies": { "get-func-name": "^2.0.1" } }, "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/makeerror": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, "dependencies": { "tmpl": "1.0.5" } }, "node_modules/marked": { "version": "9.1.2", "resolved": "https://registry.npmjs.org/marked/-/marked-9.1.2.tgz", "integrity": "sha512-qoKMJqK0w6vkLk8+KnKZAH6neUZSNaQqVZ/h2yZ9S7CbLuFHyS2viB0jnqcWF9UKjwsAbMrQtnQhdmdvOVOw9w==", "dev": true, "bin": { "marked": "bin/marked.js" }, "engines": { "node": ">= 16" } }, "node_modules/marked-terminal": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-6.0.0.tgz", "integrity": "sha512-6rruICvqRfA4N+Mvdc0UyDbLA0A0nI5omtARIlin3P2F+aNc3EbW91Rd9HTuD0v9qWyHmNIu8Bt40gAnPfldsg==", "dev": true, "dependencies": { "ansi-escapes": "^6.2.0", "cardinal": "^2.1.1", "chalk": "^5.3.0", "cli-table3": "^0.6.3", "node-emoji": "^2.1.0", "supports-hyperlinks": "^3.0.0" }, "engines": { "node": ">=16.0.0" }, "peerDependencies": { "marked": ">=1 <10" } }, "node_modules/marked-terminal/node_modules/chalk": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "dev": true, "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "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": "12.1.1", "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz", "integrity": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==", "dev": true, "engines": { "node": ">=16.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.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" }, "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.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "dependencies": { "mime-db": "1.52.0" }, "engines": { "node": ">= 0.6" } }, "node_modules/mimic-fn": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", "dev": true, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "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/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, "engines": { "node": "*" } }, "node_modules/minimist": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, "node_modules/minipass": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "dependencies": { "yallist": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/minizlib": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "dev": true, "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" }, "engines": { "node": ">= 8" } }, "node_modules/mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "dependencies": { "minimist": "^1.2.6" }, "bin": { "mkdirp": "bin/cmd.js" } }, "node_modules/mocha": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", "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": "4.2.1", "ms": "2.1.3", "nanoid": "3.3.1", "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/debug": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dev": true, "dependencies": { "ms": "2.1.2" }, "engines": { "node": ">=6.0" }, "peerDependenciesMeta": { "supports-color": { "optional": true } } }, "node_modules/mocha/node_modules/debug/node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, "node_modules/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/minimatch": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, "engines": { "node": ">=10" } }, "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/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.3.1", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", "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/natural-compare-lite": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", "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": "sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==", "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.4", "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.4.tgz", "integrity": "sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg==", "dev": true, "dependencies": { "@sinonjs/commons": "^2.0.0", "@sinonjs/fake-timers": "^10.0.2", "@sinonjs/text-encoding": "^0.7.1", "just-extend": "^4.0.2", "path-to-regexp": "^1.7.0" } }, "node_modules/nise/node_modules/@sinonjs/fake-timers": { "version": "10.3.0", "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, "dependencies": { "@sinonjs/commons": "^3.0.0" } }, "node_modules/nise/node_modules/@sinonjs/fake-timers/node_modules/@sinonjs/commons": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", "dev": true, "dependencies": { "type-detect": "4.0.8" } }, "node_modules/node-emoji": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.1.0.tgz", "integrity": "sha512-tcsBm9C6FmPN5Wo7OjFi9lgMyJjvkAeirmjR/ax8Ttfqy4N8PoFic26uqFTIgayHPNI5FH4ltUvfh9kHzwcK9A==", "dev": true, "dependencies": { "@sindresorhus/is": "^3.1.2", "char-regex": "^1.0.2", "emojilib": "^2.4.0", "skin-tone": "^2.0.0" } }, "node_modules/node-emoji/node_modules/@sindresorhus/is": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-3.1.2.tgz", "integrity": "sha512-JiX9vxoKMmu8Y3Zr2RVathBL1Cdu4Nt4MuNWemt1Nc06A0RAin9c5FArkhGsyMBWfCu4zj+9b+GxtjAnE4qqLQ==", "dev": true, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sindresorhus/is?sponsor=1" } }, "node_modules/node-fetch": { "version": "2.6.12", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", "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-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", "dev": true }, "node_modules/node-preload": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", "dev": true, "dependencies": { "process-on-spawn": "^1.0.0" }, "engines": { "node": ">=8" } }, "node_modules/node-releases": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==", "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": "10.2.0", "resolved": "https://registry.npmjs.org/npm/-/npm-10.2.0.tgz", "integrity": "sha512-Auyq6d4cfg/SY4URjZE2aePLOPzK4lUD+qyMxY/7HbxAvCnOCKtMlyLPcbLSOq9lhEGBZN800S1o+UmfjA5dTg==", "bundleDependencies": [ "@isaacs/string-locale-compare", "@npmcli/arborist", "@npmcli/config", "@npmcli/fs", "@npmcli/map-workspaces", "@npmcli/package-json", "@npmcli/promise-spawn", "@npmcli/run-script", "@sigstore/tuf", "abbrev", "archy", "cacache", "chalk", "ci-info", "cli-columns", "cli-table3", "columnify", "fastest-levenshtein", "fs-minipass", "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", "minimatch", "minipass", "minipass-pipeline", "ms", "node-gyp", "nopt", "normalize-package-data", "npm-audit-report", "npm-install-checks", "npm-package-arg", "npm-pick-manifest", "npm-profile", "npm-registry-fetch", "npm-user-validate", "npmlog", "p-map", "pacote", "parse-conflict-json", "proc-log", "qrcode-terminal", "read", "semver", "spdx-expression-parse", "ssri", "strip-ansi", "supports-color", "tar", "text-table", "tiny-relative-date", "treeverse", "validate-npm-package-name", "which", "write-file-atomic" ], "dev": true, "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", "@npmcli/arborist": "^7.2.0", "@npmcli/config": "^8.0.0", "@npmcli/fs": "^3.1.0", "@npmcli/map-workspaces": "^3.0.4", "@npmcli/package-json": "^5.0.0", "@npmcli/promise-spawn": "^7.0.0", "@npmcli/run-script": "^7.0.1", "@sigstore/tuf": "^2.1.0", "abbrev": "^2.0.0", "archy": "~1.0.0", "cacache": "^18.0.0", "chalk": "^5.3.0", "ci-info": "^3.8.0", "cli-columns": "^4.0.0", "cli-table3": "^0.6.3", "columnify": "^1.6.0", "fastest-levenshtein": "^1.0.16", "fs-minipass": "^3.0.3", "glob": "^10.3.10", "graceful-fs": "^4.2.11", "hosted-git-info": "^7.0.1", "ini": "^4.1.1", "init-package-json": "^6.0.0", "is-cidr": "^4.0.2", "json-parse-even-better-errors": "^3.0.0", "libnpmaccess": "^8.0.1", "libnpmdiff": "^6.0.2", "libnpmexec": "^7.0.2", "libnpmfund": "^5.0.0", "libnpmhook": "^10.0.0", "libnpmorg": "^6.0.1", "libnpmpack": "^6.0.2", "libnpmpublish": "^9.0.1", "libnpmsearch": "^7.0.0", "libnpmteam": "^6.0.0", "libnpmversion": "^5.0.0", "make-fetch-happen": "^13.0.0", "minimatch": "^9.0.3", "minipass": "^7.0.4", "minipass-pipeline": "^1.2.4", "ms": "^2.1.2", "node-gyp": "^9.4.0", "nopt": "^7.2.0", "normalize-package-data": "^6.0.0", "npm-audit-report": "^5.0.0", "npm-install-checks": "^6.2.0", "npm-package-arg": "^11.0.1", "npm-pick-manifest": "^9.0.0", "npm-profile": "^9.0.0", "npm-registry-fetch": "^16.0.0", "npm-user-validate": "^2.0.0", "npmlog": "^7.0.1", "p-map": "^4.0.0", "pacote": "^17.0.4", "parse-conflict-json": "^3.0.1", "proc-log": "^3.0.0", "qrcode-terminal": "^0.12.0", "read": "^2.1.0", "semver": "^7.5.4", "spdx-expression-parse": "^3.0.1", "ssri": "^10.0.5", "strip-ansi": "^6.0.1", "supports-color": "^9.4.0", "tar": "^6.2.0", "text-table": "~0.2.0", "tiny-relative-date": "^1.3.0", "treeverse": "^3.0.0", "validate-npm-package-name": "^5.0.0", "which": "^4.0.0", "write-file-atomic": "^5.0.1" }, "bin": { "npm": "bin/npm-cli.js", "npx": "bin/npx-cli.js" }, "engines": { "node": "^18.17.0 || >=20.5.0" } }, "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.5.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", "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": "5.1.0", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", "dev": true, "dependencies": { "path-key": "^4.0.0" }, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/npm-run-path/node_modules/path-key": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/npm/node_modules/@colors/colors": { "version": "1.5.0", "dev": true, "inBundle": true, "license": "MIT", "optional": true, "engines": { "node": ">=0.1.90" } }, "node_modules/npm/node_modules/@isaacs/cliui": { "version": "8.0.2", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" }, "engines": { "node": ">=12" } }, "node_modules/npm/node_modules/@isaacs/cliui/node_modules/ansi-regex": { "version": "6.0.1", "dev": true, "inBundle": true, "license": "MIT", "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, "node_modules/npm/node_modules/@isaacs/cliui/node_modules/emoji-regex": { "version": "9.2.2", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/@isaacs/cliui/node_modules/string-width": { "version": "5.1.2", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" }, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/npm/node_modules/@isaacs/cliui/node_modules/strip-ansi": { "version": "7.1.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "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/agent": { "version": "2.2.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "agent-base": "^7.1.0", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.1", "lru-cache": "^10.0.1", "socks-proxy-agent": "^8.0.1" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/@npmcli/agent/node_modules/agent-base": { "version": "7.1.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "debug": "^4.3.4" }, "engines": { "node": ">= 14" } }, "node_modules/npm/node_modules/@npmcli/agent/node_modules/http-proxy-agent": { "version": "7.0.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" }, "engines": { "node": ">= 14" } }, "node_modules/npm/node_modules/@npmcli/agent/node_modules/https-proxy-agent": { "version": "7.0.1", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "agent-base": "^7.0.2", "debug": "4" }, "engines": { "node": ">= 14" } }, "node_modules/npm/node_modules/@npmcli/agent/node_modules/socks-proxy-agent": { "version": "8.0.1", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "agent-base": "^7.0.1", "debug": "^4.3.4", "socks": "^2.7.1" }, "engines": { "node": ">= 14" } }, "node_modules/npm/node_modules/@npmcli/arborist": { "version": "7.2.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", "@npmcli/fs": "^3.1.0", "@npmcli/installed-package-contents": "^2.0.2", "@npmcli/map-workspaces": "^3.0.2", "@npmcli/metavuln-calculator": "^7.0.0", "@npmcli/name-from-folder": "^2.0.0", "@npmcli/node-gyp": "^3.0.0", "@npmcli/package-json": "^5.0.0", "@npmcli/query": "^3.0.1", "@npmcli/run-script": "^7.0.1", "bin-links": "^4.0.1", "cacache": "^18.0.0", "common-ancestor-path": "^1.0.1", "hosted-git-info": "^7.0.1", "json-parse-even-better-errors": "^3.0.0", "json-stringify-nice": "^1.1.4", "minimatch": "^9.0.0", "nopt": "^7.0.0", "npm-install-checks": "^6.2.0", "npm-package-arg": "^11.0.1", "npm-pick-manifest": "^9.0.0", "npm-registry-fetch": "^16.0.0", "npmlog": "^7.0.1", "pacote": "^17.0.4", "parse-conflict-json": "^3.0.0", "proc-log": "^3.0.0", "promise-all-reject-late": "^1.0.0", "promise-call-limit": "^1.0.2", "read-package-json-fast": "^3.0.2", "semver": "^7.3.7", "ssri": "^10.0.5", "treeverse": "^3.0.0", "walk-up-path": "^3.0.1" }, "bin": { "arborist": "bin/index.js" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/@npmcli/config": { "version": "8.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "@npmcli/map-workspaces": "^3.0.2", "ci-info": "^3.8.0", "ini": "^4.1.0", "nopt": "^7.0.0", "proc-log": "^3.0.0", "read-package-json-fast": "^3.0.2", "semver": "^7.3.5", "walk-up-path": "^3.0.1" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/@npmcli/disparity-colors": { "version": "3.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "ansi-styles": "^4.3.0" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm/node_modules/@npmcli/fs": { "version": "3.1.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "semver": "^7.3.5" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm/node_modules/@npmcli/git": { "version": "5.0.3", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "@npmcli/promise-spawn": "^7.0.0", "lru-cache": "^10.0.1", "npm-pick-manifest": "^9.0.0", "proc-log": "^3.0.0", "promise-inflight": "^1.0.1", "promise-retry": "^2.0.1", "semver": "^7.3.5", "which": "^4.0.0" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/@npmcli/installed-package-contents": { "version": "2.0.2", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "npm-bundled": "^3.0.0", "npm-normalize-package-bin": "^3.0.0" }, "bin": { "installed-package-contents": "lib/index.js" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm/node_modules/@npmcli/map-workspaces": { "version": "3.0.4", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "@npmcli/name-from-folder": "^2.0.0", "glob": "^10.2.2", "minimatch": "^9.0.0", "read-package-json-fast": "^3.0.0" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { "version": "7.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "cacache": "^18.0.0", "json-parse-even-better-errors": "^3.0.0", "pacote": "^17.0.0", "semver": "^7.3.5" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/@npmcli/name-from-folder": { "version": "2.0.0", "dev": true, "inBundle": true, "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm/node_modules/@npmcli/node-gyp": { "version": "3.0.0", "dev": true, "inBundle": true, "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm/node_modules/@npmcli/package-json": { "version": "5.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "@npmcli/git": "^5.0.0", "glob": "^10.2.2", "hosted-git-info": "^7.0.0", "json-parse-even-better-errors": "^3.0.0", "normalize-package-data": "^6.0.0", "proc-log": "^3.0.0", "semver": "^7.5.3" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/@npmcli/promise-spawn": { "version": "7.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "which": "^4.0.0" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/@npmcli/query": { "version": "3.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "postcss-selector-parser": "^6.0.10" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm/node_modules/@npmcli/run-script": { "version": "7.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "@npmcli/node-gyp": "^3.0.0", "@npmcli/promise-spawn": "^7.0.0", "node-gyp": "^9.0.0", "read-package-json-fast": "^3.0.0", "which": "^4.0.0" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/@pkgjs/parseargs": { "version": "0.11.0", "dev": true, "inBundle": true, "license": "MIT", "optional": true, "engines": { "node": ">=14" } }, "node_modules/npm/node_modules/@sigstore/bundle": { "version": "2.1.0", "dev": true, "inBundle": true, "license": "Apache-2.0", "dependencies": { "@sigstore/protobuf-specs": "^0.2.1" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/@sigstore/protobuf-specs": { "version": "0.2.1", "dev": true, "inBundle": true, "license": "Apache-2.0", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm/node_modules/@sigstore/sign": { "version": "2.1.0", "dev": true, "inBundle": true, "license": "Apache-2.0", "dependencies": { "@sigstore/bundle": "^2.1.0", "@sigstore/protobuf-specs": "^0.2.1", "make-fetch-happen": "^13.0.0" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/@sigstore/tuf": { "version": "2.1.0", "dev": true, "inBundle": true, "license": "Apache-2.0", "dependencies": { "@sigstore/protobuf-specs": "^0.2.1", "tuf-js": "^2.1.0" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/@tootallnate/once": { "version": "2.0.0", "dev": true, "inBundle": true, "license": "MIT", "engines": { "node": ">= 10" } }, "node_modules/npm/node_modules/@tufjs/canonical-json": { "version": "2.0.0", "dev": true, "inBundle": true, "license": "MIT", "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/@tufjs/models": { "version": "2.0.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "@tufjs/canonical-json": "2.0.0", "minimatch": "^9.0.3" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/abbrev": { "version": "2.0.0", "dev": true, "inBundle": true, "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm/node_modules/abort-controller": { "version": "3.0.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "event-target-shim": "^5.0.0" }, "engines": { "node": ">=6.5" } }, "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.5.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "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/ansi-regex": { "version": "5.0.1", "dev": true, "inBundle": true, "license": "MIT", "engines": { "node": ">=8" } }, "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/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": "4.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "delegates": "^1.0.0", "readable-stream": "^4.1.0" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm/node_modules/balanced-match": { "version": "1.0.2", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/base64-js": { "version": "1.5.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/bin-links": { "version": "4.0.2", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "cmd-shim": "^6.0.0", "npm-normalize-package-bin": "^3.0.0", "read-cmd-shim": "^4.0.0", "write-file-atomic": "^5.0.0" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "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": "2.0.1", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/npm/node_modules/buffer": { "version": "6.0.3", "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", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "node_modules/npm/node_modules/builtins": { "version": "5.0.1", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "semver": "^7.0.0" } }, "node_modules/npm/node_modules/cacache": { "version": "18.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "@npmcli/fs": "^3.1.0", "fs-minipass": "^3.0.0", "glob": "^10.2.2", "lru-cache": "^10.0.1", "minipass": "^7.0.3", "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "p-map": "^4.0.0", "ssri": "^10.0.0", "tar": "^6.1.11", "unique-filename": "^3.0.0" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/chalk": { "version": "5.3.0", "dev": true, "inBundle": true, "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, "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/ci-info": { "version": "3.8.0", "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/sibiraj-s" } ], "inBundle": true, "license": "MIT", "engines": { "node": ">=8" } }, "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": "4.0.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "string-width": "^4.2.3", "strip-ansi": "^6.0.1" }, "engines": { "node": ">= 10" } }, "node_modules/npm/node_modules/cli-table3": { "version": "0.6.3", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "string-width": "^4.2.0" }, "engines": { "node": "10.* || >= 12.*" }, "optionalDependencies": { "@colors/colors": "1.5.0" } }, "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": "6.0.1", "dev": true, "inBundle": true, "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.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/columnify": { "version": "1.6.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "strip-ansi": "^6.0.1", "wcwidth": "^1.0.0" }, "engines": { "node": ">=8.0.0" } }, "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/cross-spawn": { "version": "7.0.3", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" }, "engines": { "node": ">= 8" } }, "node_modules/npm/node_modules/cross-spawn/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/cssesc": { "version": "3.0.0", "dev": true, "inBundle": true, "license": "MIT", "bin": { "cssesc": "bin/cssesc" }, "engines": { "node": ">=4" } }, "node_modules/npm/node_modules/debug": { "version": "4.3.4", "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/defaults": { "version": "1.0.4", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "clone": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/npm/node_modules/delegates": { "version": "1.0.0", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/diff": { "version": "5.1.0", "dev": true, "inBundle": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } }, "node_modules/npm/node_modules/eastasianwidth": { "version": "0.2.0", "dev": true, "inBundle": true, "license": "MIT" }, "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/event-target-shim": { "version": "5.0.1", "dev": true, "inBundle": true, "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/npm/node_modules/events": { "version": "3.3.0", "dev": true, "inBundle": true, "license": "MIT", "engines": { "node": ">=0.8.x" } }, "node_modules/npm/node_modules/exponential-backoff": { "version": "3.1.1", "dev": true, "inBundle": true, "license": "Apache-2.0" }, "node_modules/npm/node_modules/fastest-levenshtein": { "version": "1.0.16", "dev": true, "inBundle": true, "license": "MIT", "engines": { "node": ">= 4.9.1" } }, "node_modules/npm/node_modules/foreground-child": { "version": "3.1.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" }, "engines": { "node": ">=14" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/npm/node_modules/fs-minipass": { "version": "3.0.3", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "minipass": "^7.0.3" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "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": "5.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "aproba": "^1.0.3 || ^2.0.0", "color-support": "^1.1.3", "console-control-strings": "^1.1.0", "has-unicode": "^2.0.1", "signal-exit": "^4.0.1", "string-width": "^4.2.3", "strip-ansi": "^6.0.1", "wide-align": "^1.1.5" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm/node_modules/glob": { "version": "10.3.10", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^2.3.5", "minimatch": "^9.0.1", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", "path-scurry": "^1.10.1" }, "bin": { "glob": "dist/esm/bin.mjs" }, "engines": { "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/npm/node_modules/graceful-fs": { "version": "4.2.11", "dev": true, "inBundle": true, "license": "ISC" }, "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-unicode": { "version": "2.0.1", "dev": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/hosted-git-info": { "version": "7.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "lru-cache": "^10.0.1" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/http-cache-semantics": { "version": "4.1.1", "dev": true, "inBundle": true, "license": "BSD-2-Clause" }, "node_modules/npm/node_modules/http-proxy-agent": { "version": "5.0.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "@tootallnate/once": "2", "agent-base": "6", "debug": "4" }, "engines": { "node": ">= 6" } }, "node_modules/npm/node_modules/https-proxy-agent": { "version": "5.0.1", "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/ieee754": { "version": "1.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": "BSD-3-Clause" }, "node_modules/npm/node_modules/ignore-walk": { "version": "6.0.3", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "minimatch": "^9.0.0" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "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/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": "4.1.1", "dev": true, "inBundle": true, "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm/node_modules/init-package-json": { "version": "6.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "npm-package-arg": "^11.0.0", "promzard": "^1.0.0", "read": "^2.0.0", "read-package-json": "^7.0.0", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4", "validate-npm-package-name": "^5.0.0" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/ip": { "version": "2.0.0", "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.12.1", "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": "3.0.0", "dev": true, "inBundle": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/npm/node_modules/is-lambda": { "version": "1.0.1", "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/jackspeak": { "version": "2.3.6", "dev": true, "inBundle": true, "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, "engines": { "node": ">=14" }, "funding": { "url": "https://github.com/sponsors/isaacs" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "node_modules/npm/node_modules/json-parse-even-better-errors": { "version": "3.0.0", "dev": true, "inBundle": true, "license": "MIT", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "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/jsonparse": { "version": "1.3.1", "dev": true, "engines": [ "node >= 0.2.0" ], "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/just-diff": { "version": "6.0.2", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/just-diff-apply": { "version": "5.5.0", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/libnpmaccess": { "version": "8.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "npm-package-arg": "^11.0.1", "npm-registry-fetch": "^16.0.0" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/libnpmdiff": { "version": "6.0.2", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "@npmcli/arborist": "^7.2.0", "@npmcli/disparity-colors": "^3.0.0", "@npmcli/installed-package-contents": "^2.0.2", "binary-extensions": "^2.2.0", "diff": "^5.1.0", "minimatch": "^9.0.0", "npm-package-arg": "^11.0.1", "pacote": "^17.0.4", "tar": "^6.2.0" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/libnpmexec": { "version": "7.0.2", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "@npmcli/arborist": "^7.2.0", "@npmcli/run-script": "^7.0.1", "ci-info": "^3.7.1", "npm-package-arg": "^11.0.1", "npmlog": "^7.0.1", "pacote": "^17.0.4", "proc-log": "^3.0.0", "read": "^2.0.0", "read-package-json-fast": "^3.0.2", "semver": "^7.3.7", "walk-up-path": "^3.0.1" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/libnpmfund": { "version": "5.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "@npmcli/arborist": "^7.2.0" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/libnpmhook": { "version": "10.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "aproba": "^2.0.0", "npm-registry-fetch": "^16.0.0" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/libnpmorg": { "version": "6.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "aproba": "^2.0.0", "npm-registry-fetch": "^16.0.0" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/libnpmpack": { "version": "6.0.2", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "@npmcli/arborist": "^7.2.0", "@npmcli/run-script": "^7.0.1", "npm-package-arg": "^11.0.1", "pacote": "^17.0.4" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/libnpmpublish": { "version": "9.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "ci-info": "^3.6.1", "normalize-package-data": "^6.0.0", "npm-package-arg": "^11.0.1", "npm-registry-fetch": "^16.0.0", "proc-log": "^3.0.0", "semver": "^7.3.7", "sigstore": "^2.1.0", "ssri": "^10.0.5" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/libnpmsearch": { "version": "7.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "npm-registry-fetch": "^16.0.0" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/libnpmteam": { "version": "6.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "aproba": "^2.0.0", "npm-registry-fetch": "^16.0.0" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/libnpmversion": { "version": "5.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "@npmcli/git": "^5.0.3", "@npmcli/run-script": "^7.0.1", "json-parse-even-better-errors": "^3.0.0", "proc-log": "^3.0.0", "semver": "^7.3.7" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/lru-cache": { "version": "10.0.1", "dev": true, "inBundle": true, "license": "ISC", "engines": { "node": "14 || >=16.14" } }, "node_modules/npm/node_modules/make-fetch-happen": { "version": "13.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "@npmcli/agent": "^2.0.0", "cacache": "^18.0.0", "http-cache-semantics": "^4.1.1", "is-lambda": "^1.0.1", "minipass": "^7.0.2", "minipass-fetch": "^3.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^0.6.3", "promise-retry": "^2.0.1", "ssri": "^10.0.0" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/minimatch": { "version": "9.0.3", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, "engines": { "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/npm/node_modules/minipass": { "version": "7.0.4", "dev": true, "inBundle": true, "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } }, "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-collect/node_modules/minipass": { "version": "3.3.6", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/npm/node_modules/minipass-fetch": { "version": "3.0.4", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "minipass": "^7.0.3", "minipass-sized": "^1.0.3", "minizlib": "^2.1.2" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" }, "optionalDependencies": { "encoding": "^0.1.13" } }, "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-flush/node_modules/minipass": { "version": "3.3.6", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "yallist": "^4.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-json-stream/node_modules/minipass": { "version": "3.3.6", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, "engines": { "node": ">=8" } }, "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-pipeline/node_modules/minipass": { "version": "3.3.6", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "yallist": "^4.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/minipass-sized/node_modules/minipass": { "version": "3.3.6", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "yallist": "^4.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/minizlib/node_modules/minipass": { "version": "3.3.6", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "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/ms": { "version": "2.1.3", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/mute-stream": { "version": "1.0.0", "dev": true, "inBundle": true, "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm/node_modules/negotiator": { "version": "0.6.3", "dev": true, "inBundle": true, "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/npm/node_modules/node-gyp": { "version": "9.4.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", "glob": "^7.1.4", "graceful-fs": "^4.2.6", "make-fetch-happen": "^11.0.3", "nopt": "^6.0.0", "npmlog": "^6.0.0", "rimraf": "^3.0.2", "semver": "^7.3.5", "tar": "^6.1.2", "which": "^2.0.2" }, "bin": { "node-gyp": "bin/node-gyp.js" }, "engines": { "node": "^12.13 || ^14.13 || >=16" } }, "node_modules/npm/node_modules/node-gyp/node_modules/abbrev": { "version": "1.1.1", "dev": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/node-gyp/node_modules/are-we-there-yet": { "version": "3.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "delegates": "^1.0.0", "readable-stream": "^3.6.0" }, "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/npm/node_modules/node-gyp/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/node-gyp/node_modules/cacache": { "version": "17.1.4", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "@npmcli/fs": "^3.1.0", "fs-minipass": "^3.0.0", "glob": "^10.2.2", "lru-cache": "^7.7.1", "minipass": "^7.0.3", "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "p-map": "^4.0.0", "ssri": "^10.0.0", "tar": "^6.1.11", "unique-filename": "^3.0.0" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm/node_modules/node-gyp/node_modules/cacache/node_modules/brace-expansion": { "version": "2.0.1", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob": { "version": "10.3.3", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^2.0.3", "minimatch": "^9.0.1", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", "path-scurry": "^1.10.1" }, "bin": { "glob": "dist/cjs/src/bin.js" }, "engines": { "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minimatch": { "version": "9.0.3", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, "engines": { "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minipass": { "version": "7.0.3", "dev": true, "inBundle": true, "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } }, "node_modules/npm/node_modules/node-gyp/node_modules/gauge": { "version": "4.0.4", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "aproba": "^1.0.3 || ^2.0.0", "color-support": "^1.1.3", "console-control-strings": "^1.1.0", "has-unicode": "^2.0.1", "signal-exit": "^3.0.7", "string-width": "^4.2.3", "strip-ansi": "^6.0.1", "wide-align": "^1.1.5" }, "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/npm/node_modules/node-gyp/node_modules/glob": { "version": "7.2.3", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" }, "engines": { "node": "*" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/npm/node_modules/node-gyp/node_modules/lru-cache": { "version": "7.18.3", "dev": true, "inBundle": true, "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/npm/node_modules/node-gyp/node_modules/make-fetch-happen": { "version": "11.1.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "agentkeepalive": "^4.2.1", "cacache": "^17.0.0", "http-cache-semantics": "^4.1.1", "http-proxy-agent": "^5.0.0", "https-proxy-agent": "^5.0.0", "is-lambda": "^1.0.1", "lru-cache": "^7.7.1", "minipass": "^5.0.0", "minipass-fetch": "^3.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^0.6.3", "promise-retry": "^2.0.1", "socks-proxy-agent": "^7.0.0", "ssri": "^10.0.0" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm/node_modules/node-gyp/node_modules/minimatch": { "version": "3.1.2", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, "engines": { "node": "*" } }, "node_modules/npm/node_modules/node-gyp/node_modules/minipass": { "version": "5.0.0", "dev": true, "inBundle": true, "license": "ISC", "engines": { "node": ">=8" } }, "node_modules/npm/node_modules/node-gyp/node_modules/nopt": { "version": "6.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "abbrev": "^1.0.0" }, "bin": { "nopt": "bin/nopt.js" }, "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/npm/node_modules/node-gyp/node_modules/npmlog": { "version": "6.0.2", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "are-we-there-yet": "^3.0.0", "console-control-strings": "^1.1.0", "gauge": "^4.0.3", "set-blocking": "^2.0.0" }, "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/npm/node_modules/node-gyp/node_modules/readable-stream": { "version": "3.6.2", "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/node-gyp/node_modules/signal-exit": { "version": "3.0.7", "dev": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/node-gyp/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/nopt": { "version": "7.2.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "abbrev": "^2.0.0" }, "bin": { "nopt": "bin/nopt.js" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm/node_modules/normalize-package-data": { "version": "6.0.0", "dev": true, "inBundle": true, "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^7.0.0", "is-core-module": "^2.8.1", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/npm-audit-report": { "version": "5.0.0", "dev": true, "inBundle": true, "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm/node_modules/npm-bundled": { "version": "3.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "npm-normalize-package-bin": "^3.0.0" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm/node_modules/npm-install-checks": { "version": "6.2.0", "dev": true, "inBundle": true, "license": "BSD-2-Clause", "dependencies": { "semver": "^7.1.1" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm/node_modules/npm-normalize-package-bin": { "version": "3.0.1", "dev": true, "inBundle": true, "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm/node_modules/npm-package-arg": { "version": "11.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "hosted-git-info": "^7.0.0", "proc-log": "^3.0.0", "semver": "^7.3.5", "validate-npm-package-name": "^5.0.0" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/npm-packlist": { "version": "8.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "ignore-walk": "^6.0.0" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm/node_modules/npm-pick-manifest": { "version": "9.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "npm-install-checks": "^6.0.0", "npm-normalize-package-bin": "^3.0.0", "npm-package-arg": "^11.0.0", "semver": "^7.3.5" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/npm-profile": { "version": "9.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "npm-registry-fetch": "^16.0.0", "proc-log": "^3.0.0" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/npm-registry-fetch": { "version": "16.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "make-fetch-happen": "^13.0.0", "minipass": "^7.0.2", "minipass-fetch": "^3.0.0", "minipass-json-stream": "^1.0.1", "minizlib": "^2.1.2", "npm-package-arg": "^11.0.0", "proc-log": "^3.0.0" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/npm-user-validate": { "version": "2.0.0", "dev": true, "inBundle": true, "license": "BSD-2-Clause", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm/node_modules/npmlog": { "version": "7.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "are-we-there-yet": "^4.0.0", "console-control-strings": "^1.1.0", "gauge": "^5.0.0", "set-blocking": "^2.0.0" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.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/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": "17.0.4", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "@npmcli/git": "^5.0.0", "@npmcli/installed-package-contents": "^2.0.1", "@npmcli/promise-spawn": "^7.0.0", "@npmcli/run-script": "^7.0.0", "cacache": "^18.0.0", "fs-minipass": "^3.0.0", "minipass": "^7.0.2", "npm-package-arg": "^11.0.0", "npm-packlist": "^8.0.0", "npm-pick-manifest": "^9.0.0", "npm-registry-fetch": "^16.0.0", "proc-log": "^3.0.0", "promise-retry": "^2.0.1", "read-package-json": "^7.0.0", "read-package-json-fast": "^3.0.0", "sigstore": "^2.0.0", "ssri": "^10.0.0", "tar": "^6.1.11" }, "bin": { "pacote": "lib/bin.js" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/parse-conflict-json": { "version": "3.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "json-parse-even-better-errors": "^3.0.0", "just-diff": "^6.0.0", "just-diff-apply": "^5.2.0" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.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/path-key": { "version": "3.1.1", "dev": true, "inBundle": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/npm/node_modules/path-scurry": { "version": "1.10.1", "dev": true, "inBundle": true, "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^9.1.1 || ^10.0.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/npm/node_modules/postcss-selector-parser": { "version": "6.0.13", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" }, "engines": { "node": ">=4" } }, "node_modules/npm/node_modules/proc-log": { "version": "3.0.0", "dev": true, "inBundle": true, "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm/node_modules/process": { "version": "0.11.10", "dev": true, "inBundle": true, "license": "MIT", "engines": { "node": ">= 0.6.0" } }, "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.2", "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": "1.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "read": "^2.0.0" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "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/read": { "version": "2.1.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "mute-stream": "~1.0.0" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm/node_modules/read-cmd-shim": { "version": "4.0.0", "dev": true, "inBundle": true, "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm/node_modules/read-package-json": { "version": "7.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "glob": "^10.2.2", "json-parse-even-better-errors": "^3.0.0", "normalize-package-data": "^6.0.0", "npm-normalize-package-bin": "^3.0.0" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/read-package-json-fast": { "version": "3.0.2", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "json-parse-even-better-errors": "^3.0.0", "npm-normalize-package-bin": "^3.0.0" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm/node_modules/readable-stream": { "version": "4.4.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", "events": "^3.3.0", "process": "^0.11.10" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "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/rimraf/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/rimraf/node_modules/glob": { "version": "7.2.3", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" }, "engines": { "node": "*" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/npm/node_modules/rimraf/node_modules/minimatch": { "version": "3.1.2", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, "engines": { "node": "*" } }, "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", "optional": true }, "node_modules/npm/node_modules/semver": { "version": "7.5.4", "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/semver/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/set-blocking": { "version": "2.0.0", "dev": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/shebang-command": { "version": "2.0.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, "engines": { "node": ">=8" } }, "node_modules/npm/node_modules/shebang-regex": { "version": "3.0.0", "dev": true, "inBundle": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/npm/node_modules/signal-exit": { "version": "4.0.2", "dev": true, "inBundle": true, "license": "ISC", "engines": { "node": ">=14" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/npm/node_modules/sigstore": { "version": "2.1.0", "dev": true, "inBundle": true, "license": "Apache-2.0", "dependencies": { "@sigstore/bundle": "^2.1.0", "@sigstore/protobuf-specs": "^0.2.1", "@sigstore/sign": "^2.1.0", "@sigstore/tuf": "^2.1.0" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "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.7.1", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "ip": "^2.0.0", "smart-buffer": "^4.2.0" }, "engines": { "node": ">= 10.13.0", "npm": ">= 3.0.0" } }, "node_modules/npm/node_modules/socks-proxy-agent": { "version": "7.0.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "agent-base": "^6.0.2", "debug": "^4.3.3", "socks": "^2.6.2" }, "engines": { "node": ">= 10" } }, "node_modules/npm/node_modules/spdx-correct": { "version": "3.2.0", "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.13", "dev": true, "inBundle": true, "license": "CC0-1.0" }, "node_modules/npm/node_modules/ssri": { "version": "10.0.5", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "minipass": "^7.0.3" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "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": "4.2.3", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" } }, "node_modules/npm/node_modules/string-width-cjs": { "name": "string-width", "version": "4.2.3", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" } }, "node_modules/npm/node_modules/strip-ansi": { "version": "6.0.1", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" } }, "node_modules/npm/node_modules/strip-ansi-cjs": { "name": "strip-ansi", "version": "6.0.1", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" } }, "node_modules/npm/node_modules/supports-color": { "version": "9.4.0", "dev": true, "inBundle": true, "license": "MIT", "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/npm/node_modules/tar": { "version": "6.2.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" }, "engines": { "node": ">=10" } }, "node_modules/npm/node_modules/tar/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/tar/node_modules/fs-minipass/node_modules/minipass": { "version": "3.3.6", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/npm/node_modules/tar/node_modules/minipass": { "version": "5.0.0", "dev": true, "inBundle": true, "license": "ISC", "engines": { "node": ">=8" } }, "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": "3.0.0", "dev": true, "inBundle": true, "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm/node_modules/tuf-js": { "version": "2.1.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "@tufjs/models": "2.0.0", "debug": "^4.3.4", "make-fetch-happen": "^13.0.0" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/unique-filename": { "version": "3.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "unique-slug": "^4.0.0" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm/node_modules/unique-slug": { "version": "4.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm/node_modules/util-deprecate": { "version": "1.0.2", "dev": true, "inBundle": true, "license": "MIT" }, "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": "5.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "builtins": "^5.0.0" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm/node_modules/walk-up-path": { "version": "3.0.1", "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": "4.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" }, "engines": { "node": "^16.13.0 || >=18.0.0" } }, "node_modules/npm/node_modules/which/node_modules/isexe": { "version": "3.1.1", "dev": true, "inBundle": true, "license": "ISC", "engines": { "node": ">=16" } }, "node_modules/npm/node_modules/wide-align": { "version": "1.1.5", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "string-width": "^1.0.2 || 2 || 3 || 4" } }, "node_modules/npm/node_modules/wrap-ansi": { "version": "8.1.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" }, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/npm/node_modules/wrap-ansi-cjs": { "name": "wrap-ansi", "version": "7.0.0", "dev": true, "inBundle": true, "license": "MIT", "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/npm/node_modules/wrap-ansi/node_modules/ansi-regex": { "version": "6.0.1", "dev": true, "inBundle": true, "license": "MIT", "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, "node_modules/npm/node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "6.2.1", "dev": true, "inBundle": true, "license": "MIT", "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/npm/node_modules/wrap-ansi/node_modules/emoji-regex": { "version": "9.2.2", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/wrap-ansi/node_modules/string-width": { "version": "5.1.2", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" }, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/npm/node_modules/wrap-ansi/node_modules/strip-ansi": { "version": "7.1.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "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": "5.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^4.0.1" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "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, "optional": true, "dependencies": { "are-we-there-yet": "~1.1.2", "console-control-strings": "~1.1.0", "gauge": "~2.7.3", "set-blocking": "~2.0.0" } }, "node_modules/number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", "dev": true, "optional": 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": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "dev": true, "optional": true, "engines": { "node": ">=0.10.0" } }, "node_modules/object-inspect": { "version": "1.12.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", "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.4", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object.fromentries": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object.groupby": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", "es-abstract": "^1.22.1", "get-intrinsic": "^1.2.1" } }, "node_modules/object.values": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", "es-abstract": "^1.22.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": "6.0.0", "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, "dependencies": { "mimic-fn": "^4.0.0" }, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/optionator": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "dependencies": { "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0" }, "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": "3.0.0", "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-3.0.0.tgz", "integrity": "sha512-lastgtAdoH9YaLyDa5i5z64q+kzOcQHsQ5SsZJD3q0VEyI8mq872S3geuNbRUQLVAE9siMfgKrpj7MloKFHruw==", "dev": true, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-filter": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-3.0.0.tgz", "integrity": "sha512-QtoWLjXAW++uTX67HZQz1dbTpqBfiidsB6VtQUC9iR85S120+s0T5sO6s+B5MLzFcZkrEd/DGMmCjR+f2Qpxwg==", "dev": true, "dependencies": { "p-map": "^5.1.0" }, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-filter/node_modules/aggregate-error": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", "dev": true, "dependencies": { "clean-stack": "^4.0.0", "indent-string": "^5.0.0" }, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-filter/node_modules/clean-stack": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", "dev": true, "dependencies": { "escape-string-regexp": "5.0.0" }, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-filter/node_modules/escape-string-regexp": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-filter/node_modules/indent-string": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "dev": true, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-filter/node_modules/p-map": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz", "integrity": "sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==", "dev": true, "dependencies": { "aggregate-error": "^4.0.0" }, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "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": "3.0.0", "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-3.0.0.tgz", "integrity": "sha512-xsrIUgI0Kn6iyDYm9StOpOeK29XM1aboGji26+QEortiFST1hGZaUQOLhtEbqHErPpGW/aSz6allwK2qcptp0Q==", "dev": true, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "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": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", "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/pirates": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", "dev": true, "engines": { "node": ">= 6" } }, "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": "3.2.4", "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.4.tgz", "integrity": "sha512-FWu1oLHKCrtpO1ypU6J0SbK2d9Ckwysq6bHj/uaCP26DxrPpppCLQRGVuqAxSTvhF00AcvDRyYrLNW7ocBhFFQ==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" }, "engines": { "node": ">=14" }, "funding": { "url": "https://github.com/prettier/prettier?sponsor=1" } }, "node_modules/pretty-format": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/pretty-format/node_modules/ansi-styles": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "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/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "dev": true, "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" }, "engines": { "node": ">= 6" } }, "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/proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", "dev": true }, "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.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", "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/pure-rand": { "version": "6.0.4", "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==", "dev": true, "funding": [ { "type": "individual", "url": "https://github.com/sponsors/dubzzz" }, { "type": "opencollective", "url": "https://opencollective.com/fast-check" } ] }, "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/rambda": { "version": "7.5.0", "resolved": "https://registry.npmjs.org/rambda/-/rambda-7.5.0.tgz", "integrity": "sha512-y/M9weqWAH4iopRd7EHDEQQvpFPHj1AA3oHozE9tfITHUtTR7Z9PSlIRRG2l1GuW7sefC1cXFfIcF+cgnShdBA==", "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/react-is": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", "dev": true }, "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": "10.1.0", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-10.1.0.tgz", "integrity": "sha512-aNtBq4jR8NawpKJQldrQcSW9y/d+KWH4v24HWkHljOZ7H0av+YTGANBzRh9A5pw7v/bLVsLVPpOhJ7gHNVy8lA==", "dev": true, "dependencies": { "find-up": "^6.3.0", "read-pkg": "^8.1.0", "type-fest": "^4.2.0" }, "engines": { "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/read-pkg-up/node_modules/find-up": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", "dev": true, "dependencies": { "locate-path": "^7.1.0", "path-exists": "^5.0.0" }, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/read-pkg-up/node_modules/hosted-git-info": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.1.tgz", "integrity": "sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==", "dev": true, "dependencies": { "lru-cache": "^10.0.1" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/read-pkg-up/node_modules/hosted-git-info/node_modules/lru-cache": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", "dev": true, "engines": { "node": "14 || >=16.14" } }, "node_modules/read-pkg-up/node_modules/json-parse-even-better-errors": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", "dev": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/read-pkg-up/node_modules/lines-and-columns": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.3.tgz", "integrity": "sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==", "dev": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, "node_modules/read-pkg-up/node_modules/locate-path": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", "dev": true, "dependencies": { "p-locate": "^6.0.0" }, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/read-pkg-up/node_modules/normalize-package-data": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.0.tgz", "integrity": "sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==", "dev": true, "dependencies": { "hosted-git-info": "^7.0.0", "is-core-module": "^2.8.1", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/read-pkg-up/node_modules/p-limit": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", "dev": true, "dependencies": { "yocto-queue": "^1.0.0" }, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/read-pkg-up/node_modules/p-locate": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", "dev": true, "dependencies": { "p-limit": "^4.0.0" }, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/read-pkg-up/node_modules/parse-json": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-7.1.0.tgz", "integrity": "sha512-ihtdrgbqdONYD156Ap6qTcaGcGdkdAxodO1wLqQ/j7HP1u2sFYppINiq4jyC8F+Nm+4fVufylCV00QmkTHkSUg==", "dev": true, "dependencies": { "@babel/code-frame": "^7.21.4", "error-ex": "^1.3.2", "json-parse-even-better-errors": "^3.0.0", "lines-and-columns": "^2.0.3", "type-fest": "^3.8.0" }, "engines": { "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/read-pkg-up/node_modules/parse-json/node_modules/type-fest": { "version": "3.13.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", "dev": true, "engines": { "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/read-pkg-up/node_modules/path-exists": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", "dev": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, "node_modules/read-pkg-up/node_modules/read-pkg": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-8.1.0.tgz", "integrity": "sha512-PORM8AgzXeskHO/WEv312k9U03B8K9JSiWF/8N9sUuFjBa+9SF2u6K7VClzXwDXab51jCd8Nd36CNM+zR97ScQ==", "dev": true, "dependencies": { "@types/normalize-package-data": "^2.4.1", "normalize-package-data": "^6.0.0", "parse-json": "^7.0.0", "type-fest": "^4.2.0" }, "engines": { "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/read-pkg-up/node_modules/semver": { "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, "node_modules/read-pkg-up/node_modules/type-fest": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.5.0.tgz", "integrity": "sha512-diLQivFzddJl4ylL3jxSkEc39Tpw7o1QeEHIPxVwryDK2lpB7Nqhzhuo6v5/Ls08Z0yPSAhsyAWlv1/H0ciNmw==", "dev": true, "engines": { "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/read-pkg-up/node_modules/yocto-queue": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", "dev": true, "engines": { "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "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/redeyed": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", "integrity": "sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==", "dev": true, "dependencies": { "esprima": "~4.0.0" } }, "node_modules/regexp.prototype.flags": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "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": "5.0.2", "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", "dev": true, "dependencies": { "@pnpm/npm-conf": "^2.1.0" }, "engines": { "node": ">=14" } }, "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.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, "dependencies": { "is-core-module": "^2.13.0", "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-cwd": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, "dependencies": { "resolve-from": "^5.0.0" }, "engines": { "node": ">=8" } }, "node_modules/resolve-cwd/node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/resolve-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/resolve.exports": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", "dev": true, "engines": { "node": ">=10" } }, "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": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", "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-array-concat": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.0", "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, "engines": { "node": ">=0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/safe-array-concat/node_modules/isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true }, "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/safe-regex-test": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.3", "is-regex": "^1.1.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "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": "22.0.6", "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-22.0.6.tgz", "integrity": "sha512-SxgpGR6b52gaKrb42nnaZWa2h5ig06XlloS3NjUN4W/lRBB8SId4JMaZaxN6Ncb+Ii2Uxd8WO6uvshTSSf8XRg==", "dev": true, "dependencies": { "@semantic-release/commit-analyzer": "^11.0.0", "@semantic-release/error": "^4.0.0", "@semantic-release/github": "^9.0.0", "@semantic-release/npm": "^11.0.0", "@semantic-release/release-notes-generator": "^12.0.0", "aggregate-error": "^5.0.0", "cosmiconfig": "^8.0.0", "debug": "^4.0.0", "env-ci": "^10.0.0", "execa": "^8.0.0", "figures": "^6.0.0", "find-versions": "^5.1.0", "get-stream": "^6.0.0", "git-log-parser": "^1.2.0", "hook-std": "^3.0.0", "hosted-git-info": "^7.0.0", "lodash-es": "^4.17.21", "marked": "^9.0.0", "marked-terminal": "^6.0.0", "micromatch": "^4.0.2", "p-each-series": "^3.0.0", "p-reduce": "^3.0.0", "read-pkg-up": "^10.0.0", "resolve-from": "^5.0.0", "semver": "^7.3.2", "semver-diff": "^4.0.0", "signale": "^1.2.1", "yargs": "^17.5.1" }, "bin": { "semantic-release": "bin/semantic-release.js" }, "engines": { "node": "^18.17 || >=20.6.1" } }, "node_modules/semantic-release/node_modules/aggregate-error": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-5.0.0.tgz", "integrity": "sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==", "dev": true, "dependencies": { "clean-stack": "^5.2.0", "indent-string": "^5.0.0" }, "engines": { "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/semantic-release/node_modules/clean-stack": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-5.2.0.tgz", "integrity": "sha512-TyUIUJgdFnCISzG5zu3291TAsE77ddchd0bepon1VVQrKLGKFED4iXFEDQ24mIPdPBbyE16PK3F8MYE1CmcBEQ==", "dev": true, "dependencies": { "escape-string-regexp": "5.0.0" }, "engines": { "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/semantic-release/node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" }, "engines": { "node": ">=12" } }, "node_modules/semantic-release/node_modules/escape-string-regexp": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "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/hosted-git-info": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.1.tgz", "integrity": "sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==", "dev": true, "dependencies": { "lru-cache": "^10.0.1" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/semantic-release/node_modules/hosted-git-info/node_modules/lru-cache": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", "dev": true, "engines": { "node": "14 || >=16.14" } }, "node_modules/semantic-release/node_modules/indent-string": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "dev": true, "engines": { "node": ">=12" }, "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": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" }, "engines": { "node": ">=12" } }, "node_modules/semantic-release/node_modules/yargs-parser": { "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, "engines": { "node": ">=12" } }, "node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/semver-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", "dev": true, "dependencies": { "semver": "^7.3.5" }, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/semver-diff/node_modules/semver": { "version": "7.5.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, "node_modules/semver-regex": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-4.0.5.tgz", "integrity": "sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==", "dev": true, "engines": { "node": ">=12" }, "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.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "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": "15.2.0", "resolved": "https://registry.npmjs.org/sinon/-/sinon-15.2.0.tgz", "integrity": "sha512-nPS85arNqwBXaIsFCkolHjGIkFo+Oxu9vbgmBJizLAhqe6P2o3Qmj3KCUoRkfhHtvgDhZdWD3risLHAUJ8npjw==", "dev": true, "dependencies": { "@sinonjs/commons": "^3.0.0", "@sinonjs/fake-timers": "^10.3.0", "@sinonjs/samsam": "^8.0.0", "diff": "^5.1.0", "nise": "^5.1.4", "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/sinon/node_modules/@sinonjs/commons": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", "dev": true, "dependencies": { "type-detect": "4.0.8" } }, "node_modules/sinon/node_modules/@sinonjs/fake-timers": { "version": "10.3.0", "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, "dependencies": { "@sinonjs/commons": "^3.0.0" } }, "node_modules/sinon/node_modules/diff": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", "dev": true, "engines": { "node": ">=0.3.1" } }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", "dev": true }, "node_modules/skin-tone": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", "dev": true, "dependencies": { "unicode-emoji-modifier-base": "^1.0.0" }, "engines": { "node": ">=8" } }, "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": "sha512-NwrtjCg+lZoqhFU8fOwl4ay2ei8PaqCBOUV3/ektPY9trO1yQ1oXEfmHAhKArUVUr/hOHvy5f6AdP17dCM0zMw==", "dev": true, "engines": { "node": "*" } }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/source-map-support": { "version": "0.5.13", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.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/split2": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", "dev": true, "engines": { "node": ">= 10.x" } }, "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/stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, "dependencies": { "escape-string-regexp": "^2.0.0" }, "engines": { "node": ">=10" } }, "node_modules/stack-utils/node_modules/escape-string-regexp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/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-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, "dependencies": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" }, "engines": { "node": ">=10" } }, "node_modules/string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", "dev": true, "optional": true, "dependencies": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", "strip-ansi": "^3.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/string-width/node_modules/ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "dev": true, "optional": 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": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "dev": true, "optional": 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.trim": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimend": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4" }, "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": "3.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "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": "3.0.0", "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.0.0.tgz", "integrity": "sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==", "dev": true, "dependencies": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" }, "engines": { "node": ">=14.18" } }, "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": "6.1.15", "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", "dev": true, "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" }, "engines": { "node": ">=10" } }, "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/tar/node_modules/minipass": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/tar/node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, "bin": { "mkdirp": "bin/cmd.js" }, "engines": { "node": ">=10" } }, "node_modules/temp-dir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-3.0.0.tgz", "integrity": "sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==", "dev": true, "engines": { "node": ">=14.16" } }, "node_modules/tempy": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/tempy/-/tempy-3.1.0.tgz", "integrity": "sha512-7jDLIdD2Zp0bDe5r3D2qtkd1QOCacylBuL7oa4udvN6v2pqr4+LcCr67C8DR1zkpaZ8XosF5m1yQSabKAW6f2g==", "dev": true, "dependencies": { "is-stream": "^3.0.0", "temp-dir": "^3.0.0", "type-fest": "^2.12.2", "unique-string": "^3.0.0" }, "engines": { "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/tempy/node_modules/is-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/tempy/node_modules/type-fest": { "version": "2.19.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "dev": true, "engines": { "node": ">=12.20" }, "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": "2.4.0", "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-2.4.0.tgz", "integrity": "sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==", "dev": true, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "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": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "dev": true }, "node_modules/tmp": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", "dev": true, "dependencies": { "rimraf": "^3.0.0" }, "engines": { "node": ">=8.17.0" } }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", "dev": true, "engines": { "node": ">=4" } }, "node_modules/to-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": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "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/tsconfig-paths": { "version": "3.15.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "node_modules/tsconfig-paths/node_modules/json5": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "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": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "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": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "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": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", "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/typed-array-buffer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.1", "is-typed-array": "^1.1.10" }, "engines": { "node": ">= 0.4" } }, "node_modules/typed-array-byte-length": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "for-each": "^0.3.3", "has-proto": "^1.0.1", "is-typed-array": "^1.1.10" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/typed-array-byte-offset": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", "dev": true, "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "for-each": "^0.3.3", "has-proto": "^1.0.1", "is-typed-array": "^1.1.10" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/typed-array-length": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "for-each": "^0.3.3", "is-typed-array": "^1.1.9" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", "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": "5.3.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { "node": ">=14.17" } }, "node_modules/uglify-js": { "version": "3.17.4", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", "dev": true, "optional": true, "bin": { "uglifyjs": "bin/uglifyjs" }, "engines": { "node": ">=0.8.0" } }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "has-bigints": "^1.0.2", "has-symbols": "^1.0.3", "which-boxed-primitive": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/unicode-emoji-modifier-base": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/unique-string": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", "dev": true, "dependencies": { "crypto-random-string": "^4.0.0" }, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "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": "5.0.0", "resolved": "https://registry.npmjs.org/url-join/-/url-join-5.0.0.tgz", "integrity": "sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==", "dev": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, "node_modules/uuid": { "version": "3.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-to-istanbul": { "version": "9.2.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", "convert-source-map": "^2.0.0" }, "engines": { "node": ">=10.12.0" } }, "node_modules/v8-to-istanbul/node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "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": "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==", "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": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", "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/walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, "dependencies": { "makeerror": "1.0.12" } }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", "dev": true }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "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/which-typed-array": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", "dev": true, "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "for-each": "^0.3.3", "gopd": "^1.0.1", "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "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, "optional": true, "dependencies": { "string-width": "^1.0.2 || 2 || 3 || 4" } }, "node_modules/wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", "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/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": { "@aashutoshrathi/word-wrap": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", "dev": true }, "@ampproject/remapping": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", "dev": true, "requires": { "@jridgewell/trace-mapping": "^0.3.0" } }, "@babel/code-frame": { "version": "7.22.13", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, "requires": { "@babel/highlight": "^7.22.13", "chalk": "^2.4.2" }, "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": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "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": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "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/compat-data": { "version": "7.17.7", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.7.tgz", "integrity": "sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==", "dev": true }, "@babel/core": { "version": "7.17.8", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.8.tgz", "integrity": "sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ==", "dev": true, "requires": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.16.7", "@babel/generator": "^7.17.7", "@babel/helper-compilation-targets": "^7.17.7", "@babel/helper-module-transforms": "^7.17.7", "@babel/helpers": "^7.17.8", "@babel/parser": "^7.17.8", "@babel/template": "^7.16.7", "@babel/traverse": "^7.17.3", "@babel/types": "^7.17.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.1.2", "semver": "^6.3.0" } }, "@babel/generator": { "version": "7.23.0", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dev": true, "requires": { "@babel/types": "^7.23.0", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" } }, "@babel/helper-compilation-targets": { "version": "7.17.7", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz", "integrity": "sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==", "dev": true, "requires": { "@babel/compat-data": "^7.17.7", "@babel/helper-validator-option": "^7.16.7", "browserslist": "^4.17.5", "semver": "^6.3.0" } }, "@babel/helper-environment-visitor": { "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true }, "@babel/helper-function-name": { "version": "7.23.0", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "requires": { "@babel/template": "^7.22.15", "@babel/types": "^7.23.0" } }, "@babel/helper-hoist-variables": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, "requires": { "@babel/types": "^7.22.5" } }, "@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.17.7", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.16.7", "@babel/helper-module-imports": "^7.16.7", "@babel/helper-simple-access": "^7.17.7", "@babel/helper-split-export-declaration": "^7.16.7", "@babel/helper-validator-identifier": "^7.16.7", "@babel/template": "^7.16.7", "@babel/traverse": "^7.17.3", "@babel/types": "^7.17.0" } }, "@babel/helper-plugin-utils": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", "dev": true }, "@babel/helper-simple-access": { "version": "7.17.7", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", "dev": true, "requires": { "@babel/types": "^7.17.0" } }, "@babel/helper-split-export-declaration": { "version": "7.22.6", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "requires": { "@babel/types": "^7.22.5" } }, "@babel/helper-string-parser": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", "dev": true }, "@babel/helper-validator-identifier": { "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "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.17.8", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.8.tgz", "integrity": "sha512-QcL86FGxpfSJwGtAvv4iG93UL6bmqBdmoVY0CMCU2g+oD2ezQse3PT5Pa+jiD6LJndBQi0EDlpzOWNlLuhz5gw==", "dev": true, "requires": { "@babel/template": "^7.16.7", "@babel/traverse": "^7.17.3", "@babel/types": "^7.17.0" } }, "@babel/highlight": { "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", "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": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "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": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "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.23.0", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", "dev": true }, "@babel/plugin-syntax-async-generators": { "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-bigint": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-class-properties": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-syntax-import-meta": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-json-strings": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-jsx": { "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-numeric-separator": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-top-level-await": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-syntax-typescript": { "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/template": { "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "requires": { "@babel/code-frame": "^7.22.13", "@babel/parser": "^7.22.15", "@babel/types": "^7.22.15" } }, "@babel/traverse": { "version": "7.23.2", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", "dev": true, "requires": { "@babel/code-frame": "^7.22.13", "@babel/generator": "^7.23.0", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", "@babel/parser": "^7.23.0", "@babel/types": "^7.23.0", "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.23.0", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "dev": true, "requires": { "@babel/helper-string-parser": "^7.22.5", "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" } }, "@bcoe/v8-coverage": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, "@colors/colors": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", "dev": true, "optional": true }, "@definitelytyped/dts-critic": { "version": "0.0.163", "resolved": "https://registry.npmjs.org/@definitelytyped/dts-critic/-/dts-critic-0.0.163.tgz", "integrity": "sha512-HsTvylj8x2gQaawsOCcN2Xk2Cx0wgV9kaj83hgsO9SITZSPd7dA0UkHyNRadbMkMwqNDKcnizcmWdz0+0gIo8A==", "dev": true, "requires": { "@definitelytyped/header-parser": "^0.0.163", "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.163", "resolved": "https://registry.npmjs.org/@definitelytyped/dtslint/-/dtslint-0.0.163.tgz", "integrity": "sha512-U0uw7Zu0QdYSuBMYgxvRYjkhkeulTEg8vDgJ7TiYQUv/wODeujSAmGahQn51E5hOlSMYUw7A9utdbUukxE02SQ==", "dev": true, "requires": { "@definitelytyped/dts-critic": "^0.0.163", "@definitelytyped/header-parser": "^0.0.163", "@definitelytyped/typescript-versions": "^0.0.163", "@definitelytyped/utils": "^0.0.163", "@typescript-eslint/eslint-plugin": "^5.55.0", "@typescript-eslint/parser": "^5.55.0", "@typescript-eslint/types": "^5.56.0", "@typescript-eslint/typescript-estree": "^5.55.0", "@typescript-eslint/utils": "^5.55.0", "eslint": "^8.17.0", "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.163", "resolved": "https://registry.npmjs.org/@definitelytyped/header-parser/-/header-parser-0.0.163.tgz", "integrity": "sha512-Jr+/q+ESfc7uWldz/j11BfpjIN/gB4WmwhFENhWaMwM0W/9p0ShF+OiUqGhk2Q3Iz8v/oyWzSsxyxgasg9kCxQ==", "dev": true, "requires": { "@definitelytyped/typescript-versions": "^0.0.163", "@types/parsimmon": "^1.10.1", "parsimmon": "^1.13.0" } }, "@definitelytyped/typescript-versions": { "version": "0.0.163", "resolved": "https://registry.npmjs.org/@definitelytyped/typescript-versions/-/typescript-versions-0.0.163.tgz", "integrity": "sha512-+GWtJhC+7UaCUnJ+ZkA7bfGuPd6ZbJKEjbHqh76/gOXsqAUOMEa49ufsLlIPUbkEeQlnDNoTHCegE5X/Q+u+/A==", "dev": true }, "@definitelytyped/utils": { "version": "0.0.163", "resolved": "https://registry.npmjs.org/@definitelytyped/utils/-/utils-0.0.163.tgz", "integrity": "sha512-6MX5TxaQbG/j2RkCWbcbLvv+YNipKqY0eQJafDhwC/RprUocpg+uYVNlH8XzdKRWOGJ0pq7SZOsJD4C3A01ZXg==", "dev": true, "requires": { "@definitelytyped/typescript-versions": "^0.0.163", "@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": "^6.1.11", "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-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "dev": true, "requires": { "eslint-visitor-keys": "^3.3.0" } }, "@eslint-community/regexpp": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", "dev": true }, "@eslint/eslintrc": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" }, "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/js": { "version": "8.56.0", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", "dev": true }, "@humanwhocodes/config-array": { "version": "0.11.13", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", "dev": true, "requires": { "@humanwhocodes/object-schema": "^2.0.1", "debug": "^4.1.1", "minimatch": "^3.0.5" } }, "@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true }, "@humanwhocodes/object-schema": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", "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 }, "@jest/console": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, "requires": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "jest-message-util": "^29.7.0", "jest-util": "^29.7.0", "slash": "^3.0.0" } }, "@jest/core": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, "requires": { "@jest/console": "^29.7.0", "@jest/reporters": "^29.7.0", "@jest/test-result": "^29.7.0", "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", "jest-changed-files": "^29.7.0", "jest-config": "^29.7.0", "jest-haste-map": "^29.7.0", "jest-message-util": "^29.7.0", "jest-regex-util": "^29.6.3", "jest-resolve": "^29.7.0", "jest-resolve-dependencies": "^29.7.0", "jest-runner": "^29.7.0", "jest-runtime": "^29.7.0", "jest-snapshot": "^29.7.0", "jest-util": "^29.7.0", "jest-validate": "^29.7.0", "jest-watcher": "^29.7.0", "micromatch": "^4.0.4", "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, "dependencies": { "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" } }, "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 } } }, "@jest/environment": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, "requires": { "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "jest-mock": "^29.7.0" } }, "@jest/expect": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, "requires": { "expect": "^29.7.0", "jest-snapshot": "^29.7.0" } }, "@jest/expect-utils": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, "requires": { "jest-get-type": "^29.6.3" } }, "@jest/fake-timers": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, "requires": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", "jest-message-util": "^29.7.0", "jest-mock": "^29.7.0", "jest-util": "^29.7.0" }, "dependencies": { "@sinonjs/commons": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, "requires": { "type-detect": "4.0.8" } }, "@sinonjs/fake-timers": { "version": "10.3.0", "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, "requires": { "@sinonjs/commons": "^3.0.0" } } } }, "@jest/globals": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, "requires": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", "@jest/types": "^29.6.3", "jest-mock": "^29.7.0" } }, "@jest/reporters": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, "requires": { "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "^29.7.0", "@jest/test-result": "^29.7.0", "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", "istanbul-lib-coverage": "^3.0.0", "istanbul-lib-instrument": "^6.0.0", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", "jest-message-util": "^29.7.0", "jest-util": "^29.7.0", "jest-worker": "^29.7.0", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", "v8-to-istanbul": "^9.0.1" }, "dependencies": { "istanbul-lib-instrument": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz", "integrity": "sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==", "dev": true, "requires": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-coverage": "^3.2.0", "semver": "^7.5.4" } }, "semver": { "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" } } } }, "@jest/schemas": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, "requires": { "@sinclair/typebox": "^0.27.8" } }, "@jest/source-map": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", "dev": true, "requires": { "@jridgewell/trace-mapping": "^0.3.18", "callsites": "^3.0.0", "graceful-fs": "^4.2.9" } }, "@jest/test-result": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, "requires": { "@jest/console": "^29.7.0", "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/test-sequencer": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, "requires": { "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.7.0", "slash": "^3.0.0" } }, "@jest/transform": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "requires": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.7.0", "jest-regex-util": "^29.6.3", "jest-util": "^29.7.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", "write-file-atomic": "^4.0.2" }, "dependencies": { "convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, "write-file-atomic": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, "requires": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" } } } }, "@jest/types": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dev": true, "requires": { "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" } }, "@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dev": true, "requires": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.9" } }, "@jridgewell/resolve-uri": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", "dev": true }, "@jridgewell/set-array": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", "dev": true }, "@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", "dev": true }, "@jridgewell/trace-mapping": { "version": "0.3.20", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", "dev": true, "requires": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "@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": "3.0.4", "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.4.tgz", "integrity": "sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==", "dev": true }, "@octokit/core": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.4.tgz", "integrity": "sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==", "dev": true, "requires": { "@octokit/auth-token": "^3.0.0", "@octokit/graphql": "^5.0.0", "@octokit/request": "^6.0.0", "@octokit/request-error": "^3.0.0", "@octokit/types": "^9.0.0", "before-after-hook": "^2.2.0", "universal-user-agent": "^6.0.0" } }, "@octokit/endpoint": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.6.tgz", "integrity": "sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==", "dev": true, "requires": { "@octokit/types": "^9.0.0", "is-plain-object": "^5.0.0", "universal-user-agent": "^6.0.0" } }, "@octokit/graphql": { "version": "5.0.6", "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.6.tgz", "integrity": "sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==", "dev": true, "requires": { "@octokit/request": "^6.0.0", "@octokit/types": "^9.0.0", "universal-user-agent": "^6.0.0" } }, "@octokit/openapi-types": { "version": "18.0.0", "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==", "dev": true }, "@octokit/plugin-paginate-rest": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-7.1.2.tgz", "integrity": "sha512-Jx8KuKqEAVRsK6fMzZKv3h6UH9/NRDHsDRtUAROqqmZlCptM///Uef7A1ViZ/cbDplekz7VbDWdFLAZ/mpuDww==", "dev": true, "requires": { "@octokit/tsconfig": "^2.0.0", "@octokit/types": "^9.3.2" } }, "@octokit/plugin-retry": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-5.0.4.tgz", "integrity": "sha512-hw00fDIhOgijy4aSxS6weWF5uqZVeoiC/AptLLyjL8KFCJRGRaXfcfgj76h/Z3cSLTjRsEIQnNCTig8INttL/g==", "dev": true, "requires": { "@octokit/request-error": "^4.0.1", "@octokit/types": "^10.0.0", "bottleneck": "^2.15.3" }, "dependencies": { "@octokit/request-error": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-4.0.2.tgz", "integrity": "sha512-uqwUEmZw3x4I9DGYq9fODVAAvcLsPQv97NRycP6syEFu5916M189VnNBW2zANNwqg3OiligNcAey7P0SET843w==", "dev": true, "requires": { "@octokit/types": "^10.0.0", "deprecation": "^2.0.0", "once": "^1.4.0" } }, "@octokit/types": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/@octokit/types/-/types-10.0.0.tgz", "integrity": "sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==", "dev": true, "requires": { "@octokit/openapi-types": "^18.0.0" } } } }, "@octokit/plugin-throttling": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-6.1.0.tgz", "integrity": "sha512-JqMbTiPC0sUSTsLQsdq3JVx1mx8UtTo5mwR80YqPXE93+XhevvSyOR1rO2Z+NbO/r0TK4hqFJSSi/9oIZBxZTg==", "dev": true, "requires": { "@octokit/types": "^9.0.0", "bottleneck": "^2.15.3" } }, "@octokit/request": { "version": "6.2.8", "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.8.tgz", "integrity": "sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==", "dev": true, "requires": { "@octokit/endpoint": "^7.0.0", "@octokit/request-error": "^3.0.0", "@octokit/types": "^9.0.0", "is-plain-object": "^5.0.0", "node-fetch": "^2.6.7", "universal-user-agent": "^6.0.0" } }, "@octokit/request-error": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz", "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==", "dev": true, "requires": { "@octokit/types": "^9.0.0", "deprecation": "^2.0.0", "once": "^1.4.0" } }, "@octokit/tsconfig": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@octokit/tsconfig/-/tsconfig-2.0.0.tgz", "integrity": "sha512-tWnrai3quGt8+gRN2edzo9fmraWekeryXPeXDomMw2oFSpu/lH3VSWGn/q4V+rwjTRMeeXk/ci623/01Zet4VQ==", "dev": true }, "@octokit/types": { "version": "9.3.2", "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", "dev": true, "requires": { "@octokit/openapi-types": "^18.0.0" } }, "@pnpm/config.env-replace": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", "dev": true }, "@pnpm/network.ca-file": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", "dev": true, "requires": { "graceful-fs": "4.2.10" } }, "@pnpm/npm-conf": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz", "integrity": "sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==", "dev": true, "requires": { "@pnpm/config.env-replace": "^1.1.0", "@pnpm/network.ca-file": "^1.0.1", "config-chain": "^1.1.11" } }, "@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.5.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", "dev": true, "requires": { "lru-cache": "^6.0.0" } } } }, "@semantic-release/commit-analyzer": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-11.0.0.tgz", "integrity": "sha512-uEXyf4Z0AWJuxI9TbSQP5kkIYqus1/E1NcmE7pIv6d6/m/5EJcNWAGR4FOo34vrV26FhEaRVkxFfYzp/M7BKIg==", "dev": true, "requires": { "conventional-changelog-angular": "^7.0.0", "conventional-commits-filter": "^4.0.0", "conventional-commits-parser": "^5.0.0", "debug": "^4.0.0", "import-from": "^4.0.0", "lodash-es": "^4.17.21", "micromatch": "^4.0.2" } }, "@semantic-release/error": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-4.0.0.tgz", "integrity": "sha512-mgdxrHTLOjOddRVYIYDo0fR3/v61GNN1YGkfbrjuIKg/uMgCd+Qzo3UAXJ+woLQQpos4pl5Esuw5A7AoNlzjUQ==", "dev": true }, "@semantic-release/github": { "version": "9.0.3", "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-9.0.3.tgz", "integrity": "sha512-X6gq4USKVlCxPwIIyXb99jU7gwVWlnsKOevs+OyABRdoqc+OIRITbFmrrYU3eE1vGMGk+Qu/GAoLUQQQwC3YOA==", "dev": true, "requires": { "@octokit/core": "^4.2.1", "@octokit/plugin-paginate-rest": "^7.0.0", "@octokit/plugin-retry": "^5.0.0", "@octokit/plugin-throttling": "^6.0.0", "@semantic-release/error": "^4.0.0", "aggregate-error": "^4.0.1", "debug": "^4.3.4", "dir-glob": "^3.0.1", "globby": "^13.1.4", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.0", "issue-parser": "^6.0.0", "lodash-es": "^4.17.21", "mime": "^3.0.0", "p-filter": "^3.0.0", "url-join": "^5.0.0" }, "dependencies": { "aggregate-error": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", "dev": true, "requires": { "clean-stack": "^4.0.0", "indent-string": "^5.0.0" } }, "clean-stack": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", "dev": true, "requires": { "escape-string-regexp": "5.0.0" } }, "escape-string-regexp": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true }, "globby": { "version": "13.2.1", "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.1.tgz", "integrity": "sha512-DPCBxctI7dN4EeIqjW2KGqgdcUMbrhJ9AzON+PlxCtvppWhubTLD4+a0GFxiym14ZvacUydTPjLPc2DlKz7EIg==", "dev": true, "requires": { "dir-glob": "^3.0.1", "fast-glob": "^3.2.11", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^4.0.0" } }, "indent-string": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "dev": true }, "slash": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", "dev": true } } }, "@semantic-release/npm": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-11.0.0.tgz", "integrity": "sha512-ozNCiPUp14Xp2rgeY7j96yFTEhDncLSWOJr0IAUr888+ax6fH5xgYkNVv08vpkV8C5GIXBgnGd9coRiOCD6oqQ==", "dev": true, "requires": { "@semantic-release/error": "^4.0.0", "aggregate-error": "^5.0.0", "execa": "^8.0.0", "fs-extra": "^11.0.0", "lodash-es": "^4.17.21", "nerf-dart": "^1.0.0", "normalize-url": "^8.0.0", "npm": "^10.0.0", "rc": "^1.2.8", "read-pkg": "^8.0.0", "registry-auth-token": "^5.0.0", "semver": "^7.1.2", "tempy": "^3.0.0" }, "dependencies": { "aggregate-error": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-5.0.0.tgz", "integrity": "sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==", "dev": true, "requires": { "clean-stack": "^5.2.0", "indent-string": "^5.0.0" } }, "clean-stack": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-5.2.0.tgz", "integrity": "sha512-TyUIUJgdFnCISzG5zu3291TAsE77ddchd0bepon1VVQrKLGKFED4iXFEDQ24mIPdPBbyE16PK3F8MYE1CmcBEQ==", "dev": true, "requires": { "escape-string-regexp": "5.0.0" } }, "escape-string-regexp": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true }, "fs-extra": { "version": "11.1.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", "dev": true, "requires": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "hosted-git-info": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.1.tgz", "integrity": "sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==", "dev": true, "requires": { "lru-cache": "^10.0.1" }, "dependencies": { "lru-cache": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", "dev": true } } }, "indent-string": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "dev": true }, "json-parse-even-better-errors": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", "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" } }, "lines-and-columns": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.3.tgz", "integrity": "sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==", "dev": true }, "normalize-package-data": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.0.tgz", "integrity": "sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==", "dev": true, "requires": { "hosted-git-info": "^7.0.0", "is-core-module": "^2.8.1", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4" } }, "normalize-url": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", "dev": true }, "parse-json": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-7.1.0.tgz", "integrity": "sha512-ihtdrgbqdONYD156Ap6qTcaGcGdkdAxodO1wLqQ/j7HP1u2sFYppINiq4jyC8F+Nm+4fVufylCV00QmkTHkSUg==", "dev": true, "requires": { "@babel/code-frame": "^7.21.4", "error-ex": "^1.3.2", "json-parse-even-better-errors": "^3.0.0", "lines-and-columns": "^2.0.3", "type-fest": "^3.8.0" }, "dependencies": { "type-fest": { "version": "3.13.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", "dev": true } } }, "read-pkg": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-8.1.0.tgz", "integrity": "sha512-PORM8AgzXeskHO/WEv312k9U03B8K9JSiWF/8N9sUuFjBa+9SF2u6K7VClzXwDXab51jCd8Nd36CNM+zR97ScQ==", "dev": true, "requires": { "@types/normalize-package-data": "^2.4.1", "normalize-package-data": "^6.0.0", "parse-json": "^7.0.0", "type-fest": "^4.2.0" } }, "semver": { "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" } }, "type-fest": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.5.0.tgz", "integrity": "sha512-diLQivFzddJl4ylL3jxSkEc39Tpw7o1QeEHIPxVwryDK2lpB7Nqhzhuo6v5/Ls08Z0yPSAhsyAWlv1/H0ciNmw==", "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": "12.0.0", "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-12.0.0.tgz", "integrity": "sha512-m7Ds8ComP1KJgA2Lke2xMwE1TOOU40U7AzP4lT8hJ2tUAeicziPz/1GeDFmRkTOkMFlfHvE6kuvMkvU+mIzIDQ==", "dev": true, "requires": { "conventional-changelog-angular": "^7.0.0", "conventional-changelog-writer": "^7.0.0", "conventional-commits-filter": "^4.0.0", "conventional-commits-parser": "^5.0.0", "debug": "^4.0.0", "get-stream": "^7.0.0", "import-from": "^4.0.0", "into-stream": "^7.0.0", "lodash-es": "^4.17.21", "read-pkg-up": "^10.0.0" }, "dependencies": { "get-stream": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-7.0.1.tgz", "integrity": "sha512-3M8C1EOFN6r8AMUhwUAACIoXZJEOufDU5+0gFFN5uNs6XYOralD2Pqkl7m046va6x77FwposWXbAhPPIOus7mQ==", "dev": true } } }, "@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "dev": true }, "@sindresorhus/is": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", "dev": true }, "@sinonjs/commons": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", "dev": true, "requires": { "type-detect": "4.0.8" } }, "@sinonjs/fake-timers": { "version": "11.2.2", "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-11.2.2.tgz", "integrity": "sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==", "dev": true, "requires": { "@sinonjs/commons": "^3.0.0" }, "dependencies": { "@sinonjs/commons": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", "dev": true, "requires": { "type-detect": "4.0.8" } } } }, "@sinonjs/samsam": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.0.tgz", "integrity": "sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew==", "dev": true, "requires": { "@sinonjs/commons": "^2.0.0", "lodash.get": "^4.4.2", "type-detect": "^4.0.8" } }, "@sinonjs/text-encoding": { "version": "0.7.2", "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", "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" } }, "@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, "requires": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "@types/babel__generator": { "version": "7.6.8", "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", "dev": true, "requires": { "@babel/types": "^7.0.0" } }, "@types/babel__template": { "version": "7.4.4", "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, "requires": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "@types/babel__traverse": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", "dev": true, "requires": { "@babel/types": "^7.20.7" } }, "@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/graceful-fs": { "version": "4.1.9", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, "requires": { "@types/node": "*" } }, "@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/istanbul-lib-coverage": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", "dev": true }, "@types/istanbul-lib-report": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "*" } }, "@types/istanbul-reports": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "dev": true, "requires": { "@types/istanbul-lib-report": "*" } }, "@types/json-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/json-buffer/-/json-buffer-3.0.0.tgz", "integrity": "sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ==", "dev": true }, "@types/json-schema": { "version": "7.0.11", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "dev": true }, "@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, "@types/keyv": { "version": "3.1.4", "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", "dev": true, "requires": { "@types/node": "*" } }, "@types/node": { "version": "14.18.12", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.12.tgz", "integrity": "sha512-q4jlIR71hUpWTnGhXWcakgkZeHa3CCjcQcnuzU8M891BAWA2jHiziiWEPEkdS5pFsz7H9HJiy8BrK7tBRNrY7A==", "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/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/semver": { "version": "7.3.13", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", "dev": true }, "@types/stack-utils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", "dev": true }, "@types/yargs": { "version": "17.0.32", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", "dev": true, "requires": { "@types/yargs-parser": "*" } }, "@types/yargs-parser": { "version": "21.0.3", "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "dev": true }, "@typescript-eslint/eslint-plugin": { "version": "5.59.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.1.tgz", "integrity": "sha512-AVi0uazY5quFB9hlp2Xv+ogpfpk77xzsgsIEWyVS7uK/c7MZ5tw7ZPbapa0SbfkqE0fsAMkz5UwtgMLVk2BQAg==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.4.0", "@typescript-eslint/scope-manager": "5.59.1", "@typescript-eslint/type-utils": "5.59.1", "@typescript-eslint/utils": "5.59.1", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "natural-compare-lite": "^1.4.0", "semver": "^7.3.7", "tsutils": "^3.21.0" }, "dependencies": { "semver": { "version": "7.5.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", "dev": true, "requires": { "lru-cache": "^6.0.0" } }, "tsutils": { "version": "3.21.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, "requires": { "tslib": "^1.8.1" } } } }, "@typescript-eslint/parser": { "version": "5.59.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.1.tgz", "integrity": "sha512-nzjFAN8WEu6yPRDizIFyzAfgK7nybPodMNFGNH0M9tei2gYnYszRDqVA0xlnRjkl7Hkx2vYrEdb6fP2a21cG1g==", "dev": true, "requires": { "@typescript-eslint/scope-manager": "5.59.1", "@typescript-eslint/types": "5.59.1", "@typescript-eslint/typescript-estree": "5.59.1", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { "version": "5.59.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.1.tgz", "integrity": "sha512-mau0waO5frJctPuAzcxiNWqJR5Z8V0190FTSqRw1Q4Euop6+zTwHAf8YIXNwDOT29tyUDrQ65jSg9aTU/H0omA==", "dev": true, "requires": { "@typescript-eslint/types": "5.59.1", "@typescript-eslint/visitor-keys": "5.59.1" } }, "@typescript-eslint/type-utils": { "version": "5.59.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.1.tgz", "integrity": "sha512-ZMWQ+Oh82jWqWzvM3xU+9y5U7MEMVv6GLioM3R5NJk6uvP47kZ7YvlgSHJ7ERD6bOY7Q4uxWm25c76HKEwIjZw==", "dev": true, "requires": { "@typescript-eslint/typescript-estree": "5.59.1", "@typescript-eslint/utils": "5.59.1", "debug": "^4.3.4", "tsutils": "^3.21.0" }, "dependencies": { "tsutils": { "version": "3.21.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, "requires": { "tslib": "^1.8.1" } } } }, "@typescript-eslint/types": { "version": "5.59.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.1.tgz", "integrity": "sha512-dg0ICB+RZwHlysIy/Dh1SP+gnXNzwd/KS0JprD3Lmgmdq+dJAJnUPe1gNG34p0U19HvRlGX733d/KqscrGC1Pg==", "dev": true }, "@typescript-eslint/typescript-estree": { "version": "5.59.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.1.tgz", "integrity": "sha512-lYLBBOCsFltFy7XVqzX0Ju+Lh3WPIAWxYpmH/Q7ZoqzbscLiCW00LeYCdsUnnfnj29/s1WovXKh2gwCoinHNGA==", "dev": true, "requires": { "@typescript-eslint/types": "5.59.1", "@typescript-eslint/visitor-keys": "5.59.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "semver": "^7.3.7", "tsutils": "^3.21.0" }, "dependencies": { "semver": { "version": "7.5.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", "dev": true, "requires": { "lru-cache": "^6.0.0" } }, "tsutils": { "version": "3.21.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, "requires": { "tslib": "^1.8.1" } } } }, "@typescript-eslint/utils": { "version": "5.59.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.1.tgz", "integrity": "sha512-MkTe7FE+K1/GxZkP5gRj3rCztg45bEhsd8HYjczBuYm+qFHP5vtZmjx3B0yUCDotceQ4sHgTyz60Ycl225njmA==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", "@typescript-eslint/scope-manager": "5.59.1", "@typescript-eslint/types": "5.59.1", "@typescript-eslint/typescript-estree": "5.59.1", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, "dependencies": { "eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "requires": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, "estraverse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true }, "semver": { "version": "7.5.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", "dev": true, "requires": { "lru-cache": "^6.0.0" } } } }, "@typescript-eslint/visitor-keys": { "version": "5.59.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.1.tgz", "integrity": "sha512-6waEYwBTCWryx0VJmP7JaM4FpipLsFl9CvYf2foAE8Qh/Y0s+bxWysciwOs0LTBED4JCaNxTZ5rGadB14M6dwA==", "dev": true, "requires": { "@typescript-eslint/types": "5.59.1", "eslint-visitor-keys": "^3.3.0" } }, "@ungap/promise-all-settled": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", "dev": true }, "@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", "dev": true }, "acorn": { "version": "8.11.3", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "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": "7.1.0", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", "dev": true, "requires": { "debug": "^4.3.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": "6.2.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.0.tgz", "integrity": "sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==", "dev": true, "requires": { "type-fest": "^3.0.0" }, "dependencies": { "type-fest": { "version": "3.13.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", "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": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==", "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, "optional": 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, "optional": 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": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true, "optional": true }, "readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, "optional": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "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, "optional": 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, "optional": 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-buffer-byte-length": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", "dev": true, "requires": { "call-bind": "^1.0.2", "is-array-buffer": "^3.0.1" } }, "array-ify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", "dev": true }, "array-includes": { "version": "3.1.7", "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", "es-abstract": "^1.22.1", "get-intrinsic": "^1.2.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.findlastindex": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0", "get-intrinsic": "^1.2.1" } }, "array.prototype.flat": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" } }, "array.prototype.flatmap": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" } }, "arraybuffer.prototype.slice": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", "dev": true, "requires": { "array-buffer-byte-length": "^1.0.0", "call-bind": "^1.0.2", "define-properties": "^1.2.0", "get-intrinsic": "^1.2.1", "is-array-buffer": "^3.0.2", "is-shared-array-buffer": "^1.0.2" } }, "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": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", "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 }, "available-typed-arrays": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", "dev": true }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", "dev": true }, "aws4": { "version": "1.12.0", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", "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 } } }, "babel-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, "requires": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.6.3", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "slash": "^3.0.0" } }, "babel-plugin-istanbul": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-instrument": "^5.0.4", "test-exclude": "^6.0.0" }, "dependencies": { "istanbul-lib-instrument": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, "requires": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-coverage": "^3.2.0", "semver": "^6.3.0" } } } }, "babel-plugin-jest-hoist": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, "requires": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", "@types/babel__core": "^7.1.14", "@types/babel__traverse": "^7.0.6" } }, "babel-preset-current-node-syntax": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", "dev": true, "requires": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", "@babel/plugin-syntax-class-properties": "^7.8.3", "@babel/plugin-syntax-import-meta": "^7.8.3", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", "@babel/plugin-syntax-numeric-separator": "^7.8.3", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-top-level-await": "^7.8.3" } }, "babel-preset-jest": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, "requires": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" } }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, "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": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", "dev": true, "requires": { "tweetnacl": "^0.14.3" } }, "before-after-hook": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", "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" } }, "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.20.2", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", "dev": true, "requires": { "caniuse-lite": "^1.0.30001317", "electron-to-chromium": "^1.4.84", "escalade": "^3.1.1", "node-releases": "^2.0.2", "picocolors": "^1.0.0" } }, "bser": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, "requires": { "node-int64": "^0.4.0" } }, "buffer": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "dev": true, "requires": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, "buffer-from": { "version": "1.1.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": "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==", "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 }, "caniuse-lite": { "version": "1.0.30001325", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001325.tgz", "integrity": "sha512-sB1bZHjseSjDtijV1Hb7PB2Zd58Kyx+n/9EotvZ4Qcz2K3d0lWB8dB4nb8wN/TsOGFq3UuAm0zQZNQ4SoR7TrQ==", "dev": true }, "cardinal": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", "integrity": "sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==", "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": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", "dev": true }, "chai": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", "dev": true, "requires": { "assertion-error": "^1.1.0", "check-error": "^1.0.3", "deep-eql": "^4.1.3", "get-func-name": "^2.0.2", "loupe": "^2.3.6", "pathval": "^1.1.1", "type-detect": "^4.0.8" } }, "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" } }, "char-regex": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true }, "charm": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/charm/-/charm-1.0.2.tgz", "integrity": "sha512-wqW3VdPnlSWT4eRiYX+hcs+C6ViBPUWk1qTCd+37qw9kEm/a5n2qcyQDMBWvSYKN/ctqZzeXNQaeBjOetJJUkw==", "dev": true, "requires": { "inherits": "^2.0.1" } }, "check-error": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", "dev": true, "requires": { "get-func-name": "^2.0.2" } }, "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" } } } }, "chownr": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "dev": true }, "ci-info": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", "dev": true }, "cjs-module-lexer": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", "dev": true }, "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.3", "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", "dev": true, "requires": { "@colors/colors": "1.5.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" } }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true }, "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", "dev": true, "optional": true }, "collect-v8-coverage": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", "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 }, "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" } }, "compress-brotli": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/compress-brotli/-/compress-brotli-1.3.6.tgz", "integrity": "sha512-au99/GqZtUtiCBliqLFbWlhnCxn+XSYjwZ77q6mKN4La4qOXDoLVPZ50iXr0WmAyMxl8yqoq3Yq4OeQNPPkyeQ==", "dev": true, "requires": { "@types/json-buffer": "~3.0.0", "json-buffer": "~3.0.1" } }, "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" } }, "config-chain": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", "dev": true, "requires": { "ini": "^1.3.4", "proto-list": "~1.2.1" } }, "console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", "dev": true, "optional": true }, "conventional-changelog-angular": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz", "integrity": "sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==", "dev": true, "requires": { "compare-func": "^2.0.0" } }, "conventional-changelog-writer": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-7.0.1.tgz", "integrity": "sha512-Uo+R9neH3r/foIvQ0MKcsXkX642hdm9odUp7TqgFS7BsalTcjzRlIfWZrZR1gbxOozKucaKt5KAbjW8J8xRSmA==", "dev": true, "requires": { "conventional-commits-filter": "^4.0.0", "handlebars": "^4.7.7", "json-stringify-safe": "^5.0.1", "meow": "^12.0.1", "semver": "^7.5.2", "split2": "^4.0.0" }, "dependencies": { "semver": { "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" } } } }, "conventional-commits-filter": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-4.0.0.tgz", "integrity": "sha512-rnpnibcSOdFcdclpFwWa+pPlZJhXE7l+XK04zxhbWrhgpR96h33QLz8hITTXbcYICxVr3HZFtbtUAQ+4LdBo9A==", "dev": true }, "conventional-commits-parser": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz", "integrity": "sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==", "dev": true, "requires": { "is-text-path": "^2.0.0", "JSONStream": "^1.3.5", "meow": "^12.0.1", "split2": "^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": "8.1.3", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.1.3.tgz", "integrity": "sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==", "dev": true, "requires": { "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "parse-json": "^5.0.0", "path-type": "^4.0.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 } } }, "create-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", "dev": true, "requires": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", "jest-config": "^29.7.0", "jest-util": "^29.7.0", "prompts": "^2.0.1" } }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "requires": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "crypto-random-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", "dev": true, "requires": { "type-fest": "^1.0.1" }, "dependencies": { "type-fest": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", "dev": true } } }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", "dev": true, "requires": { "assert-plus": "^1.0.0" } }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "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 }, "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 } } }, "dedent": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", "dev": true, "requires": {} }, "deep-eql": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", "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 }, "deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "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.2.0", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", "dev": true, "requires": { "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true }, "delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", "dev": true, "optional": true }, "deprecation": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", "dev": true }, "detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true }, "diff": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", "dev": true }, "diff-sequences": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "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": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", "dev": true, "requires": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" } }, "electron-to-chromium": { "version": "1.4.103", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.103.tgz", "integrity": "sha512-c/uKWR1Z/W30Wy/sx3dkZoj4BijbXX85QKWu9jJfjho3LBAXNEGAEW3oWiGb+dotA6C6BzCTxL2/aLes7jlUeg==", "dev": true }, "emittery": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "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 }, "emojilib": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==", "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": "10.0.0", "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-10.0.0.tgz", "integrity": "sha512-U4xcd/utDYFgMh0yWj07R1H6L5fwhVbmxBCpnL0DbVSDZVnsC82HONw0wxtxNkIAcua3KtbomQvIk5xFZGAQJw==", "dev": true, "requires": { "execa": "^8.0.0", "java-properties": "^1.0.2" } }, "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.22.1", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", "dev": true, "requires": { "array-buffer-byte-length": "^1.0.0", "arraybuffer.prototype.slice": "^1.0.1", "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.5", "get-intrinsic": "^1.2.1", "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", "gopd": "^1.0.1", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "internal-slot": "^1.0.5", "is-array-buffer": "^3.0.2", "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", "is-typed-array": "^1.1.10", "is-weakref": "^1.0.2", "object-inspect": "^1.12.3", "object-keys": "^1.1.1", "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.5.0", "safe-array-concat": "^1.0.0", "safe-regex-test": "^1.0.0", "string.prototype.trim": "^1.2.7", "string.prototype.trimend": "^1.0.6", "string.prototype.trimstart": "^1.0.6", "typed-array-buffer": "^1.0.0", "typed-array-byte-length": "^1.0.0", "typed-array-byte-offset": "^1.0.0", "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", "which-typed-array": "^1.1.10" } }, "es-set-tostringtag": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", "dev": true, "requires": { "get-intrinsic": "^1.1.3", "has": "^1.0.3", "has-tostringtag": "^1.0.0" } }, "es-shim-unscopables": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, "requires": { "hasown": "^2.0.0" } }, "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.56.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", "@eslint/js": "8.56.0", "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "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.2.2", "eslint-visitor-keys": "^3.4.3", "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3", "strip-ansi": "^6.0.1", "text-table": "^0.2.0" }, "dependencies": { "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" } }, "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" } }, "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 } } }, "eslint-config-prettier": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", "dev": true, "requires": {} }, "eslint-config-standard": { "version": "17.1.0", "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz", "integrity": "sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==", "dev": true, "requires": {} }, "eslint-import-resolver-node": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, "requires": { "debug": "^3.2.7", "is-core-module": "^2.13.0", "resolve": "^1.22.4" }, "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.8.0", "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", "dev": true, "requires": { "debug": "^3.2.7" }, "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.29.1", "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", "dev": true, "requires": { "array-includes": "^3.1.7", "array.prototype.findlastindex": "^1.2.3", "array.prototype.flat": "^1.3.2", "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", "eslint-module-utils": "^2.8.0", "hasown": "^2.0.0", "is-core-module": "^2.13.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", "object.fromentries": "^2.0.7", "object.groupby": "^1.0.1", "object.values": "^1.1.7", "semver": "^6.3.1", "tsconfig-paths": "^3.15.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" } }, "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" } } } }, "eslint-plugin-mocha": { "version": "10.2.0", "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.2.0.tgz", "integrity": "sha512-ZhdxzSZnd1P9LqDPF0DBcFLpRIGdh1zkF2JHnQklKQOvrQtT73kdP5K9V2mzvbLR+cCAO9OI48NXK/Ax9/ciCQ==", "dev": true, "requires": { "eslint-utils": "^3.0.0", "rambda": "^7.4.0" } }, "eslint-plugin-n": { "version": "15.2.1", "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.2.1.tgz", "integrity": "sha512-uMG50pvKqXK9ab163bSI5OpyZR0F5yIB0pEC4ciGpBLrXVjVDOlx5oTq8GQULWzbelJt7wL5Rw4T+FfAff5Cxg==", "dev": true, "peer": true, "requires": { "builtins": "^5.0.1", "eslint-plugin-es": "^4.1.0", "eslint-utils": "^3.0.0", "ignore": "^5.1.1", "is-core-module": "^2.9.0", "minimatch": "^3.1.2", "resolve": "^1.10.1", "semver": "^7.3.7" }, "dependencies": { "builtins": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", "dev": true, "peer": true, "requires": { "semver": "^7.0.0" } }, "semver": { "version": "7.3.7", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "peer": true, "requires": { "lru-cache": "^6.0.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.1.1", "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", "dev": true, "requires": {} }, "eslint-scope": { "version": "7.2.2", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "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.4.3", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true }, "espree": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "requires": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" } }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, "esquery": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.2.tgz", "integrity": "sha512-JVSoLdTlTDkmjFmab7H/9SL9qGSyjElT3myyKp7krqjVFQCDLmj1QFaCLRFBszBKI0XVZaiiXvuPIX3ZwHe1Ng==", "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": "8.0.1", "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", "dev": true, "requires": { "cross-spawn": "^7.0.3", "get-stream": "^8.0.1", "human-signals": "^5.0.0", "is-stream": "^3.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^5.1.0", "onetime": "^6.0.0", "signal-exit": "^4.1.0", "strip-final-newline": "^3.0.0" }, "dependencies": { "get-stream": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", "dev": true }, "is-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true }, "signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true } } }, "exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", "dev": true }, "expect": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, "requires": { "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", "jest-matcher-utils": "^29.7.0", "jest-message-util": "^29.7.0", "jest-util": "^29.7.0" } }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", "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": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "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" } }, "fb-watchman": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, "requires": { "bser": "2.1.1" } }, "figures": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/figures/-/figures-6.0.1.tgz", "integrity": "sha512-0oY/olScYD4IhQ8u//gCPA4F3mlTn2dacYmiDm/mbDQvpmLjV4uH+zhsQ5IyXRyvqkvtUkXkNdGvg5OFJTCsuQ==", "dev": true, "requires": { "is-unicode-supported": "^2.0.0" }, "dependencies": { "is-unicode-supported": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.0.0.tgz", "integrity": "sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==", "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": "5.1.0", "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-5.1.0.tgz", "integrity": "sha512-+iwzCJ7C5v5KgcBuueqVoNiHVoQpwiUK5XFLjf0affFTep+Wcw93tPvmb8tqujDNmzhBDPddnWV/qgWSXgq+Hg==", "dev": true, "requires": { "semver-regex": "^4.0.5" } }, "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 }, "for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dev": true, "requires": { "is-callable": "^1.1.3" } }, "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": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", "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": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", "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": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true }, "readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "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-minipass": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "dev": true, "requires": { "minipass": "^3.0.0" } }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, "fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "optional": true }, "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.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true }, "function.prototype.name": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", "es-abstract": "^1.19.0", "functions-have-names": "^1.2.2" } }, "functions-have-names": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true }, "gauge": { "version": "2.7.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", "integrity": "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==", "dev": true, "optional": true, "requires": { "aproba": "^1.0.3", "console-control-strings": "^1.0.0", "has-unicode": "^2.0.0", "object-assign": "^4.1.0", "signal-exit": "^3.0.0", "string-width": "^1.0.1", "strip-ansi": "^3.0.1", "wide-align": "^1.1.0" }, "dependencies": { "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "dev": true, "optional": true }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "dev": true, "optional": 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.2", "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", "dev": true }, "get-intrinsic": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", "dev": true, "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", "has-proto": "^1.0.1", "has-symbols": "^1.0.3" } }, "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": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", "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.24.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "requires": { "type-fest": "^0.20.2" } }, "globalthis": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", "dev": true, "requires": { "define-properties": "^1.1.3" } }, "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" } }, "gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dev": true, "requires": { "get-intrinsic": "^1.1.3" } }, "got": { "version": "11.8.5", "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", "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.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true }, "grapheme-splitter": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", "dev": true }, "graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "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.8", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", "dev": true, "requires": { "minimist": "^1.2.5", "neo-async": "^2.6.2", "source-map": "^0.6.1", "uglify-js": "^3.1.4", "wordwrap": "^1.0.0" } }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", "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" } }, "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.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "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-property-descriptors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", "dev": true, "requires": { "get-intrinsic": "^1.1.1" } }, "has-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", "dev": true }, "has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "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": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", "dev": true, "optional": 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 } } }, "hasown": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", "dev": true, "requires": { "function-bind": "^1.1.2" } }, "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": "3.0.0", "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-3.0.0.tgz", "integrity": "sha512-jHRQzjSDzMtFy34AGj1DN+vq54WVuhSvKgrHf0OMiFQTwDD4L/qqofVEWjLOBMTn5+lCD3fPg32W9yOfnEJTTw==", "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.1", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", "dev": true }, "http-proxy-agent": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", "dev": true, "requires": { "agent-base": "^7.1.0", "debug": "^4.3.4" } }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", "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": "7.0.0", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.0.tgz", "integrity": "sha512-0euwPCRyAPSgGdzD1IVN9nJYHtBhJwb6XPfbpQcYbPCwrBidX6GzxmchnaF4sfF/jPb74Ojx5g4yTg3sixlyPw==", "dev": true, "requires": { "agent-base": "^7.0.2", "debug": "4" } }, "human-signals": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", "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 }, "import-local": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", "dev": true, "requires": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" } }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, "indent-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" } }, "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, "ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "dev": true }, "internal-slot": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", "dev": true, "requires": { "get-intrinsic": "^1.2.0", "has": "^1.0.3", "side-channel": "^1.0.4" } }, "into-stream": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-7.0.0.tgz", "integrity": "sha512-2dYz766i9HprMBasCMvHMuazJ7u4WzhJwo5kb3iPSiW/iRYV6uPari3zHoqZlnuaR7V1bEiNMxikhp37rdBXbw==", "dev": true, "requires": { "from2": "^2.3.0", "p-is-promise": "^3.0.0" } }, "is-array-buffer": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", "dev": true, "requires": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.0", "is-typed-array": "^1.1.10" } }, "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.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true }, "is-core-module": { "version": "2.13.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dev": true, "requires": { "hasown": "^2.0.0" } }, "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": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", "dev": true, "optional": true, "requires": { "number-is-nan": "^1.0.0" } }, "is-generator-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true }, "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.7", "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "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-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-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.2", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", "dev": true, "requires": { "call-bind": "^1.0.2" } }, "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": "2.0.0", "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-2.0.0.tgz", "integrity": "sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==", "dev": true, "requires": { "text-extensions": "^2.0.0" } }, "is-typed-array": { "version": "1.1.10", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", "dev": true, "requires": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "for-each": "^0.3.3", "gopd": "^1.0.1", "has-tostringtag": "^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": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", "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": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", "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" } }, "istanbul-reports": { "version": "3.1.4", "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", "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 }, "jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, "requires": { "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", "import-local": "^3.0.2", "jest-cli": "^29.7.0" } }, "jest-changed-files": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, "requires": { "execa": "^5.0.0", "jest-util": "^29.7.0", "p-limit": "^3.1.0" }, "dependencies": { "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" } }, "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 }, "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 }, "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 }, "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" } }, "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" } }, "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" } }, "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 } } }, "jest-circus": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, "requires": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", "jest-each": "^29.7.0", "jest-matcher-utils": "^29.7.0", "jest-message-util": "^29.7.0", "jest-runtime": "^29.7.0", "jest-snapshot": "^29.7.0", "jest-util": "^29.7.0", "p-limit": "^3.1.0", "pretty-format": "^29.7.0", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, "dependencies": { "p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "requires": { "yocto-queue": "^0.1.0" } } } }, "jest-cli": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, "requires": { "@jest/core": "^29.7.0", "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "chalk": "^4.0.0", "create-jest": "^29.7.0", "exit": "^0.1.2", "import-local": "^3.0.2", "jest-config": "^29.7.0", "jest-util": "^29.7.0", "jest-validate": "^29.7.0", "yargs": "^17.3.1" }, "dependencies": { "cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.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 }, "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": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "requires": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "yargs-parser": { "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true } } }, "jest-config": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, "requires": { "@babel/core": "^7.11.6", "@jest/test-sequencer": "^29.7.0", "@jest/types": "^29.6.3", "babel-jest": "^29.7.0", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", "jest-circus": "^29.7.0", "jest-environment-node": "^29.7.0", "jest-get-type": "^29.6.3", "jest-regex-util": "^29.6.3", "jest-resolve": "^29.7.0", "jest-runner": "^29.7.0", "jest-util": "^29.7.0", "jest-validate": "^29.7.0", "micromatch": "^4.0.4", "parse-json": "^5.2.0", "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, "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" } }, "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 } } }, "jest-diff": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "requires": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", "jest-get-type": "^29.6.3", "pretty-format": "^29.7.0" } }, "jest-docblock": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, "requires": { "detect-newline": "^3.0.0" } }, "jest-each": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, "requires": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "jest-util": "^29.7.0", "pretty-format": "^29.7.0" } }, "jest-environment-node": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "requires": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "jest-mock": "^29.7.0", "jest-util": "^29.7.0" } }, "jest-get-type": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true }, "jest-haste-map": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "requires": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "fsevents": "^2.3.2", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.6.3", "jest-util": "^29.7.0", "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" } }, "jest-leak-detector": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, "requires": { "jest-get-type": "^29.6.3", "pretty-format": "^29.7.0" } }, "jest-matcher-utils": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, "requires": { "chalk": "^4.0.0", "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", "pretty-format": "^29.7.0" } }, "jest-message-util": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, "requires": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", "pretty-format": "^29.7.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" } }, "jest-mock": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "requires": { "@jest/types": "^29.6.3", "@types/node": "*", "jest-util": "^29.7.0" } }, "jest-pnp-resolver": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true, "requires": {} }, "jest-regex-util": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true }, "jest-resolve": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, "requires": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.7.0", "jest-pnp-resolver": "^1.2.2", "jest-util": "^29.7.0", "jest-validate": "^29.7.0", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" } }, "jest-resolve-dependencies": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, "requires": { "jest-regex-util": "^29.6.3", "jest-snapshot": "^29.7.0" } }, "jest-runner": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, "requires": { "@jest/console": "^29.7.0", "@jest/environment": "^29.7.0", "@jest/test-result": "^29.7.0", "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", "jest-docblock": "^29.7.0", "jest-environment-node": "^29.7.0", "jest-haste-map": "^29.7.0", "jest-leak-detector": "^29.7.0", "jest-message-util": "^29.7.0", "jest-resolve": "^29.7.0", "jest-runtime": "^29.7.0", "jest-util": "^29.7.0", "jest-watcher": "^29.7.0", "jest-worker": "^29.7.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, "dependencies": { "p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "requires": { "yocto-queue": "^0.1.0" } } } }, "jest-runtime": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dev": true, "requires": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", "@jest/globals": "^29.7.0", "@jest/source-map": "^29.6.3", "@jest/test-result": "^29.7.0", "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.7.0", "jest-message-util": "^29.7.0", "jest-mock": "^29.7.0", "jest-regex-util": "^29.6.3", "jest-resolve": "^29.7.0", "jest-snapshot": "^29.7.0", "jest-util": "^29.7.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" } }, "jest-snapshot": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, "requires": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/types": "^7.3.3", "@jest/expect-utils": "^29.7.0", "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", "expect": "^29.7.0", "graceful-fs": "^4.2.9", "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", "jest-matcher-utils": "^29.7.0", "jest-message-util": "^29.7.0", "jest-util": "^29.7.0", "natural-compare": "^1.4.0", "pretty-format": "^29.7.0", "semver": "^7.5.3" }, "dependencies": { "semver": { "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" } } } }, "jest-util": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "requires": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" } }, "jest-validate": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "requires": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "leven": "^3.1.0", "pretty-format": "^29.7.0" }, "dependencies": { "camelcase": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true } } }, "jest-watcher": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, "requires": { "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", "jest-util": "^29.7.0", "string-length": "^4.0.1" }, "dependencies": { "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" } }, "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 } } }, "jest-worker": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "requires": { "@types/node": "*", "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, "dependencies": { "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" } } } }, "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": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", "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.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true }, "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": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", "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.2.1", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.2.1.tgz", "integrity": "sha512-cAJq5cTfxQdq1DHZEVNpnk4mEvhP+8UP8UQftLtTtJ98beKkRHf+62M0mIDM2u/IWXyP8bmGB375/6uGdSX2MA==", "dev": true, "requires": { "compress-brotli": "^1.3.6", "json-buffer": "3.0.1" } }, "kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true }, "leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true }, "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-es": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", "dev": true }, "lodash.capitalize": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", "integrity": "sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==", "dev": true }, "lodash.escaperegexp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==", "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": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", "dev": true }, "lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", "dev": true }, "lodash.isstring": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", "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.uniqby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==", "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.7", "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", "dev": true, "requires": { "get-func-name": "^2.0.1" } }, "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" } }, "makeerror": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, "requires": { "tmpl": "1.0.5" } }, "marked": { "version": "9.1.2", "resolved": "https://registry.npmjs.org/marked/-/marked-9.1.2.tgz", "integrity": "sha512-qoKMJqK0w6vkLk8+KnKZAH6neUZSNaQqVZ/h2yZ9S7CbLuFHyS2viB0jnqcWF9UKjwsAbMrQtnQhdmdvOVOw9w==", "dev": true }, "marked-terminal": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-6.0.0.tgz", "integrity": "sha512-6rruICvqRfA4N+Mvdc0UyDbLA0A0nI5omtARIlin3P2F+aNc3EbW91Rd9HTuD0v9qWyHmNIu8Bt40gAnPfldsg==", "dev": true, "requires": { "ansi-escapes": "^6.2.0", "cardinal": "^2.1.1", "chalk": "^5.3.0", "cli-table3": "^0.6.3", "node-emoji": "^2.1.0", "supports-hyperlinks": "^3.0.0" }, "dependencies": { "chalk": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "dev": true } } }, "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": "12.1.1", "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz", "integrity": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==", "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.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "requires": { "braces": "^3.0.2", "picomatch": "^2.3.1" } }, "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.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true }, "mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "requires": { "mime-db": "1.52.0" } }, "mimic-fn": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", "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 }, "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, "minipass": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "requires": { "yallist": "^4.0.0" } }, "minizlib": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "dev": true, "requires": { "minipass": "^3.0.0", "yallist": "^4.0.0" } }, "mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "requires": { "minimist": "^1.2.6" } }, "mocha": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", "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": "4.2.1", "ms": "2.1.3", "nanoid": "3.3.1", "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" } }, "debug": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dev": true, "requires": { "ms": "2.1.2" }, "dependencies": { "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true } } }, "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" } }, "minimatch": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", "dev": true, "requires": { "brace-expansion": "^1.1.7" } }, "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" } } } }, "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.3.1", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", "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 }, "natural-compare-lite": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", "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": "sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==", "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.4", "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.4.tgz", "integrity": "sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg==", "dev": true, "requires": { "@sinonjs/commons": "^2.0.0", "@sinonjs/fake-timers": "^10.0.2", "@sinonjs/text-encoding": "^0.7.1", "just-extend": "^4.0.2", "path-to-regexp": "^1.7.0" }, "dependencies": { "@sinonjs/fake-timers": { "version": "10.3.0", "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, "requires": { "@sinonjs/commons": "^3.0.0" }, "dependencies": { "@sinonjs/commons": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", "dev": true, "requires": { "type-detect": "4.0.8" } } } } } }, "node-emoji": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.1.0.tgz", "integrity": "sha512-tcsBm9C6FmPN5Wo7OjFi9lgMyJjvkAeirmjR/ax8Ttfqy4N8PoFic26uqFTIgayHPNI5FH4ltUvfh9kHzwcK9A==", "dev": true, "requires": { "@sindresorhus/is": "^3.1.2", "char-regex": "^1.0.2", "emojilib": "^2.4.0", "skin-tone": "^2.0.0" }, "dependencies": { "@sindresorhus/is": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-3.1.2.tgz", "integrity": "sha512-JiX9vxoKMmu8Y3Zr2RVathBL1Cdu4Nt4MuNWemt1Nc06A0RAin9c5FArkhGsyMBWfCu4zj+9b+GxtjAnE4qqLQ==", "dev": true } } }, "node-fetch": { "version": "2.6.12", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", "dev": true, "requires": { "whatwg-url": "^5.0.0" } }, "node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", "dev": true }, "node-preload": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", "dev": true, "requires": { "process-on-spawn": "^1.0.0" } }, "node-releases": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==", "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": "10.2.0", "resolved": "https://registry.npmjs.org/npm/-/npm-10.2.0.tgz", "integrity": "sha512-Auyq6d4cfg/SY4URjZE2aePLOPzK4lUD+qyMxY/7HbxAvCnOCKtMlyLPcbLSOq9lhEGBZN800S1o+UmfjA5dTg==", "dev": true, "requires": { "@isaacs/string-locale-compare": "^1.1.0", "@npmcli/arborist": "^7.2.0", "@npmcli/config": "^8.0.0", "@npmcli/fs": "^3.1.0", "@npmcli/map-workspaces": "^3.0.4", "@npmcli/package-json": "^5.0.0", "@npmcli/promise-spawn": "^7.0.0", "@npmcli/run-script": "^7.0.1", "@sigstore/tuf": "^2.1.0", "abbrev": "^2.0.0", "archy": "~1.0.0", "cacache": "^18.0.0", "chalk": "^5.3.0", "ci-info": "^3.8.0", "cli-columns": "^4.0.0", "cli-table3": "^0.6.3", "columnify": "^1.6.0", "fastest-levenshtein": "^1.0.16", "fs-minipass": "^3.0.3", "glob": "^10.3.10", "graceful-fs": "^4.2.11", "hosted-git-info": "^7.0.1", "ini": "^4.1.1", "init-package-json": "^6.0.0", "is-cidr": "^4.0.2", "json-parse-even-better-errors": "^3.0.0", "libnpmaccess": "^8.0.1", "libnpmdiff": "^6.0.2", "libnpmexec": "^7.0.2", "libnpmfund": "^5.0.0", "libnpmhook": "^10.0.0", "libnpmorg": "^6.0.1", "libnpmpack": "^6.0.2", "libnpmpublish": "^9.0.1", "libnpmsearch": "^7.0.0", "libnpmteam": "^6.0.0", "libnpmversion": "^5.0.0", "make-fetch-happen": "^13.0.0", "minimatch": "^9.0.3", "minipass": "^7.0.4", "minipass-pipeline": "^1.2.4", "ms": "^2.1.2", "node-gyp": "^9.4.0", "nopt": "^7.2.0", "normalize-package-data": "^6.0.0", "npm-audit-report": "^5.0.0", "npm-install-checks": "^6.2.0", "npm-package-arg": "^11.0.1", "npm-pick-manifest": "^9.0.0", "npm-profile": "^9.0.0", "npm-registry-fetch": "^16.0.0", "npm-user-validate": "^2.0.0", "npmlog": "^7.0.1", "p-map": "^4.0.0", "pacote": "^17.0.4", "parse-conflict-json": "^3.0.1", "proc-log": "^3.0.0", "qrcode-terminal": "^0.12.0", "read": "^2.1.0", "semver": "^7.5.4", "spdx-expression-parse": "^3.0.1", "ssri": "^10.0.5", "strip-ansi": "^6.0.1", "supports-color": "^9.4.0", "tar": "^6.2.0", "text-table": "~0.2.0", "tiny-relative-date": "^1.3.0", "treeverse": "^3.0.0", "validate-npm-package-name": "^5.0.0", "which": "^4.0.0", "write-file-atomic": "^5.0.1" }, "dependencies": { "@colors/colors": { "version": "1.5.0", "bundled": true, "dev": true, "optional": true }, "@isaacs/cliui": { "version": "8.0.2", "bundled": true, "dev": true, "requires": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" }, "dependencies": { "ansi-regex": { "version": "6.0.1", "bundled": true, "dev": true }, "emoji-regex": { "version": "9.2.2", "bundled": true, "dev": true }, "string-width": { "version": "5.1.2", "bundled": true, "dev": true, "requires": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "strip-ansi": { "version": "7.1.0", "bundled": true, "dev": true, "requires": { "ansi-regex": "^6.0.1" } } } }, "@isaacs/string-locale-compare": { "version": "1.1.0", "bundled": true, "dev": true }, "@npmcli/agent": { "version": "2.2.0", "bundled": true, "dev": true, "requires": { "agent-base": "^7.1.0", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.1", "lru-cache": "^10.0.1", "socks-proxy-agent": "^8.0.1" }, "dependencies": { "agent-base": { "version": "7.1.0", "bundled": true, "dev": true, "requires": { "debug": "^4.3.4" } }, "http-proxy-agent": { "version": "7.0.0", "bundled": true, "dev": true, "requires": { "agent-base": "^7.1.0", "debug": "^4.3.4" } }, "https-proxy-agent": { "version": "7.0.1", "bundled": true, "dev": true, "requires": { "agent-base": "^7.0.2", "debug": "4" } }, "socks-proxy-agent": { "version": "8.0.1", "bundled": true, "dev": true, "requires": { "agent-base": "^7.0.1", "debug": "^4.3.4", "socks": "^2.7.1" } } } }, "@npmcli/arborist": { "version": "7.2.0", "bundled": true, "dev": true, "requires": { "@isaacs/string-locale-compare": "^1.1.0", "@npmcli/fs": "^3.1.0", "@npmcli/installed-package-contents": "^2.0.2", "@npmcli/map-workspaces": "^3.0.2", "@npmcli/metavuln-calculator": "^7.0.0", "@npmcli/name-from-folder": "^2.0.0", "@npmcli/node-gyp": "^3.0.0", "@npmcli/package-json": "^5.0.0", "@npmcli/query": "^3.0.1", "@npmcli/run-script": "^7.0.1", "bin-links": "^4.0.1", "cacache": "^18.0.0", "common-ancestor-path": "^1.0.1", "hosted-git-info": "^7.0.1", "json-parse-even-better-errors": "^3.0.0", "json-stringify-nice": "^1.1.4", "minimatch": "^9.0.0", "nopt": "^7.0.0", "npm-install-checks": "^6.2.0", "npm-package-arg": "^11.0.1", "npm-pick-manifest": "^9.0.0", "npm-registry-fetch": "^16.0.0", "npmlog": "^7.0.1", "pacote": "^17.0.4", "parse-conflict-json": "^3.0.0", "proc-log": "^3.0.0", "promise-all-reject-late": "^1.0.0", "promise-call-limit": "^1.0.2", "read-package-json-fast": "^3.0.2", "semver": "^7.3.7", "ssri": "^10.0.5", "treeverse": "^3.0.0", "walk-up-path": "^3.0.1" } }, "@npmcli/config": { "version": "8.0.0", "bundled": true, "dev": true, "requires": { "@npmcli/map-workspaces": "^3.0.2", "ci-info": "^3.8.0", "ini": "^4.1.0", "nopt": "^7.0.0", "proc-log": "^3.0.0", "read-package-json-fast": "^3.0.2", "semver": "^7.3.5", "walk-up-path": "^3.0.1" } }, "@npmcli/disparity-colors": { "version": "3.0.0", "bundled": true, "dev": true, "requires": { "ansi-styles": "^4.3.0" } }, "@npmcli/fs": { "version": "3.1.0", "bundled": true, "dev": true, "requires": { "semver": "^7.3.5" } }, "@npmcli/git": { "version": "5.0.3", "bundled": true, "dev": true, "requires": { "@npmcli/promise-spawn": "^7.0.0", "lru-cache": "^10.0.1", "npm-pick-manifest": "^9.0.0", "proc-log": "^3.0.0", "promise-inflight": "^1.0.1", "promise-retry": "^2.0.1", "semver": "^7.3.5", "which": "^4.0.0" } }, "@npmcli/installed-package-contents": { "version": "2.0.2", "bundled": true, "dev": true, "requires": { "npm-bundled": "^3.0.0", "npm-normalize-package-bin": "^3.0.0" } }, "@npmcli/map-workspaces": { "version": "3.0.4", "bundled": true, "dev": true, "requires": { "@npmcli/name-from-folder": "^2.0.0", "glob": "^10.2.2", "minimatch": "^9.0.0", "read-package-json-fast": "^3.0.0" } }, "@npmcli/metavuln-calculator": { "version": "7.0.0", "bundled": true, "dev": true, "requires": { "cacache": "^18.0.0", "json-parse-even-better-errors": "^3.0.0", "pacote": "^17.0.0", "semver": "^7.3.5" } }, "@npmcli/name-from-folder": { "version": "2.0.0", "bundled": true, "dev": true }, "@npmcli/node-gyp": { "version": "3.0.0", "bundled": true, "dev": true }, "@npmcli/package-json": { "version": "5.0.0", "bundled": true, "dev": true, "requires": { "@npmcli/git": "^5.0.0", "glob": "^10.2.2", "hosted-git-info": "^7.0.0", "json-parse-even-better-errors": "^3.0.0", "normalize-package-data": "^6.0.0", "proc-log": "^3.0.0", "semver": "^7.5.3" } }, "@npmcli/promise-spawn": { "version": "7.0.0", "bundled": true, "dev": true, "requires": { "which": "^4.0.0" } }, "@npmcli/query": { "version": "3.0.1", "bundled": true, "dev": true, "requires": { "postcss-selector-parser": "^6.0.10" } }, "@npmcli/run-script": { "version": "7.0.1", "bundled": true, "dev": true, "requires": { "@npmcli/node-gyp": "^3.0.0", "@npmcli/promise-spawn": "^7.0.0", "node-gyp": "^9.0.0", "read-package-json-fast": "^3.0.0", "which": "^4.0.0" } }, "@pkgjs/parseargs": { "version": "0.11.0", "bundled": true, "dev": true, "optional": true }, "@sigstore/bundle": { "version": "2.1.0", "bundled": true, "dev": true, "requires": { "@sigstore/protobuf-specs": "^0.2.1" } }, "@sigstore/protobuf-specs": { "version": "0.2.1", "bundled": true, "dev": true }, "@sigstore/sign": { "version": "2.1.0", "bundled": true, "dev": true, "requires": { "@sigstore/bundle": "^2.1.0", "@sigstore/protobuf-specs": "^0.2.1", "make-fetch-happen": "^13.0.0" } }, "@sigstore/tuf": { "version": "2.1.0", "bundled": true, "dev": true, "requires": { "@sigstore/protobuf-specs": "^0.2.1", "tuf-js": "^2.1.0" } }, "@tootallnate/once": { "version": "2.0.0", "bundled": true, "dev": true }, "@tufjs/canonical-json": { "version": "2.0.0", "bundled": true, "dev": true }, "@tufjs/models": { "version": "2.0.0", "bundled": true, "dev": true, "requires": { "@tufjs/canonical-json": "2.0.0", "minimatch": "^9.0.3" } }, "abbrev": { "version": "2.0.0", "bundled": true, "dev": true }, "abort-controller": { "version": "3.0.0", "bundled": true, "dev": true, "requires": { "event-target-shim": "^5.0.0" } }, "agent-base": { "version": "6.0.2", "bundled": true, "dev": true, "requires": { "debug": "4" } }, "agentkeepalive": { "version": "4.5.0", "bundled": true, "dev": true, "requires": { "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" } }, "ansi-regex": { "version": "5.0.1", "bundled": true, "dev": true }, "ansi-styles": { "version": "4.3.0", "bundled": true, "dev": true, "requires": { "color-convert": "^2.0.1" } }, "aproba": { "version": "2.0.0", "bundled": true, "dev": true }, "archy": { "version": "1.0.0", "bundled": true, "dev": true }, "are-we-there-yet": { "version": "4.0.0", "bundled": true, "dev": true, "requires": { "delegates": "^1.0.0", "readable-stream": "^4.1.0" } }, "balanced-match": { "version": "1.0.2", "bundled": true, "dev": true }, "base64-js": { "version": "1.5.1", "bundled": true, "dev": true }, "bin-links": { "version": "4.0.2", "bundled": true, "dev": true, "requires": { "cmd-shim": "^6.0.0", "npm-normalize-package-bin": "^3.0.0", "read-cmd-shim": "^4.0.0", "write-file-atomic": "^5.0.0" } }, "binary-extensions": { "version": "2.2.0", "bundled": true, "dev": true }, "brace-expansion": { "version": "2.0.1", "bundled": true, "dev": true, "requires": { "balanced-match": "^1.0.0" } }, "buffer": { "version": "6.0.3", "bundled": true, "dev": true, "requires": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "builtins": { "version": "5.0.1", "bundled": true, "dev": true, "requires": { "semver": "^7.0.0" } }, "cacache": { "version": "18.0.0", "bundled": true, "dev": true, "requires": { "@npmcli/fs": "^3.1.0", "fs-minipass": "^3.0.0", "glob": "^10.2.2", "lru-cache": "^10.0.1", "minipass": "^7.0.3", "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "p-map": "^4.0.0", "ssri": "^10.0.0", "tar": "^6.1.11", "unique-filename": "^3.0.0" } }, "chalk": { "version": "5.3.0", "bundled": true, "dev": true }, "chownr": { "version": "2.0.0", "bundled": true, "dev": true }, "ci-info": { "version": "3.8.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": "4.0.0", "bundled": true, "dev": true, "requires": { "string-width": "^4.2.3", "strip-ansi": "^6.0.1" } }, "cli-table3": { "version": "0.6.3", "bundled": true, "dev": true, "requires": { "@colors/colors": "1.5.0", "string-width": "^4.2.0" } }, "clone": { "version": "1.0.4", "bundled": true, "dev": true }, "cmd-shim": { "version": "6.0.1", "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 }, "columnify": { "version": "1.6.0", "bundled": true, "dev": true, "requires": { "strip-ansi": "^6.0.1", "wcwidth": "^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 }, "cross-spawn": { "version": "7.0.3", "bundled": true, "dev": true, "requires": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" }, "dependencies": { "which": { "version": "2.0.2", "bundled": true, "dev": true, "requires": { "isexe": "^2.0.0" } } } }, "cssesc": { "version": "3.0.0", "bundled": true, "dev": true }, "debug": { "version": "4.3.4", "bundled": true, "dev": true, "requires": { "ms": "2.1.2" }, "dependencies": { "ms": { "version": "2.1.2", "bundled": true, "dev": true } } }, "defaults": { "version": "1.0.4", "bundled": true, "dev": true, "requires": { "clone": "^1.0.2" } }, "delegates": { "version": "1.0.0", "bundled": true, "dev": true }, "diff": { "version": "5.1.0", "bundled": true, "dev": true }, "eastasianwidth": { "version": "0.2.0", "bundled": true, "dev": true }, "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 }, "event-target-shim": { "version": "5.0.1", "bundled": true, "dev": true }, "events": { "version": "3.3.0", "bundled": true, "dev": true }, "exponential-backoff": { "version": "3.1.1", "bundled": true, "dev": true }, "fastest-levenshtein": { "version": "1.0.16", "bundled": true, "dev": true }, "foreground-child": { "version": "3.1.1", "bundled": true, "dev": true, "requires": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" } }, "fs-minipass": { "version": "3.0.3", "bundled": true, "dev": true, "requires": { "minipass": "^7.0.3" } }, "fs.realpath": { "version": "1.0.0", "bundled": true, "dev": true }, "function-bind": { "version": "1.1.1", "bundled": true, "dev": true }, "gauge": { "version": "5.0.1", "bundled": true, "dev": true, "requires": { "aproba": "^1.0.3 || ^2.0.0", "color-support": "^1.1.3", "console-control-strings": "^1.1.0", "has-unicode": "^2.0.1", "signal-exit": "^4.0.1", "string-width": "^4.2.3", "strip-ansi": "^6.0.1", "wide-align": "^1.1.5" } }, "glob": { "version": "10.3.10", "bundled": true, "dev": true, "requires": { "foreground-child": "^3.1.0", "jackspeak": "^2.3.5", "minimatch": "^9.0.1", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", "path-scurry": "^1.10.1" } }, "graceful-fs": { "version": "4.2.11", "bundled": true, "dev": true }, "has": { "version": "1.0.3", "bundled": true, "dev": true, "requires": { "function-bind": "^1.1.1" } }, "has-unicode": { "version": "2.0.1", "bundled": true, "dev": true }, "hosted-git-info": { "version": "7.0.1", "bundled": true, "dev": true, "requires": { "lru-cache": "^10.0.1" } }, "http-cache-semantics": { "version": "4.1.1", "bundled": true, "dev": true }, "http-proxy-agent": { "version": "5.0.0", "bundled": true, "dev": true, "requires": { "@tootallnate/once": "2", "agent-base": "6", "debug": "4" } }, "https-proxy-agent": { "version": "5.0.1", "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" } }, "ieee754": { "version": "1.2.1", "bundled": true, "dev": true }, "ignore-walk": { "version": "6.0.3", "bundled": true, "dev": true, "requires": { "minimatch": "^9.0.0" } }, "imurmurhash": { "version": "0.1.4", "bundled": true, "dev": true }, "indent-string": { "version": "4.0.0", "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": "4.1.1", "bundled": true, "dev": true }, "init-package-json": { "version": "6.0.0", "bundled": true, "dev": true, "requires": { "npm-package-arg": "^11.0.0", "promzard": "^1.0.0", "read": "^2.0.0", "read-package-json": "^7.0.0", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4", "validate-npm-package-name": "^5.0.0" } }, "ip": { "version": "2.0.0", "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.12.1", "bundled": true, "dev": true, "requires": { "has": "^1.0.3" } }, "is-fullwidth-code-point": { "version": "3.0.0", "bundled": true, "dev": true }, "is-lambda": { "version": "1.0.1", "bundled": true, "dev": true }, "isexe": { "version": "2.0.0", "bundled": true, "dev": true }, "jackspeak": { "version": "2.3.6", "bundled": true, "dev": true, "requires": { "@isaacs/cliui": "^8.0.2", "@pkgjs/parseargs": "^0.11.0" } }, "json-parse-even-better-errors": { "version": "3.0.0", "bundled": true, "dev": true }, "json-stringify-nice": { "version": "1.1.4", "bundled": true, "dev": true }, "jsonparse": { "version": "1.3.1", "bundled": true, "dev": true }, "just-diff": { "version": "6.0.2", "bundled": true, "dev": true }, "just-diff-apply": { "version": "5.5.0", "bundled": true, "dev": true }, "libnpmaccess": { "version": "8.0.1", "bundled": true, "dev": true, "requires": { "npm-package-arg": "^11.0.1", "npm-registry-fetch": "^16.0.0" } }, "libnpmdiff": { "version": "6.0.2", "bundled": true, "dev": true, "requires": { "@npmcli/arborist": "^7.2.0", "@npmcli/disparity-colors": "^3.0.0", "@npmcli/installed-package-contents": "^2.0.2", "binary-extensions": "^2.2.0", "diff": "^5.1.0", "minimatch": "^9.0.0", "npm-package-arg": "^11.0.1", "pacote": "^17.0.4", "tar": "^6.2.0" } }, "libnpmexec": { "version": "7.0.2", "bundled": true, "dev": true, "requires": { "@npmcli/arborist": "^7.2.0", "@npmcli/run-script": "^7.0.1", "ci-info": "^3.7.1", "npm-package-arg": "^11.0.1", "npmlog": "^7.0.1", "pacote": "^17.0.4", "proc-log": "^3.0.0", "read": "^2.0.0", "read-package-json-fast": "^3.0.2", "semver": "^7.3.7", "walk-up-path": "^3.0.1" } }, "libnpmfund": { "version": "5.0.0", "bundled": true, "dev": true, "requires": { "@npmcli/arborist": "^7.2.0" } }, "libnpmhook": { "version": "10.0.0", "bundled": true, "dev": true, "requires": { "aproba": "^2.0.0", "npm-registry-fetch": "^16.0.0" } }, "libnpmorg": { "version": "6.0.1", "bundled": true, "dev": true, "requires": { "aproba": "^2.0.0", "npm-registry-fetch": "^16.0.0" } }, "libnpmpack": { "version": "6.0.2", "bundled": true, "dev": true, "requires": { "@npmcli/arborist": "^7.2.0", "@npmcli/run-script": "^7.0.1", "npm-package-arg": "^11.0.1", "pacote": "^17.0.4" } }, "libnpmpublish": { "version": "9.0.1", "bundled": true, "dev": true, "requires": { "ci-info": "^3.6.1", "normalize-package-data": "^6.0.0", "npm-package-arg": "^11.0.1", "npm-registry-fetch": "^16.0.0", "proc-log": "^3.0.0", "semver": "^7.3.7", "sigstore": "^2.1.0", "ssri": "^10.0.5" } }, "libnpmsearch": { "version": "7.0.0", "bundled": true, "dev": true, "requires": { "npm-registry-fetch": "^16.0.0" } }, "libnpmteam": { "version": "6.0.0", "bundled": true, "dev": true, "requires": { "aproba": "^2.0.0", "npm-registry-fetch": "^16.0.0" } }, "libnpmversion": { "version": "5.0.0", "bundled": true, "dev": true, "requires": { "@npmcli/git": "^5.0.3", "@npmcli/run-script": "^7.0.1", "json-parse-even-better-errors": "^3.0.0", "proc-log": "^3.0.0", "semver": "^7.3.7" } }, "lru-cache": { "version": "10.0.1", "bundled": true, "dev": true }, "make-fetch-happen": { "version": "13.0.0", "bundled": true, "dev": true, "requires": { "@npmcli/agent": "^2.0.0", "cacache": "^18.0.0", "http-cache-semantics": "^4.1.1", "is-lambda": "^1.0.1", "minipass": "^7.0.2", "minipass-fetch": "^3.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^0.6.3", "promise-retry": "^2.0.1", "ssri": "^10.0.0" } }, "minimatch": { "version": "9.0.3", "bundled": true, "dev": true, "requires": { "brace-expansion": "^2.0.1" } }, "minipass": { "version": "7.0.4", "bundled": true, "dev": true }, "minipass-collect": { "version": "1.0.2", "bundled": true, "dev": true, "requires": { "minipass": "^3.0.0" }, "dependencies": { "minipass": { "version": "3.3.6", "bundled": true, "dev": true, "requires": { "yallist": "^4.0.0" } } } }, "minipass-fetch": { "version": "3.0.4", "bundled": true, "dev": true, "requires": { "encoding": "^0.1.13", "minipass": "^7.0.3", "minipass-sized": "^1.0.3", "minizlib": "^2.1.2" } }, "minipass-flush": { "version": "1.0.5", "bundled": true, "dev": true, "requires": { "minipass": "^3.0.0" }, "dependencies": { "minipass": { "version": "3.3.6", "bundled": true, "dev": true, "requires": { "yallist": "^4.0.0" } } } }, "minipass-json-stream": { "version": "1.0.1", "bundled": true, "dev": true, "requires": { "jsonparse": "^1.3.1", "minipass": "^3.0.0" }, "dependencies": { "minipass": { "version": "3.3.6", "bundled": true, "dev": true, "requires": { "yallist": "^4.0.0" } } } }, "minipass-pipeline": { "version": "1.2.4", "bundled": true, "dev": true, "requires": { "minipass": "^3.0.0" }, "dependencies": { "minipass": { "version": "3.3.6", "bundled": true, "dev": true, "requires": { "yallist": "^4.0.0" } } } }, "minipass-sized": { "version": "1.0.3", "bundled": true, "dev": true, "requires": { "minipass": "^3.0.0" }, "dependencies": { "minipass": { "version": "3.3.6", "bundled": true, "dev": true, "requires": { "yallist": "^4.0.0" } } } }, "minizlib": { "version": "2.1.2", "bundled": true, "dev": true, "requires": { "minipass": "^3.0.0", "yallist": "^4.0.0" }, "dependencies": { "minipass": { "version": "3.3.6", "bundled": true, "dev": true, "requires": { "yallist": "^4.0.0" } } } }, "mkdirp": { "version": "1.0.4", "bundled": true, "dev": true }, "ms": { "version": "2.1.3", "bundled": true, "dev": true }, "mute-stream": { "version": "1.0.0", "bundled": true, "dev": true }, "negotiator": { "version": "0.6.3", "bundled": true, "dev": true }, "node-gyp": { "version": "9.4.0", "bundled": true, "dev": true, "requires": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", "glob": "^7.1.4", "graceful-fs": "^4.2.6", "make-fetch-happen": "^11.0.3", "nopt": "^6.0.0", "npmlog": "^6.0.0", "rimraf": "^3.0.2", "semver": "^7.3.5", "tar": "^6.1.2", "which": "^2.0.2" }, "dependencies": { "abbrev": { "version": "1.1.1", "bundled": true, "dev": true }, "are-we-there-yet": { "version": "3.0.1", "bundled": true, "dev": true, "requires": { "delegates": "^1.0.0", "readable-stream": "^3.6.0" } }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "cacache": { "version": "17.1.4", "bundled": true, "dev": true, "requires": { "@npmcli/fs": "^3.1.0", "fs-minipass": "^3.0.0", "glob": "^10.2.2", "lru-cache": "^7.7.1", "minipass": "^7.0.3", "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "p-map": "^4.0.0", "ssri": "^10.0.0", "tar": "^6.1.11", "unique-filename": "^3.0.0" }, "dependencies": { "brace-expansion": { "version": "2.0.1", "bundled": true, "dev": true, "requires": { "balanced-match": "^1.0.0" } }, "glob": { "version": "10.3.3", "bundled": true, "dev": true, "requires": { "foreground-child": "^3.1.0", "jackspeak": "^2.0.3", "minimatch": "^9.0.1", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", "path-scurry": "^1.10.1" } }, "minimatch": { "version": "9.0.3", "bundled": true, "dev": true, "requires": { "brace-expansion": "^2.0.1" } }, "minipass": { "version": "7.0.3", "bundled": true, "dev": true } } }, "gauge": { "version": "4.0.4", "bundled": true, "dev": true, "requires": { "aproba": "^1.0.3 || ^2.0.0", "color-support": "^1.1.3", "console-control-strings": "^1.1.0", "has-unicode": "^2.0.1", "signal-exit": "^3.0.7", "string-width": "^4.2.3", "strip-ansi": "^6.0.1", "wide-align": "^1.1.5" } }, "glob": { "version": "7.2.3", "bundled": true, "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "lru-cache": { "version": "7.18.3", "bundled": true, "dev": true }, "make-fetch-happen": { "version": "11.1.1", "bundled": true, "dev": true, "requires": { "agentkeepalive": "^4.2.1", "cacache": "^17.0.0", "http-cache-semantics": "^4.1.1", "http-proxy-agent": "^5.0.0", "https-proxy-agent": "^5.0.0", "is-lambda": "^1.0.1", "lru-cache": "^7.7.1", "minipass": "^5.0.0", "minipass-fetch": "^3.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^0.6.3", "promise-retry": "^2.0.1", "socks-proxy-agent": "^7.0.0", "ssri": "^10.0.0" } }, "minimatch": { "version": "3.1.2", "bundled": true, "dev": true, "requires": { "brace-expansion": "^1.1.7" } }, "minipass": { "version": "5.0.0", "bundled": true, "dev": true }, "nopt": { "version": "6.0.0", "bundled": true, "dev": true, "requires": { "abbrev": "^1.0.0" } }, "npmlog": { "version": "6.0.2", "bundled": true, "dev": true, "requires": { "are-we-there-yet": "^3.0.0", "console-control-strings": "^1.1.0", "gauge": "^4.0.3", "set-blocking": "^2.0.0" } }, "readable-stream": { "version": "3.6.2", "bundled": true, "dev": true, "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "signal-exit": { "version": "3.0.7", "bundled": true, "dev": true }, "which": { "version": "2.0.2", "bundled": true, "dev": true, "requires": { "isexe": "^2.0.0" } } } }, "nopt": { "version": "7.2.0", "bundled": true, "dev": true, "requires": { "abbrev": "^2.0.0" } }, "normalize-package-data": { "version": "6.0.0", "bundled": true, "dev": true, "requires": { "hosted-git-info": "^7.0.0", "is-core-module": "^2.8.1", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4" } }, "npm-audit-report": { "version": "5.0.0", "bundled": true, "dev": true }, "npm-bundled": { "version": "3.0.0", "bundled": true, "dev": true, "requires": { "npm-normalize-package-bin": "^3.0.0" } }, "npm-install-checks": { "version": "6.2.0", "bundled": true, "dev": true, "requires": { "semver": "^7.1.1" } }, "npm-normalize-package-bin": { "version": "3.0.1", "bundled": true, "dev": true }, "npm-package-arg": { "version": "11.0.1", "bundled": true, "dev": true, "requires": { "hosted-git-info": "^7.0.0", "proc-log": "^3.0.0", "semver": "^7.3.5", "validate-npm-package-name": "^5.0.0" } }, "npm-packlist": { "version": "8.0.0", "bundled": true, "dev": true, "requires": { "ignore-walk": "^6.0.0" } }, "npm-pick-manifest": { "version": "9.0.0", "bundled": true, "dev": true, "requires": { "npm-install-checks": "^6.0.0", "npm-normalize-package-bin": "^3.0.0", "npm-package-arg": "^11.0.0", "semver": "^7.3.5" } }, "npm-profile": { "version": "9.0.0", "bundled": true, "dev": true, "requires": { "npm-registry-fetch": "^16.0.0", "proc-log": "^3.0.0" } }, "npm-registry-fetch": { "version": "16.0.0", "bundled": true, "dev": true, "requires": { "make-fetch-happen": "^13.0.0", "minipass": "^7.0.2", "minipass-fetch": "^3.0.0", "minipass-json-stream": "^1.0.1", "minizlib": "^2.1.2", "npm-package-arg": "^11.0.0", "proc-log": "^3.0.0" } }, "npm-user-validate": { "version": "2.0.0", "bundled": true, "dev": true }, "npmlog": { "version": "7.0.1", "bundled": true, "dev": true, "requires": { "are-we-there-yet": "^4.0.0", "console-control-strings": "^1.1.0", "gauge": "^5.0.0", "set-blocking": "^2.0.0" } }, "once": { "version": "1.4.0", "bundled": true, "dev": true, "requires": { "wrappy": "1" } }, "p-map": { "version": "4.0.0", "bundled": true, "dev": true, "requires": { "aggregate-error": "^3.0.0" } }, "pacote": { "version": "17.0.4", "bundled": true, "dev": true, "requires": { "@npmcli/git": "^5.0.0", "@npmcli/installed-package-contents": "^2.0.1", "@npmcli/promise-spawn": "^7.0.0", "@npmcli/run-script": "^7.0.0", "cacache": "^18.0.0", "fs-minipass": "^3.0.0", "minipass": "^7.0.2", "npm-package-arg": "^11.0.0", "npm-packlist": "^8.0.0", "npm-pick-manifest": "^9.0.0", "npm-registry-fetch": "^16.0.0", "proc-log": "^3.0.0", "promise-retry": "^2.0.1", "read-package-json": "^7.0.0", "read-package-json-fast": "^3.0.0", "sigstore": "^2.0.0", "ssri": "^10.0.0", "tar": "^6.1.11" } }, "parse-conflict-json": { "version": "3.0.1", "bundled": true, "dev": true, "requires": { "json-parse-even-better-errors": "^3.0.0", "just-diff": "^6.0.0", "just-diff-apply": "^5.2.0" } }, "path-is-absolute": { "version": "1.0.1", "bundled": true, "dev": true }, "path-key": { "version": "3.1.1", "bundled": true, "dev": true }, "path-scurry": { "version": "1.10.1", "bundled": true, "dev": true, "requires": { "lru-cache": "^9.1.1 || ^10.0.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "postcss-selector-parser": { "version": "6.0.13", "bundled": true, "dev": true, "requires": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "proc-log": { "version": "3.0.0", "bundled": true, "dev": true }, "process": { "version": "0.11.10", "bundled": true, "dev": true }, "promise-all-reject-late": { "version": "1.0.1", "bundled": true, "dev": true }, "promise-call-limit": { "version": "1.0.2", "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": "1.0.0", "bundled": true, "dev": true, "requires": { "read": "^2.0.0" } }, "qrcode-terminal": { "version": "0.12.0", "bundled": true, "dev": true }, "read": { "version": "2.1.0", "bundled": true, "dev": true, "requires": { "mute-stream": "~1.0.0" } }, "read-cmd-shim": { "version": "4.0.0", "bundled": true, "dev": true }, "read-package-json": { "version": "7.0.0", "bundled": true, "dev": true, "requires": { "glob": "^10.2.2", "json-parse-even-better-errors": "^3.0.0", "normalize-package-data": "^6.0.0", "npm-normalize-package-bin": "^3.0.0" } }, "read-package-json-fast": { "version": "3.0.2", "bundled": true, "dev": true, "requires": { "json-parse-even-better-errors": "^3.0.0", "npm-normalize-package-bin": "^3.0.0" } }, "readable-stream": { "version": "4.4.0", "bundled": true, "dev": true, "requires": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", "events": "^3.3.0", "process": "^0.11.10" } }, "retry": { "version": "0.12.0", "bundled": true, "dev": true }, "rimraf": { "version": "3.0.2", "bundled": true, "dev": true, "requires": { "glob": "^7.1.3" }, "dependencies": { "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "glob": { "version": "7.2.3", "bundled": true, "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "minimatch": { "version": "3.1.2", "bundled": true, "dev": true, "requires": { "brace-expansion": "^1.1.7" } } } }, "safe-buffer": { "version": "5.2.1", "bundled": true, "dev": true }, "safer-buffer": { "version": "2.1.2", "bundled": true, "dev": true, "optional": true }, "semver": { "version": "7.5.4", "bundled": true, "dev": true, "requires": { "lru-cache": "^6.0.0" }, "dependencies": { "lru-cache": { "version": "6.0.0", "bundled": true, "dev": true, "requires": { "yallist": "^4.0.0" } } } }, "set-blocking": { "version": "2.0.0", "bundled": true, "dev": true }, "shebang-command": { "version": "2.0.0", "bundled": true, "dev": true, "requires": { "shebang-regex": "^3.0.0" } }, "shebang-regex": { "version": "3.0.0", "bundled": true, "dev": true }, "signal-exit": { "version": "4.0.2", "bundled": true, "dev": true }, "sigstore": { "version": "2.1.0", "bundled": true, "dev": true, "requires": { "@sigstore/bundle": "^2.1.0", "@sigstore/protobuf-specs": "^0.2.1", "@sigstore/sign": "^2.1.0", "@sigstore/tuf": "^2.1.0" } }, "smart-buffer": { "version": "4.2.0", "bundled": true, "dev": true }, "socks": { "version": "2.7.1", "bundled": true, "dev": true, "requires": { "ip": "^2.0.0", "smart-buffer": "^4.2.0" } }, "socks-proxy-agent": { "version": "7.0.0", "bundled": true, "dev": true, "requires": { "agent-base": "^6.0.2", "debug": "^4.3.3", "socks": "^2.6.2" } }, "spdx-correct": { "version": "3.2.0", "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.13", "bundled": true, "dev": true }, "ssri": { "version": "10.0.5", "bundled": true, "dev": true, "requires": { "minipass": "^7.0.3" } }, "string_decoder": { "version": "1.3.0", "bundled": true, "dev": true, "requires": { "safe-buffer": "~5.2.0" } }, "string-width": { "version": "4.2.3", "bundled": true, "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "string-width-cjs": { "version": "npm:string-width@4.2.3", "bundled": true, "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "strip-ansi": { "version": "6.0.1", "bundled": true, "dev": true, "requires": { "ansi-regex": "^5.0.1" } }, "strip-ansi-cjs": { "version": "npm:strip-ansi@6.0.1", "bundled": true, "dev": true, "requires": { "ansi-regex": "^5.0.1" } }, "supports-color": { "version": "9.4.0", "bundled": true, "dev": true }, "tar": { "version": "6.2.0", "bundled": true, "dev": true, "requires": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" }, "dependencies": { "fs-minipass": { "version": "2.1.0", "bundled": true, "dev": true, "requires": { "minipass": "^3.0.0" }, "dependencies": { "minipass": { "version": "3.3.6", "bundled": true, "dev": true, "requires": { "yallist": "^4.0.0" } } } }, "minipass": { "version": "5.0.0", "bundled": true, "dev": true } } }, "text-table": { "version": "0.2.0", "bundled": true, "dev": true }, "tiny-relative-date": { "version": "1.3.0", "bundled": true, "dev": true }, "treeverse": { "version": "3.0.0", "bundled": true, "dev": true }, "tuf-js": { "version": "2.1.0", "bundled": true, "dev": true, "requires": { "@tufjs/models": "2.0.0", "debug": "^4.3.4", "make-fetch-happen": "^13.0.0" } }, "unique-filename": { "version": "3.0.0", "bundled": true, "dev": true, "requires": { "unique-slug": "^4.0.0" } }, "unique-slug": { "version": "4.0.0", "bundled": true, "dev": true, "requires": { "imurmurhash": "^0.1.4" } }, "util-deprecate": { "version": "1.0.2", "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": "5.0.0", "bundled": true, "dev": true, "requires": { "builtins": "^5.0.0" } }, "walk-up-path": { "version": "3.0.1", "bundled": true, "dev": true }, "wcwidth": { "version": "1.0.1", "bundled": true, "dev": true, "requires": { "defaults": "^1.0.3" } }, "which": { "version": "4.0.0", "bundled": true, "dev": true, "requires": { "isexe": "^3.1.1" }, "dependencies": { "isexe": { "version": "3.1.1", "bundled": true, "dev": true } } }, "wide-align": { "version": "1.1.5", "bundled": true, "dev": true, "requires": { "string-width": "^1.0.2 || 2 || 3 || 4" } }, "wrap-ansi": { "version": "8.1.0", "bundled": true, "dev": true, "requires": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" }, "dependencies": { "ansi-regex": { "version": "6.0.1", "bundled": true, "dev": true }, "ansi-styles": { "version": "6.2.1", "bundled": true, "dev": true }, "emoji-regex": { "version": "9.2.2", "bundled": true, "dev": true }, "string-width": { "version": "5.1.2", "bundled": true, "dev": true, "requires": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "strip-ansi": { "version": "7.1.0", "bundled": true, "dev": true, "requires": { "ansi-regex": "^6.0.1" } } } }, "wrap-ansi-cjs": { "version": "npm:wrap-ansi@7.0.0", "bundled": true, "dev": true, "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "wrappy": { "version": "1.0.2", "bundled": true, "dev": true }, "write-file-atomic": { "version": "5.0.1", "bundled": true, "dev": true, "requires": { "imurmurhash": "^0.1.4", "signal-exit": "^4.0.1" } }, "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.5.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", "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": "5.1.0", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", "dev": true, "requires": { "path-key": "^4.0.0" }, "dependencies": { "path-key": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true } } }, "npmlog": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "dev": true, "optional": true, "requires": { "are-we-there-yet": "~1.1.2", "console-control-strings": "~1.1.0", "gauge": "~2.7.3", "set-blocking": "~2.0.0" } }, "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", "dev": true, "optional": 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": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "dev": true, "optional": true }, "object-inspect": { "version": "1.12.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", "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.4", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" } }, "object.fromentries": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", "es-abstract": "^1.22.1" } }, "object.groupby": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", "es-abstract": "^1.22.1", "get-intrinsic": "^1.2.1" } }, "object.values": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", "es-abstract": "^1.22.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": "6.0.0", "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, "requires": { "mimic-fn": "^4.0.0" } }, "optionator": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "requires": { "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0" } }, "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": "3.0.0", "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-3.0.0.tgz", "integrity": "sha512-lastgtAdoH9YaLyDa5i5z64q+kzOcQHsQ5SsZJD3q0VEyI8mq872S3geuNbRUQLVAE9siMfgKrpj7MloKFHruw==", "dev": true }, "p-filter": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-3.0.0.tgz", "integrity": "sha512-QtoWLjXAW++uTX67HZQz1dbTpqBfiidsB6VtQUC9iR85S120+s0T5sO6s+B5MLzFcZkrEd/DGMmCjR+f2Qpxwg==", "dev": true, "requires": { "p-map": "^5.1.0" }, "dependencies": { "aggregate-error": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", "dev": true, "requires": { "clean-stack": "^4.0.0", "indent-string": "^5.0.0" } }, "clean-stack": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", "dev": true, "requires": { "escape-string-regexp": "5.0.0" } }, "escape-string-regexp": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true }, "indent-string": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "dev": true }, "p-map": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz", "integrity": "sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==", "dev": true, "requires": { "aggregate-error": "^4.0.0" } } } }, "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": "3.0.0", "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-3.0.0.tgz", "integrity": "sha512-xsrIUgI0Kn6iyDYm9StOpOeK29XM1aboGji26+QEortiFST1hGZaUQOLhtEbqHErPpGW/aSz6allwK2qcptp0Q==", "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": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", "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 }, "pirates": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", "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": "3.2.4", "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.4.tgz", "integrity": "sha512-FWu1oLHKCrtpO1ypU6J0SbK2d9Ckwysq6bHj/uaCP26DxrPpppCLQRGVuqAxSTvhF00AcvDRyYrLNW7ocBhFFQ==", "dev": true }, "pretty-format": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "requires": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, "dependencies": { "ansi-styles": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "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" } }, "prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "dev": true, "requires": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" } }, "propagate": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/propagate/-/propagate-2.0.1.tgz", "integrity": "sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==" }, "proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", "dev": true }, "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.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", "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 }, "pure-rand": { "version": "6.0.4", "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==", "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 }, "rambda": { "version": "7.5.0", "resolved": "https://registry.npmjs.org/rambda/-/rambda-7.5.0.tgz", "integrity": "sha512-y/M9weqWAH4iopRd7EHDEQQvpFPHj1AA3oHozE9tfITHUtTR7Z9PSlIRRG2l1GuW7sefC1cXFfIcF+cgnShdBA==", "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" } }, "react-is": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", "dev": true }, "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": "10.1.0", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-10.1.0.tgz", "integrity": "sha512-aNtBq4jR8NawpKJQldrQcSW9y/d+KWH4v24HWkHljOZ7H0av+YTGANBzRh9A5pw7v/bLVsLVPpOhJ7gHNVy8lA==", "dev": true, "requires": { "find-up": "^6.3.0", "read-pkg": "^8.1.0", "type-fest": "^4.2.0" }, "dependencies": { "find-up": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", "dev": true, "requires": { "locate-path": "^7.1.0", "path-exists": "^5.0.0" } }, "hosted-git-info": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.1.tgz", "integrity": "sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==", "dev": true, "requires": { "lru-cache": "^10.0.1" }, "dependencies": { "lru-cache": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", "dev": true } } }, "json-parse-even-better-errors": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", "dev": true }, "lines-and-columns": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.3.tgz", "integrity": "sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==", "dev": true }, "locate-path": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", "dev": true, "requires": { "p-locate": "^6.0.0" } }, "normalize-package-data": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.0.tgz", "integrity": "sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==", "dev": true, "requires": { "hosted-git-info": "^7.0.0", "is-core-module": "^2.8.1", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4" } }, "p-limit": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", "dev": true, "requires": { "yocto-queue": "^1.0.0" } }, "p-locate": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", "dev": true, "requires": { "p-limit": "^4.0.0" } }, "parse-json": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-7.1.0.tgz", "integrity": "sha512-ihtdrgbqdONYD156Ap6qTcaGcGdkdAxodO1wLqQ/j7HP1u2sFYppINiq4jyC8F+Nm+4fVufylCV00QmkTHkSUg==", "dev": true, "requires": { "@babel/code-frame": "^7.21.4", "error-ex": "^1.3.2", "json-parse-even-better-errors": "^3.0.0", "lines-and-columns": "^2.0.3", "type-fest": "^3.8.0" }, "dependencies": { "type-fest": { "version": "3.13.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", "dev": true } } }, "path-exists": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", "dev": true }, "read-pkg": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-8.1.0.tgz", "integrity": "sha512-PORM8AgzXeskHO/WEv312k9U03B8K9JSiWF/8N9sUuFjBa+9SF2u6K7VClzXwDXab51jCd8Nd36CNM+zR97ScQ==", "dev": true, "requires": { "@types/normalize-package-data": "^2.4.1", "normalize-package-data": "^6.0.0", "parse-json": "^7.0.0", "type-fest": "^4.2.0" } }, "semver": { "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" } }, "type-fest": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.5.0.tgz", "integrity": "sha512-diLQivFzddJl4ylL3jxSkEc39Tpw7o1QeEHIPxVwryDK2lpB7Nqhzhuo6v5/Ls08Z0yPSAhsyAWlv1/H0ciNmw==", "dev": true }, "yocto-queue": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", "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" } }, "redeyed": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", "integrity": "sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==", "dev": true, "requires": { "esprima": "~4.0.0" } }, "regexp.prototype.flags": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", "functions-have-names": "^1.2.3" } }, "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": "5.0.2", "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", "dev": true, "requires": { "@pnpm/npm-conf": "^2.1.0" } }, "release-zalgo": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", "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.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, "requires": { "is-core-module": "^2.13.0", "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-cwd": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, "requires": { "resolve-from": "^5.0.0" }, "dependencies": { "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 } } }, "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 }, "resolve.exports": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", "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": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", "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-array-concat": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", "dev": true, "requires": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.0", "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, "dependencies": { "isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true } } }, "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 }, "safe-regex-test": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", "dev": true, "requires": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.3", "is-regex": "^1.1.4" } }, "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": "22.0.6", "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-22.0.6.tgz", "integrity": "sha512-SxgpGR6b52gaKrb42nnaZWa2h5ig06XlloS3NjUN4W/lRBB8SId4JMaZaxN6Ncb+Ii2Uxd8WO6uvshTSSf8XRg==", "dev": true, "requires": { "@semantic-release/commit-analyzer": "^11.0.0", "@semantic-release/error": "^4.0.0", "@semantic-release/github": "^9.0.0", "@semantic-release/npm": "^11.0.0", "@semantic-release/release-notes-generator": "^12.0.0", "aggregate-error": "^5.0.0", "cosmiconfig": "^8.0.0", "debug": "^4.0.0", "env-ci": "^10.0.0", "execa": "^8.0.0", "figures": "^6.0.0", "find-versions": "^5.1.0", "get-stream": "^6.0.0", "git-log-parser": "^1.2.0", "hook-std": "^3.0.0", "hosted-git-info": "^7.0.0", "lodash-es": "^4.17.21", "marked": "^9.0.0", "marked-terminal": "^6.0.0", "micromatch": "^4.0.2", "p-each-series": "^3.0.0", "p-reduce": "^3.0.0", "read-pkg-up": "^10.0.0", "resolve-from": "^5.0.0", "semver": "^7.3.2", "semver-diff": "^4.0.0", "signale": "^1.2.1", "yargs": "^17.5.1" }, "dependencies": { "aggregate-error": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-5.0.0.tgz", "integrity": "sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==", "dev": true, "requires": { "clean-stack": "^5.2.0", "indent-string": "^5.0.0" } }, "clean-stack": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-5.2.0.tgz", "integrity": "sha512-TyUIUJgdFnCISzG5zu3291TAsE77ddchd0bepon1VVQrKLGKFED4iXFEDQ24mIPdPBbyE16PK3F8MYE1CmcBEQ==", "dev": true, "requires": { "escape-string-regexp": "5.0.0" } }, "cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "escape-string-regexp": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true }, "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 }, "hosted-git-info": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.1.tgz", "integrity": "sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==", "dev": true, "requires": { "lru-cache": "^10.0.1" }, "dependencies": { "lru-cache": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", "dev": true } } }, "indent-string": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "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": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "requires": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "yargs-parser": { "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true } } }, "semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true }, "semver-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", "dev": true, "requires": { "semver": "^7.3.5" }, "dependencies": { "semver": { "version": "7.5.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", "dev": true, "requires": { "lru-cache": "^6.0.0" } } } }, "semver-regex": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-4.0.5.tgz", "integrity": "sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==", "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.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "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": "15.2.0", "resolved": "https://registry.npmjs.org/sinon/-/sinon-15.2.0.tgz", "integrity": "sha512-nPS85arNqwBXaIsFCkolHjGIkFo+Oxu9vbgmBJizLAhqe6P2o3Qmj3KCUoRkfhHtvgDhZdWD3risLHAUJ8npjw==", "dev": true, "requires": { "@sinonjs/commons": "^3.0.0", "@sinonjs/fake-timers": "^10.3.0", "@sinonjs/samsam": "^8.0.0", "diff": "^5.1.0", "nise": "^5.1.4", "supports-color": "^7.2.0" }, "dependencies": { "@sinonjs/commons": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", "dev": true, "requires": { "type-detect": "4.0.8" } }, "@sinonjs/fake-timers": { "version": "10.3.0", "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, "requires": { "@sinonjs/commons": "^3.0.0" } }, "diff": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", "dev": true } } }, "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": {} }, "sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", "dev": true }, "skin-tone": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", "dev": true, "requires": { "unicode-emoji-modifier-base": "^1.0.0" } }, "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": "sha512-NwrtjCg+lZoqhFU8fOwl4ay2ei8PaqCBOUV3/ektPY9trO1yQ1oXEfmHAhKArUVUr/hOHvy5f6AdP17dCM0zMw==", "dev": true }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, "source-map-support": { "version": "0.5.13", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "spawn-error-forwarder": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz", "integrity": "sha1-Gv2Uc46ZmwNG17n8NzvlXgdXcCk=", "dev": true }, "spawn-wrap": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", "dev": true, "requires": { "foreground-child": "^2.0.0", "is-windows": "^1.0.2", "make-dir": "^3.0.0", "rimraf": "^3.0.0", "signal-exit": "^3.0.2", "which": "^2.0.1" } }, "spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "spdx-exceptions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", "dev": true }, "spdx-expression-parse": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, "requires": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "spdx-license-ids": { "version": "3.0.11", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", "dev": true }, "split2": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", "dev": true }, "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" } }, "stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, "requires": { "escape-string-regexp": "^2.0.0" }, "dependencies": { "escape-string-regexp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true } } }, "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-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, "requires": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" } }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", "dev": true, "optional": 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": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "dev": true, "optional": true }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "dev": true, "optional": 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.trim": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4" } }, "string.prototype.trimend": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4" } }, "string.prototype.trimstart": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4" } }, "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": "3.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true }, "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": "3.0.0", "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.0.0.tgz", "integrity": "sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==", "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": "6.1.15", "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", "dev": true, "requires": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" }, "dependencies": { "minipass": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "dev": true }, "mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true } } }, "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": "3.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-3.0.0.tgz", "integrity": "sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==", "dev": true }, "tempy": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/tempy/-/tempy-3.1.0.tgz", "integrity": "sha512-7jDLIdD2Zp0bDe5r3D2qtkd1QOCacylBuL7oa4udvN6v2pqr4+LcCr67C8DR1zkpaZ8XosF5m1yQSabKAW6f2g==", "dev": true, "requires": { "is-stream": "^3.0.0", "temp-dir": "^3.0.0", "type-fest": "^2.12.2", "unique-string": "^3.0.0" }, "dependencies": { "is-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true }, "type-fest": { "version": "2.19.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "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": "2.4.0", "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-2.4.0.tgz", "integrity": "sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==", "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": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "dev": true }, "tmp": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", "dev": true, "requires": { "rimraf": "^3.0.0" } }, "tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true }, "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": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "dev": true }, "traverse": { "version": "0.6.6", "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=", "dev": true }, "tsconfig-paths": { "version": "3.15.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, "requires": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" }, "dependencies": { "json5": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "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": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "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": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "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": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", "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 }, "typed-array-buffer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", "dev": true, "requires": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.1", "is-typed-array": "^1.1.10" } }, "typed-array-byte-length": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", "dev": true, "requires": { "call-bind": "^1.0.2", "for-each": "^0.3.3", "has-proto": "^1.0.1", "is-typed-array": "^1.1.10" } }, "typed-array-byte-offset": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", "dev": true, "requires": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "for-each": "^0.3.3", "has-proto": "^1.0.1", "is-typed-array": "^1.1.10" } }, "typed-array-length": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", "dev": true, "requires": { "call-bind": "^1.0.2", "for-each": "^0.3.3", "is-typed-array": "^1.1.9" } }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", "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": "5.3.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", "dev": true }, "uglify-js": { "version": "3.17.4", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", "dev": true, "optional": true }, "unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, "requires": { "call-bind": "^1.0.2", "has-bigints": "^1.0.2", "has-symbols": "^1.0.3", "which-boxed-primitive": "^1.0.2" } }, "unicode-emoji-modifier-base": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", "dev": true }, "unique-string": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", "dev": true, "requires": { "crypto-random-string": "^4.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": "5.0.0", "resolved": "https://registry.npmjs.org/url-join/-/url-join-5.0.0.tgz", "integrity": "sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==", "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-to-istanbul": { "version": "9.2.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", "dev": true, "requires": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", "convert-source-map": "^2.0.0" }, "dependencies": { "convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "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": "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==", "dev": true, "requires": { "builtins": "^1.0.3" } }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", "dev": true, "requires": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", "extsprintf": "^1.2.0" } }, "walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, "requires": { "makeerror": "1.0.12" } }, "webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", "dev": true }, "whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "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 }, "which-typed-array": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", "dev": true, "requires": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "for-each": "^0.3.3", "gopd": "^1.0.1", "has-tostringtag": "^1.0.0" } }, "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, "optional": true, "requires": { "string-width": "^1.0.2 || 2 || 3 || 4" } }, "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", "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 }, "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.5.4/package.json000066400000000000000000000044501456720332700150400ustar00rootroot00000000000000{ "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", "propagate": "^2.0.0" }, "devDependencies": { "@definitelytyped/dtslint": "^0.0.163", "@sinonjs/fake-timers": "^11.2.2", "assert-rejects": "^1.0.0", "chai": "^4.1.2", "dirty-chai": "^2.0.1", "eslint": "^8.8.0", "eslint-config-prettier": "^9.0.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", "jest": "^29.7.0", "mocha": "^9.1.3", "npm-run-all": "^4.1.5", "nyc": "^15.0.0", "prettier": "3.2.4", "proxyquire": "^2.1.0", "rimraf": "^3.0.0", "semantic-release": "^22.0.5", "sinon": "^15.0.1", "sinon-chai": "^3.7.0", "typescript": "^5.0.4" }, "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 --expectOnly types", "test": "nyc --reporter=lcov --reporter=text mocha --recursive tests", "test:coverage": "open coverage/lcov-report/index.html", "test:jest": "jest tests_jest --detectLeaks" }, "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.5.4/rfcs/000077500000000000000000000000001456720332700135045ustar00rootroot00000000000000nock-13.5.4/rfcs/rfc-001.md000066400000000000000000000112401456720332700150740ustar00rootroot00000000000000# Analysis of lifecycle methods (RFC-001) ![](https://img.shields.io/badge/rfc-001-blue.svg) ![](https://img.shields.io/badge/status-accepted-brightgreen.svg) 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.5.4/tests/000077500000000000000000000000001456720332700137115ustar00rootroot00000000000000nock-13.5.4/tests/assets/000077500000000000000000000000001456720332700152135ustar00rootroot00000000000000nock-13.5.4/tests/assets/reply_file_1.txt000066400000000000000000000000241456720332700203220ustar00rootroot00000000000000Hello from the file!nock-13.5.4/tests/assets/reply_file_2.txt.gz000066400000000000000000000000711456720332700207440ustar00rootroot000000000000009Sreply_file_2.txtHWH+U(HUHIUpN,nock-13.5.4/tests/fixtures/000077500000000000000000000000001456720332700155625ustar00rootroot00000000000000nock-13.5.4/tests/fixtures/good_request.json000066400000000000000000001523541456720332700211670ustar00rootroot00000000000000[ { "scope": "http://www.example.test:80", "method": "GET", "path": "/", "body": "", "status": 200, "response": "Google
×
A faster way to browse the web

\"Google\"

 

Advanced searchLanguage tools

© 2013 - Privacy & Terms

", "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.5.4/tests/fixtures/wrong_uri.json000066400000000000000000003250331456720332700204760ustar00rootroot00000000000000[ { "scope": "http://www.google.com:80", "method": "GET", "path": "/", "body": "", "status": 200, "response": "Google
×
A faster way to browse the web

\"Google\"

 

Advanced searchLanguage tools

© 2013 - Privacy & Terms

", "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

\"Google\"

 

Advanced searchLanguage tools

© 2013 - Privacy & Terms

", "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.5.4/tests/got/000077500000000000000000000000001456720332700145025ustar00rootroot00000000000000nock-13.5.4/tests/got/got_client.js000066400000000000000000000002001456720332700171570ustar00rootroot00000000000000'use strict' const got = require('got') // https://github.com/nock/nock/issues/1523 module.exports = got.extend({ retry: 0 }) nock-13.5.4/tests/got/test_allow_unmocked.js000066400000000000000000000202221456720332700211000ustar00rootroot00000000000000'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.5.4/tests/got/test_allow_unmocked_https.js000066400000000000000000000057441456720332700223360ustar00rootroot00000000000000'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.5.4/tests/got/test_back_filters.js000066400000000000000000000061221456720332700205300ustar00rootroot00000000000000'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.5.4/tests/got/test_basic_auth.js000066400000000000000000000027151456720332700202060ustar00rootroot00000000000000'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.5.4/tests/got/test_body_match.js000066400000000000000000000216461456720332700202210ustar00rootroot00000000000000'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.5.4/tests/got/test_content_encoding.js000066400000000000000000000023441456720332700214220ustar00rootroot00000000000000'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.5.4/tests/got/test_default_reply_headers.js000066400000000000000000000122161456720332700224330ustar00rootroot00000000000000'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.5.4/tests/got/test_define.js000066400000000000000000000150441456720332700173350ustar00rootroot00000000000000'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.5.4/tests/got/test_delay.js000066400000000000000000000271741456720332700172100ustar00rootroot00000000000000'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.5.4/tests/got/test_dynamic_mock.js000066400000000000000000000036071456720332700205420ustar00rootroot00000000000000'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.5.4/tests/got/test_events.js000066400000000000000000000054571456720332700174160ustar00rootroot00000000000000'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.5.4/tests/got/test_fake_timer.js000066400000000000000000000006551456720332700202130ustar00rootroot00000000000000'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.5.4/tests/got/test_header_matching.js000066400000000000000000000431601456720332700212050ustar00rootroot00000000000000'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.5.4/tests/got/test_intercept.js000066400000000000000000000747431456720332700201130ustar00rootroot00000000000000'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.5.4/tests/got/test_intercept_parallel.js000066400000000000000000000044001456720332700217460ustar00rootroot00000000000000'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.5.4/tests/got/test_logging.js000066400000000000000000000032471456720332700175330ustar00rootroot00000000000000'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.5.4/tests/got/test_net_connect.js000066400000000000000000000063151456720332700204030ustar00rootroot00000000000000'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.5.4/tests/got/test_nock_lifecycle.js000066400000000000000000000146541456720332700210620ustar00rootroot00000000000000'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() }) it("activeMocks doesn't return duplicate mocks", () => { nock('http://example.test') .get('/') .reply() .get('/second') .reply() .get('/third') .reply() expect(nock.activeMocks()).to.deep.equal([ 'GET http://example.test:80/', 'GET http://example.test:80/second', 'GET http://example.test:80/third', ]) }) }) 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.5.4/tests/got/test_nock_off.js000066400000000000000000000024011456720332700176600ustar00rootroot00000000000000'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.5.4/tests/got/test_persist_optionally.js000066400000000000000000000136771456720332700220600ustar00rootroot00000000000000'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.5.4/tests/got/test_query.js000066400000000000000000000235031456720332700172470ustar00rootroot00000000000000'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 a string', () => { it('matches a url encoded query string of the same name=value', async () => { const scope = nock('http://example.test') .get('/') .query('foo%5Bbar%5D%3Dhello%20world%21') .reply() const { statusCode } = await got( 'http://example.test/?foo%5Bbar%5D%3Dhello%20world%21', ) expect(statusCode).to.equal(200) scope.done() }) }) 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(1) }).to.throw(Error, 'Argument Error: 1') }) }) 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.5.4/tests/got/test_query_complex.js000066400000000000000000000071421456720332700207770ustar00rootroot00000000000000'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.5.4/tests/got/test_recorder.js000066400000000000000000001012011456720332700176770ustar00rootroot00000000000000'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.5.4/tests/got/test_redirects.js000066400000000000000000000010431456720332700200610ustar00rootroot00000000000000'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.5.4/tests/got/test_remove_interceptor.js000066400000000000000000000130751456720332700220200ustar00rootroot00000000000000'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 newScope = nock('http://example.test') .get('/somepath') .reply(202, 'other-content') const givenInterceptor = nock('http://example.test').get('/somepath') givenInterceptor.reply(200, 'hey') expect(nock.removeInterceptor(givenInterceptor)).to.be.true() 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.5.4/tests/got/test_repeating.js000066400000000000000000000053371456720332700200650ustar00rootroot00000000000000'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.5.4/tests/got/test_reply_body.js000066400000000000000000000106021456720332700202460ustar00rootroot00000000000000'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.5.4/tests/got/test_reply_function_async.js000066400000000000000000000126341456720332700223420ustar00rootroot00000000000000'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.5.4/tests/got/test_reply_function_sync.js000066400000000000000000000313341456720332700221770ustar00rootroot00000000000000'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.5.4/tests/got/test_reply_headers.js000066400000000000000000000271321456720332700207320ustar00rootroot00000000000000'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.5.4/tests/got/test_reply_with_file.js000066400000000000000000000060021456720332700212620ustar00rootroot00000000000000'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() }) it('reply with file with persist', async () => { sinon.spy(fs) const scope = nock('http://example.test') .persist() .get('/') .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') }) }) it('does not create ReadStream eagerly', async () => { sinon.spy(fs) nock('http://example.test').get('/').replyWithFile(200, binaryFilePath, { 'content-encoding': 'gzip', }) expect(fs.createReadStream.callCount).to.equal(0) }) }) nock-13.5.4/tests/got/test_request_overrider.js000066400000000000000000000577641456720332700216730ustar00rootroot00000000000000'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 called when encoding is not supplied', 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', () => { 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("write doesn't throw if invoked w/o callback", 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) 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.5.4/tests/got/test_scope.js000066400000000000000000000154731456720332700172220ustar00rootroot00000000000000'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() }) it('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('throws on invalid or omitted protocol', async () => { expect(() => nock('ws://example.test')).to.throw() expect(() => nock('localhost/foo')).to.throw() expect(() => nock('foo.com:1234')).to.throw() }) it('throws on invalid URL format', async () => { expect(() => nock(['This is not a url'])).to.throw() // The following contains all valid properties of WHATWG URL, but is not an // instance of URL. Maybe we should support object literals some day? A // simple duck-type validator would suffice. expect(() => nock({ href: 'http://google.com/foo', origin: 'http://google.com', protocol: 'http:', username: '', password: '', host: 'google.com', hostname: 'google.com', port: 80, pathname: '/foo', search: '', searchParams: {}, hash: '', }), ).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', ) }) describe('`Scope#clone()`', async () => { it('creates a new Scope with the same basePath and scope options', () => { const scope = nock('http://example.test', { encodedQueryParams: true }) const clonedScope = scope.clone() expect(clonedScope.basePath).to.equal(scope.basePath) expect(clonedScope.scopeOptions).to.deep.equal(scope.scopeOptions) }) it('creates a new Scope that works independently', async () => { const scope = nock('http://example.test') const getScope = scope.get('/').reply(200) const postScope = scope.clone().post('/').reply(200) await got('http://example.test/') expect(getScope.isDone()).to.be.true() await got.post('http://example.test/') expect(postScope.isDone()).to.be.true() }) }) }) nock-13.5.4/tests/got/test_stream.js000066400000000000000000000161201456720332700173720ustar00rootroot00000000000000'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.5.4/tests/got/test_url_encoding.js000066400000000000000000000005311456720332700205460ustar00rootroot00000000000000'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.5.4/tests/servers/000077500000000000000000000000001456720332700154025ustar00rootroot00000000000000nock-13.5.4/tests/servers/ca.crt000066400000000000000000000022401456720332700164750ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDPDCCAiQCCQCueDE36f5RTDANBgkqhkiG9w0BAQsFADBgMQswCQYDVQQGEwJH QjEQMA4GA1UECAwHRW5nbGFuZDEPMA0GA1UEBwwGTG9uZG9uMQ0wCwYDVQQKDARO b2NrMQ0wCwYDVQQLDARUZXN0MRAwDgYDVQQDDAdOb2NrIENBMB4XDTIzMDQyMTE1 MzYwNloXDTMzMDQxODE1MzYwNlowYDELMAkGA1UEBhMCR0IxEDAOBgNVBAgMB0Vu Z2xhbmQxDzANBgNVBAcMBkxvbmRvbjENMAsGA1UECgwETm9jazENMAsGA1UECwwE VGVzdDEQMA4GA1UEAwwHTm9jayBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC AQoCggEBAMHXbQDRpZ1OsCNCN3m6XYYcbq1CfrcqjJkR6tQLyqEQhxNxwXFYgvAF pibdn2sbqIaAINogyf1bckS6357C75oVPeQFxT2qE6KwnVdUNEc3t5wZMYJeIGhj eNVSJ2hjVuMfNgqlZpwtOZ2EK6HlWCpQuxBhTyVhJhaoFaNbCQqE2yPCwpGNQsvG tR9Owo1B9KX/dEv4aisFDn78fNykXQGBFtNoa/ZD7Z4nwi0KJguhUC+DXilZM8mj E6cC5hZHUHcdRXmIwY0lnV4A32yxekh/PaPZT+e70Uy8j+BlQGcfEtc6F9ScCmrB 8wMnQErmv+riIuoT08bj8ZMo+5ShYmkCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEA T7dZYnzaiHLLsfxMAknUKHhkHcJwU4Ca8v/HQMIigmvA6gexR6EH4xu1pUm1XbOR zWOLFOvVkjlv7ZlLReJkaz7A//qq2l7f+X/9+y6rGk9og1zQ28Gq5StDJ9IBruaP PSOOwX8Q9RBaPOn3CffOtuG5YKnkrDgLYhbWVP7OhGBHbNe5/n/TXPHMvkcb68XU oiauSioHimTppA4K3HNf4U6TEeOK4B4Az5b4+k+sskjVBNw/GKMLKCb41HhrH1Uw YUjetR94xUZukQJHIP7wzqp21XYWl9/KC7fkk2huM+dF3vDJqXRXA54DVIZD96WE WxGh8fPySY+nYngq5rHQ8w== -----END CERTIFICATE----- nock-13.5.4/tests/servers/ca.key000066400000000000000000000032171456720332700165020ustar00rootroot00000000000000-----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEAwddtANGlnU6wI0I3ebpdhhxurUJ+tyqMmRHq1AvKoRCHE3HB cViC8AWmJt2faxuohoAg2iDJ/VtyRLrfnsLvmhU95AXFPaoTorCdV1Q0Rze3nBkx gl4gaGN41VInaGNW4x82CqVmnC05nYQroeVYKlC7EGFPJWEmFqgVo1sJCoTbI8LC kY1Cy8a1H07CjUH0pf90S/hqKwUOfvx83KRdAYEW02hr9kPtnifCLQomC6FQL4Ne KVkzyaMTpwLmFkdQdx1FeYjBjSWdXgDfbLF6SH89o9lP57vRTLyP4GVAZx8S1zoX 1JwKasHzAydASua/6uIi6hPTxuPxkyj7lKFiaQIDAQABAoIBAQC02F5q8C0aKSqt in6lQ9kzYN1lKe98xeasfIng0St3vyq2WmAGdnSaqDqOch/kVsaQzYNY3lR02lcu hkZRIT9XOtAmJ7gQQtfU5f+1VOr9Mp9LtDl7joOfwIYgR2havKt4dEr//bZQqOTi 70eh4I2z1OPhcVfc4NkfNCwT3r/9nbmf4g7kR+DFUjLMUQ/DNM+Iq4WXapgerCbI o9XqXGFAQdhVTZDE6z0VLrSPj7B4sF0J9XV4IKpZgfatX3ZBneTuLCaSN7NCTEI2 r9OMaDNJgR33Krl4eeie51jwIehJFEHjfUdrIKnGmUROFv2zJPrHD6DvD/cPYp2b 54kDGufxAoGBAPgP6aiCFY7YCxTicfWplS8qqwDKnB64GiX98T5UnWXFFwJs4C5Y p2vw9RJWykAttzOwXhxJbGwr9gWf/t7NP4eBUIflihZzD6qQQ0inxN0P4wLnDT72 a0YoXObHynxn+p+ZPv+hwAh5qTC1PzA+Y52140VwYmVNMSU1D8c1T6tNAoGBAMgL WITHb+Cc6/aYPxq5CpnfhKQx8lr6Haj0wlB8+Ph22tSiIQh8adDPvrtIZWu7tDf2 H21nTLIRwsaTkdC9+42BfLefbqqGLDh8kI7KzcIHis9YqhUkKbsB8NEprNsA9h9H acnQW5/4pUFWdppENkVOQONzjSOQ5ByZXQ7Uca2NAoGBAIKt91zzMqIuxB+7b2eI b/QKGU3wbrBsMjJDhjxc3RJI8ucvLiacQ47EwIZpvGB09OdBCUMDlx+hRRkPgXgk Tkx3XlJJJSbQdLdZCmkTIM2IWgIkcED0Fe0+xDo7lDtXl5tOYvbOYljUpsHnKaOj qlzh/hmNq/hL4xED1A0Q06idAoGAOUsWlSDRqBEJe9zq5eptYNilkqlDck8EQ6mm JYtFe1P/JLsyns2TONznEZiQg6SE3yo8ogbd7norwNfvAUwISeT2JVkiRvCapar3 dA4dlB644N3SCLAMy6Soph87hJXn59l6MPTd6Rk7q1TqLxCuQndBGmOz3qXWz2IV RvQNgtkCgYEAgICKJtC2kdwQSyvaDD9swgvf28piTcoHrbCks8okuWUW4Njkw/HZ iOISF0mIuRKa0poagF6eSfZSRf4pupSxsull8qodQRAdvcD8EBUu3cHl173z0XbI kwnu3sqCK7xTkvqrsb8p9DyE/PHbApDGvIYtXbnJMSn97JWifAlQ5LU= -----END RSA PRIVATE KEY----- nock-13.5.4/tests/servers/index.js000066400000000000000000000034411456720332700170510ustar00rootroot00000000000000'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.5.4/tests/servers/localhost.crt000066400000000000000000000022401456720332700201020ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDPjCCAiYCCQC6qPYSWa0ZezANBgkqhkiG9w0BAQsFADBgMQswCQYDVQQGEwJH QjEQMA4GA1UECAwHRW5nbGFuZDEPMA0GA1UEBwwGTG9uZG9uMQ0wCwYDVQQKDARO b2NrMQ0wCwYDVQQLDARUZXN0MRAwDgYDVQQDDAdOb2NrIENBMB4XDTIzMDQyMTE1 MzYxNFoXDTMzMDQxODE1MzYxNFowYjELMAkGA1UEBhMCR0IxEDAOBgNVBAgMB0Vu Z2xhbmQxDzANBgNVBAcMBkxvbmRvbjENMAsGA1UECgwETm9jazENMAsGA1UECwwE VGVzdDESMBAGA1UEAwwJbG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEA7gE1a0SCpHIl/AWPRehQHR26diXfhYrKjrZMfDu4A7mApMJOYbys 3//+aHugiQxUJ9ZyZERcNxmQ1pTGqqJFeeJNg1UUki0e/nX/GuQQrnbYCDHbAb1b AZxHgy6+XDs1jOkkCI3uAPtqxsHTRKS34nLr6phiWSJJB4a+POxpuqqG6BlcsHZj Dba3EJnozSc3Vwk81aZ7blILsHS3ePQ03IwKsmvS/HS9+L611urL+fZ8i9XkIzWm y3RBN5xLIRsoQIceAT3ualTNqXJuZO3x1gpZnOYbC9y2xDfTBcEgjeqql1Pc0nSG zgZJ5M91mVm2djU1Np3Hwx7VWe0YU5Kq0wIDAQABMA0GCSqGSIb3DQEBCwUAA4IB AQAW+4SIDqnn5qWa7bMP74Q4DCL/Lf8rPg6RCdGuwPdoAQ4lj43nXGmvwUyVaV91 kuh7bSPOTut0pjPEbnouowj9WrKShyOP+jdo1m6Y7WQPawwhEgdhbUUP2iUT5kJv 1VLFBSkpq9VVb/6rumwOAqv/DrrAfqQI7ELY5bF9CAARw819N7E6QtzzsIxU7Fou iW9ZgvDxd5b4n8fVmpp9Ll7kiXhMeRCAx7yJr4I8aENxt7hf0OmgPZxsp2T2B7Pe a0UektMkuMCmJf5jv76PmAoAGWMKs79hVAoxndHcq/9KK5l+fJxiH91unfTeyg5c +0EFY8lOlM0dzO+TGorzQ5k2 -----END CERTIFICATE----- nock-13.5.4/tests/servers/localhost.key000066400000000000000000000032171456720332700201070ustar00rootroot00000000000000-----BEGIN RSA PRIVATE KEY----- MIIEpAIBAAKCAQEA7gE1a0SCpHIl/AWPRehQHR26diXfhYrKjrZMfDu4A7mApMJO Ybys3//+aHugiQxUJ9ZyZERcNxmQ1pTGqqJFeeJNg1UUki0e/nX/GuQQrnbYCDHb Ab1bAZxHgy6+XDs1jOkkCI3uAPtqxsHTRKS34nLr6phiWSJJB4a+POxpuqqG6Blc sHZjDba3EJnozSc3Vwk81aZ7blILsHS3ePQ03IwKsmvS/HS9+L611urL+fZ8i9Xk IzWmy3RBN5xLIRsoQIceAT3ualTNqXJuZO3x1gpZnOYbC9y2xDfTBcEgjeqql1Pc 0nSGzgZJ5M91mVm2djU1Np3Hwx7VWe0YU5Kq0wIDAQABAoIBAGa4VNLX/b51mZk8 2Qol6rW2R+yICgF71lJjsX0I1TGeVTxGtEeQg9glhyqW+MFNdeC/uB04N8h8GzvR eDDa2jtxhVzCUp+II9FVIeX8OorhtflLcyc8D1QRm/etK/FoiIMpeCjNAMShvgLM Up9UrBxq1xEn9YJcvsIl0GNA8Zzi+ThaV9mXf3qfylZnmmFL980OQwBTIwF8JlrC 8Nb4+IKurOynVMqHswabXCOQeawbqdSMfo+IrK8enLMl2qlAW1NRgqkQ6H37QuSA PHMsndvLCMtIjEQgzW2MtJvuf+CyR6T2XluJ56DRrVWYzWf9CPUr1dzrjYzWeWMa knO5/1kCgYEA/KZZB1++XUsqqfF5OWQIpk2S8MGcyT5ciDK2k8TkHkIL01rkuY2T irtfKJKe946GBDXgJJ1sM4vrjPl30jI9lkok0FMTdJc946hdQQNfQOuw8PoGogsE RbKAKsqwR1U+BjUwE/Sf6bjK2arc9e2OB1gwwXyRecJu9mFYFTFuafUCgYEA8Skl dIzLYaIB2x+ikwBTrOUYfq9GWd+rJ33EZ/ueogrRmpt8xLgx+2KINcPVZhYBpPaI /lfvC4KyYmPcZOJ+NNemMXR2XHlajSVWu3AMCM2rH1vNsSqBYKzWM7JfIUpk8GqX 0jnPjYAE3sBeFbKrkpHCkksVEhMBZeBDXExp3KcCgYEAuXqiJ5C5n6IcSzEUrvZq hzSyKH/rS661neOlOCy20CPqrJqxCiwO4i2WuaGShOmkJ5kp2ZecpOcW4aMPvUfX AOujxTEIOnMCI40qER2Zo36kovTbQ8FUvJpED6ZH7cZ9x27qweu4LozUlyIiH4Xr 3CZ5fMKnxjzg244xbTWh+rUCgYEAgyWVMOTAVb/8smVpy/eJiaSsxXgcEhQIx9kl TkcP5Z9sjV+xYmmpBMR4voRZMMMW8dcAeRDo9qGE0Oztlg92AtajkpF7LJ7yF4AO wrAUW1U9kjgijA5JfYGAm2yNP1VtvzC4j6LQtGrCO0Dx6WrY00RhQ52BP+sF/5kO CMulZlECgYAUsGy/zPp3jgHuiywemP9JZGI7CB1a8beF7yBLXIJWYikR4CfecOAM gQg5kqDkE/rcTB492C7rgbmo3Q1A1Na5fsgELw7ngIXZ+FgInvAVmSzTAFdjaHAX 0AVOFsRl+/ChfnfUqU47tmJJuIL0z2+UHMUuML39x6knLZ4guZXS4g== -----END RSA PRIVATE KEY----- nock-13.5.4/tests/setup.js000066400000000000000000000011231456720332700154040ustar00rootroot00000000000000'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.5.4/tests/test_abort.js000066400000000000000000000140401456720332700164140ustar00rootroot00000000000000'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.5.4/tests/test_back.js000066400000000000000000000550031456720332700162110ustar00rootroot00000000000000'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() }) }) it('`query` returns all of the interceptors recorded to the cassette', done => { nockBack('good_request.json').then(({ nockDone, context }) => { const interceptor = context.query() nockDone() expect(interceptor.length).to.equal(1) expect(interceptor[0].method).to.equal('GET') expect(interceptor[0].uri).to.equal('/') expect(interceptor[0].basePath).to.equal('http://www.example.test:80') expect(interceptor[0].path).to.equal('/') expect(interceptor[0].queries).to.be.null() expect(interceptor[0].counter).to.equal(1) expect(interceptor[0]).to.have.property('body') expect(interceptor[0].statusCode).to.equal(200) expect(interceptor[0].optional).to.equal(false) 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.5.4/tests/test_client_request.js000066400000000000000000000061641456720332700203430ustar00rootroot00000000000000'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.5.4/tests/test_common.js000066400000000000000000000421471456720332700166060ustar00rootroot00000000000000'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 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 [major, minor] = process.versions.node.split('.').map(Number) const useNewErrorText = major > 16 || (major === 16 && minor > 1) const errorText = useNewErrorText ? '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() }) }) describe('`isPlainObject()`', () => { const { isPlainObject } = common it('custom Object', () => { function Foo() { this.a = 1 } expect(isPlainObject(new Foo()), false) }) it('Array', () => { expect(isPlainObject([1, 2, 3]), false) }) it('Date', () => { expect(isPlainObject(new Date()), false) }) it('RegExp', () => { expect(isPlainObject(/a/), false) }) it('plain Object', () => { expect(isPlainObject({}), true) }) it('null', () => { expect(isPlainObject(null), true) }) it('null-Object /1', () => { expect(isPlainObject({ __proto__: null }), true) }) it('null-Object /2', () => { expect(isPlainObject(Object.create(null)), true) }) }) describe('`expand()`', () => { const { expand } = common it('undefined', () => { expect(expand(undefined), undefined) }) it('null', () => { expect(expand(null), null) }) it('throws on constructor', () => { expect(expand({ constructor: 4 })).equal(undefined) }) it('pure key values', () => { expect(expand({ a: 4 })).deep.equal({ a: 4 }) }) it('nested object', () => { expect(expand({ 'a.b': 4 })).deep.equal({ a: { b: 4 } }) }) it('nested object', () => { expect(expand({ 'a.b': 4, 'a.c': 5 })).deep.equal({ a: { b: 4, c: 5 } }) }) it('nested object', () => { expect(expand({ 'a.b': 4, 'b.a': 5 })).deep.equal({ a: { b: 4 }, b: { a: 5 }, }) }) it('nested array', () => { expect(expand({ 'a.0': 4, 'a.1': 5 })).deep.equal({ a: [4, 5] }) }) it('array-like', () => { expect(expand({ 'a[0]': 4, 'a[1]': 5 })).deep.equal({ a: [4, 5] }) }) it('example', () => { expect(expand({ 'foo[bar][0]': 'baz' })).deep.equal({ foo: { bar: ['baz'] }, }) }) it('does not mutate original', () => { const original = { 'foo[bar][0]': 'baz' } const result = expand(original) expect(result).deep.equal({ foo: { bar: ['baz'] } }) expect(original).deep.equal({ 'foo[bar][0]': 'baz' }) expect(original).not.equal(result) }) }) nock-13.5.4/tests/test_destroy.js000066400000000000000000000025671456720332700170110ustar00rootroot00000000000000'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.5.4/tests/test_gzip_request.js000066400000000000000000000036141456720332700200330ustar00rootroot00000000000000'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.5.4/tests/test_ipv6.js000066400000000000000000000031621456720332700161740ustar00rootroot00000000000000'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.5.4/tests/test_reply_with_error.js000066400000000000000000000022071456720332700207060ustar00rootroot00000000000000'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.5.4/tests/test_socket.js000066400000000000000000000050601456720332700165770ustar00rootroot00000000000000'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.5.4/tests_jest/000077500000000000000000000000001456720332700147365ustar00rootroot00000000000000nock-13.5.4/tests_jest/memory_leak.spec.js000066400000000000000000000004141456720332700205300ustar00rootroot00000000000000'use strict' const nock = require('..') const { test } = require('@jest/globals') // jest --detectLeaks flag will fail on a leak, so we do not need any 'expect' in this test test('Does not leak memory in Jest after using "nock.restore"', () => { nock.restore() }) nock-13.5.4/types/000077500000000000000000000000001456720332700137135ustar00rootroot00000000000000nock-13.5.4/types/index.d.ts000066400000000000000000000174171456720332700156260ustar00rootroot00000000000000// 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 | 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, recordedBody: 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 | RegExp path: string | RegExp 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 InterceptorSurface { method: string uri: string basePath: string path: string queries?: string counter: number body: string statusCode: number optional: boolean } interface BackContext { isLoaded: boolean scopes: Scope[] assertScopesFinished(): void query: InterceptorSurface[] } interface BackOptions { before?: (def: Definition) => void after?: (scope: Scope) => void afterRecord?: (defs: Definition[]) => Definition[] recorder?: RecorderOptions } } type ReqOptions = RequestOptions & { proto?: string } nock-13.5.4/types/tests.ts000066400000000000000000000447751456720332700154460ustar00rootroot00000000000000import 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) // @ts-expect-error inst = scope.post(str, true) // @ts-expect-error inst = scope.post(str, null) // @ts-expect-error inst = scope.post(str, num) 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 }) // @ts-expect-error inst = inst.query(strings) // @ts-expect-error inst = inst.query(buffer) // @ts-expect-error inst = inst.query(regex) 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 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.5.4/types/tsconfig.json000066400000000000000000000003051456720332700164200ustar00rootroot00000000000000{ "compilerOptions": { "module": "commonjs", "lib": ["es6"], "strict": true, "noEmit": true, "esModuleInterop": true, "baseUrl": ".", "paths": { "nock": ["."] } } } nock-13.5.4/types/tslint.json000066400000000000000000000002141456720332700161200ustar00rootroot00000000000000{ "extends": "@definitelytyped/dtslint/dtslint.json", "rules": { "semicolon": false, "space-before-function-paren": false } }