From e4607f90bb152ab3e053b44215216612b18edc0c Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Thu, 15 Sep 2022 16:28:59 +0530 Subject: [PATCH 001/145] feat: resetup project for esm --- .editorconfig | 22 - .github/COMMIT_CONVENTION.md | 70 - .github/CONTRIBUTING.md | 46 - .github/ISSUE_TEMPLATE/bug_report.md | 29 - .github/ISSUE_TEMPLATE/feature_request.md | 28 - .github/PULL_REQUEST_TEMPLATE.md | 28 - .github/labels.json | 170 + .github/stale.yml | 4 +- .github/workflows/test.yml | 19 +- .gitignore | 15 +- .husky/.gitignore | 1 - .husky/commit-msg | 7 +- .npmrc | 1 - .prettierignore | 8 - CHANGELOG.md | 193 - LICENSE.md | 9 - README.md | 55 +- bin/japaTypes.ts | 7 - bin/japa_types.ts | 11 + bin/test.ts | 4 +- examples/index.ts | 61 - index.ts | 14 +- package-lock.json | 15653 ++++++++++++++++++ package.json | 133 +- perf/foo.js | 1 - perf/index.js | 42 - perf/require.js | 21 - src/Contracts/index.ts | 412 - src/Exceptions/InvalidInjectionException.ts | 23 - src/Exceptions/IocLookupException.ts | 41 - src/Ioc/Bindings.ts | 70 - src/Ioc/Fakes.ts | 67 - src/Ioc/ImportAliases.ts | 119 - src/Ioc/Injector.ts | 168 - src/Ioc/IocProxy.ts | 117 - src/Ioc/index.ts | 552 - src/Registrar/index.ts | 149 - src/Resolver/index.ts | 115 - src/decorators/index.ts | 69 - src/helpers.ts | 35 - src/user.ts | 13 + test/ioc-resolver.spec.ts | 186 - test/ioc.spec.ts | 2030 --- test/registrar.spec.ts | 230 - tests/maths.spec.ts | 8 + tsconfig.json | 31 +- 46 files changed, 15953 insertions(+), 5134 deletions(-) delete mode 100644 .editorconfig delete mode 100644 .github/COMMIT_CONVENTION.md delete mode 100644 .github/CONTRIBUTING.md delete mode 100644 .github/ISSUE_TEMPLATE/bug_report.md delete mode 100644 .github/ISSUE_TEMPLATE/feature_request.md delete mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 .github/labels.json delete mode 100644 .husky/.gitignore delete mode 100644 .npmrc delete mode 100644 .prettierignore delete mode 100644 CHANGELOG.md delete mode 100644 LICENSE.md delete mode 100644 bin/japaTypes.ts create mode 100644 bin/japa_types.ts delete mode 100644 examples/index.ts create mode 100644 package-lock.json delete mode 100644 perf/foo.js delete mode 100644 perf/index.js delete mode 100644 perf/require.js delete mode 100644 src/Contracts/index.ts delete mode 100644 src/Exceptions/InvalidInjectionException.ts delete mode 100644 src/Exceptions/IocLookupException.ts delete mode 100644 src/Ioc/Bindings.ts delete mode 100644 src/Ioc/Fakes.ts delete mode 100644 src/Ioc/ImportAliases.ts delete mode 100644 src/Ioc/Injector.ts delete mode 100644 src/Ioc/IocProxy.ts delete mode 100644 src/Ioc/index.ts delete mode 100644 src/Registrar/index.ts delete mode 100644 src/Resolver/index.ts delete mode 100644 src/decorators/index.ts delete mode 100644 src/helpers.ts create mode 100644 src/user.ts delete mode 100644 test/ioc-resolver.spec.ts delete mode 100644 test/ioc.spec.ts delete mode 100644 test/registrar.spec.ts create mode 100644 tests/maths.spec.ts diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index 1dfdf29..0000000 --- a/.editorconfig +++ /dev/null @@ -1,22 +0,0 @@ -# http://editorconfig.org - -[*] -indent_style = space -indent_size = 2 -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true - -[*.json] -insert_final_newline = ignore - -[**.min.js] -indent_style = ignore -insert_final_newline = ignore - -[MakeFile] -indent_style = space - -[*.md] -trim_trailing_whitespace = false diff --git a/.github/COMMIT_CONVENTION.md b/.github/COMMIT_CONVENTION.md deleted file mode 100644 index fc852af..0000000 --- a/.github/COMMIT_CONVENTION.md +++ /dev/null @@ -1,70 +0,0 @@ -## Git Commit Message Convention - -> This is adapted from [Angular's commit convention](https://github.com/conventional-changelog/conventional-changelog/tree/master/packages/conventional-changelog-angular). - -Using conventional commit messages, we can automate the process of generating the CHANGELOG file. All commits messages will automatically be validated against the following regex. - -``` js -/^(revert: )?(feat|fix|docs|style|refactor|perf|test|workflow|ci|chore|types|build|improvement)((.+))?: .{1,50}/ -``` - -## Commit Message Format -A commit message consists of a **header**, **body** and **footer**. The header has a **type**, **scope** and **subject**: - -> The **scope** is optional - -``` -feat(router): add support for prefix - -Prefix makes it easier to append a path to a group of routes -``` - -1. `feat` is type. -2. `router` is scope and is optional -3. `add support for prefix` is the subject -4. The **body** is followed by a blank line. -5. The optional **footer** can be added after the body, followed by a blank line. - -## Types -Only one type can be used at a time and only following types are allowed. - -- feat -- fix -- docs -- style -- refactor -- perf -- test -- workflow -- ci -- chore -- types -- build - -If a type is `feat`, `fix` or `perf`, then the commit will appear in the CHANGELOG.md file. However if there is any BREAKING CHANGE, the commit will always appear in the changelog. - -### Revert -If the commit reverts a previous commit, it should begin with `revert:`, followed by the header of the reverted commit. In the body it should say: `This reverts commit `., where the hash is the SHA of the commit being reverted. - -## Scope -The scope could be anything specifying place of the commit change. For example: `router`, `view`, `querybuilder`, `database`, `model` and so on. - -## Subject -The subject contains succinct description of the change: - -- use the imperative, present tense: "change" not "changed" nor "changes". -- don't capitalize first letter -- no dot (.) at the end - -## Body - -Just as in the **subject**, use the imperative, present tense: "change" not "changed" nor "changes". -The body should include the motivation for the change and contrast this with previous behavior. - -## Footer - -The footer should contain any information about **Breaking Changes** and is also the place to -reference GitHub issues that this commit **Closes**. - -**Breaking Changes** should start with the word `BREAKING CHANGE:` with a space or two newlines. The rest of the commit message is then used for this. - diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md deleted file mode 100644 index f0c5446..0000000 --- a/.github/CONTRIBUTING.md +++ /dev/null @@ -1,46 +0,0 @@ -# Contributing - -AdonisJS is a community driven project. You are free to contribute in any of the following ways. - -- [Coding style](coding-style) -- [Fix bugs by creating PR's](fix-bugs-by-creating-prs) -- [Share an RFC for new features or big changes](share-an-rfc-for-new-features-or-big-changes) -- [Report security issues](report-security-issues) -- [Be a part of the community](be-a-part-of-community) - -## Coding style - -Majority of AdonisJS core packages are written in Typescript. Having a brief knowledge of Typescript is required to contribute to the core. - -## Fix bugs by creating PR's - -We appreciate every time you report a bug in the framework or related libraries. However, taking time to submit a PR can help us in fixing bugs quickly and ensure a healthy and stable eco-system. - -Go through the following points, before creating a new PR. - -1. Create an issue discussing the bug or short-coming in the framework. -2. Once approved, go ahead and fork the REPO. -3. Make sure to start from the `develop`, since this is the upto date branch. -4. Make sure to keep commits small and relevant. -5. We follow [conventional-commits](https://github.com/conventional-changelog/conventional-changelog) to structure our commit messages. Instead of running `git commit`, you must run `npm commit`, which will show you prompts to create a valid commit message. -6. Once done with all the changes, create a PR against the `develop` branch. - -## Share an RFC for new features or big changes - -Sharing PR's for small changes works great. However, when contributing big features to the framework, it is required to go through the RFC process. - -### What is an RFC? - -RFC stands for **Request for Commits**, a standard process followed by many other frameworks including [Ember](https://github.com/emberjs/rfcs), [yarn](https://github.com/yarnpkg/rfcs) and [rust](https://github.com/rust-lang/rfcs). - -In brief, RFC process allows you to talk about the changes with everyone in the community and get a view of the core team before dedicating your time to work on the feature. - -The RFC proposals are created as Pull Request on [adonisjs/rfcs](https://github.com/adonisjs/rfcs) repo. Make sure to read the README to learn about the process in depth. - -## Report security issues - -All of the security issues, must be reported via [email](mailto:virk@adonisjs.com) and not using any of the public channels. - -## Be a part of community - -We welcome you to participate in [GitHub Discussion](https://github.com/adonisjs/core/discussions) and the AdonisJS [Discord Server](https://discord.gg/vDcEjq6). You are free to ask your questions and share your work or contributions made to AdonisJS eco-system. diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index e65000c..0000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -name: Bug report -about: Report identified bugs ---- - - - -## Prerequisites - -We do our best to reply to all the issues on time. If you will follow the given guidelines, the turn around time will be faster. - -- Lots of raised issues are directly not bugs but instead are design decisions taken by us. -- Make use of our [GH discussions](https://github.com/adonisjs/core/discussions), or [discord server](https://discord.me/adonisjs), if you are not sure that you are reporting a bug. -- Ensure the issue isn't already reported. -- Ensure you are reporting the bug in the correct repo. - -*Delete the above section and the instructions in the sections below before submitting* - -## Package version - - -## Node.js and npm version - - -## Sample Code (to reproduce the issue) - - -## BONUS (a sample repo to reproduce the issue) - diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index abd44a5..0000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -name: Feature request -about: Propose changes for adding a new feature ---- - - - -## Prerequisites - -We do our best to reply to all the issues on time. If you will follow the given guidelines, the turn around time will be faster. - -## Consider an RFC - -Please create an [RFC](https://github.com/adonisjs/rfcs) instead, if - -- Feature introduces a breaking change -- Demands lots of time and changes in the current code base. - -*Delete the above section and the instructions in the sections below before submitting* - -## Why this feature is required (specific use-cases will be appreciated)? - - -## Have you tried any other work arounds? - - -## Are you willing to work on it with little guidance? - diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 7c158d6..0000000 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,28 +0,0 @@ - - -## Proposed changes - -Describe the big picture of your changes here to communicate to the maintainers why we should accept this pull request. If it fixes a bug or resolves a feature request, be sure to link to that issue. - -## Types of changes - -What types of changes does your code introduce? - -_Put an `x` in the boxes that apply_ - -- [ ] Bugfix (non-breaking change which fixes an issue) -- [ ] New feature (non-breaking change which adds functionality) -- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) - -## Checklist - -_Put an `x` in the boxes that apply. You can also fill these out after creating the PR. If you're unsure about any of them, don't hesitate to ask. We're here to help! This is simply a reminder of what we are going to look for before merging your code._ - -- [ ] I have read the [CONTRIBUTING](https://github.com/adonisjs/fold/blob/master/.github/CONTRIBUTING.md) doc -- [ ] Lint and unit tests pass locally with my changes -- [ ] I have added tests that prove my fix is effective or that my feature works. -- [ ] I have added necessary documentation (if appropriate) - -## Further comments - -If this is a relatively large or complex change, kick off the discussion by explaining why you chose the solution you did and what alternatives you considered, etc... diff --git a/.github/labels.json b/.github/labels.json new file mode 100644 index 0000000..ba001c6 --- /dev/null +++ b/.github/labels.json @@ -0,0 +1,170 @@ +[ + { + "name": "Priority: Critical", + "color": "ea0056", + "description": "The issue needs urgent attention", + "aliases": [] + }, + { + "name": "Priority: High", + "color": "5666ed", + "description": "Look into this issue before picking up any new work", + "aliases": [] + }, + { + "name": "Priority: Medium", + "color": "f4ff61", + "description": "Try to fix the issue for the next patch/minor release", + "aliases": [] + }, + { + "name": "Priority: Low", + "color": "87dfd6", + "description": "Something worth considering, but not a top priority for the team", + "aliases": [] + }, + { + "name": "Semver: Alpha", + "color": "008480", + "description": "Will make it's way to the next alpha version of the package", + "aliases": [] + }, + { + "name": "Semver: Major", + "color": "ea0056", + "description": "Has breaking changes", + "aliases": [] + }, + { + "name": "Semver: Minor", + "color": "fbe555", + "description": "Mainly new features and improvements", + "aliases": [] + }, + { + "name": "Semver: Next", + "color": "5666ed", + "description": "Will make it's way to the bleeding edge version of the package", + "aliases": [] + }, + { + "name": "Semver: Patch", + "color": "87dfd6", + "description": "A bug fix", + "aliases": [] + }, + { + "name": "Status: Abandoned", + "color": "ffffff", + "description": "Dropped and not into consideration", + "aliases": ["wontfix"] + }, + { + "name": "Status: Accepted", + "color": "e5fbf2", + "description": "The proposal or the feature has been accepted for the future versions", + "aliases": [] + }, + { + "name": "Status: Blocked", + "color": "ea0056", + "description": "The work on the issue or the PR is blocked. Check comments for reasoning", + "aliases": [] + }, + { + "name": "Status: Completed", + "color": "008672", + "description": "The work has been completed, but not released yet", + "aliases": [] + }, + { + "name": "Status: In Progress", + "color": "73dbc4", + "description": "Still banging the keyboard", + "aliases": ["in progress"] + }, + { + "name": "Status: On Hold", + "color": "f4ff61", + "description": "The work was started earlier, but is on hold now. Check comments for reasoning", + "aliases": ["On Hold"] + }, + { + "name": "Status: Review Needed", + "color": "fbe555", + "description": "Review from the core team is required before moving forward", + "aliases": [] + }, + { + "name": "Status: Awaiting More Information", + "color": "89f8ce", + "description": "Waiting on the issue reporter or PR author to provide more information", + "aliases": [] + }, + { + "name": "Status: Need Contributors", + "color": "7057ff", + "description": "Looking for contributors to help us move forward with this issue or PR", + "aliases": [] + }, + { + "name": "Type: Bug", + "color": "ea0056", + "description": "The issue has indentified a bug", + "aliases": ["bug"] + }, + { + "name": "Type: Security", + "color": "ea0056", + "description": "Spotted security vulnerability and is a top priority for the core team", + "aliases": [] + }, + { + "name": "Type: Duplicate", + "color": "00837e", + "description": "Already answered or fixed previously", + "aliases": ["duplicate"] + }, + { + "name": "Type: Enhancement", + "color": "89f8ce", + "description": "Improving an existing feature", + "aliases": ["enhancement"] + }, + { + "name": "Type: Feature Request", + "color": "483add", + "description": "Request to add a new feature to the package", + "aliases": [] + }, + { + "name": "Type: Invalid", + "color": "dbdbdb", + "description": "Doesn't really belong here. Maybe use discussion threads?", + "aliases": ["invalid"] + }, + { + "name": "Type: Question", + "color": "eceafc", + "description": "Needs clarification", + "aliases": ["help wanted", "question"] + }, + { + "name": "Type: Documentation Change", + "color": "7057ff", + "description": "Documentation needs some improvements", + "aliases": ["documentation"] + }, + { + "name": "Type: Dependencies Update", + "color": "00837e", + "description": "Bump dependencies", + "aliases": ["dependencies"] + }, + { + "name": "Good First Issue", + "color": "008480", + "description": "Want to contribute? Just filter by this label", + "aliases": ["good first issue"] + } +] diff --git a/.github/stale.yml b/.github/stale.yml index 7a6a571..f767674 100644 --- a/.github/stale.yml +++ b/.github/stale.yml @@ -6,10 +6,10 @@ daysUntilClose: 7 # Issues with these labels will never be considered stale exemptLabels: - - "Type: Security" + - 'Type: Security' # Label to use when marking an issue as stale -staleLabel: "Status: Abandoned" +staleLabel: 'Status: Abandoned' # Comment to post when marking an issue as stale. Set to `false` to disable markComment: > diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 8b778ca..5dcb10b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -8,8 +8,23 @@ jobs: strategy: matrix: node-version: - - 14.15.4 - - 17.x + - 18.x + steps: + - uses: actions/checkout@v2 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v1 + with: + node-version: ${{ matrix.node-version }} + - name: Install + run: npm install + - name: Run tests + run: npm test + windows: + runs-on: windows-latest + strategy: + matrix: + node-version: + - 18.x steps: - uses: actions/checkout@v2 - name: Use Node.js ${{ matrix.node-version }} diff --git a/.gitignore b/.gitignore index 324fb8c..b7dab5e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,15 +1,2 @@ node_modules -coverage -.DS_STORE -.nyc_output -.idea -.vscode/ -*.sublime-project -*.sublime-workspace -*.log -build -dist -yarn.lock -shrinkwrap.yaml -package-lock.json -test/__app +build \ No newline at end of file diff --git a/.husky/.gitignore b/.husky/.gitignore deleted file mode 100644 index 31354ec..0000000 --- a/.husky/.gitignore +++ /dev/null @@ -1 +0,0 @@ -_ diff --git a/.husky/commit-msg b/.husky/commit-msg index 4654c12..42a70e4 100755 --- a/.husky/commit-msg +++ b/.husky/commit-msg @@ -1,3 +1,4 @@ -#!/bin/sh -. "$(dirname "$0")/_/husky.sh" -HUSKY_GIT_PARAMS=$1 node ./node_modules/@adonisjs/mrm-preset/validate-commit/conventional/validate.js +#!/usr/bin/env sh +. "$(dirname -- "$0")/_/husky.sh" + +npx --no -- commitlint --edit "$1" \ No newline at end of file diff --git a/.npmrc b/.npmrc deleted file mode 100644 index 43c97e7..0000000 --- a/.npmrc +++ /dev/null @@ -1 +0,0 @@ -package-lock=false diff --git a/.prettierignore b/.prettierignore deleted file mode 100644 index e843a17..0000000 --- a/.prettierignore +++ /dev/null @@ -1,8 +0,0 @@ -build -docs -*.md -config.json -.eslintrc.json -package.json -*.html -*.txt diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index 7aa1300..0000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,193 +0,0 @@ - -## [4.0.9](https://github.com/poppinss/adonis-fold/compare/v4.0.8...v4.0.9) (2018-07-15) - - -### Features - -* **ioc:** add with method ([#12](https://github.com/poppinss/adonis-fold/issues/12)) ([b13c643](https://github.com/poppinss/adonis-fold/commit/b13c643)) - - - - -## [4.0.8](https://github.com/poppinss/adonis-fold/compare/v4.0.7...v4.0.8) (2018-04-05) - - -### Bug Fixes - -* **registrar:** execute extend calls after register ([f8b1a7e](https://github.com/poppinss/adonis-fold/commit/f8b1a7e)) - - - - -## [4.0.7](https://github.com/poppinss/adonis-fold/compare/v4.0.6...v4.0.7) (2018-02-08) - - -### Bug Fixes - -* **ioc.getPath:** normalize autoloaded paths ([a0a77bc](https://github.com/poppinss/adonis-fold/commit/a0a77bc)) - - - - -## [4.0.6](https://github.com/poppinss/adonis-fold/compare/v4.0.5...v4.0.6) (2018-02-08) - - -### Features - -* **ioc:** add getPath method to ioc class ([9b37695](https://github.com/poppinss/adonis-fold/commit/9b37695)) -* **resolver:** exposing resolver to globals via iocResolver ([9cc5959](https://github.com/poppinss/adonis-fold/commit/9cc5959)) -* **resolver:** resolver.getPath returns abs path to binding file ([2188ea0](https://github.com/poppinss/adonis-fold/commit/2188ea0)) - - - - -## [4.0.5](https://github.com/poppinss/adonis-fold/compare/v4.0.3...v4.0.5) (2017-10-29) - - -### Bug Fixes - -* **ioc:** fix execution cycle of extend calls ([bc2c084](https://github.com/poppinss/adonis-fold/commit/bc2c084)) - - - - -## [4.0.4](https://github.com/poppinss/adonis-fold/compare/v4.0.3...v4.0.4) (2017-09-12) - - -### Bug Fixes - -* **ioc:** fix execution cycle of extend calls ([bc2c084](https://github.com/poppinss/adonis-fold/commit/bc2c084)) - - - - -## [4.0.3](https://github.com/poppinss/adonis-fold/compare/v4.0.2...v4.0.3) (2017-09-06) - - -### Features - -* **ioc:** add singletonFake method to register fakes ([bd5376d](https://github.com/poppinss/adonis-fold/commit/bd5376d)) - - - - -## [4.0.2](https://github.com/poppinss/adonis-fold/compare/v4.0.1...v4.0.2) (2017-08-02) - - -### Bug Fixes - -* **resolver:** translate full namespace correctly ([9f727f3](https://github.com/poppinss/adonis-fold/commit/9f727f3)) - - -### Features - -* **exceptions:** use generic-exceptions package ([20f9d08](https://github.com/poppinss/adonis-fold/commit/20f9d08)) - - - - -## [4.0.1](https://github.com/poppinss/adonis-fold/compare/v4.0.0...v4.0.1) (2017-07-30) - - - - -# [4.0.0](https://github.com/poppinss/adonis-fold/compare/v3.0.3...v4.0.0) (2017-06-21) - - -### Features - -* first commit for 4.0 dawn ([9e728a0](https://github.com/poppinss/adonis-fold/commit/9e728a0)) -* **ioc:** add suport for escaped bindings ([8ee7554](https://github.com/poppinss/adonis-fold/commit/8ee7554)) -* **registrar:** register and boot providers in multiple steps ([9732d75](https://github.com/poppinss/adonis-fold/commit/9732d75)) -* **resolver:** add resolver to resolve dependencies ([bab45fc](https://github.com/poppinss/adonis-fold/commit/bab45fc)) - - - - -## 3.0.3 (2016-08-26) - -### Features - -* **ioc:** add event and support for fakes ([98fae41](https://github.com/poppinss/adonis-fold/commit/98fae41)) -* **providers:** add support for boot method ([f7157a4](https://github.com/poppinss/adonis-fold/commit/f7157a4)) - - - -## 3.0.2 (2016-06-26) - - -### Bug Fixes - -* **Ioc:** do not transform output after calling hooks([8bc17ef](https://github.com/poppinss/adonis-fold/commit/8bc17ef)) - - -### Features - -* **ioc:** add support for makePlain property([33ab0bf](https://github.com/poppinss/adonis-fold/commit/33ab0bf)) -* **ioc:** Ioc.extend to pass all args to manager extend method([082060c](https://github.com/poppinss/adonis-fold/commit/082060c)) -* **package.json:** Added commitizen([8a8fd3c](https://github.com/poppinss/adonis-fold/commit/8a8fd3c)) - - -### Performance Improvements - -* **ioc,registerar:** triming namespaces and providers, improved var initialization for v8([c5e04ad](https://github.com/poppinss/adonis-fold/commit/c5e04ad)) - - - - -## 3.0.1 (2016-04-30) - - -### Bug Fixes - -* **Ioc:** do not transform output after calling hooks ([8bc17ef](https://github.com/poppinss/adonis-fold/commit/8bc17ef)) - -### Features - -* **ioc:** add support for makePlain property ([33ab0bf](https://github.com/poppinss/adonis-fold/commit/33ab0bf)) -* **package.json:** Added commitizen ([8a8fd3c](https://github.com/poppinss/adonis-fold/commit/8a8fd3c)) - -### Performance Improvements - -* **ioc,registerar:** triming namespaces and providers, improved var initialization for v8 ([c5e04ad](https://github.com/poppinss/adonis-fold/commit/c5e04ad)) - - - - -## 2.0.1 (2016-01-15) - -### feat - -* feat(package.json): Added commitizen ([8a8fd3c](https://github.com/poppinss/adonis-fold/commit/8a8fd3c)) - -### refactor - -* refactor(ioc): Improved ioc extend method workflow ([47ffdb2](https://github.com/poppinss/adonis-fold/commit/47ffdb2)) - -* Added debugging logs ([7fd661e](https://github.com/poppinss/adonis-fold/commit/7fd661e)) -* Added jshintrc and formatted files ([d584c82](https://github.com/poppinss/adonis-fold/commit/d584c82)) -* Added support to require node module from ioc container ([c067fcc](https://github.com/poppinss/adonis-fold/commit/c067fcc)) -* Added support to transform output using hooks from autoloaded paths ([247d87f](https://github.com/poppinss/adonis-fold/commit/247d87f)) -* Also made make global ([95285ec](https://github.com/poppinss/adonis-fold/commit/95285ec)) -* Also resolving alias from make method ([bda90f9](https://github.com/poppinss/adonis-fold/commit/bda90f9)) -* Exposed modules via index.js file and added readme ([217ad2c](https://github.com/poppinss/adonis-fold/commit/217ad2c)) -* Fixed makeFunc error where class name was printing as object ([6e177e6](https://github.com/poppinss/adonis-fold/commit/6e177e6)) -* Formatted source files and removed unnecessary files ([b3123ab](https://github.com/poppinss/adonis-fold/commit/b3123ab)) -* Improved make method ([ed0fa07](https://github.com/poppinss/adonis-fold/commit/ed0fa07)) -* Increased priority of alias over autoload in use method ([4c27a13](https://github.com/poppinss/adonis-fold/commit/4c27a13)) -* Made jshint happy and added houndci ([b156641](https://github.com/poppinss/adonis-fold/commit/b156641)) -* Made make also global ([9be6049](https://github.com/poppinss/adonis-fold/commit/9be6049)) -* Made use global and removed unwanted dependencies ([ed99dbb](https://github.com/poppinss/adonis-fold/commit/ed99dbb)) -* Merge 2.0 ([a260229](https://github.com/poppinss/adonis-fold/commit/a260229)) -* Moved logs from verbose to debug ([7299cfd](https://github.com/poppinss/adonis-fold/commit/7299cfd)) -* npm version bump ([6dd5180](https://github.com/poppinss/adonis-fold/commit/6dd5180)) -* refactor(readme,contributing,license): Added files important for github presence ([69a008f](https://github.com/poppinss/adonis-fold/commit/69a008f)) -* Removed hound and jshint with standardjs ([b350e46](https://github.com/poppinss/adonis-fold/commit/b350e46)) -* Removed Logger src and using cat-log instead & added aliases method to ioc ([5a536af](https://github.com/poppinss/adonis-fold/commit/5a536af)) -* Replaced debug with custom logger ([2179df7](https://github.com/poppinss/adonis-fold/commit/2179df7)) -* Sorry switched back to verbose mode (sorry is for git) ([ac30d8a](https://github.com/poppinss/adonis-fold/commit/ac30d8a)) -* Updated code annotations ([18a913c](https://github.com/poppinss/adonis-fold/commit/18a913c)) -* Updated npm ignore ([33b0d75](https://github.com/poppinss/adonis-fold/commit/33b0d75)) -* Updated package file and added MIT license ([3bfeb26](https://github.com/poppinss/adonis-fold/commit/3bfeb26)) -* Updated travis file and remove cz-changelog dependency ([50b7d46](https://github.com/poppinss/adonis-fold/commit/50b7d46)) -* v2 initial commit ([474575c](https://github.com/poppinss/adonis-fold/commit/474575c)) diff --git a/LICENSE.md b/LICENSE.md deleted file mode 100644 index 1c19428..0000000 --- a/LICENSE.md +++ /dev/null @@ -1,9 +0,0 @@ -# The MIT License - -Copyright 2022 Harminder Virk, 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. diff --git a/README.md b/README.md index f778d2c..f84aedf 100644 --- a/README.md +++ b/README.md @@ -1,53 +1,2 @@ -
- -
- -
- -
-

IoC Container of AdonisJS

-

Fold is the IoC container used the AdonisJS framework to register and resolve the framework wide dependencies

-
- -
- -
- -[![gh-workflow-image]][gh-workflow-url] [![npm-image]][npm-url] ![][typescript-image] [![license-image]][license-url] [![synk-image]][synk-url] - -
- -
-

- - Website - - | - - Guides - - | - - Contributing - -

-
- -
- Built with ❤︎ by Harminder Virk -
- -[gh-workflow-image]: https://img.shields.io/github/workflow/status/adonisjs/fold/test?style=for-the-badge -[gh-workflow-url]: https://github.com/adonisjs/fold/actions/workflows/test.yml "Github action" - -[typescript-image]: https://img.shields.io/badge/Typescript-294E80.svg?style=for-the-badge&logo=typescript -[typescript-url]: "typescript" - -[npm-image]: https://img.shields.io/npm/v/@adonisjs/fold/alpha.svg?style=for-the-badge&logo=npm -[npm-url]: https://npmjs.org/package/@adonisjs/fold/v/alpha "npm" - -[license-image]: https://img.shields.io/npm/l/@adonisjs/fold?color=blueviolet&style=for-the-badge -[license-url]: LICENSE.md "license" - -[synk-image]: https://img.shields.io/snyk/vulnerabilities/github/adonisjs/fold?label=Synk%20Vulnerabilities&style=for-the-badge -[synk-url]: https://snyk.io/test/github/adonisjs/fold?targetFile=package.json "synk" +@adonisjs/fold +> Simplest and straight forward implementation for IoC container in JavaScript diff --git a/bin/japaTypes.ts b/bin/japaTypes.ts deleted file mode 100644 index d42cac6..0000000 --- a/bin/japaTypes.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { Assert } from '@japa/assert' - -declare module '@japa/runner' { - interface TestContext { - assert: Assert - } -} diff --git a/bin/japa_types.ts b/bin/japa_types.ts new file mode 100644 index 0000000..78cc527 --- /dev/null +++ b/bin/japa_types.ts @@ -0,0 +1,11 @@ +import '@japa/runner' + +declare module '@japa/runner' { + interface TestContext { + // notify TypeScript about custom context properties + } + + interface Test { + // notify TypeScript about custom test properties + } +} diff --git a/bin/test.ts b/bin/test.ts index 5aba7ce..30bf0cc 100644 --- a/bin/test.ts +++ b/bin/test.ts @@ -19,10 +19,10 @@ import { processCliArgs, configure, run } from '@japa/runner' configure({ ...processCliArgs(process.argv.slice(2)), ...{ - files: ['test/**/*.spec.ts'], + files: ['tests/**/*.spec.ts'], plugins: [assert(), runFailedTests()], reporters: [specReporter()], - importer: (filePath: string) => import(filePath), + importer: (filePath) => import(filePath), }, }) diff --git a/examples/index.ts b/examples/index.ts deleted file mode 100644 index a3bb298..0000000 --- a/examples/index.ts +++ /dev/null @@ -1,61 +0,0 @@ -// import { IocContract } from '../src/Contracts' - -// type Bindings = { -// 'Adonis/Core/Server': { http: true } -// 'Adonis/Core/Request': { url: string } -// } -// const ioc = {} as IocContract - -// ioc.bind('Adonis/Core/Request', () => { -// return { -// url: '/', -// } -// }) - -// ioc.fake('Adonis/Core/Request', (container, originalValue) => { -// return { -// url: '/', -// } -// }) - -// ioc.use('foo') - -// ioc.fake('Adonis/Core/Request', () => { -// return { -// url: '/', -// } -// }) - -// ioc.use('Adonis/Core/Request').url -// ioc.use({ namespace: 'Adonis/Core/Request', type: 'binding' }).url - -// ioc.make('Adonis/Core/Request').url -// ioc.make({ namespace: 'Adonis/Core/Request', type: 'binding' }).url - -// class Foo { -// public foo = 'foo' -// public run() {} -// public walk() {} -// } - -// class FooPlain { -// public static makePlain: true = true -// public foo = 'foo' -// } - -// ioc.make('Adonis/Core/Request').url -// ioc.make(Foo).foo -// ioc.make(FooPlain).makePlain - -// ioc.hasFake('Adonis/Core/Request') -// ioc.hasFake('foo') - -// ioc.hasBinding('Adonis/Core/Request') -// ioc.hasBinding('foo') - -// ioc.with(['Adonis/Core/Request', 'foo'], (req, foo) => { -// req.url -// foo -// }) - -// ioc.call(ioc.make(Foo), 'run', []) diff --git a/index.ts b/index.ts index 7efcde6..65f4a70 100644 --- a/index.ts +++ b/index.ts @@ -1,13 +1,3 @@ -/* - * @adonisjs/fold - * - * (c) Harminder Virk - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ +import { User } from './src/user.js' -export * from './src/Contracts' -export { Ioc } from './src/Ioc' -export { inject } from './src/decorators' -export { Registrar } from './src/Registrar' +console.log(new User('Harminder', 'Virk').fullName) diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..c3f3de9 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,15653 @@ +{ + "name": "@adonisjs/fold", + "version": "8.2.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "@adonisjs/fold", + "version": "8.2.0", + "license": "MIT", + "devDependencies": { + "@commitlint/cli": "^17.0.2", + "@commitlint/config-conventional": "^17.0.2", + "@japa/assert": "^1.3.4", + "@japa/run-failed-tests": "^1.0.7", + "@japa/runner": "^2.0.9", + "@japa/spec-reporter": "^1.1.12", + "@swc/core": "^1.2.203", + "@types/node": "^18.0.0", + "del-cli": "^4.0.1", + "ejs": "^3.1.8", + "eslint": "^8.17.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-adonis": "^3.0.2", + "eslint-plugin-prettier": "^4.0.0", + "github-label-sync": "^2.2.0", + "husky": "^8.0.1", + "np": "^7.6.1", + "prettier": "^2.7.1", + "ts-node": "^10.8.1", + "typescript": "^4.7.3" + } + }, + "node_modules/@apidevtools/json-schema-ref-parser": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz", + "integrity": "sha512-GBD2Le9w2+lVFoc4vswGI/TjkNIZSVp7+9xPf+X3uidBfWnAeUWmquteSyt0+VCrhNMWj/FTABISQrD3Z/YA+w==", + "dev": true, + "dependencies": { + "@jsdevtools/ono": "^7.1.3", + "@types/json-schema": "^7.0.6", + "call-me-maybe": "^1.0.1", + "js-yaml": "^4.1.0" + } + }, + "node_modules/@apidevtools/json-schema-ref-parser/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/@apidevtools/json-schema-ref-parser/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/@apidevtools/openapi-schemas": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@apidevtools/openapi-schemas/-/openapi-schemas-2.1.0.tgz", + "integrity": "sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@apidevtools/swagger-methods": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@apidevtools/swagger-methods/-/swagger-methods-3.0.2.tgz", + "integrity": "sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==", + "dev": true + }, + "node_modules/@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "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/@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/@commitlint/cli": { + "version": "17.1.2", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-17.1.2.tgz", + "integrity": "sha512-h/4Hlka3bvCLbnxf0Er2ri5A44VMlbMSkdTRp8Adv2tRiklSTRIoPGs7OEXDv3EoDs2AAzILiPookgM4Gi7LOw==", + "dev": true, + "dependencies": { + "@commitlint/format": "^17.0.0", + "@commitlint/lint": "^17.1.0", + "@commitlint/load": "^17.1.2", + "@commitlint/read": "^17.1.0", + "@commitlint/types": "^17.0.0", + "execa": "^5.0.0", + "lodash": "^4.17.19", + "resolve-from": "5.0.0", + "resolve-global": "1.0.0", + "yargs": "^17.0.0" + }, + "bin": { + "commitlint": "cli.js" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/config-conventional": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-17.1.0.tgz", + "integrity": "sha512-WU2p0c9/jLi8k2q2YrDV96Y8XVswQOceIQ/wyJvQxawJSCasLdRB3kUIYdNjOCJsxkpoUlV/b90ZPxp1MYZDiA==", + "dev": true, + "dependencies": { + "conventional-changelog-conventionalcommits": "^5.0.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/config-validator": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-17.1.0.tgz", + "integrity": "sha512-Q1rRRSU09ngrTgeTXHq6ePJs2KrI+axPTgkNYDWSJIuS1Op4w3J30vUfSXjwn5YEJHklK3fSqWNHmBhmTR7Vdg==", + "dev": true, + "dependencies": { + "@commitlint/types": "^17.0.0", + "ajv": "^8.11.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/ensure": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-17.0.0.tgz", + "integrity": "sha512-M2hkJnNXvEni59S0QPOnqCKIK52G1XyXBGw51mvh7OXDudCmZ9tZiIPpU882p475Mhx48Ien1MbWjCP1zlyC0A==", + "dev": true, + "dependencies": { + "@commitlint/types": "^17.0.0", + "lodash": "^4.17.19" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/execute-rule": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-17.0.0.tgz", + "integrity": "sha512-nVjL/w/zuqjCqSJm8UfpNaw66V9WzuJtQvEnCrK4jDw6qKTmZB+1JQ8m6BQVZbNBcwfYdDNKnhIhqI0Rk7lgpQ==", + "dev": true, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/format": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-17.0.0.tgz", + "integrity": "sha512-MZzJv7rBp/r6ZQJDEodoZvdRM0vXu1PfQvMTNWFb8jFraxnISMTnPBWMMjr2G/puoMashwaNM//fl7j8gGV5lA==", + "dev": true, + "dependencies": { + "@commitlint/types": "^17.0.0", + "chalk": "^4.1.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/is-ignored": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-17.1.0.tgz", + "integrity": "sha512-JITWKDMHhIh8IpdIbcbuH9rEQJty1ZWelgjleTFrVRAcEwN/sPzk1aVUXRIZNXMJWbZj8vtXRJnFihrml8uECQ==", + "dev": true, + "dependencies": { + "@commitlint/types": "^17.0.0", + "semver": "7.3.7" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/lint": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-17.1.0.tgz", + "integrity": "sha512-ltpqM2ogt/+SDhUaScFo0MdscncEF96lvQTPMM/VTTWlw7sTGLLWkOOppsee2MN/uLNNWjQ7kqkd4h6JqoM9AQ==", + "dev": true, + "dependencies": { + "@commitlint/is-ignored": "^17.1.0", + "@commitlint/parse": "^17.0.0", + "@commitlint/rules": "^17.0.0", + "@commitlint/types": "^17.0.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/load": { + "version": "17.1.2", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-17.1.2.tgz", + "integrity": "sha512-sk2p/jFYAWLChIfOIp/MGSIn/WzZ0vkc3afw+l4X8hGEYkvDe4gQUUAVxjl/6xMRn0HgnSLMZ04xXh5pkTsmgg==", + "dev": true, + "dependencies": { + "@commitlint/config-validator": "^17.1.0", + "@commitlint/execute-rule": "^17.0.0", + "@commitlint/resolve-extends": "^17.1.0", + "@commitlint/types": "^17.0.0", + "@types/node": "^14.0.0", + "chalk": "^4.1.0", + "cosmiconfig": "^7.0.0", + "cosmiconfig-typescript-loader": "^4.0.0", + "lodash": "^4.17.19", + "resolve-from": "^5.0.0", + "ts-node": "^10.8.1", + "typescript": "^4.6.4" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/load/node_modules/@types/node": { + "version": "14.18.29", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.29.tgz", + "integrity": "sha512-LhF+9fbIX4iPzhsRLpK5H7iPdvW8L4IwGciXQIOEcuF62+9nw/VQVsOViAOOGxY3OlOKGLFv0sWwJXdwQeTn6A==", + "dev": true + }, + "node_modules/@commitlint/message": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-17.0.0.tgz", + "integrity": "sha512-LpcwYtN+lBlfZijHUdVr8aNFTVpHjuHI52BnfoV01TF7iSLnia0jttzpLkrLmI8HNQz6Vhr9UrxDWtKZiMGsBw==", + "dev": true, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/parse": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-17.0.0.tgz", + "integrity": "sha512-cKcpfTIQYDG1ywTIr5AG0RAiLBr1gudqEsmAGCTtj8ffDChbBRxm6xXs2nv7GvmJN7msOt7vOKleLvcMmRa1+A==", + "dev": true, + "dependencies": { + "@commitlint/types": "^17.0.0", + "conventional-changelog-angular": "^5.0.11", + "conventional-commits-parser": "^3.2.2" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/read": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-17.1.0.tgz", + "integrity": "sha512-73BoFNBA/3Ozo2JQvGsE0J8SdrJAWGfZQRSHqvKaqgmY042Su4gXQLqvAzgr55S9DI1l9TiU/5WDuh8IE86d/g==", + "dev": true, + "dependencies": { + "@commitlint/top-level": "^17.0.0", + "@commitlint/types": "^17.0.0", + "fs-extra": "^10.0.0", + "git-raw-commits": "^2.0.0", + "minimist": "^1.2.6" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/resolve-extends": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-17.1.0.tgz", + "integrity": "sha512-jqKm00LJ59T0O8O4bH4oMa4XyJVEOK4GzH8Qye9XKji+Q1FxhZznxMV/bDLyYkzbTodBt9sL0WLql8wMtRTbqQ==", + "dev": true, + "dependencies": { + "@commitlint/config-validator": "^17.1.0", + "@commitlint/types": "^17.0.0", + "import-fresh": "^3.0.0", + "lodash": "^4.17.19", + "resolve-from": "^5.0.0", + "resolve-global": "^1.0.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/rules": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-17.0.0.tgz", + "integrity": "sha512-45nIy3dERKXWpnwX9HeBzK5SepHwlDxdGBfmedXhL30fmFCkJOdxHyOJsh0+B0RaVsLGT01NELpfzJUmtpDwdQ==", + "dev": true, + "dependencies": { + "@commitlint/ensure": "^17.0.0", + "@commitlint/message": "^17.0.0", + "@commitlint/to-lines": "^17.0.0", + "@commitlint/types": "^17.0.0", + "execa": "^5.0.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/to-lines": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-17.0.0.tgz", + "integrity": "sha512-nEi4YEz04Rf2upFbpnEorG8iymyH7o9jYIVFBG1QdzebbIFET3ir+8kQvCZuBE5pKCtViE4XBUsRZz139uFrRQ==", + "dev": true, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/top-level": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-17.0.0.tgz", + "integrity": "sha512-dZrEP1PBJvodNWYPOYiLWf6XZergdksKQaT6i1KSROLdjf5Ai0brLOv5/P+CPxBeoj3vBxK4Ax8H1Pg9t7sHIQ==", + "dev": true, + "dependencies": { + "find-up": "^5.0.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/types": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-17.0.0.tgz", + "integrity": "sha512-hBAw6U+SkAT5h47zDMeOu3HSiD0SODw4Aq7rRNh1ceUmL7GyLKYhPbUvlRWqZ65XjBLPHZhFyQlRaPNz8qvUyQ==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.2.tgz", + "integrity": "sha512-AXYd23w1S/bv3fTs3Lz0vjiYemS08jWkI3hYyS9I1ry+0f+Yjs1wm+sU0BS8qDOPrBIkp4qHYC16I8uVtpLajQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.4.0", + "globals": "^13.15.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/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/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@eslint/eslintrc/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/@financial-times/origami-service-makefile": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@financial-times/origami-service-makefile/-/origami-service-makefile-7.0.3.tgz", + "integrity": "sha512-aKe65sZ3XgZ/0Sm0MDLbGrcO3G4DRv/bVW4Gpmw68cRZV9IBE7h/pwfR3Rs7njNSZMFkjS4rPG/YySv9brQByA==", + "dev": true + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", + "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/gitignore-to-minimatch": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", + "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "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": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@japa/assert": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/@japa/assert/-/assert-1.3.6.tgz", + "integrity": "sha512-aFyCRdLAgYR4P45CayMY7MlzHKLp+oKr2fGj34jObWqmNZOWgFJuEcwBGoqbr+ApL/9Qhkcq0hoFL2FyfFJ7Jw==", + "dev": true, + "dependencies": { + "@types/chai": "^4.3.3", + "api-contract-validator": "^2.2.8", + "chai": "^4.3.6", + "macroable": "^7.0.1" + }, + "peerDependencies": { + "@japa/runner": "^2.1.1" + } + }, + "node_modules/@japa/base-reporter": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@japa/base-reporter/-/base-reporter-1.0.2.tgz", + "integrity": "sha512-ONuLhtQ2UKAqooxm0VjILtZ+r3FvIuIjIh66qyMrfZZUE9Ht+dVxjmnMKRo1MgLnP9D6Rh98JUJEVaiJfgEEKQ==", + "dev": true, + "dependencies": { + "@japa/errors-printer": "^1.3.10", + "@poppinss/cliui": "^3.0.2", + "ms": "^2.1.3" + }, + "peerDependencies": { + "@japa/core": "^7.0.0" + } + }, + "node_modules/@japa/base-reporter/node_modules/@japa/errors-printer": { + "version": "1.3.10", + "resolved": "https://registry.npmjs.org/@japa/errors-printer/-/errors-printer-1.3.10.tgz", + "integrity": "sha512-tUTHnDiGXnhKHZry63sSb4wS3bs2wxvrUOofDzYKilmAY0nUGCIQwpkpSaqVmC3l0xqk29EhBZJewmDCrUBIPw==", + "dev": true, + "dependencies": { + "@poppinss/cliui": "^3.0.2", + "jest-diff": "^29.0.1", + "youch": "^3.2.1", + "youch-terminal": "^2.1.5" + } + }, + "node_modules/@japa/core": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@japa/core/-/core-7.2.0.tgz", + "integrity": "sha512-CnF1NoNgQWH0UALJQ+YNJjXMXdFYb+wlGdppFptsvn2FmjejWFtXeuPCACl4hX4vQahfPKEojSIRKL4iTML6FQ==", + "dev": true, + "dependencies": { + "@poppinss/hooks": "^6.0.2-0", + "async-retry": "^1.3.3", + "emittery": "^0.13.1", + "macroable": "^7.0.1", + "time-span": "^4.0.0" + } + }, + "node_modules/@japa/errors-printer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@japa/errors-printer/-/errors-printer-2.0.1.tgz", + "integrity": "sha512-6ngqHgvgDzVVz2zMd+vCziAfVoAyDxOXvgvHNNVAddAtbmd62eyFexG0hfTUZnkY8EthVG7o8lv6XpcsJL1kxA==", + "dev": true, + "dependencies": { + "@poppinss/cliui": "^3.0.2", + "jest-diff": "^29.0.2", + "youch": "^3.2.2", + "youch-terminal": "^2.1.5" + } + }, + "node_modules/@japa/run-failed-tests": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@japa/run-failed-tests/-/run-failed-tests-1.1.0.tgz", + "integrity": "sha512-kwD/esM3Mc+4eslhAN31e5r/fCMHi9kNlg4FvetgdmS6bR9XTlTR3Cy2fJ4LwMYhNcLFRcBEw9x8d0Nobq9ryg==", + "dev": true, + "dependencies": { + "@poppinss/cliui": "^3.0.2", + "find-cache-dir": "^3.3.2", + "fs-extra": "^10.1.0" + }, + "peerDependencies": { + "@japa/runner": "^2.1.1" + } + }, + "node_modules/@japa/runner": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@japa/runner/-/runner-2.2.1.tgz", + "integrity": "sha512-jP7soKxHm791YzVelwQOZQ1WItgQvbFo0hR0iwULcPqYs/Vh2p70ojPwjYgQ0HbfxyKAEUOjGJXTePRxF2JapQ==", + "dev": true, + "dependencies": { + "@japa/core": "^7.2.0", + "@japa/errors-printer": "^2.0.1", + "@poppinss/cliui": "^3.0.2", + "@poppinss/hooks": "^6.0.2-0", + "fast-glob": "^3.2.12", + "getopts": "^2.3.0", + "inclusion": "^1.0.1" + } + }, + "node_modules/@japa/spec-reporter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@japa/spec-reporter/-/spec-reporter-1.3.0.tgz", + "integrity": "sha512-YTl51H0zAHLJTpTajbRjplRaXqSWUpQaJvtWWrjVGPYVPEfB3RrRHFsRXwpTZI/IZN+/eaZ+ZX/ucZfmFrzY+g==", + "dev": true, + "dependencies": { + "@japa/base-reporter": "^1.0.2", + "@japa/errors-printer": "^2.0.1", + "@poppinss/cliui": "^3.0.2", + "ms": "^2.1.3" + } + }, + "node_modules/@jest/schemas": { + "version": "29.0.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", + "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.24.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", + "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/@jest/types/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@jsdevtools/ono": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", + "dev": true + }, + "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/@poppinss/cliui": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@poppinss/cliui/-/cliui-3.0.2.tgz", + "integrity": "sha512-nrAosoQy0ex3wSw3VuigLs3XCsxDsnNvx4ZL4ZvdZlygrChMUKPKnlxctQk13IyUHaH4F/wvaHnfWg/inhA36w==", + "dev": true, + "dependencies": { + "@poppinss/colors": "^3.0.2", + "cli-boxes": "^3.0.0", + "cli-table3": "^0.6.1", + "color-support": "^1.1.3", + "log-update": "^4.0.0", + "pretty-hrtime": "^1.0.3", + "string-width": "^4.2.2" + } + }, + "node_modules/@poppinss/colors": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@poppinss/colors/-/colors-3.0.2.tgz", + "integrity": "sha512-kgIiDPKUV0IaNtzLKricxd3mMWepqCbgh2Mb0M8C5zyS1bJ0K86s6dMu9xEKtF2XksqyE0qV4ANtMnTCMjQgvA==", + "dev": true, + "dependencies": { + "color-support": "^1.1.3", + "kleur": "^4.1.4" + } + }, + "node_modules/@poppinss/hooks": { + "version": "6.0.2-0", + "resolved": "https://registry.npmjs.org/@poppinss/hooks/-/hooks-6.0.2-0.tgz", + "integrity": "sha512-mG0hnQlxgflvxyM6t/XO8z/FwotsYRXPhtLZ3cz3iyk4t8xaNtOihSANBcvqdkxZCtGBvotNIf/GnES9hvlfSQ==", + "dev": true + }, + "node_modules/@samverschueren/stream-to-observable": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.1.tgz", + "integrity": "sha512-c/qwwcHyafOQuVQJj0IlBjf5yYgBI7YPJ77k4fOJYesb41jio65eaJODRUmfYKhTOFBrIZ66kgvGPlNbjuoRdQ==", + "dev": true, + "dependencies": { + "any-observable": "^0.3.0" + }, + "engines": { + "node": ">=6" + }, + "peerDependenciesMeta": { + "rxjs": { + "optional": true + }, + "zen-observable": { + "optional": true + } + } + }, + "node_modules/@samverschueren/stream-to-observable/node_modules/any-observable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.3.0.tgz", + "integrity": "sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.24.41", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.41.tgz", + "integrity": "sha512-TJCgQurls4FipFvHeC+gfAzb+GGstL0TDwYJKQVtTeSvJIznWzP7g3bAd5gEBlr8+bIxqnWS9VGVWREDhmE8jA==", + "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/@swc/core": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.1.tgz", + "integrity": "sha512-ztB5N63UGLIOM60Vg+deHVigEnDAEAttiTQk4T91/i11SoOO65P9z8Bey01XFTxF0Alc2OJxkt8TBcq+n5mMYQ==", + "dev": true, + "hasInstallScript": true, + "bin": { + "swcx": "run_swcx.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-android-arm-eabi": "1.3.1", + "@swc/core-android-arm64": "1.3.1", + "@swc/core-darwin-arm64": "1.3.1", + "@swc/core-darwin-x64": "1.3.1", + "@swc/core-freebsd-x64": "1.3.1", + "@swc/core-linux-arm-gnueabihf": "1.3.1", + "@swc/core-linux-arm64-gnu": "1.3.1", + "@swc/core-linux-arm64-musl": "1.3.1", + "@swc/core-linux-x64-gnu": "1.3.1", + "@swc/core-linux-x64-musl": "1.3.1", + "@swc/core-win32-arm64-msvc": "1.3.1", + "@swc/core-win32-ia32-msvc": "1.3.1", + "@swc/core-win32-x64-msvc": "1.3.1" + } + }, + "node_modules/@swc/core-android-arm-eabi": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@swc/core-android-arm-eabi/-/core-android-arm-eabi-1.3.1.tgz", + "integrity": "sha512-fZ6nTalHWYn1OHfU87yF8s24edgQ4COHydLlPcpU/pwSH90hCwy/fgna5PpUBw0rfzGBttX0/0yMorC7ZSar4Q==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "dependencies": { + "@swc/wasm": "1.2.122" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-android-arm64": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@swc/core-android-arm64/-/core-android-arm64-1.3.1.tgz", + "integrity": "sha512-aDrV22ajQ4NYOwxEWvipPpdhHaLqU5W1rxRap5N1KSetzwGIk6NMd31o6Jotoxf7tB8qtLlo5VyNok4adJRVYg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "dependencies": { + "@swc/wasm": "1.2.130" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-android-arm64/node_modules/@swc/wasm": { + "version": "1.2.130", + "resolved": "https://registry.npmjs.org/@swc/wasm/-/wasm-1.2.130.tgz", + "integrity": "sha512-rNcJsBxS70+pv8YUWwf5fRlWX6JoY/HJc25HD/F8m6Kv7XhJdqPPMhyX6TKkUBPAG7TWlZYoxa+rHAjPy4Cj3Q==", + "dev": true, + "optional": true + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.1.tgz", + "integrity": "sha512-yom8pqaDhsncQaqp+NdXk1YEtWoqPrfsyKJP3RriTbUjXS/20q/WNfkkJjxUuaFZC6PH/MuvrLzD6Z6ZuZvLaA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.1.tgz", + "integrity": "sha512-Q2kH2i5pS0dvauOiRR4s7atH+Qrhe1LmiCv1D2U+AghZMfDcxi3DBTxrae/YqmDYm3GxHH3ZSAFHR3E0SeiSSg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-freebsd-x64": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@swc/core-freebsd-x64/-/core-freebsd-x64-1.3.1.tgz", + "integrity": "sha512-f2a+rPGrhAICF+Du/nHWZlYzltX1/fWyt+v0IP+r0Zh4drgTrt5G3sMYrQVTjsKvI8R6tV2Q7BfYvDIQXwE1pw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "dependencies": { + "@swc/wasm": "1.2.130" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-freebsd-x64/node_modules/@swc/wasm": { + "version": "1.2.130", + "resolved": "https://registry.npmjs.org/@swc/wasm/-/wasm-1.2.130.tgz", + "integrity": "sha512-rNcJsBxS70+pv8YUWwf5fRlWX6JoY/HJc25HD/F8m6Kv7XhJdqPPMhyX6TKkUBPAG7TWlZYoxa+rHAjPy4Cj3Q==", + "dev": true, + "optional": true + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.1.tgz", + "integrity": "sha512-Q1zGHJMvAEkFdW7A2dthFrswf/HezhC2kOSoOmitz+KxWBZ0YSj8k9ImLYGFf7S8Vi0KVzLUaE1jCGK2oePx/A==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "dependencies": { + "@swc/wasm": "1.2.130" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf/node_modules/@swc/wasm": { + "version": "1.2.130", + "resolved": "https://registry.npmjs.org/@swc/wasm/-/wasm-1.2.130.tgz", + "integrity": "sha512-rNcJsBxS70+pv8YUWwf5fRlWX6JoY/HJc25HD/F8m6Kv7XhJdqPPMhyX6TKkUBPAG7TWlZYoxa+rHAjPy4Cj3Q==", + "dev": true, + "optional": true + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.1.tgz", + "integrity": "sha512-5OPkiU2A4Ijt2cRzi2FCGPkAC+wRvAb0TmUkL4Lj2PXPzM5RtEd2AoYmpQhV+YEOXO4XdnKwgBmdeiQV5K8eXA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.1.tgz", + "integrity": "sha512-oTIeS7kEKSUrTxavYBEfqjqoIiHtbwSdgp/rrn2hz7CDG1B1imRHnsjwdh4YaYLsm8RcCH9+GABnHxJd3Nd6qg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.1.tgz", + "integrity": "sha512-gNojY1qIKksK9kNdY4pqrlUILTxfqSWtXjX0qV2mlxgwRpnOATJnMx585q09cOZnkN2/QB+33pXnT8z/wxuGzQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.1.tgz", + "integrity": "sha512-WXNagCsjul7U9uYYP1JkUUVtvqXRDDWjvdegqrtQ99/De+HoWr+fCPgvENgOsSwb0clPTBuiGm2PTnK6kDQ0Sw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.1.tgz", + "integrity": "sha512-3LSDJtpYNgN4N/pd/YzHAWKaF2Y/1P9t83vHfPos77hQ+KzFaiyT7YIG1qfYy1AD8MGC28l2bJNH2gia3bcERA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "dependencies": { + "@swc/wasm": "1.2.130" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc/node_modules/@swc/wasm": { + "version": "1.2.130", + "resolved": "https://registry.npmjs.org/@swc/wasm/-/wasm-1.2.130.tgz", + "integrity": "sha512-rNcJsBxS70+pv8YUWwf5fRlWX6JoY/HJc25HD/F8m6Kv7XhJdqPPMhyX6TKkUBPAG7TWlZYoxa+rHAjPy4Cj3Q==", + "dev": true, + "optional": true + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.1.tgz", + "integrity": "sha512-0VfPVkQx7jV7k71tTQY5HchDrALWjrHF8AcaaCojXQpb9ftktLxaCUdTWlQ+Y958GkgG7QX+HEo95ImZ+cYRHQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "dependencies": { + "@swc/wasm": "1.2.130" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc/node_modules/@swc/wasm": { + "version": "1.2.130", + "resolved": "https://registry.npmjs.org/@swc/wasm/-/wasm-1.2.130.tgz", + "integrity": "sha512-rNcJsBxS70+pv8YUWwf5fRlWX6JoY/HJc25HD/F8m6Kv7XhJdqPPMhyX6TKkUBPAG7TWlZYoxa+rHAjPy4Cj3Q==", + "dev": true, + "optional": true + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.1.tgz", + "integrity": "sha512-jSeqI8+1PGp+lHtyQCieDQxSszOF6UlA3bC2cmC9LAD84xcvsqpt0hsg3GFaw6RR7FsVjMNl/St6y1EEW0mm6Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/wasm": { + "version": "1.2.122", + "resolved": "https://registry.npmjs.org/@swc/wasm/-/wasm-1.2.122.tgz", + "integrity": "sha512-sM1VCWQxmNhFtdxME+8UXNyPNhxNu7zdb6ikWpz0YKAQQFRGT5ThZgJrubEpah335SUToNg8pkdDF7ibVCjxbQ==", + "dev": true, + "optional": 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/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "dev": true + }, + "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/chai": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.3.tgz", + "integrity": "sha512-hC7OMnszpxhZPduX+m+nrx+uFoLkWOMiR4oa/AZF3MuSETYTZmFfJAHqZEM8MVlvfG7BEUcgvtwoCTxBp6hm3g==", + "dev": true + }, + "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.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "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/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/minimist": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", + "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "18.7.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.18.tgz", + "integrity": "sha512-m+6nTEOadJZuTPkKR/SYK3A2d7FZrgElol9UP1Kae90VVU4a6mxnPuLiIW1m4Cq4gZ/nWb9GrdVXJCoCazDAbg==", + "dev": true + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "dev": true + }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "node_modules/@types/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/yargs": { + "version": "15.0.14", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.14.tgz", + "integrity": "sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.37.0.tgz", + "integrity": "sha512-Fde6W0IafXktz1UlnhGkrrmnnGpAo1kyX7dnyHHVrmwJOn72Oqm3eYtddrpOwwel2W8PAK9F3pIL5S+lfoM0og==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.37.0", + "@typescript-eslint/type-utils": "5.37.0", + "@typescript-eslint/utils": "5.37.0", + "debug": "^4.3.4", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.2.0", + "regexpp": "^3.2.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/parser": { + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.37.0.tgz", + "integrity": "sha512-01VzI/ipYKuaG5PkE5+qyJ6m02fVALmMPY3Qq5BHflDx3y4VobbLdHQkSMg9VPRS4KdNt4oYTMaomFoHonBGAw==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.37.0", + "@typescript-eslint/types": "5.37.0", + "@typescript-eslint/typescript-estree": "5.37.0", + "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.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.37.0.tgz", + "integrity": "sha512-F67MqrmSXGd/eZnujjtkPgBQzgespu/iCZ+54Ok9X5tALb9L2v3G+QBSoWkXG0p3lcTJsL+iXz5eLUEdSiJU9Q==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.37.0", + "@typescript-eslint/visitor-keys": "5.37.0" + }, + "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.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.37.0.tgz", + "integrity": "sha512-BSx/O0Z0SXOF5tY0bNTBcDEKz2Ec20GVYvq/H/XNKiUorUFilH7NPbFUuiiyzWaSdN3PA8JV0OvYx0gH/5aFAQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "5.37.0", + "@typescript-eslint/utils": "5.37.0", + "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/types": { + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.37.0.tgz", + "integrity": "sha512-3frIJiTa5+tCb2iqR/bf7XwU20lnU05r/sgPJnRpwvfZaqCJBrl8Q/mw9vr3NrNdB/XtVyMA0eppRMMBqdJ1bA==", + "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.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.37.0.tgz", + "integrity": "sha512-JkFoFIt/cx59iqEDSgIGnQpCTRv96MQnXCYvJi7QhBC24uyuzbD8wVbajMB1b9x4I0octYFJ3OwjAwNqk1AjDA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.37.0", + "@typescript-eslint/visitor-keys": "5.37.0", + "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/utils": { + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.37.0.tgz", + "integrity": "sha512-jUEJoQrWbZhmikbcWSMDuUSxEE7ID2W/QCV/uz10WtQqfOuKZUqFGjqLJ+qhDd17rjgp+QJPqTdPIBWwoob2NQ==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.37.0", + "@typescript-eslint/types": "5.37.0", + "@typescript-eslint/typescript-estree": "5.37.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "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/visitor-keys": { + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.37.0.tgz", + "integrity": "sha512-Hp7rT4cENBPIzMwrlehLW/28EVCOcE9U1Z1BQTc8EA8v5qpr7GRGuG+U58V5tTY48zvUOA3KHvw3rA8tY9fbdA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.37.0", + "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/acorn": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", + "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", + "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/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dev": true, + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-observable": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.5.1.tgz", + "integrity": "sha512-8zv01bgDOp9PTmRTNCAHTw64TFP2rvlX4LvtNJLachaXY+AjmIvLT47fABNPCiIe89hKiSCo2n5zmPqI9CElPA==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + }, + "peerDependenciesMeta": { + "rxjs": { + "optional": true + }, + "zen-observable": { + "optional": true + } + } + }, + "node_modules/api-contract-validator": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/api-contract-validator/-/api-contract-validator-2.2.8.tgz", + "integrity": "sha512-YM3rMcrIp8Thf/WWbVBXBGX793Mm3Phw2pn3VbJpiZkpeTCTtF10huKPrzQ2gSIaK5GjAhTRJMAOyf+rsS7MAw==", + "dev": true, + "dependencies": { + "api-schema-builder": "^2.0.10", + "chalk": "^3.0.0", + "columnify": "^1.5.4", + "jest-diff": "^25.5.0", + "jest-matcher-utils": "^25.5.0", + "lodash.flatten": "^4.4.0", + "lodash.get": "^4.4.2", + "lodash.set": "^4.3.2", + "uri-js": "^4.4.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/api-contract-validator/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/api-contract-validator/node_modules/diff-sequences": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", + "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==", + "dev": true, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/api-contract-validator/node_modules/jest-diff": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.5.0.tgz", + "integrity": "sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A==", + "dev": true, + "dependencies": { + "chalk": "^3.0.0", + "diff-sequences": "^25.2.6", + "jest-get-type": "^25.2.6", + "pretty-format": "^25.5.0" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/api-contract-validator/node_modules/jest-get-type": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", + "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", + "dev": true, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/api-contract-validator/node_modules/pretty-format": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", + "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", + "dev": true, + "dependencies": { + "@jest/types": "^25.5.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/api-contract-validator/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, + "node_modules/api-schema-builder": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/api-schema-builder/-/api-schema-builder-2.0.11.tgz", + "integrity": "sha512-85zbwf8MtPWodhfnmQRW5YD/fuGR12FP+8TbcYai5wbRnoUmPYLftLSbp7NB6zQMPb61Gjz+ApPUSyTdcCos7g==", + "dev": true, + "dependencies": { + "ajv": "^6.12.6", + "clone-deep": "^4.0.1", + "decimal.js": "^10.3.1", + "js-yaml": "^3.14.1", + "json-schema-deref-sync": "^0.14.0", + "lodash.get": "^4.4.2", + "openapi-schema-validator": "^3.0.3", + "swagger-parser": "^10.0.3" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/api-schema-builder/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/api-schema-builder/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/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-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-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-uniq": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.2.tgz", + "integrity": "sha512-GVYjmpL05al4dNlKJm53mKE4w9OOLiuVHWorsIA3YVz+Hu0hcn6PtE3Ydl0EqU7v+7ABC4mjjWsnLUxbpno+CA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/as-table": { + "version": "1.0.55", + "resolved": "https://registry.npmjs.org/as-table/-/as-table-1.0.55.tgz", + "integrity": "sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==", + "dev": true, + "dependencies": { + "printable-characters": "^1.0.42" + } + }, + "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/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/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "dev": true + }, + "node_modules/async-exit-hook": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", + "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/async-retry": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", + "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", + "dev": true, + "dependencies": { + "retry": "0.13.1" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "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.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true + }, + "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/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/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "node_modules/boxen": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", + "dev": true, + "dependencies": { + "ansi-align": "^3.0.0", + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/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/boxen/node_modules/cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/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/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/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/cacheable-request/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/call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha512-wCyFsDQkKPwwF8BDwOiWNx/9K45L/hvggQiDbve+viMNMQnWhrlYIuBk09offfwCRtCO9P6XwUttufzU11WCVw==", + "dev": true + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-keys/node_modules/quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/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.3.6", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz", + "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==", + "dev": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "node_modules/charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/ci-info": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.4.0.tgz", + "integrity": "sha512-t5QdPT5jq3o262DOQ8zA6E1tlH2upmUc4Hlvrbx1pGYJuiiHl7O7rvVNI+l8HTVhd/q3Qc9vqimkNk5yiXsAug==", + "dev": true + }, + "node_modules/clean-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", + "integrity": "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/clean-regexp/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/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-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-table3": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.2.tgz", + "integrity": "sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/cli-truncate": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", + "integrity": "sha512-f4r4yJnbT++qUPI9NR4XLDLq41gQ+uqnPItWG0F5ZkehuNiTTa3EY0S4AqTSUOeJ7/zU41oWPQSNkW5BqPL9bg==", + "dev": true, + "dependencies": { + "slice-ansi": "0.0.4", + "string-width": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cli-truncate/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cli-truncate/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, + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cli-truncate/node_modules/slice-ansi": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha512-up04hB2hR92PgjpyU3y/eg91yIBILyjVY26NvvciY3EVVPjybkMszMpXQ9QAkcS3I5rtJBDLoTxxg+qvW8c7rw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cli-truncate/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, + "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/cli-truncate/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, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "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/cliui/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/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dev": true, + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/columnify": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.6.0.tgz", + "integrity": "sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==", + "dev": true, + "dependencies": { + "strip-ansi": "^6.0.1", + "wcwidth": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "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/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "node_modules/compare-func": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "dev": true, + "dependencies": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "dev": true, + "dependencies": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/conventional-changelog-angular": { + "version": "5.0.13", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", + "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", + "dev": true, + "dependencies": { + "compare-func": "^2.0.0", + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-conventionalcommits": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-5.0.0.tgz", + "integrity": "sha512-lCDbA+ZqVFQGUj7h9QBKoIpLhl8iihkO0nCTyRNzuXtcd7ubODpYB04IFy31JloiJgG0Uovu8ot8oxRzn7Nwtw==", + "dev": true, + "dependencies": { + "compare-func": "^2.0.0", + "lodash": "^4.17.15", + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-commits-parser": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", + "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", + "dev": true, + "dependencies": { + "is-text-path": "^1.0.1", + "JSONStream": "^1.0.4", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + }, + "bin": { + "conventional-commits-parser": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/convert-hrtime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/convert-hrtime/-/convert-hrtime-3.0.0.tgz", + "integrity": "sha512-7V+KqSvMiHp8yWDuwfww06XleMWVVB9b9tURBx+G7UTADuo5hYPuowKloz4OzOqbPezxgo+fdQ1522WzPG4OeA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "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": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true + }, + "node_modules/cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "dev": true, + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cosmiconfig-typescript-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.0.0.tgz", + "integrity": "sha512-cVpucSc2Tf+VPwCCR7SZzmQTQkPbkk4O01yXsYqXBIbjE1bhwqSyAgYQkRK1un4i0OPziTleqFhdkmOc4RQ/9g==", + "dev": true, + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "@types/node": "*", + "cosmiconfig": ">=7", + "ts-node": ">=10", + "typescript": ">=3" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "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/crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/dag-map": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/dag-map/-/dag-map-1.0.2.tgz", + "integrity": "sha512-+LSAiGFwQ9dRnRdOeaj7g47ZFJcOUPukAP8J3A3fuZ1g9Y44BG+P1sgApjLXTQPOzC4+7S9Wr8kXsfpINM4jpw==", + "dev": true + }, + "node_modules/dargs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", + "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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/data-uri-to-buffer": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-2.0.2.tgz", + "integrity": "sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==", + "dev": true + }, + "node_modules/date-fns": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", + "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "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/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg==", + "dev": true, + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decimal.js": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.0.tgz", + "integrity": "sha512-Nv6ENEzyPQ6AItkGwLE2PGKinZZ9g59vSh2BeH6NqPu0OTKZ5ruJsVqh/orbAnqXc9pBbgXAIrc2EyaCj8NpGg==", + "dev": true + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA==", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + } + }, + "node_modules/defaults/node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "engines": { + "node": ">=0.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/del": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", + "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", + "dev": true, + "dependencies": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del-cli": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/del-cli/-/del-cli-4.0.1.tgz", + "integrity": "sha512-KtR/6cBfZkGDAP2NA7z+bP4p1OMob3wjN9mq13+SWvExx6jT9gFWfLgXEeX8J2B47OKeNCq9yTONmtryQ+m+6g==", + "dev": true, + "dependencies": { + "del": "^6.0.0", + "meow": "^10.1.0" + }, + "bin": { + "del": "cli.js", + "del-cli": "cli.js" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del-cli/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/del-cli/node_modules/camelcase-keys": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-7.0.2.tgz", + "integrity": "sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==", + "dev": true, + "dependencies": { + "camelcase": "^6.3.0", + "map-obj": "^4.1.0", + "quick-lru": "^5.1.1", + "type-fest": "^1.2.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del-cli/node_modules/decamelize": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-5.0.1.tgz", + "integrity": "sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del-cli/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/del-cli/node_modules/meow": { + "version": "10.1.3", + "resolved": "https://registry.npmjs.org/meow/-/meow-10.1.3.tgz", + "integrity": "sha512-0WL7RMCPPdUTE00+GxJjL4d5Dm6eUbmAzxlzywJWiRUKCW093owmZ7/q74tH9VI91vxw9KJJNxAcvdpxb2G4iA==", + "dev": true, + "dependencies": { + "@types/minimist": "^1.2.2", + "camelcase-keys": "^7.0.0", + "decamelize": "^5.0.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.2", + "read-pkg-up": "^8.0.0", + "redent": "^4.0.0", + "trim-newlines": "^4.0.2", + "type-fest": "^1.2.2", + "yargs-parser": "^20.2.9" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del-cli/node_modules/read-pkg": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-6.0.0.tgz", + "integrity": "sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^3.0.2", + "parse-json": "^5.2.0", + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del-cli/node_modules/read-pkg-up": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-8.0.0.tgz", + "integrity": "sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==", + "dev": true, + "dependencies": { + "find-up": "^5.0.0", + "read-pkg": "^6.0.0", + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del-cli/node_modules/redent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz", + "integrity": "sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==", + "dev": true, + "dependencies": { + "indent-string": "^5.0.0", + "strip-indent": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del-cli/node_modules/strip-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", + "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del-cli/node_modules/trim-newlines": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.0.2.tgz", + "integrity": "sha512-GJtWyq9InR/2HRiLZgpIKv+ufIKrVrvjQWEj7PxAXNc5dwbNJkqhAUoAGgzRmULAnoOM5EIpveYd3J2VeSAIew==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del-cli/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/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.0.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.0.0.tgz", + "integrity": "sha512-7Qe/zd1wxSDL4D/X/FPjOMB+ZMDt71W94KYaq05I2l0oQqgXgs7s4ftYYmV38gBSrPz2vcygxfs1xn0FT+rKNA==", + "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/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/duplexer3": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", + "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==", + "dev": true + }, + "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/ejs": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz", + "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==", + "dev": true, + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/elegant-spinner": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", + "integrity": "sha512-B+ZM+RXvRqQaAmkMlO/oSe5nMUOaUnyfGYCEHoR8wrXsZR2mA0XVibsxV1bvTwxdRWah1PkQqso2EzhILGHtEQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/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-goat": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-3.0.0.tgz", + "integrity": "sha512-w3PwNZJwRxlp47QGzhuEBldEqVHHhh8/tIPcl6ecf2Bou99cdAt0knihBV0Ecc7CGxYduXVBDheH1K2oADRlvw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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.23.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.23.1.tgz", + "integrity": "sha512-w7C1IXCc6fNqjpuYd0yPlcTKKmHlHHktRkzmBPZ+7cvNBQuiNjx0xaMTjAJGCafJhQkrFJooREv0CtrVzmHwqg==", + "dev": true, + "dependencies": { + "@eslint/eslintrc": "^1.3.2", + "@humanwhocodes/config-array": "^0.10.4", + "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", + "@humanwhocodes/module-importer": "^1.0.1", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.4.0", + "esquery": "^1.4.0", + "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.1", + "globals": "^13.15.0", + "globby": "^11.1.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-sdsl": "^4.1.4", + "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.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "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": "8.5.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", + "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-adonis": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-adonis/-/eslint-plugin-adonis-3.0.2.tgz", + "integrity": "sha512-tS9GuhyZlPHzpAslXhCto7JEbB21UBoLQLgMXCaeqrOWX9Mg6Rc6r51CZ/9RdWwRXpj3sl/JzpFWqc9JvGObmA==", + "dev": true, + "dependencies": { + "@typescript-eslint/eslint-plugin": "^5.28.0", + "@typescript-eslint/parser": "^5.28.0", + "eslint-plugin-unicorn": "^42.0.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "eslint": "^8.0.0" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", + "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "eslint": ">=7.28.0", + "prettier": ">=2.0.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-unicorn": { + "version": "42.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-42.0.0.tgz", + "integrity": "sha512-ixBsbhgWuxVaNlPTT8AyfJMlhyC5flCJFjyK3oKE8TRrwBnaHvUbuIkCM1lqg8ryYrFStL/T557zfKzX4GKSlg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.15.7", + "ci-info": "^3.3.0", + "clean-regexp": "^1.0.0", + "eslint-utils": "^3.0.0", + "esquery": "^1.4.0", + "indent-string": "^4.0.0", + "is-builtin-module": "^3.1.0", + "lodash": "^4.17.21", + "pluralize": "^8.0.0", + "read-pkg-up": "^7.0.1", + "regexp-tree": "^0.1.24", + "safe-regex": "^2.1.1", + "semver": "^7.3.5", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1" + }, + "peerDependencies": { + "eslint": ">=8.8.0" + } + }, + "node_modules/eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/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/eslint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/eslint/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/eslint/node_modules/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/espree": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", + "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", + "dev": true, + "dependencies": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + }, + "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.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/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/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "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-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "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/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "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": "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/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.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "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": "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/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/get-source": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/get-source/-/get-source-2.0.12.tgz", + "integrity": "sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==", + "dev": true, + "dependencies": { + "data-uri-to-buffer": "^2.0.0", + "source-map": "^0.6.1" + } + }, + "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/getopts": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/getopts/-/getopts-2.3.0.tgz", + "integrity": "sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA==", + "dev": true + }, + "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-raw-commits": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz", + "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==", + "dev": true, + "dependencies": { + "dargs": "^7.0.0", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + }, + "bin": { + "git-raw-commits": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/github-label-sync": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/github-label-sync/-/github-label-sync-2.2.0.tgz", + "integrity": "sha512-4FBcwA/6XhQtFWZ/+xkwIAJKn7XJlkLBXA+eA3kjJJ6YTFbTynU6Cg9oUN3RXUCBoV2B7fhyEhqN6IwWO/hf3g==", + "dev": true, + "dependencies": { + "@financial-times/origami-service-makefile": "^7.0.3", + "ajv": "^8.6.3", + "chalk": "^4.1.2", + "commander": "^6.2.1", + "got": "^11.8.2", + "js-yaml": "^3.14.1", + "node.extend": "^2.0.2", + "octonode": "^0.10.2" + }, + "bin": { + "github-label-sync": "bin/github-label-sync.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/github-url-from-git": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/github-url-from-git/-/github-url-from-git-1.5.0.tgz", + "integrity": "sha512-WWOec4aRI7YAykQ9+BHmzjyNlkfJFG8QLXnDTsLz/kZefq7qkzdfo4p6fkYYMIq1aj+gZcQs/1HQhQh3DPPxlQ==", + "dev": true + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "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/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/global-dirs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz", + "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==", + "dev": true, + "dependencies": { + "ini": "1.3.7" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globals": { + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/got": { + "version": "11.8.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/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/har-validator/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/har-validator/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/hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "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": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true + }, + "node_modules/http-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/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/husky": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.1.tgz", + "integrity": "sha512-xs7/chUH/CKdOCs7Zy0Aev9e/dKOMZf3K1Az1nar3tzlv0jfqnYtu235bstsWTmXOR0EfINrPa97yy4Lz6RiKw==", + "dev": true, + "bin": { + "husky": "lib/bin.js" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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/ignore-walk": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz", + "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==", + "dev": true, + "dependencies": { + "minimatch": "^3.0.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-fresh/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/import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inclusion": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/inclusion/-/inclusion-1.0.1.tgz", + "integrity": "sha512-TRicJXpIfJN+a47xxjs5nfy2V5l413e4aAtsLYRG+OsDM3A3uloBd/+fDmj23RVuIL9VQfwtb37iIc0rtMw9KA==", + "dev": true, + "dependencies": { + "parent-module": "^2.0.0" + } + }, + "node_modules/inclusion/node_modules/parent-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-2.0.0.tgz", + "integrity": "sha512-uo0Z9JJeWzv8BG+tRcapBKNJ0dro9cLyczGzulS6EfeyAdeC9sbojtW6XwvYxJkEne9En+J2XEl4zyglVeIwFg==", + "dev": true, + "dependencies": { + "callsites": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "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": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "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.7", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", + "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==", + "dev": true + }, + "node_modules/inquirer": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.19", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/inquirer-autosubmit-prompt": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/inquirer-autosubmit-prompt/-/inquirer-autosubmit-prompt-0.2.0.tgz", + "integrity": "sha512-mzNrusCk5L6kSzlN0Ioddn8yzrhYNLli+Sn2ZxMuLechMYAzakiFCIULxsxlQb5YKzthLGfrFACcWoAvM7p04Q==", + "dev": true, + "dependencies": { + "chalk": "^2.4.1", + "inquirer": "^6.2.1", + "rxjs": "^6.3.3" + } + }, + "node_modules/inquirer-autosubmit-prompt/node_modules/ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-autosubmit-prompt/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/inquirer-autosubmit-prompt/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/inquirer-autosubmit-prompt/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/inquirer-autosubmit-prompt/node_modules/cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", + "dev": true, + "dependencies": { + "restore-cursor": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-autosubmit-prompt/node_modules/cli-width": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", + "dev": true + }, + "node_modules/inquirer-autosubmit-prompt/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/inquirer-autosubmit-prompt/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/inquirer-autosubmit-prompt/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/inquirer-autosubmit-prompt/node_modules/figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-autosubmit-prompt/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/inquirer-autosubmit-prompt/node_modules/inquirer": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", + "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", + "dev": true, + "dependencies": { + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.12", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/inquirer-autosubmit-prompt/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-autosubmit-prompt/node_modules/mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-autosubmit-prompt/node_modules/mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==", + "dev": true + }, + "node_modules/inquirer-autosubmit-prompt/node_modules/onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-autosubmit-prompt/node_modules/restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "dev": true, + "dependencies": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-autosubmit-prompt/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-autosubmit-prompt/node_modules/string-width/node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-autosubmit-prompt/node_modules/string-width/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dev": true, + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer-autosubmit-prompt/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/inquirer-autosubmit-prompt/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/is": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/is/-/is-3.3.0.tgz", + "integrity": "sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/is-builtin-module": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.0.tgz", + "integrity": "sha512-phDA4oSGt7vl1n5tJvTWooWWAsXLY+2xCnxNqvKhGEzujg+A43wPlPOyDg3C8XQHN+6k/JTQWJ/j0dQh/qr+Hw==", + "dev": true, + "dependencies": { + "builtin-modules": "^3.3.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-ci/node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "node_modules/is-core-module": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", + "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-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-installed-globally": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", + "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", + "dev": true, + "dependencies": { + "global-dirs": "^2.0.1", + "is-path-inside": "^3.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-invalid-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-invalid-path/-/is-invalid-path-0.1.0.tgz", + "integrity": "sha512-aZMG0T3F34mTg4eTdszcGXx54oiZ4NtHSft3hWNJMGJXUUqdIj3cOZuHcU0nCWWcY3jd7yRe/3AEm3vSNTpBGQ==", + "dev": true, + "dependencies": { + "is-glob": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-invalid-path/node_modules/is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-invalid-path/node_modules/is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==", + "dev": true, + "dependencies": { + "is-extglob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-npm": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", + "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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-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-observable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-1.1.0.tgz", + "integrity": "sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA==", + "dev": true, + "dependencies": { + "symbol-observable": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/is-observable/node_modules/symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "dev": true + }, + "node_modules/is-scoped": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-scoped/-/is-scoped-2.1.0.tgz", + "integrity": "sha512-Cv4OpPTHAK9kHYzkzCrof3VJh7H/PrG2MBUMvvJebaaUMbqhm0YAtXnvh0I3Hnj2tMZWwrRROWLSgfJrKqWmlQ==", + "dev": true, + "dependencies": { + "scoped-regex": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", + "dev": true, + "dependencies": { + "text-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "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-url-superb": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-url-superb/-/is-url-superb-4.0.0.tgz", + "integrity": "sha512-GI+WjezhPPcbM+tqE9LnmsY5qqjwHzTvjJ36wxYX5ujNXefSUJ/T17r5bqDV8yLhcgB59KTPNOc9O9cmHTPWsA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-valid-path": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-valid-path/-/is-valid-path-0.1.1.tgz", + "integrity": "sha512-+kwPrVDu9Ms03L90Qaml+79+6DZHqHyRoANI6IsZJ/g8frhnfchDOBCa0RbQ6/kdHt5CS5OeIEyrYznNuVN+8A==", + "dev": true, + "dependencies": { + "is-invalid-path": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true + }, + "node_modules/issue-regex": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/issue-regex/-/issue-regex-3.1.0.tgz", + "integrity": "sha512-0RHjbtw9QXeSYnIEY5Yrp2QZrdtz21xBDV9C/GIlY2POmgoS6a7qjkYS5siRKXScnuAj5/SPv1C3YForNCHTJA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/jake": { + "version": "10.8.5", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", + "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", + "dev": true, + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-diff": { + "version": "29.0.3", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.0.3.tgz", + "integrity": "sha512-+X/AIF5G/vX9fWK+Db9bi9BQas7M9oBME7egU7psbn4jlszLFCu0dW63UgeE6cs/GANq4fLaT+8sGHQQ0eCUfg==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.0.0", + "jest-get-type": "^29.0.0", + "pretty-format": "^29.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.0.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.0.0.tgz", + "integrity": "sha512-83X19z/HuLKYXYHskZlBAShO7UfLFXu/vWajw9ZNJASN32li8yHMaVGAQqxFW1RCFOkB7cubaL6FaJVQqqJLSw==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.5.0.tgz", + "integrity": "sha512-VWI269+9JS5cpndnpCwm7dy7JtGQT30UHfrnM3mXl22gHGt/b7NkjBqXfbhZ8V4B7ANUsjK18PlSBmG0YH7gjw==", + "dev": true, + "dependencies": { + "chalk": "^3.0.0", + "jest-diff": "^25.5.0", + "jest-get-type": "^25.2.6", + "pretty-format": "^25.5.0" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-matcher-utils/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-matcher-utils/node_modules/diff-sequences": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", + "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==", + "dev": true, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-matcher-utils/node_modules/jest-diff": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.5.0.tgz", + "integrity": "sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A==", + "dev": true, + "dependencies": { + "chalk": "^3.0.0", + "diff-sequences": "^25.2.6", + "jest-get-type": "^25.2.6", + "pretty-format": "^25.5.0" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-matcher-utils/node_modules/jest-get-type": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", + "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", + "dev": true, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-matcher-utils/node_modules/pretty-format": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", + "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", + "dev": true, + "dependencies": { + "@jest/types": "^25.5.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-matcher-utils/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, + "node_modules/js-sdsl": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.4.tgz", + "integrity": "sha512-Y2/yD55y5jteOAmY50JbUZYwk3CP3wnLPEZnlR1w9oKhITrBEtAxwuWKebFf8hMrPMgbYwFoWK/lH2sBkErELw==", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true + }, + "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-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-deref-sync": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/json-schema-deref-sync/-/json-schema-deref-sync-0.14.0.tgz", + "integrity": "sha512-yGR1xmhdiD6R0MSrwWcFxQzAj5b3i5Gb/mt5tvQKgFMMeNe0KZYNEN/jWr7G+xn39Azqgcvk4ZKMs8dQl8e4wA==", + "dev": true, + "dependencies": { + "clone": "^2.1.2", + "dag-map": "~1.0.0", + "is-valid-path": "^0.1.1", + "lodash": "^4.17.13", + "md5": "~2.2.0", + "memory-cache": "~0.2.0", + "traverse": "~0.6.6", + "valid-url": "~1.0.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "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": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "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": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true + }, + "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/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/keyv": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.0.tgz", + "integrity": "sha512-2YvuMsA+jnFGtBareKqgANOEKe1mk3HKiXu2fRmAfyxG0MJAywNhi5ttWA3PMjl4NmpyjZNbFifR2vNjW1znfA==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "dev": true, + "dependencies": { + "package-json": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "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/listr": { + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/listr/-/listr-0.14.3.tgz", + "integrity": "sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA==", + "dev": true, + "dependencies": { + "@samverschueren/stream-to-observable": "^0.3.0", + "is-observable": "^1.1.0", + "is-promise": "^2.1.0", + "is-stream": "^1.1.0", + "listr-silent-renderer": "^1.1.1", + "listr-update-renderer": "^0.5.0", + "listr-verbose-renderer": "^0.5.0", + "p-map": "^2.0.0", + "rxjs": "^6.3.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/listr-input": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/listr-input/-/listr-input-0.2.1.tgz", + "integrity": "sha512-oa8iVG870qJq+OuuMK3DjGqFcwsK1SDu+kULp9kEq09TY231aideIZenr3lFOQdASpAr6asuyJBbX62/a3IIhg==", + "dev": true, + "dependencies": { + "inquirer": "^7.0.0", + "inquirer-autosubmit-prompt": "^0.2.0", + "rxjs": "^6.5.3", + "through": "^2.3.8" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/listr-silent-renderer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz", + "integrity": "sha512-L26cIFm7/oZeSNVhWB6faeorXhMg4HNlb/dS/7jHhr708jxlXrtrBWo4YUxZQkc6dGoxEAe6J/D3juTRBUzjtA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/listr-update-renderer": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz", + "integrity": "sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "cli-truncate": "^0.2.1", + "elegant-spinner": "^1.0.1", + "figures": "^1.7.0", + "indent-string": "^3.0.0", + "log-symbols": "^1.0.2", + "log-update": "^2.3.0", + "strip-ansi": "^3.0.1" + }, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "listr": "^0.14.2" + } + }, + "node_modules/listr-update-renderer/node_modules/ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/listr-update-renderer/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/listr-update-renderer/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/listr-update-renderer/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "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/listr-update-renderer/node_modules/cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", + "dev": true, + "dependencies": { + "restore-cursor": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/listr-update-renderer/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/listr-update-renderer/node_modules/figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/listr-update-renderer/node_modules/indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha512-BYqTHXTGUIvg7t1r4sJNKcbDZkL92nkXA8YtRpbjFHRHGDL/NtUeiBJMeE60kIFN/Mg8ESaWQvftaYMGJzQZCQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/listr-update-renderer/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/listr-update-renderer/node_modules/log-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", + "integrity": "sha512-mmPrW0Fh2fxOzdBbFv4g1m6pR72haFLPJ2G5SJEELf1y+iaQrDG6cWCPjy54RHYbZAt7X+ls690Kw62AdWXBzQ==", + "dev": true, + "dependencies": { + "chalk": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/listr-update-renderer/node_modules/log-update": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-2.3.0.tgz", + "integrity": "sha512-vlP11XfFGyeNQlmEn9tJ66rEW1coA/79m5z6BCkudjbAGE83uhAcGYrBFwfs3AdLiLzGRusRPAbSPK9xZteCmg==", + "dev": true, + "dependencies": { + "ansi-escapes": "^3.0.0", + "cli-cursor": "^2.0.0", + "wrap-ansi": "^3.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/listr-update-renderer/node_modules/mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/listr-update-renderer/node_modules/onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/listr-update-renderer/node_modules/restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "dev": true, + "dependencies": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/listr-update-renderer/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/listr-update-renderer/node_modules/string-width/node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/listr-update-renderer/node_modules/string-width/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dev": true, + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/listr-update-renderer/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, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/listr-update-renderer/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/listr-update-renderer/node_modules/wrap-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-3.0.1.tgz", + "integrity": "sha512-iXR3tDXpbnTpzjKSylUJRkLuOrEC7hwEB221cgn6wtF8wpmz28puFXAEfPT5zrjM3wahygB//VuWEr1vTkDcNQ==", + "dev": true, + "dependencies": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/listr-update-renderer/node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/listr-update-renderer/node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dev": true, + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/listr-verbose-renderer": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz", + "integrity": "sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.1", + "cli-cursor": "^2.1.0", + "date-fns": "^1.27.2", + "figures": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/listr-verbose-renderer/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/listr-verbose-renderer/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/listr-verbose-renderer/node_modules/cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", + "dev": true, + "dependencies": { + "restore-cursor": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/listr-verbose-renderer/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/listr-verbose-renderer/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/listr-verbose-renderer/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/listr-verbose-renderer/node_modules/figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/listr-verbose-renderer/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/listr-verbose-renderer/node_modules/mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/listr-verbose-renderer/node_modules/onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/listr-verbose-renderer/node_modules/restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "dev": true, + "dependencies": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/listr-verbose-renderer/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/listr/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/listr/node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", + "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.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.set": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", + "integrity": "sha512-4hNPN5jlm/N/HLMCO43v8BXKq9Z7QdAGc/VGrRD61w8gN9g/6jF9A4L1pbUgBLCffi0w9VsXfTOij5x8iTyFvg==", + "dev": true + }, + "node_modules/lodash.zip": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz", + "integrity": "sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/loupe": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz", + "integrity": "sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.0" + } + }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/macroable": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/macroable/-/macroable-7.0.1.tgz", + "integrity": "sha512-8bbZLq2JoGI7FdvmDIxed41opR2cqgUUrRN4fVEsajARzfHkZDAzbCg0RW+jIY93YhWuBsMOeLcIyYz5WU4HNQ==", + "dev": true + }, + "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/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "dependencies": { + "p-defer": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/md5": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz", + "integrity": "sha512-PlGG4z5mBANDGCKsYQe0CaUYHdZYZt8ZPZLmEt+Urf0W4GlpTX4HescwHU+dc9+Z/G/vZKYZYFrwgm9VxK6QOQ==", + "dev": true, + "dependencies": { + "charenc": "~0.0.1", + "crypt": "~0.0.1", + "is-buffer": "~1.1.1" + } + }, + "node_modules/memory-cache": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/memory-cache/-/memory-cache-0.2.0.tgz", + "integrity": "sha512-OcjA+jzjOYzKmKS6IQVALHLVz+rNTMPoJvCztFaZxwG14wtAW7VRZjwTQu06vKCYOxh4jVnik7ya0SXTB0W+xA==", + "dev": true + }, + "node_modules/meow": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "dev": true, + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-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-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": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.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/minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/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/mustache": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "dev": true, + "bin": { + "mustache": "bin/mustache" + } + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/new-github-release-url": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/new-github-release-url/-/new-github-release-url-1.0.0.tgz", + "integrity": "sha512-dle7yf655IMjyFUqn6Nxkb18r4AOAkzRcgcZv6WZ0IqrOH4QCEZ8Sm6I7XX21zvHdBeeMeTkhR9qT2Z0EJDx6A==", + "dev": true, + "dependencies": { + "type-fest": "^0.4.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/new-github-release-url/node_modules/type-fest": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.4.1.tgz", + "integrity": "sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/node.extend": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node.extend/-/node.extend-2.0.2.tgz", + "integrity": "sha512-pDT4Dchl94/+kkgdwyS2PauDFjZG0Hk0IcHIB+LkW27HLDtdoeMxHTxZh39DYbPP8UflWXWj9JcdDozF+YDOpQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3", + "is": "^3.2.1" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "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-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/np": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/np/-/np-7.6.2.tgz", + "integrity": "sha512-gExmKGKixh7ITc4Q+Lv7nfCby0CVKvzri9zN8970oKD8976T4L5dw8QWUtMcXcIjhFF6h5lbvztao/NurDbmxQ==", + "dev": true, + "dependencies": { + "@samverschueren/stream-to-observable": "^0.3.1", + "any-observable": "^0.5.1", + "async-exit-hook": "^2.0.1", + "chalk": "^4.1.0", + "cosmiconfig": "^7.0.0", + "del": "^6.0.0", + "escape-goat": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "execa": "^5.0.0", + "github-url-from-git": "^1.5.0", + "has-yarn": "^2.1.0", + "hosted-git-info": "^3.0.7", + "ignore-walk": "^3.0.3", + "import-local": "^3.0.2", + "inquirer": "^7.3.3", + "is-installed-globally": "^0.3.2", + "is-interactive": "^1.0.0", + "is-scoped": "^2.1.0", + "issue-regex": "^3.1.0", + "listr": "^0.14.3", + "listr-input": "^0.2.1", + "log-symbols": "^4.0.0", + "meow": "^8.1.0", + "minimatch": "^3.0.4", + "new-github-release-url": "^1.0.0", + "npm-name": "^6.0.1", + "onetime": "^5.1.2", + "open": "^7.3.0", + "ow": "^0.21.0", + "p-memoize": "^4.0.1", + "p-timeout": "^4.1.0", + "pkg-dir": "^5.0.0", + "read-pkg-up": "^7.0.1", + "rxjs": "^6.6.3", + "semver": "^7.3.4", + "split": "^1.0.1", + "symbol-observable": "^3.0.0", + "terminal-link": "^2.1.1", + "update-notifier": "^5.0.1" + }, + "bin": { + "np": "source/cli.js" + }, + "engines": { + "git": ">=2.11.0", + "node": ">=10", + "npm": ">=6.8.0", + "yarn": ">=1.7.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/np?sponsor=1" + } + }, + "node_modules/np/node_modules/hosted-git-info": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.8.tgz", + "integrity": "sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/np/node_modules/pkg-dir": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", + "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", + "dev": true, + "dependencies": { + "find-up": "^5.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-name": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/npm-name/-/npm-name-6.0.1.tgz", + "integrity": "sha512-fhKRvUAxaYzMEUZim4mXWyfFbVS+M1CbrCLdAo3txWzrctxKka/h+KaBW0O9Cz5uOM00Nldn2JLWhuwnyW3SUw==", + "dev": true, + "dependencies": { + "got": "^10.6.0", + "is-scoped": "^2.1.0", + "is-url-superb": "^4.0.0", + "lodash.zip": "^4.2.0", + "org-regex": "^1.0.0", + "p-map": "^3.0.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.1.0", + "validate-npm-package-name": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-name/node_modules/@sindresorhus/is": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-2.1.1.tgz", + "integrity": "sha512-/aPsuoj/1Dw/kzhkgz+ES6TxG0zfTMGLwuK2ZG00k/iJzYHTLCE8mVU8EPqEOp/lmxPoq1C1C9RYToRKb2KEfg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/npm-name/node_modules/cacheable-lookup": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-2.0.1.tgz", + "integrity": "sha512-EMMbsiOTcdngM/K6gV/OxF2x0t07+vMOWxZNSCRQMjO2MY2nhZQ6OYhOOpyQrbhqsgtvKGI7hcq6xjnA92USjg==", + "dev": true, + "dependencies": { + "@types/keyv": "^3.1.1", + "keyv": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-name/node_modules/decompress-response": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-5.0.0.tgz", + "integrity": "sha512-TLZWWybuxWgoW7Lykv+gq9xvzOsUjQ9tF09Tj6NSTYGMTCHNXzrPnD6Hi+TgZq19PyTAGH4Ll/NIM/eTGglnMw==", + "dev": true, + "dependencies": { + "mimic-response": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-name/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/npm-name/node_modules/got": { + "version": "10.7.0", + "resolved": "https://registry.npmjs.org/got/-/got-10.7.0.tgz", + "integrity": "sha512-aWTDeNw9g+XqEZNcTjMMZSy7B7yE9toWOFYip7ofFTLleJhvZwUxxTxkTpKvF+p1SAA4VHmuEy7PiHTHyq8tJg==", + "dev": true, + "dependencies": { + "@sindresorhus/is": "^2.0.0", + "@szmarczak/http-timer": "^4.0.0", + "@types/cacheable-request": "^6.0.1", + "cacheable-lookup": "^2.0.0", + "cacheable-request": "^7.0.1", + "decompress-response": "^5.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^5.0.0", + "lowercase-keys": "^2.0.0", + "mimic-response": "^2.1.0", + "p-cancelable": "^2.0.0", + "p-event": "^4.0.0", + "responselike": "^2.0.0", + "to-readable-stream": "^2.0.0", + "type-fest": "^0.10.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/npm-name/node_modules/mimic-response": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-name/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/npm-name/node_modules/type-fest": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.10.0.tgz", + "integrity": "sha512-EUV9jo4sffrwlg8s0zDhP0T2WD3pru5Xi0+HTE3zTUmBaZNhfkite9PdSJwdXLwPVW0jnAHT56pZHIOYckPEiw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/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, + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/octonode": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/octonode/-/octonode-0.10.2.tgz", + "integrity": "sha512-lxKJxAvrw3BuM0Wu3A/TRyFkYxMFWbMm8p7fDO3EoG9KDgOy53d91bjlGR1mmNk1EoF5LjGBx7BmIB+PfmMKLQ==", + "dev": true, + "dependencies": { + "bluebird": "^3.5.0", + "deep-extend": "^0.6.0", + "randomstring": "^1.1.5", + "request": "^2.72.0" + }, + "engines": { + "node": ">0.4.11" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/openapi-schema-validator": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/openapi-schema-validator/-/openapi-schema-validator-3.0.3.tgz", + "integrity": "sha512-KKpeNEvAmpy6B2JCfyrM4yWjL6vggDCVbBoR8Yfkj0Jltc6PCW+dBbcg+1yrTCuDv80qBQJ6w0ejA71DlOFegA==", + "dev": true, + "dependencies": { + "ajv": "^6.5.2", + "lodash.merge": "^4.6.1", + "openapi-types": "1.3.4", + "swagger-schema-official": "2.0.0-bab6bed" + } + }, + "node_modules/openapi-schema-validator/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/openapi-schema-validator/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/openapi-types": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-1.3.4.tgz", + "integrity": "sha512-h8rADpW3k/wepLdERKF0VKMAPdoFYNQCLGPmc/f8sgQ2dxUy+7sY4WAX2XDUDjhKTjbJVbxxofLkzy7f1/tE4g==", + "dev": true + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/org-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/org-regex/-/org-regex-1.0.0.tgz", + "integrity": "sha512-7bqkxkEJwzJQUAlyYniqEZ3Ilzjh0yoa62c7gL6Ijxj5bEpPL+8IE1Z0PFj0ywjjXQcdrwR51g9MIcLezR0hKQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ow": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/ow/-/ow-0.21.0.tgz", + "integrity": "sha512-dlsoDe39g7mhdsdrC1R/YwjT7yjVqE3svWwOlMGvN690waBkgEZBmKBdkmKvSt5/wZ6E0Jn/nIesPqMZOpPKqw==", + "dev": true, + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "callsites": "^3.1.0", + "dot-prop": "^6.0.1", + "lodash.isequal": "^4.5.0", + "type-fest": "^0.20.2", + "vali-date": "^1.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ow/node_modules/dot-prop": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "dev": true, + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-event": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz", + "integrity": "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==", + "dev": true, + "dependencies": { + "p-timeout": "^3.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-event/node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "dev": true, + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-memoize": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/p-memoize/-/p-memoize-4.0.4.tgz", + "integrity": "sha512-ijdh0DP4Mk6J4FXlOM6vPPoCjPytcEseW8p/k5SDTSSfGV3E9bpt9Yzfifvzp6iohIieoLTkXRb32OWV0fB2Lw==", + "dev": true, + "dependencies": { + "map-age-cleaner": "^0.1.3", + "mimic-fn": "^3.0.0", + "p-settle": "^4.1.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/p-memoize?sponsor=1" + } + }, + "node_modules/p-memoize/node_modules/mimic-fn": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", + "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-reflect": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-reflect/-/p-reflect-2.1.0.tgz", + "integrity": "sha512-paHV8NUz8zDHu5lhr/ngGWQiW067DK/+IbJ+RfZ4k+s8y4EKyYCz8pGYWjxCg35eHztpJAt+NUgvN4L+GCbPlg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-settle": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/p-settle/-/p-settle-4.1.1.tgz", + "integrity": "sha512-6THGh13mt3gypcNMm0ADqVNCcYa3BK6DWsuJWFCuEKP1rpY+OKGp7gaZwVmLspmic01+fsg/fN57MfvDzZ/PuQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.2", + "p-reflect": "^2.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-settle/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-4.1.0.tgz", + "integrity": "sha512-+/wmHtzJuWii1sXn3HCuH/FTwGhrp4tmJTxSKJbfS+vkipci6osxXM5mY0jUiRzWKMTgUT8l7HFbeSwZAynqHw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "dev": true, + "dependencies": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json/node_modules/@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json/node_modules/@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dev": true, + "dependencies": { + "defer-to-connect": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json/node_modules/cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dev": true, + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json/node_modules/cacheable-request/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/package-json/node_modules/decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", + "dev": true, + "dependencies": { + "mimic-response": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/package-json/node_modules/defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", + "dev": true + }, + "node_modules/package-json/node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json/node_modules/got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dev": true, + "dependencies": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/package-json/node_modules/got/node_modules/lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/package-json/node_modules/json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==", + "dev": true + }, + "node_modules/package-json/node_modules/keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.0" + } + }, + "node_modules/package-json/node_modules/normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json/node_modules/p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json/node_modules/responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", + "dev": true, + "dependencies": { + "lowercase-keys": "^1.0.0" + } + }, + "node_modules/package-json/node_modules/responselike/node_modules/lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/package-json/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/package-json/node_modules/to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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": "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/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "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-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/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/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/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/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/prettier": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/pretty-format": { + "version": "29.0.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.0.3.tgz", + "integrity": "sha512-cHudsvQr1K5vNVLbvYF/nv3Qy/F/BcEKxGuIeMiVMRHxPOO1RxXooP8g/ZrwAp7Dx+KdMZoOc7NxLHhMrP2f9Q==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.0.0", + "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/pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/printable-characters": { + "version": "1.0.42", + "resolved": "https://registry.npmjs.org/printable-characters/-/printable-characters-1.0.42.tgz", + "integrity": "sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==", + "dev": true + }, + "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/pupa": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "dev": true, + "dependencies": { + "escape-goat": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pupa/node_modules/escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "dev": true, + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/randombytes": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.3.tgz", + "integrity": "sha512-lDVjxQQFoCG1jcrP06LNo2lbWp4QTShEXnhActFBwYuHprllQV6VUpwreApsYqCgD+N1mHoqJ/BI/4eV4R2GYg==", + "dev": true + }, + "node_modules/randomstring": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/randomstring/-/randomstring-1.2.2.tgz", + "integrity": "sha512-9FByiB8guWZLbE+akdQiWE3I1I6w7Vn5El4o4y7o5bWQ6DWPcEOp+aLG7Jezc8BVRKKpgJd2ppRX0jnKu1YCfg==", + "dev": true, + "dependencies": { + "array-uniq": "1.0.2", + "randombytes": "2.0.3" + }, + "bin": { + "randomstring": "bin/randomstring" + }, + "engines": { + "node": "*" + } + }, + "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/rc/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": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/read-pkg/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/readable-stream": { + "version": "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/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/regexp-tree": { + "version": "0.1.24", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.24.tgz", + "integrity": "sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw==", + "dev": true, + "bin": { + "regexp-tree": "bin/regexp-tree" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/registry-auth-token": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz", + "integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==", + "dev": true, + "dependencies": { + "rc": "1.2.8" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "dev": true, + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=8" + } + }, + "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/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.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-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-global": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", + "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", + "dev": true, + "dependencies": { + "global-dirs": "^0.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-global/node_modules/global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", + "dev": true, + "dependencies": { + "ini": "^1.3.4" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dev": true, + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/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-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "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/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "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": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", + "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==", + "dev": true, + "dependencies": { + "regexp-tree": "~0.1.1" + } + }, + "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/scoped-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/scoped-regex/-/scoped-regex-2.1.0.tgz", + "integrity": "sha512-g3WxHrqSWCZHGHlSrF51VXFdjImhwvH8ZO/pryFH56Qi0cDsZfylQa/t0jCzVQFNbNvM00HfHjkDPEuarKDSWQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "dev": true, + "dependencies": { + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/semver-diff/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "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/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/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/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "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/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.12", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", + "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", + "dev": true + }, + "node_modules/split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, + "dependencies": { + "through": "2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "dev": true, + "dependencies": { + "readable-stream": "^3.0.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "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/stacktracey": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/stacktracey/-/stacktracey-2.1.8.tgz", + "integrity": "sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==", + "dev": true, + "dependencies": { + "as-table": "^1.0.36", + "get-source": "^2.0.12" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "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/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-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/swagger-parser": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/swagger-parser/-/swagger-parser-10.0.3.tgz", + "integrity": "sha512-nF7oMeL4KypldrQhac8RyHerJeGPD1p2xDh900GPvc+Nk7nWP6jX2FcC7WmkinMoAmoO774+AFXcWsW8gMWEIg==", + "dev": true, + "dependencies": { + "@apidevtools/swagger-parser": "10.0.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/swagger-parser/node_modules/@apidevtools/swagger-parser": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/@apidevtools/swagger-parser/-/swagger-parser-10.0.3.tgz", + "integrity": "sha512-sNiLY51vZOmSPFZA5TF35KZ2HbgYklQnTSDnkghamzLb3EkNtcQnrBQEj5AOCxHpTtXpqMCRM1CrmV2rG6nw4g==", + "dev": true, + "dependencies": { + "@apidevtools/json-schema-ref-parser": "^9.0.6", + "@apidevtools/openapi-schemas": "^2.0.4", + "@apidevtools/swagger-methods": "^3.0.2", + "@jsdevtools/ono": "^7.1.3", + "call-me-maybe": "^1.0.1", + "z-schema": "^5.0.1" + }, + "peerDependencies": { + "openapi-types": ">=7" + } + }, + "node_modules/swagger-parser/node_modules/openapi-types": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.0.2.tgz", + "integrity": "sha512-GuTo7FyZjOIWVhIhQSWJVaws6A82sWIGyQogxxYBYKZ0NBdyP2CYSIgOwFfSB+UVoPExk/YzFpyYitHS8KVZtA==", + "dev": true, + "peer": true + }, + "node_modules/swagger-schema-official": { + "version": "2.0.0-bab6bed", + "resolved": "https://registry.npmjs.org/swagger-schema-official/-/swagger-schema-official-2.0.0-bab6bed.tgz", + "integrity": "sha512-rCC0NWGKr/IJhtRuPq/t37qvZHI/mH4I4sxflVM+qgVe5Z2uOCivzWaVbuioJaB61kvm5UvB7b49E+oBY0M8jA==", + "dev": true + }, + "node_modules/symbol-observable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-3.0.0.tgz", + "integrity": "sha512-6tDOXSHiVjuCaasQSWTmHUWn4PuG7qa3+1WT031yTc/swT7+rLiw3GOrFxaH1E3lLP09dH3bVuVDf2gK5rxG3Q==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/text-extensions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", + "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "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/through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dev": true, + "dependencies": { + "readable-stream": "3" + } + }, + "node_modules/time-span": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/time-span/-/time-span-4.0.0.tgz", + "integrity": "sha512-MyqZCTGLDZ77u4k+jqg4UlrzPTPZ49NDlaekU6uuFaJLzPIN1woaRXCbGeqOfxwc3Y37ZROGAJ614Rdv7Olt+g==", + "dev": true, + "dependencies": { + "convert-hrtime": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/to-readable-stream": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-2.1.0.tgz", + "integrity": "sha512-o3Qa6DGg1CEXshSdvWNX2sN4QHqg03SPq7U6jPXRahlQdl5dK8oXjkU/2/sGrnOZKeGV1zLSO8qPwyKklPPE7w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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/traverse": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", + "integrity": "sha512-kdf4JKs8lbARxWdp7RKdNzoJBhGUcIalSYibuGyHJbmk40pOysQ0+QPvlkCOICOivDWU2IJo2rkrxyTK2AH4fw==", + "dev": true + }, + "node_modules/trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "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/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/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/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.3.tgz", + "integrity": "sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dev": true, + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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/update-notifier": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", + "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", + "dev": true, + "dependencies": { + "boxen": "^5.0.0", + "chalk": "^4.1.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.4.0", + "is-npm": "^5.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.1.0", + "pupa": "^2.1.1", + "semver": "^7.3.4", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/global-dirs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", + "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", + "dev": true, + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/update-notifier/node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dev": true, + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", + "dev": true, + "dependencies": { + "prepend-http": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/vali-date": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", + "integrity": "sha512-sgECfZthyaCKW10N0fm27cg8HYTFK5qMWgypqkXMQ4Wbl/zZKx7xZICgcoxIIE+WFAP/MBL2EFwC/YvLxw3Zeg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/valid-url": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz", + "integrity": "sha512-QQDsV8OnSf5Uc30CKSwG9lnhMPe6exHtTXLRYX8uMwKENy640pU+2BgBL0LRbDh/eYRahNCS7aewCx0wf3NYVA==", + "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/validator": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "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/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, + "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/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dev": true, + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "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/xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", + "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", + "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.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs/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/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "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" + } + }, + "node_modules/youch": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/youch/-/youch-3.2.2.tgz", + "integrity": "sha512-+xhTK8sY9qV3nLbWVaOUFZPdlQ3wrMKiu3dKqKkAkLaYzzkYmpWY+v+eQIAfbPu7TZhS1G5FhEV++sl8fhuT4w==", + "dev": true, + "dependencies": { + "cookie": "^0.5.0", + "mustache": "^4.2.0", + "stacktracey": "^2.1.8" + } + }, + "node_modules/youch-terminal": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/youch-terminal/-/youch-terminal-2.1.5.tgz", + "integrity": "sha512-ObQ2GeG0LnIGiOAq0rLaEdCC8Z+fHlMFcJqsQcLBWo36zlj2GViS7pOKjRGdJ4pJl4ofZmU77O7gwd6lId67PA==", + "dev": true, + "dependencies": { + "kleur": "^4.1.5" + } + }, + "node_modules/z-schema": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.4.tgz", + "integrity": "sha512-gm/lx3hDzJNcLwseIeQVm1UcwhWIKpSB4NqH89pTBtFns4k/HDHudsICtvG05Bvw/Mv3jMyk700y5dadueLHdA==", + "dev": true, + "dependencies": { + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.7.0" + }, + "bin": { + "z-schema": "bin/z-schema" + }, + "engines": { + "node": ">=8.0.0" + }, + "optionalDependencies": { + "commander": "^2.20.3" + } + }, + "node_modules/z-schema/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, + "optional": true + } + }, + "dependencies": { + "@apidevtools/json-schema-ref-parser": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz", + "integrity": "sha512-GBD2Le9w2+lVFoc4vswGI/TjkNIZSVp7+9xPf+X3uidBfWnAeUWmquteSyt0+VCrhNMWj/FTABISQrD3Z/YA+w==", + "dev": true, + "requires": { + "@jsdevtools/ono": "^7.1.3", + "@types/json-schema": "^7.0.6", + "call-me-maybe": "^1.0.1", + "js-yaml": "^4.1.0" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "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" + } + } + } + }, + "@apidevtools/openapi-schemas": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@apidevtools/openapi-schemas/-/openapi-schemas-2.1.0.tgz", + "integrity": "sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==", + "dev": true + }, + "@apidevtools/swagger-methods": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@apidevtools/swagger-methods/-/swagger-methods-3.0.2.tgz", + "integrity": "sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==", + "dev": true + }, + "@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "requires": { + "@babel/highlight": "^7.18.6" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true + }, + "@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "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" + } + } + } + }, + "@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 + }, + "@commitlint/cli": { + "version": "17.1.2", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-17.1.2.tgz", + "integrity": "sha512-h/4Hlka3bvCLbnxf0Er2ri5A44VMlbMSkdTRp8Adv2tRiklSTRIoPGs7OEXDv3EoDs2AAzILiPookgM4Gi7LOw==", + "dev": true, + "requires": { + "@commitlint/format": "^17.0.0", + "@commitlint/lint": "^17.1.0", + "@commitlint/load": "^17.1.2", + "@commitlint/read": "^17.1.0", + "@commitlint/types": "^17.0.0", + "execa": "^5.0.0", + "lodash": "^4.17.19", + "resolve-from": "5.0.0", + "resolve-global": "1.0.0", + "yargs": "^17.0.0" + } + }, + "@commitlint/config-conventional": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-17.1.0.tgz", + "integrity": "sha512-WU2p0c9/jLi8k2q2YrDV96Y8XVswQOceIQ/wyJvQxawJSCasLdRB3kUIYdNjOCJsxkpoUlV/b90ZPxp1MYZDiA==", + "dev": true, + "requires": { + "conventional-changelog-conventionalcommits": "^5.0.0" + } + }, + "@commitlint/config-validator": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-17.1.0.tgz", + "integrity": "sha512-Q1rRRSU09ngrTgeTXHq6ePJs2KrI+axPTgkNYDWSJIuS1Op4w3J30vUfSXjwn5YEJHklK3fSqWNHmBhmTR7Vdg==", + "dev": true, + "requires": { + "@commitlint/types": "^17.0.0", + "ajv": "^8.11.0" + } + }, + "@commitlint/ensure": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-17.0.0.tgz", + "integrity": "sha512-M2hkJnNXvEni59S0QPOnqCKIK52G1XyXBGw51mvh7OXDudCmZ9tZiIPpU882p475Mhx48Ien1MbWjCP1zlyC0A==", + "dev": true, + "requires": { + "@commitlint/types": "^17.0.0", + "lodash": "^4.17.19" + } + }, + "@commitlint/execute-rule": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-17.0.0.tgz", + "integrity": "sha512-nVjL/w/zuqjCqSJm8UfpNaw66V9WzuJtQvEnCrK4jDw6qKTmZB+1JQ8m6BQVZbNBcwfYdDNKnhIhqI0Rk7lgpQ==", + "dev": true + }, + "@commitlint/format": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-17.0.0.tgz", + "integrity": "sha512-MZzJv7rBp/r6ZQJDEodoZvdRM0vXu1PfQvMTNWFb8jFraxnISMTnPBWMMjr2G/puoMashwaNM//fl7j8gGV5lA==", + "dev": true, + "requires": { + "@commitlint/types": "^17.0.0", + "chalk": "^4.1.0" + } + }, + "@commitlint/is-ignored": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-17.1.0.tgz", + "integrity": "sha512-JITWKDMHhIh8IpdIbcbuH9rEQJty1ZWelgjleTFrVRAcEwN/sPzk1aVUXRIZNXMJWbZj8vtXRJnFihrml8uECQ==", + "dev": true, + "requires": { + "@commitlint/types": "^17.0.0", + "semver": "7.3.7" + } + }, + "@commitlint/lint": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-17.1.0.tgz", + "integrity": "sha512-ltpqM2ogt/+SDhUaScFo0MdscncEF96lvQTPMM/VTTWlw7sTGLLWkOOppsee2MN/uLNNWjQ7kqkd4h6JqoM9AQ==", + "dev": true, + "requires": { + "@commitlint/is-ignored": "^17.1.0", + "@commitlint/parse": "^17.0.0", + "@commitlint/rules": "^17.0.0", + "@commitlint/types": "^17.0.0" + } + }, + "@commitlint/load": { + "version": "17.1.2", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-17.1.2.tgz", + "integrity": "sha512-sk2p/jFYAWLChIfOIp/MGSIn/WzZ0vkc3afw+l4X8hGEYkvDe4gQUUAVxjl/6xMRn0HgnSLMZ04xXh5pkTsmgg==", + "dev": true, + "requires": { + "@commitlint/config-validator": "^17.1.0", + "@commitlint/execute-rule": "^17.0.0", + "@commitlint/resolve-extends": "^17.1.0", + "@commitlint/types": "^17.0.0", + "@types/node": "^14.0.0", + "chalk": "^4.1.0", + "cosmiconfig": "^7.0.0", + "cosmiconfig-typescript-loader": "^4.0.0", + "lodash": "^4.17.19", + "resolve-from": "^5.0.0", + "ts-node": "^10.8.1", + "typescript": "^4.6.4" + }, + "dependencies": { + "@types/node": { + "version": "14.18.29", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.29.tgz", + "integrity": "sha512-LhF+9fbIX4iPzhsRLpK5H7iPdvW8L4IwGciXQIOEcuF62+9nw/VQVsOViAOOGxY3OlOKGLFv0sWwJXdwQeTn6A==", + "dev": true + } + } + }, + "@commitlint/message": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-17.0.0.tgz", + "integrity": "sha512-LpcwYtN+lBlfZijHUdVr8aNFTVpHjuHI52BnfoV01TF7iSLnia0jttzpLkrLmI8HNQz6Vhr9UrxDWtKZiMGsBw==", + "dev": true + }, + "@commitlint/parse": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-17.0.0.tgz", + "integrity": "sha512-cKcpfTIQYDG1ywTIr5AG0RAiLBr1gudqEsmAGCTtj8ffDChbBRxm6xXs2nv7GvmJN7msOt7vOKleLvcMmRa1+A==", + "dev": true, + "requires": { + "@commitlint/types": "^17.0.0", + "conventional-changelog-angular": "^5.0.11", + "conventional-commits-parser": "^3.2.2" + } + }, + "@commitlint/read": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-17.1.0.tgz", + "integrity": "sha512-73BoFNBA/3Ozo2JQvGsE0J8SdrJAWGfZQRSHqvKaqgmY042Su4gXQLqvAzgr55S9DI1l9TiU/5WDuh8IE86d/g==", + "dev": true, + "requires": { + "@commitlint/top-level": "^17.0.0", + "@commitlint/types": "^17.0.0", + "fs-extra": "^10.0.0", + "git-raw-commits": "^2.0.0", + "minimist": "^1.2.6" + } + }, + "@commitlint/resolve-extends": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-17.1.0.tgz", + "integrity": "sha512-jqKm00LJ59T0O8O4bH4oMa4XyJVEOK4GzH8Qye9XKji+Q1FxhZznxMV/bDLyYkzbTodBt9sL0WLql8wMtRTbqQ==", + "dev": true, + "requires": { + "@commitlint/config-validator": "^17.1.0", + "@commitlint/types": "^17.0.0", + "import-fresh": "^3.0.0", + "lodash": "^4.17.19", + "resolve-from": "^5.0.0", + "resolve-global": "^1.0.0" + } + }, + "@commitlint/rules": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-17.0.0.tgz", + "integrity": "sha512-45nIy3dERKXWpnwX9HeBzK5SepHwlDxdGBfmedXhL30fmFCkJOdxHyOJsh0+B0RaVsLGT01NELpfzJUmtpDwdQ==", + "dev": true, + "requires": { + "@commitlint/ensure": "^17.0.0", + "@commitlint/message": "^17.0.0", + "@commitlint/to-lines": "^17.0.0", + "@commitlint/types": "^17.0.0", + "execa": "^5.0.0" + } + }, + "@commitlint/to-lines": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-17.0.0.tgz", + "integrity": "sha512-nEi4YEz04Rf2upFbpnEorG8iymyH7o9jYIVFBG1QdzebbIFET3ir+8kQvCZuBE5pKCtViE4XBUsRZz139uFrRQ==", + "dev": true + }, + "@commitlint/top-level": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-17.0.0.tgz", + "integrity": "sha512-dZrEP1PBJvodNWYPOYiLWf6XZergdksKQaT6i1KSROLdjf5Ai0brLOv5/P+CPxBeoj3vBxK4Ax8H1Pg9t7sHIQ==", + "dev": true, + "requires": { + "find-up": "^5.0.0" + } + }, + "@commitlint/types": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-17.0.0.tgz", + "integrity": "sha512-hBAw6U+SkAT5h47zDMeOu3HSiD0SODw4Aq7rRNh1ceUmL7GyLKYhPbUvlRWqZ65XjBLPHZhFyQlRaPNz8qvUyQ==", + "dev": true, + "requires": { + "chalk": "^4.1.0" + } + }, + "@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "0.3.9" + } + }, + "@eslint/eslintrc": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.2.tgz", + "integrity": "sha512-AXYd23w1S/bv3fTs3Lz0vjiYemS08jWkI3hYyS9I1ry+0f+Yjs1wm+sU0BS8qDOPrBIkp4qHYC16I8uVtpLajQ==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.4.0", + "globals": "^13.15.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": { + "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" + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "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 + } + } + }, + "@financial-times/origami-service-makefile": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@financial-times/origami-service-makefile/-/origami-service-makefile-7.0.3.tgz", + "integrity": "sha512-aKe65sZ3XgZ/0Sm0MDLbGrcO3G4DRv/bVW4Gpmw68cRZV9IBE7h/pwfR3Rs7njNSZMFkjS4rPG/YySv9brQByA==", + "dev": true + }, + "@humanwhocodes/config-array": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", + "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + } + }, + "@humanwhocodes/gitignore-to-minimatch": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", + "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", + "dev": true + }, + "@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": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "@japa/assert": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/@japa/assert/-/assert-1.3.6.tgz", + "integrity": "sha512-aFyCRdLAgYR4P45CayMY7MlzHKLp+oKr2fGj34jObWqmNZOWgFJuEcwBGoqbr+ApL/9Qhkcq0hoFL2FyfFJ7Jw==", + "dev": true, + "requires": { + "@types/chai": "^4.3.3", + "api-contract-validator": "^2.2.8", + "chai": "^4.3.6", + "macroable": "^7.0.1" + } + }, + "@japa/base-reporter": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@japa/base-reporter/-/base-reporter-1.0.2.tgz", + "integrity": "sha512-ONuLhtQ2UKAqooxm0VjILtZ+r3FvIuIjIh66qyMrfZZUE9Ht+dVxjmnMKRo1MgLnP9D6Rh98JUJEVaiJfgEEKQ==", + "dev": true, + "requires": { + "@japa/errors-printer": "^1.3.10", + "@poppinss/cliui": "^3.0.2", + "ms": "^2.1.3" + }, + "dependencies": { + "@japa/errors-printer": { + "version": "1.3.10", + "resolved": "https://registry.npmjs.org/@japa/errors-printer/-/errors-printer-1.3.10.tgz", + "integrity": "sha512-tUTHnDiGXnhKHZry63sSb4wS3bs2wxvrUOofDzYKilmAY0nUGCIQwpkpSaqVmC3l0xqk29EhBZJewmDCrUBIPw==", + "dev": true, + "requires": { + "@poppinss/cliui": "^3.0.2", + "jest-diff": "^29.0.1", + "youch": "^3.2.1", + "youch-terminal": "^2.1.5" + } + } + } + }, + "@japa/core": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@japa/core/-/core-7.2.0.tgz", + "integrity": "sha512-CnF1NoNgQWH0UALJQ+YNJjXMXdFYb+wlGdppFptsvn2FmjejWFtXeuPCACl4hX4vQahfPKEojSIRKL4iTML6FQ==", + "dev": true, + "requires": { + "@poppinss/hooks": "^6.0.2-0", + "async-retry": "^1.3.3", + "emittery": "^0.13.1", + "macroable": "^7.0.1", + "time-span": "^4.0.0" + } + }, + "@japa/errors-printer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@japa/errors-printer/-/errors-printer-2.0.1.tgz", + "integrity": "sha512-6ngqHgvgDzVVz2zMd+vCziAfVoAyDxOXvgvHNNVAddAtbmd62eyFexG0hfTUZnkY8EthVG7o8lv6XpcsJL1kxA==", + "dev": true, + "requires": { + "@poppinss/cliui": "^3.0.2", + "jest-diff": "^29.0.2", + "youch": "^3.2.2", + "youch-terminal": "^2.1.5" + } + }, + "@japa/run-failed-tests": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@japa/run-failed-tests/-/run-failed-tests-1.1.0.tgz", + "integrity": "sha512-kwD/esM3Mc+4eslhAN31e5r/fCMHi9kNlg4FvetgdmS6bR9XTlTR3Cy2fJ4LwMYhNcLFRcBEw9x8d0Nobq9ryg==", + "dev": true, + "requires": { + "@poppinss/cliui": "^3.0.2", + "find-cache-dir": "^3.3.2", + "fs-extra": "^10.1.0" + } + }, + "@japa/runner": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@japa/runner/-/runner-2.2.1.tgz", + "integrity": "sha512-jP7soKxHm791YzVelwQOZQ1WItgQvbFo0hR0iwULcPqYs/Vh2p70ojPwjYgQ0HbfxyKAEUOjGJXTePRxF2JapQ==", + "dev": true, + "requires": { + "@japa/core": "^7.2.0", + "@japa/errors-printer": "^2.0.1", + "@poppinss/cliui": "^3.0.2", + "@poppinss/hooks": "^6.0.2-0", + "fast-glob": "^3.2.12", + "getopts": "^2.3.0", + "inclusion": "^1.0.1" + } + }, + "@japa/spec-reporter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@japa/spec-reporter/-/spec-reporter-1.3.0.tgz", + "integrity": "sha512-YTl51H0zAHLJTpTajbRjplRaXqSWUpQaJvtWWrjVGPYVPEfB3RrRHFsRXwpTZI/IZN+/eaZ+ZX/ucZfmFrzY+g==", + "dev": true, + "requires": { + "@japa/base-reporter": "^1.0.2", + "@japa/errors-printer": "^2.0.1", + "@poppinss/cliui": "^3.0.2", + "ms": "^2.1.3" + } + }, + "@jest/schemas": { + "version": "29.0.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", + "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", + "dev": true, + "requires": { + "@sinclair/typebox": "^0.24.1" + } + }, + "@jest/types": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", + "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + }, + "dependencies": { + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@jsdevtools/ono": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", + "dev": true + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@poppinss/cliui": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@poppinss/cliui/-/cliui-3.0.2.tgz", + "integrity": "sha512-nrAosoQy0ex3wSw3VuigLs3XCsxDsnNvx4ZL4ZvdZlygrChMUKPKnlxctQk13IyUHaH4F/wvaHnfWg/inhA36w==", + "dev": true, + "requires": { + "@poppinss/colors": "^3.0.2", + "cli-boxes": "^3.0.0", + "cli-table3": "^0.6.1", + "color-support": "^1.1.3", + "log-update": "^4.0.0", + "pretty-hrtime": "^1.0.3", + "string-width": "^4.2.2" + } + }, + "@poppinss/colors": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@poppinss/colors/-/colors-3.0.2.tgz", + "integrity": "sha512-kgIiDPKUV0IaNtzLKricxd3mMWepqCbgh2Mb0M8C5zyS1bJ0K86s6dMu9xEKtF2XksqyE0qV4ANtMnTCMjQgvA==", + "dev": true, + "requires": { + "color-support": "^1.1.3", + "kleur": "^4.1.4" + } + }, + "@poppinss/hooks": { + "version": "6.0.2-0", + "resolved": "https://registry.npmjs.org/@poppinss/hooks/-/hooks-6.0.2-0.tgz", + "integrity": "sha512-mG0hnQlxgflvxyM6t/XO8z/FwotsYRXPhtLZ3cz3iyk4t8xaNtOihSANBcvqdkxZCtGBvotNIf/GnES9hvlfSQ==", + "dev": true + }, + "@samverschueren/stream-to-observable": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.1.tgz", + "integrity": "sha512-c/qwwcHyafOQuVQJj0IlBjf5yYgBI7YPJ77k4fOJYesb41jio65eaJODRUmfYKhTOFBrIZ66kgvGPlNbjuoRdQ==", + "dev": true, + "requires": { + "any-observable": "^0.3.0" + }, + "dependencies": { + "any-observable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.3.0.tgz", + "integrity": "sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==", + "dev": true + } + } + }, + "@sinclair/typebox": { + "version": "0.24.41", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.41.tgz", + "integrity": "sha512-TJCgQurls4FipFvHeC+gfAzb+GGstL0TDwYJKQVtTeSvJIznWzP7g3bAd5gEBlr8+bIxqnWS9VGVWREDhmE8jA==", + "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 + }, + "@swc/core": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.1.tgz", + "integrity": "sha512-ztB5N63UGLIOM60Vg+deHVigEnDAEAttiTQk4T91/i11SoOO65P9z8Bey01XFTxF0Alc2OJxkt8TBcq+n5mMYQ==", + "dev": true, + "requires": { + "@swc/core-android-arm-eabi": "1.3.1", + "@swc/core-android-arm64": "1.3.1", + "@swc/core-darwin-arm64": "1.3.1", + "@swc/core-darwin-x64": "1.3.1", + "@swc/core-freebsd-x64": "1.3.1", + "@swc/core-linux-arm-gnueabihf": "1.3.1", + "@swc/core-linux-arm64-gnu": "1.3.1", + "@swc/core-linux-arm64-musl": "1.3.1", + "@swc/core-linux-x64-gnu": "1.3.1", + "@swc/core-linux-x64-musl": "1.3.1", + "@swc/core-win32-arm64-msvc": "1.3.1", + "@swc/core-win32-ia32-msvc": "1.3.1", + "@swc/core-win32-x64-msvc": "1.3.1" + } + }, + "@swc/core-android-arm-eabi": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@swc/core-android-arm-eabi/-/core-android-arm-eabi-1.3.1.tgz", + "integrity": "sha512-fZ6nTalHWYn1OHfU87yF8s24edgQ4COHydLlPcpU/pwSH90hCwy/fgna5PpUBw0rfzGBttX0/0yMorC7ZSar4Q==", + "dev": true, + "optional": true, + "requires": { + "@swc/wasm": "1.2.122" + } + }, + "@swc/core-android-arm64": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@swc/core-android-arm64/-/core-android-arm64-1.3.1.tgz", + "integrity": "sha512-aDrV22ajQ4NYOwxEWvipPpdhHaLqU5W1rxRap5N1KSetzwGIk6NMd31o6Jotoxf7tB8qtLlo5VyNok4adJRVYg==", + "dev": true, + "optional": true, + "requires": { + "@swc/wasm": "1.2.130" + }, + "dependencies": { + "@swc/wasm": { + "version": "1.2.130", + "resolved": "https://registry.npmjs.org/@swc/wasm/-/wasm-1.2.130.tgz", + "integrity": "sha512-rNcJsBxS70+pv8YUWwf5fRlWX6JoY/HJc25HD/F8m6Kv7XhJdqPPMhyX6TKkUBPAG7TWlZYoxa+rHAjPy4Cj3Q==", + "dev": true, + "optional": true + } + } + }, + "@swc/core-darwin-arm64": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.1.tgz", + "integrity": "sha512-yom8pqaDhsncQaqp+NdXk1YEtWoqPrfsyKJP3RriTbUjXS/20q/WNfkkJjxUuaFZC6PH/MuvrLzD6Z6ZuZvLaA==", + "dev": true, + "optional": true + }, + "@swc/core-darwin-x64": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.1.tgz", + "integrity": "sha512-Q2kH2i5pS0dvauOiRR4s7atH+Qrhe1LmiCv1D2U+AghZMfDcxi3DBTxrae/YqmDYm3GxHH3ZSAFHR3E0SeiSSg==", + "dev": true, + "optional": true + }, + "@swc/core-freebsd-x64": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@swc/core-freebsd-x64/-/core-freebsd-x64-1.3.1.tgz", + "integrity": "sha512-f2a+rPGrhAICF+Du/nHWZlYzltX1/fWyt+v0IP+r0Zh4drgTrt5G3sMYrQVTjsKvI8R6tV2Q7BfYvDIQXwE1pw==", + "dev": true, + "optional": true, + "requires": { + "@swc/wasm": "1.2.130" + }, + "dependencies": { + "@swc/wasm": { + "version": "1.2.130", + "resolved": "https://registry.npmjs.org/@swc/wasm/-/wasm-1.2.130.tgz", + "integrity": "sha512-rNcJsBxS70+pv8YUWwf5fRlWX6JoY/HJc25HD/F8m6Kv7XhJdqPPMhyX6TKkUBPAG7TWlZYoxa+rHAjPy4Cj3Q==", + "dev": true, + "optional": true + } + } + }, + "@swc/core-linux-arm-gnueabihf": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.1.tgz", + "integrity": "sha512-Q1zGHJMvAEkFdW7A2dthFrswf/HezhC2kOSoOmitz+KxWBZ0YSj8k9ImLYGFf7S8Vi0KVzLUaE1jCGK2oePx/A==", + "dev": true, + "optional": true, + "requires": { + "@swc/wasm": "1.2.130" + }, + "dependencies": { + "@swc/wasm": { + "version": "1.2.130", + "resolved": "https://registry.npmjs.org/@swc/wasm/-/wasm-1.2.130.tgz", + "integrity": "sha512-rNcJsBxS70+pv8YUWwf5fRlWX6JoY/HJc25HD/F8m6Kv7XhJdqPPMhyX6TKkUBPAG7TWlZYoxa+rHAjPy4Cj3Q==", + "dev": true, + "optional": true + } + } + }, + "@swc/core-linux-arm64-gnu": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.1.tgz", + "integrity": "sha512-5OPkiU2A4Ijt2cRzi2FCGPkAC+wRvAb0TmUkL4Lj2PXPzM5RtEd2AoYmpQhV+YEOXO4XdnKwgBmdeiQV5K8eXA==", + "dev": true, + "optional": true + }, + "@swc/core-linux-arm64-musl": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.1.tgz", + "integrity": "sha512-oTIeS7kEKSUrTxavYBEfqjqoIiHtbwSdgp/rrn2hz7CDG1B1imRHnsjwdh4YaYLsm8RcCH9+GABnHxJd3Nd6qg==", + "dev": true, + "optional": true + }, + "@swc/core-linux-x64-gnu": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.1.tgz", + "integrity": "sha512-gNojY1qIKksK9kNdY4pqrlUILTxfqSWtXjX0qV2mlxgwRpnOATJnMx585q09cOZnkN2/QB+33pXnT8z/wxuGzQ==", + "dev": true, + "optional": true + }, + "@swc/core-linux-x64-musl": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.1.tgz", + "integrity": "sha512-WXNagCsjul7U9uYYP1JkUUVtvqXRDDWjvdegqrtQ99/De+HoWr+fCPgvENgOsSwb0clPTBuiGm2PTnK6kDQ0Sw==", + "dev": true, + "optional": true + }, + "@swc/core-win32-arm64-msvc": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.1.tgz", + "integrity": "sha512-3LSDJtpYNgN4N/pd/YzHAWKaF2Y/1P9t83vHfPos77hQ+KzFaiyT7YIG1qfYy1AD8MGC28l2bJNH2gia3bcERA==", + "dev": true, + "optional": true, + "requires": { + "@swc/wasm": "1.2.130" + }, + "dependencies": { + "@swc/wasm": { + "version": "1.2.130", + "resolved": "https://registry.npmjs.org/@swc/wasm/-/wasm-1.2.130.tgz", + "integrity": "sha512-rNcJsBxS70+pv8YUWwf5fRlWX6JoY/HJc25HD/F8m6Kv7XhJdqPPMhyX6TKkUBPAG7TWlZYoxa+rHAjPy4Cj3Q==", + "dev": true, + "optional": true + } + } + }, + "@swc/core-win32-ia32-msvc": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.1.tgz", + "integrity": "sha512-0VfPVkQx7jV7k71tTQY5HchDrALWjrHF8AcaaCojXQpb9ftktLxaCUdTWlQ+Y958GkgG7QX+HEo95ImZ+cYRHQ==", + "dev": true, + "optional": true, + "requires": { + "@swc/wasm": "1.2.130" + }, + "dependencies": { + "@swc/wasm": { + "version": "1.2.130", + "resolved": "https://registry.npmjs.org/@swc/wasm/-/wasm-1.2.130.tgz", + "integrity": "sha512-rNcJsBxS70+pv8YUWwf5fRlWX6JoY/HJc25HD/F8m6Kv7XhJdqPPMhyX6TKkUBPAG7TWlZYoxa+rHAjPy4Cj3Q==", + "dev": true, + "optional": true + } + } + }, + "@swc/core-win32-x64-msvc": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.1.tgz", + "integrity": "sha512-jSeqI8+1PGp+lHtyQCieDQxSszOF6UlA3bC2cmC9LAD84xcvsqpt0hsg3GFaw6RR7FsVjMNl/St6y1EEW0mm6Q==", + "dev": true, + "optional": true + }, + "@swc/wasm": { + "version": "1.2.122", + "resolved": "https://registry.npmjs.org/@swc/wasm/-/wasm-1.2.122.tgz", + "integrity": "sha512-sM1VCWQxmNhFtdxME+8UXNyPNhxNu7zdb6ikWpz0YKAQQFRGT5ThZgJrubEpah335SUToNg8pkdDF7ibVCjxbQ==", + "dev": true, + "optional": 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" + } + }, + "@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "@tsconfig/node16": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "dev": true + }, + "@types/cacheable-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", + "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==", + "dev": true, + "requires": { + "@types/http-cache-semantics": "*", + "@types/keyv": "*", + "@types/node": "*", + "@types/responselike": "*" + } + }, + "@types/chai": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.3.tgz", + "integrity": "sha512-hC7OMnszpxhZPduX+m+nrx+uFoLkWOMiR4oa/AZF3MuSETYTZmFfJAHqZEM8MVlvfG7BEUcgvtwoCTxBp6hm3g==", + "dev": true + }, + "@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.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "@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/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/minimist": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", + "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", + "dev": true + }, + "@types/node": { + "version": "18.7.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.18.tgz", + "integrity": "sha512-m+6nTEOadJZuTPkKR/SYK3A2d7FZrgElol9UP1Kae90VVU4a6mxnPuLiIW1m4Cq4gZ/nWb9GrdVXJCoCazDAbg==", + "dev": true + }, + "@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "dev": true + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "@types/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/yargs": { + "version": "15.0.14", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.14.tgz", + "integrity": "sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true + }, + "@typescript-eslint/eslint-plugin": { + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.37.0.tgz", + "integrity": "sha512-Fde6W0IafXktz1UlnhGkrrmnnGpAo1kyX7dnyHHVrmwJOn72Oqm3eYtddrpOwwel2W8PAK9F3pIL5S+lfoM0og==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.37.0", + "@typescript-eslint/type-utils": "5.37.0", + "@typescript-eslint/utils": "5.37.0", + "debug": "^4.3.4", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.2.0", + "regexpp": "^3.2.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/parser": { + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.37.0.tgz", + "integrity": "sha512-01VzI/ipYKuaG5PkE5+qyJ6m02fVALmMPY3Qq5BHflDx3y4VobbLdHQkSMg9VPRS4KdNt4oYTMaomFoHonBGAw==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.37.0", + "@typescript-eslint/types": "5.37.0", + "@typescript-eslint/typescript-estree": "5.37.0", + "debug": "^4.3.4" + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.37.0.tgz", + "integrity": "sha512-F67MqrmSXGd/eZnujjtkPgBQzgespu/iCZ+54Ok9X5tALb9L2v3G+QBSoWkXG0p3lcTJsL+iXz5eLUEdSiJU9Q==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.37.0", + "@typescript-eslint/visitor-keys": "5.37.0" + } + }, + "@typescript-eslint/type-utils": { + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.37.0.tgz", + "integrity": "sha512-BSx/O0Z0SXOF5tY0bNTBcDEKz2Ec20GVYvq/H/XNKiUorUFilH7NPbFUuiiyzWaSdN3PA8JV0OvYx0gH/5aFAQ==", + "dev": true, + "requires": { + "@typescript-eslint/typescript-estree": "5.37.0", + "@typescript-eslint/utils": "5.37.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/types": { + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.37.0.tgz", + "integrity": "sha512-3frIJiTa5+tCb2iqR/bf7XwU20lnU05r/sgPJnRpwvfZaqCJBrl8Q/mw9vr3NrNdB/XtVyMA0eppRMMBqdJ1bA==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.37.0.tgz", + "integrity": "sha512-JkFoFIt/cx59iqEDSgIGnQpCTRv96MQnXCYvJi7QhBC24uyuzbD8wVbajMB1b9x4I0octYFJ3OwjAwNqk1AjDA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.37.0", + "@typescript-eslint/visitor-keys": "5.37.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/utils": { + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.37.0.tgz", + "integrity": "sha512-jUEJoQrWbZhmikbcWSMDuUSxEE7ID2W/QCV/uz10WtQqfOuKZUqFGjqLJ+qhDd17rjgp+QJPqTdPIBWwoob2NQ==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.37.0", + "@typescript-eslint/types": "5.37.0", + "@typescript-eslint/typescript-estree": "5.37.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "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 + } + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.37.0.tgz", + "integrity": "sha512-Hp7rT4cENBPIzMwrlehLW/28EVCOcE9U1Z1BQTc8EA8v5qpr7GRGuG+U58V5tTY48zvUOA3KHvw3rA8tY9fbdA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.37.0", + "eslint-visitor-keys": "^3.3.0" + } + }, + "acorn": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", + "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", + "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": {} + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true + }, + "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": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dev": true, + "requires": { + "string-width": "^4.1.0" + } + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + }, + "dependencies": { + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + } + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "any-observable": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.5.1.tgz", + "integrity": "sha512-8zv01bgDOp9PTmRTNCAHTw64TFP2rvlX4LvtNJLachaXY+AjmIvLT47fABNPCiIe89hKiSCo2n5zmPqI9CElPA==", + "dev": true + }, + "api-contract-validator": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/api-contract-validator/-/api-contract-validator-2.2.8.tgz", + "integrity": "sha512-YM3rMcrIp8Thf/WWbVBXBGX793Mm3Phw2pn3VbJpiZkpeTCTtF10huKPrzQ2gSIaK5GjAhTRJMAOyf+rsS7MAw==", + "dev": true, + "requires": { + "api-schema-builder": "^2.0.10", + "chalk": "^3.0.0", + "columnify": "^1.5.4", + "jest-diff": "^25.5.0", + "jest-matcher-utils": "^25.5.0", + "lodash.flatten": "^4.4.0", + "lodash.get": "^4.4.2", + "lodash.set": "^4.3.2", + "uri-js": "^4.4.1" + }, + "dependencies": { + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "diff-sequences": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", + "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==", + "dev": true + }, + "jest-diff": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.5.0.tgz", + "integrity": "sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "diff-sequences": "^25.2.6", + "jest-get-type": "^25.2.6", + "pretty-format": "^25.5.0" + } + }, + "jest-get-type": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", + "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", + "dev": true + }, + "pretty-format": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", + "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", + "dev": true, + "requires": { + "@jest/types": "^25.5.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + } + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + } + } + }, + "api-schema-builder": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/api-schema-builder/-/api-schema-builder-2.0.11.tgz", + "integrity": "sha512-85zbwf8MtPWodhfnmQRW5YD/fuGR12FP+8TbcYai5wbRnoUmPYLftLSbp7NB6zQMPb61Gjz+ApPUSyTdcCos7g==", + "dev": true, + "requires": { + "ajv": "^6.12.6", + "clone-deep": "^4.0.1", + "decimal.js": "^10.3.1", + "js-yaml": "^3.14.1", + "json-schema-deref-sync": "^0.14.0", + "lodash.get": "^4.4.2", + "openapi-schema-validator": "^3.0.3", + "swagger-parser": "^10.0.3" + }, + "dependencies": { + "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" + } + }, + "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 + } + } + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "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-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-uniq": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.2.tgz", + "integrity": "sha512-GVYjmpL05al4dNlKJm53mKE4w9OOLiuVHWorsIA3YVz+Hu0hcn6PtE3Ydl0EqU7v+7ABC4mjjWsnLUxbpno+CA==", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true + }, + "as-table": { + "version": "1.0.55", + "resolved": "https://registry.npmjs.org/as-table/-/as-table-1.0.55.tgz", + "integrity": "sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==", + "dev": true, + "requires": { + "printable-characters": "^1.0.42" + } + }, + "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 + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, + "async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "dev": true + }, + "async-exit-hook": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", + "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", + "dev": true + }, + "async-retry": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", + "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", + "dev": true, + "requires": { + "retry": "0.13.1" + } + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "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.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "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" + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "boxen": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", + "dev": true, + "requires": { + "ansi-align": "^3.0.0", + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + }, + "cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + } + } + }, + "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" + } + }, + "builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "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" + }, + "dependencies": { + "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" + } + } + } + }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha512-wCyFsDQkKPwwF8BDwOiWNx/9K45L/hvggQiDbve+viMNMQnWhrlYIuBk09offfwCRtCO9P6XwUttufzU11WCVw==", + "dev": true + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "dependencies": { + "quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true + } + } + }, + "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.3.6", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz", + "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==", + "dev": true, + "requires": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", + "dev": true + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "dev": true + }, + "ci-info": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.4.0.tgz", + "integrity": "sha512-t5QdPT5jq3o262DOQ8zA6E1tlH2upmUc4Hlvrbx1pGYJuiiHl7O7rvVNI+l8HTVhd/q3Qc9vqimkNk5yiXsAug==", + "dev": true + }, + "clean-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", + "integrity": "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "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-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-table3": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.2.tgz", + "integrity": "sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw==", + "dev": true, + "requires": { + "@colors/colors": "1.5.0", + "string-width": "^4.2.0" + } + }, + "cli-truncate": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", + "integrity": "sha512-f4r4yJnbT++qUPI9NR4XLDLq41gQ+uqnPItWG0F5ZkehuNiTTa3EY0S4AqTSUOeJ7/zU41oWPQSNkW5BqPL9bg==", + "dev": true, + "requires": { + "slice-ansi": "0.0.4", + "string-width": "^1.0.1" + }, + "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 + }, + "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, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "slice-ansi": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha512-up04hB2hR92PgjpyU3y/eg91yIBILyjVY26NvvciY3EVVPjybkMszMpXQ9QAkcS3I5rtJBDLoTxxg+qvW8c7rw==", + "dev": true + }, + "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, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "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, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "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" + } + } + } + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "dev": true + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, + "clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", + "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 + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true + }, + "columnify": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.6.0.tgz", + "integrity": "sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==", + "dev": true, + "requires": { + "strip-ansi": "^6.0.1", + "wcwidth": "^1.0.0" + } + }, + "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" + } + }, + "commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "compare-func": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "dev": true, + "requires": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + } + }, + "conventional-changelog-angular": { + "version": "5.0.13", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", + "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", + "dev": true, + "requires": { + "compare-func": "^2.0.0", + "q": "^1.5.1" + } + }, + "conventional-changelog-conventionalcommits": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-5.0.0.tgz", + "integrity": "sha512-lCDbA+ZqVFQGUj7h9QBKoIpLhl8iihkO0nCTyRNzuXtcd7ubODpYB04IFy31JloiJgG0Uovu8ot8oxRzn7Nwtw==", + "dev": true, + "requires": { + "compare-func": "^2.0.0", + "lodash": "^4.17.15", + "q": "^1.5.1" + } + }, + "conventional-commits-parser": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", + "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", + "dev": true, + "requires": { + "is-text-path": "^1.0.1", + "JSONStream": "^1.0.4", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + } + }, + "convert-hrtime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/convert-hrtime/-/convert-hrtime-3.0.0.tgz", + "integrity": "sha512-7V+KqSvMiHp8yWDuwfww06XleMWVVB9b9tURBx+G7UTADuo5hYPuowKloz4OzOqbPezxgo+fdQ1522WzPG4OeA==", + "dev": true + }, + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "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": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true + }, + "cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "cosmiconfig-typescript-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.0.0.tgz", + "integrity": "sha512-cVpucSc2Tf+VPwCCR7SZzmQTQkPbkk4O01yXsYqXBIbjE1bhwqSyAgYQkRK1un4i0OPziTleqFhdkmOc4RQ/9g==", + "dev": true, + "requires": {} + }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", + "dev": true + }, + "crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "dev": true + }, + "dag-map": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/dag-map/-/dag-map-1.0.2.tgz", + "integrity": "sha512-+LSAiGFwQ9dRnRdOeaj7g47ZFJcOUPukAP8J3A3fuZ1g9Y44BG+P1sgApjLXTQPOzC4+7S9Wr8kXsfpINM4jpw==", + "dev": true + }, + "dargs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", + "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", + "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" + } + }, + "data-uri-to-buffer": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-2.0.2.tgz", + "integrity": "sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==", + "dev": true + }, + "date-fns": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", + "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==", + "dev": true + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "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 + } + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true + }, + "decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg==", + "dev": true, + "requires": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true + } + } + }, + "decimal.js": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.0.tgz", + "integrity": "sha512-Nv6ENEzyPQ6AItkGwLE2PGKinZZ9g59vSh2BeH6NqPu0OTKZ5ruJsVqh/orbAnqXc9pBbgXAIrc2EyaCj8NpGg==", + "dev": true + }, + "decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "requires": { + "mimic-response": "^3.1.0" + }, + "dependencies": { + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true + } + } + }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "requires": { + "type-detect": "^4.0.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA==", + "dev": true, + "requires": { + "clone": "^1.0.2" + }, + "dependencies": { + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true + } + } + }, + "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 + }, + "del": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", + "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", + "dev": true, + "requires": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + } + }, + "del-cli": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/del-cli/-/del-cli-4.0.1.tgz", + "integrity": "sha512-KtR/6cBfZkGDAP2NA7z+bP4p1OMob3wjN9mq13+SWvExx6jT9gFWfLgXEeX8J2B47OKeNCq9yTONmtryQ+m+6g==", + "dev": true, + "requires": { + "del": "^6.0.0", + "meow": "^10.1.0" + }, + "dependencies": { + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + }, + "camelcase-keys": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-7.0.2.tgz", + "integrity": "sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==", + "dev": true, + "requires": { + "camelcase": "^6.3.0", + "map-obj": "^4.1.0", + "quick-lru": "^5.1.1", + "type-fest": "^1.2.1" + } + }, + "decamelize": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-5.0.1.tgz", + "integrity": "sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==", + "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 + }, + "meow": { + "version": "10.1.3", + "resolved": "https://registry.npmjs.org/meow/-/meow-10.1.3.tgz", + "integrity": "sha512-0WL7RMCPPdUTE00+GxJjL4d5Dm6eUbmAzxlzywJWiRUKCW093owmZ7/q74tH9VI91vxw9KJJNxAcvdpxb2G4iA==", + "dev": true, + "requires": { + "@types/minimist": "^1.2.2", + "camelcase-keys": "^7.0.0", + "decamelize": "^5.0.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.2", + "read-pkg-up": "^8.0.0", + "redent": "^4.0.0", + "trim-newlines": "^4.0.2", + "type-fest": "^1.2.2", + "yargs-parser": "^20.2.9" + } + }, + "read-pkg": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-6.0.0.tgz", + "integrity": "sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^3.0.2", + "parse-json": "^5.2.0", + "type-fest": "^1.0.1" + } + }, + "read-pkg-up": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-8.0.0.tgz", + "integrity": "sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==", + "dev": true, + "requires": { + "find-up": "^5.0.0", + "read-pkg": "^6.0.0", + "type-fest": "^1.0.1" + } + }, + "redent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz", + "integrity": "sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==", + "dev": true, + "requires": { + "indent-string": "^5.0.0", + "strip-indent": "^4.0.0" + } + }, + "strip-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", + "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", + "dev": true, + "requires": { + "min-indent": "^1.0.1" + } + }, + "trim-newlines": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.0.2.tgz", + "integrity": "sha512-GJtWyq9InR/2HRiLZgpIKv+ufIKrVrvjQWEj7PxAXNc5dwbNJkqhAUoAGgzRmULAnoOM5EIpveYd3J2VeSAIew==", + "dev": true + }, + "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 + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "diff-sequences": { + "version": "29.0.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.0.0.tgz", + "integrity": "sha512-7Qe/zd1wxSDL4D/X/FPjOMB+ZMDt71W94KYaq05I2l0oQqgXgs7s4ftYYmV38gBSrPz2vcygxfs1xn0FT+rKNA==", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + } + }, + "duplexer3": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", + "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==", + "dev": true + }, + "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" + } + }, + "ejs": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz", + "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==", + "dev": true, + "requires": { + "jake": "^10.8.5" + } + }, + "elegant-spinner": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", + "integrity": "sha512-B+ZM+RXvRqQaAmkMlO/oSe5nMUOaUnyfGYCEHoR8wrXsZR2mA0XVibsxV1bvTwxdRWah1PkQqso2EzhILGHtEQ==", + "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 + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-goat": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-3.0.0.tgz", + "integrity": "sha512-w3PwNZJwRxlp47QGzhuEBldEqVHHhh8/tIPcl6ecf2Bou99cdAt0knihBV0Ecc7CGxYduXVBDheH1K2oADRlvw==", + "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.23.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.23.1.tgz", + "integrity": "sha512-w7C1IXCc6fNqjpuYd0yPlcTKKmHlHHktRkzmBPZ+7cvNBQuiNjx0xaMTjAJGCafJhQkrFJooREv0CtrVzmHwqg==", + "dev": true, + "requires": { + "@eslint/eslintrc": "^1.3.2", + "@humanwhocodes/config-array": "^0.10.4", + "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", + "@humanwhocodes/module-importer": "^1.0.1", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.4.0", + "esquery": "^1.4.0", + "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.1", + "globals": "^13.15.0", + "globby": "^11.1.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-sdsl": "^4.1.4", + "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.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "dependencies": { + "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" + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "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 + } + } + }, + "eslint-config-prettier": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", + "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", + "dev": true, + "requires": {} + }, + "eslint-plugin-adonis": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-adonis/-/eslint-plugin-adonis-3.0.2.tgz", + "integrity": "sha512-tS9GuhyZlPHzpAslXhCto7JEbB21UBoLQLgMXCaeqrOWX9Mg6Rc6r51CZ/9RdWwRXpj3sl/JzpFWqc9JvGObmA==", + "dev": true, + "requires": { + "@typescript-eslint/eslint-plugin": "^5.28.0", + "@typescript-eslint/parser": "^5.28.0", + "eslint-plugin-unicorn": "^42.0.0" + } + }, + "eslint-plugin-prettier": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", + "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, + "eslint-plugin-unicorn": { + "version": "42.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-42.0.0.tgz", + "integrity": "sha512-ixBsbhgWuxVaNlPTT8AyfJMlhyC5flCJFjyK3oKE8TRrwBnaHvUbuIkCM1lqg8ryYrFStL/T557zfKzX4GKSlg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.15.7", + "ci-info": "^3.3.0", + "clean-regexp": "^1.0.0", + "eslint-utils": "^3.0.0", + "esquery": "^1.4.0", + "indent-string": "^4.0.0", + "is-builtin-module": "^3.1.0", + "lodash": "^4.17.21", + "pluralize": "^8.0.0", + "read-pkg-up": "^7.0.1", + "regexp-tree": "^0.1.24", + "safe-regex": "^2.1.1", + "semver": "^7.3.5", + "strip-indent": "^3.0.0" + } + }, + "eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "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.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true + }, + "espree": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", + "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", + "dev": true, + "requires": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "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-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "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" + } + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "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" + } + }, + "filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "requires": { + "minimatch": "^5.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-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": "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" + } + }, + "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.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "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": "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" + } + }, + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "dev": true + }, + "get-source": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/get-source/-/get-source-2.0.12.tgz", + "integrity": "sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==", + "dev": true, + "requires": { + "data-uri-to-buffer": "^2.0.0", + "source-map": "^0.6.1" + } + }, + "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 + }, + "getopts": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/getopts/-/getopts-2.3.0.tgz", + "integrity": "sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA==", + "dev": true + }, + "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-raw-commits": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz", + "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==", + "dev": true, + "requires": { + "dargs": "^7.0.0", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + } + }, + "github-label-sync": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/github-label-sync/-/github-label-sync-2.2.0.tgz", + "integrity": "sha512-4FBcwA/6XhQtFWZ/+xkwIAJKn7XJlkLBXA+eA3kjJJ6YTFbTynU6Cg9oUN3RXUCBoV2B7fhyEhqN6IwWO/hf3g==", + "dev": true, + "requires": { + "@financial-times/origami-service-makefile": "^7.0.3", + "ajv": "^8.6.3", + "chalk": "^4.1.2", + "commander": "^6.2.1", + "got": "^11.8.2", + "js-yaml": "^3.14.1", + "node.extend": "^2.0.2", + "octonode": "^0.10.2" + } + }, + "github-url-from-git": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/github-url-from-git/-/github-url-from-git-1.5.0.tgz", + "integrity": "sha512-WWOec4aRI7YAykQ9+BHmzjyNlkfJFG8QLXnDTsLz/kZefq7qkzdfo4p6fkYYMIq1aj+gZcQs/1HQhQh3DPPxlQ==", + "dev": true + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + } + }, + "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" + } + }, + "global-dirs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz", + "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==", + "dev": true, + "requires": { + "ini": "1.3.7" + } + }, + "globals": { + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "got": { + "version": "11.8.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 + }, + "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" + }, + "dependencies": { + "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" + } + }, + "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 + } + } + }, + "hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "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": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "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-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "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" + } + }, + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true + }, + "http-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" + } + }, + "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 + }, + "husky": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.1.tgz", + "integrity": "sha512-xs7/chUH/CKdOCs7Zy0Aev9e/dKOMZf3K1Az1nar3tzlv0jfqnYtu235bstsWTmXOR0EfINrPa97yy4Lz6RiKw==", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true + }, + "ignore-walk": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz", + "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==", + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + } + } + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==", + "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": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true + }, + "inclusion": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/inclusion/-/inclusion-1.0.1.tgz", + "integrity": "sha512-TRicJXpIfJN+a47xxjs5nfy2V5l413e4aAtsLYRG+OsDM3A3uloBd/+fDmj23RVuIL9VQfwtb37iIc0rtMw9KA==", + "dev": true, + "requires": { + "parent-module": "^2.0.0" + }, + "dependencies": { + "parent-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-2.0.0.tgz", + "integrity": "sha512-uo0Z9JJeWzv8BG+tRcapBKNJ0dro9cLyczGzulS6EfeyAdeC9sbojtW6XwvYxJkEne9En+J2XEl4zyglVeIwFg==", + "dev": true, + "requires": { + "callsites": "^3.1.0" + } + } + } + }, + "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": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "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.7", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", + "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==", + "dev": true + }, + "inquirer": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.19", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + } + }, + "inquirer-autosubmit-prompt": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/inquirer-autosubmit-prompt/-/inquirer-autosubmit-prompt-0.2.0.tgz", + "integrity": "sha512-mzNrusCk5L6kSzlN0Ioddn8yzrhYNLli+Sn2ZxMuLechMYAzakiFCIULxsxlQb5YKzthLGfrFACcWoAvM7p04Q==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "inquirer": "^6.2.1", + "rxjs": "^6.3.3" + }, + "dependencies": { + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true + }, + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "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" + } + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-width": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", + "dev": true + }, + "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 + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", + "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": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "inquirer": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", + "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", + "dev": true, + "requires": { + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.12", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==", + "dev": true + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "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" + } + } + } + }, + "is": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/is/-/is-3.3.0.tgz", + "integrity": "sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg==", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-builtin-module": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.0.tgz", + "integrity": "sha512-phDA4oSGt7vl1n5tJvTWooWWAsXLY+2xCnxNqvKhGEzujg+A43wPlPOyDg3C8XQHN+6k/JTQWJ/j0dQh/qr+Hw==", + "dev": true, + "requires": { + "builtin-modules": "^3.3.0" + } + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "requires": { + "ci-info": "^2.0.0" + }, + "dependencies": { + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + } + } + }, + "is-core-module": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", + "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-glob": { + "version": "4.0.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-installed-globally": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", + "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", + "dev": true, + "requires": { + "global-dirs": "^2.0.1", + "is-path-inside": "^3.0.1" + } + }, + "is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true + }, + "is-invalid-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-invalid-path/-/is-invalid-path-0.1.0.tgz", + "integrity": "sha512-aZMG0T3F34mTg4eTdszcGXx54oiZ4NtHSft3hWNJMGJXUUqdIj3cOZuHcU0nCWWcY3jd7yRe/3AEm3vSNTpBGQ==", + "dev": true, + "requires": { + "is-glob": "^2.0.0" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + } + } + }, + "is-npm": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", + "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", + "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-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-observable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-1.1.0.tgz", + "integrity": "sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA==", + "dev": true, + "requires": { + "symbol-observable": "^1.1.0" + }, + "dependencies": { + "symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", + "dev": true + } + } + }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "dev": true + }, + "is-scoped": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-scoped/-/is-scoped-2.1.0.tgz", + "integrity": "sha512-Cv4OpPTHAK9kHYzkzCrof3VJh7H/PrG2MBUMvvJebaaUMbqhm0YAtXnvh0I3Hnj2tMZWwrRROWLSgfJrKqWmlQ==", + "dev": true, + "requires": { + "scoped-regex": "^2.0.0" + } + }, + "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-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", + "dev": true, + "requires": { + "text-extensions": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "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-url-superb": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-url-superb/-/is-url-superb-4.0.0.tgz", + "integrity": "sha512-GI+WjezhPPcbM+tqE9LnmsY5qqjwHzTvjJ36wxYX5ujNXefSUJ/T17r5bqDV8yLhcgB59KTPNOc9O9cmHTPWsA==", + "dev": true + }, + "is-valid-path": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-valid-path/-/is-valid-path-0.1.1.tgz", + "integrity": "sha512-+kwPrVDu9Ms03L90Qaml+79+6DZHqHyRoANI6IsZJ/g8frhnfchDOBCa0RbQ6/kdHt5CS5OeIEyrYznNuVN+8A==", + "dev": true, + "requires": { + "is-invalid-path": "^0.1.0" + } + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "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-regex": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/issue-regex/-/issue-regex-3.1.0.tgz", + "integrity": "sha512-0RHjbtw9QXeSYnIEY5Yrp2QZrdtz21xBDV9C/GIlY2POmgoS6a7qjkYS5siRKXScnuAj5/SPv1C3YForNCHTJA==", + "dev": true + }, + "jake": { + "version": "10.8.5", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", + "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", + "dev": true, + "requires": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + } + }, + "jest-diff": { + "version": "29.0.3", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.0.3.tgz", + "integrity": "sha512-+X/AIF5G/vX9fWK+Db9bi9BQas7M9oBME7egU7psbn4jlszLFCu0dW63UgeE6cs/GANq4fLaT+8sGHQQ0eCUfg==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^29.0.0", + "jest-get-type": "^29.0.0", + "pretty-format": "^29.0.3" + } + }, + "jest-get-type": { + "version": "29.0.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.0.0.tgz", + "integrity": "sha512-83X19z/HuLKYXYHskZlBAShO7UfLFXu/vWajw9ZNJASN32li8yHMaVGAQqxFW1RCFOkB7cubaL6FaJVQqqJLSw==", + "dev": true + }, + "jest-matcher-utils": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.5.0.tgz", + "integrity": "sha512-VWI269+9JS5cpndnpCwm7dy7JtGQT30UHfrnM3mXl22gHGt/b7NkjBqXfbhZ8V4B7ANUsjK18PlSBmG0YH7gjw==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "jest-diff": "^25.5.0", + "jest-get-type": "^25.2.6", + "pretty-format": "^25.5.0" + }, + "dependencies": { + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "diff-sequences": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", + "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==", + "dev": true + }, + "jest-diff": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.5.0.tgz", + "integrity": "sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "diff-sequences": "^25.2.6", + "jest-get-type": "^25.2.6", + "pretty-format": "^25.5.0" + } + }, + "jest-get-type": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", + "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", + "dev": true + }, + "pretty-format": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", + "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", + "dev": true, + "requires": { + "@jest/types": "^25.5.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + } + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + } + } + }, + "js-sdsl": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.4.tgz", + "integrity": "sha512-Y2/yD55y5jteOAmY50JbUZYwk3CP3wnLPEZnlR1w9oKhITrBEtAxwuWKebFf8hMrPMgbYwFoWK/lH2sBkErELw==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "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-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-deref-sync": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/json-schema-deref-sync/-/json-schema-deref-sync-0.14.0.tgz", + "integrity": "sha512-yGR1xmhdiD6R0MSrwWcFxQzAj5b3i5Gb/mt5tvQKgFMMeNe0KZYNEN/jWr7G+xn39Azqgcvk4ZKMs8dQl8e4wA==", + "dev": true, + "requires": { + "clone": "^2.1.2", + "dag-map": "~1.0.0", + "is-valid-path": "^0.1.1", + "lodash": "^4.17.13", + "md5": "~2.2.0", + "memory-cache": "~0.2.0", + "traverse": "~0.6.6", + "valid-url": "~1.0.9" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "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": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "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": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "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" + } + }, + "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" + } + }, + "keyv": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.0.tgz", + "integrity": "sha512-2YvuMsA+jnFGtBareKqgANOEKe1mk3HKiXu2fRmAfyxG0MJAywNhi5ttWA3PMjl4NmpyjZNbFifR2vNjW1znfA==", + "dev": true, + "requires": { + "json-buffer": "3.0.1" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true + }, + "latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "dev": true, + "requires": { + "package-json": "^6.3.0" + } + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "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 + }, + "listr": { + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/listr/-/listr-0.14.3.tgz", + "integrity": "sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA==", + "dev": true, + "requires": { + "@samverschueren/stream-to-observable": "^0.3.0", + "is-observable": "^1.1.0", + "is-promise": "^2.1.0", + "is-stream": "^1.1.0", + "listr-silent-renderer": "^1.1.1", + "listr-update-renderer": "^0.5.0", + "listr-verbose-renderer": "^0.5.0", + "p-map": "^2.0.0", + "rxjs": "^6.3.3" + }, + "dependencies": { + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true + }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true + } + } + }, + "listr-input": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/listr-input/-/listr-input-0.2.1.tgz", + "integrity": "sha512-oa8iVG870qJq+OuuMK3DjGqFcwsK1SDu+kULp9kEq09TY231aideIZenr3lFOQdASpAr6asuyJBbX62/a3IIhg==", + "dev": true, + "requires": { + "inquirer": "^7.0.0", + "inquirer-autosubmit-prompt": "^0.2.0", + "rxjs": "^6.5.3", + "through": "^2.3.8" + } + }, + "listr-silent-renderer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz", + "integrity": "sha512-L26cIFm7/oZeSNVhWB6faeorXhMg4HNlb/dS/7jHhr708jxlXrtrBWo4YUxZQkc6dGoxEAe6J/D3juTRBUzjtA==", + "dev": true + }, + "listr-update-renderer": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz", + "integrity": "sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "cli-truncate": "^0.2.1", + "elegant-spinner": "^1.0.1", + "figures": "^1.7.0", + "indent-string": "^3.0.0", + "log-symbols": "^1.0.2", + "log-update": "^2.3.0", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true + }, + "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 + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "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" + } + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", + "dev": true, + "requires": { + "restore-cursor": "^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": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + } + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha512-BYqTHXTGUIvg7t1r4sJNKcbDZkL92nkXA8YtRpbjFHRHGDL/NtUeiBJMeE60kIFN/Mg8ESaWQvftaYMGJzQZCQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true + }, + "log-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", + "integrity": "sha512-mmPrW0Fh2fxOzdBbFv4g1m6pR72haFLPJ2G5SJEELf1y+iaQrDG6cWCPjy54RHYbZAt7X+ls690Kw62AdWXBzQ==", + "dev": true, + "requires": { + "chalk": "^1.0.0" + } + }, + "log-update": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-2.3.0.tgz", + "integrity": "sha512-vlP11XfFGyeNQlmEn9tJ66rEW1coA/79m5z6BCkudjbAGE83uhAcGYrBFwfs3AdLiLzGRusRPAbSPK9xZteCmg==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "cli-cursor": "^2.0.0", + "wrap-ansi": "^3.0.1" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "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, + "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": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true + }, + "wrap-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-3.0.1.tgz", + "integrity": "sha512-iXR3tDXpbnTpzjKSylUJRkLuOrEC7hwEB221cgn6wtF8wpmz28puFXAEfPT5zrjM3wahygB//VuWEr1vTkDcNQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + } + } + }, + "listr-verbose-renderer": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz", + "integrity": "sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "cli-cursor": "^2.1.0", + "date-fns": "^1.27.2", + "figures": "^2.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" + } + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "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 + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", + "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": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "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" + } + } + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", + "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.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "lodash.set": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", + "integrity": "sha512-4hNPN5jlm/N/HLMCO43v8BXKq9Z7QdAGc/VGrRD61w8gN9g/6jF9A4L1pbUgBLCffi0w9VsXfTOij5x8iTyFvg==", + "dev": true + }, + "lodash.zip": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz", + "integrity": "sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==", + "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" + } + }, + "log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "requires": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "loupe": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz", + "integrity": "sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==", + "dev": true, + "requires": { + "get-func-name": "^2.0.0" + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "macroable": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/macroable/-/macroable-7.0.1.tgz", + "integrity": "sha512-8bbZLq2JoGI7FdvmDIxed41opR2cqgUUrRN4fVEsajARzfHkZDAzbCg0RW+jIY93YhWuBsMOeLcIyYz5WU4HNQ==", + "dev": true + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true + }, + "md5": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz", + "integrity": "sha512-PlGG4z5mBANDGCKsYQe0CaUYHdZYZt8ZPZLmEt+Urf0W4GlpTX4HescwHU+dc9+Z/G/vZKYZYFrwgm9VxK6QOQ==", + "dev": true, + "requires": { + "charenc": "~0.0.1", + "crypt": "~0.0.1", + "is-buffer": "~1.1.1" + } + }, + "memory-cache": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/memory-cache/-/memory-cache-0.2.0.tgz", + "integrity": "sha512-OcjA+jzjOYzKmKS6IQVALHLVz+rNTMPoJvCztFaZxwG14wtAW7VRZjwTQu06vKCYOxh4jVnik7ya0SXTB0W+xA==", + "dev": true + }, + "meow": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "dev": true, + "requires": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "dependencies": { + "type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true + } + } + }, + "merge-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-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": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true + }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true + }, + "minimatch": { + "version": "3.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 + }, + "minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + } + }, + "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 + }, + "mustache": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "dev": true + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "new-github-release-url": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/new-github-release-url/-/new-github-release-url-1.0.0.tgz", + "integrity": "sha512-dle7yf655IMjyFUqn6Nxkb18r4AOAkzRcgcZv6WZ0IqrOH4QCEZ8Sm6I7XX21zvHdBeeMeTkhR9qT2Z0EJDx6A==", + "dev": true, + "requires": { + "type-fest": "^0.4.1" + }, + "dependencies": { + "type-fest": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.4.1.tgz", + "integrity": "sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==", + "dev": true + } + } + }, + "node.extend": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node.extend/-/node.extend-2.0.2.tgz", + "integrity": "sha512-pDT4Dchl94/+kkgdwyS2PauDFjZG0Hk0IcHIB+LkW27HLDtdoeMxHTxZh39DYbPP8UflWXWj9JcdDozF+YDOpQ==", + "dev": true, + "requires": { + "has": "^1.0.3", + "is": "^3.2.1" + } + }, + "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" + } + }, + "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 + }, + "np": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/np/-/np-7.6.2.tgz", + "integrity": "sha512-gExmKGKixh7ITc4Q+Lv7nfCby0CVKvzri9zN8970oKD8976T4L5dw8QWUtMcXcIjhFF6h5lbvztao/NurDbmxQ==", + "dev": true, + "requires": { + "@samverschueren/stream-to-observable": "^0.3.1", + "any-observable": "^0.5.1", + "async-exit-hook": "^2.0.1", + "chalk": "^4.1.0", + "cosmiconfig": "^7.0.0", + "del": "^6.0.0", + "escape-goat": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "execa": "^5.0.0", + "github-url-from-git": "^1.5.0", + "has-yarn": "^2.1.0", + "hosted-git-info": "^3.0.7", + "ignore-walk": "^3.0.3", + "import-local": "^3.0.2", + "inquirer": "^7.3.3", + "is-installed-globally": "^0.3.2", + "is-interactive": "^1.0.0", + "is-scoped": "^2.1.0", + "issue-regex": "^3.1.0", + "listr": "^0.14.3", + "listr-input": "^0.2.1", + "log-symbols": "^4.0.0", + "meow": "^8.1.0", + "minimatch": "^3.0.4", + "new-github-release-url": "^1.0.0", + "npm-name": "^6.0.1", + "onetime": "^5.1.2", + "open": "^7.3.0", + "ow": "^0.21.0", + "p-memoize": "^4.0.1", + "p-timeout": "^4.1.0", + "pkg-dir": "^5.0.0", + "read-pkg-up": "^7.0.1", + "rxjs": "^6.6.3", + "semver": "^7.3.4", + "split": "^1.0.1", + "symbol-observable": "^3.0.0", + "terminal-link": "^2.1.1", + "update-notifier": "^5.0.1" + }, + "dependencies": { + "hosted-git-info": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.8.tgz", + "integrity": "sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "pkg-dir": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", + "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", + "dev": true, + "requires": { + "find-up": "^5.0.0" + } + } + } + }, + "npm-name": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/npm-name/-/npm-name-6.0.1.tgz", + "integrity": "sha512-fhKRvUAxaYzMEUZim4mXWyfFbVS+M1CbrCLdAo3txWzrctxKka/h+KaBW0O9Cz5uOM00Nldn2JLWhuwnyW3SUw==", + "dev": true, + "requires": { + "got": "^10.6.0", + "is-scoped": "^2.1.0", + "is-url-superb": "^4.0.0", + "lodash.zip": "^4.2.0", + "org-regex": "^1.0.0", + "p-map": "^3.0.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.1.0", + "validate-npm-package-name": "^3.0.0" + }, + "dependencies": { + "@sindresorhus/is": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-2.1.1.tgz", + "integrity": "sha512-/aPsuoj/1Dw/kzhkgz+ES6TxG0zfTMGLwuK2ZG00k/iJzYHTLCE8mVU8EPqEOp/lmxPoq1C1C9RYToRKb2KEfg==", + "dev": true + }, + "cacheable-lookup": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-2.0.1.tgz", + "integrity": "sha512-EMMbsiOTcdngM/K6gV/OxF2x0t07+vMOWxZNSCRQMjO2MY2nhZQ6OYhOOpyQrbhqsgtvKGI7hcq6xjnA92USjg==", + "dev": true, + "requires": { + "@types/keyv": "^3.1.1", + "keyv": "^4.0.0" + } + }, + "decompress-response": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-5.0.0.tgz", + "integrity": "sha512-TLZWWybuxWgoW7Lykv+gq9xvzOsUjQ9tF09Tj6NSTYGMTCHNXzrPnD6Hi+TgZq19PyTAGH4Ll/NIM/eTGglnMw==", + "dev": true, + "requires": { + "mimic-response": "^2.0.0" + } + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "got": { + "version": "10.7.0", + "resolved": "https://registry.npmjs.org/got/-/got-10.7.0.tgz", + "integrity": "sha512-aWTDeNw9g+XqEZNcTjMMZSy7B7yE9toWOFYip7ofFTLleJhvZwUxxTxkTpKvF+p1SAA4VHmuEy7PiHTHyq8tJg==", + "dev": true, + "requires": { + "@sindresorhus/is": "^2.0.0", + "@szmarczak/http-timer": "^4.0.0", + "@types/cacheable-request": "^6.0.1", + "cacheable-lookup": "^2.0.0", + "cacheable-request": "^7.0.1", + "decompress-response": "^5.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^5.0.0", + "lowercase-keys": "^2.0.0", + "mimic-response": "^2.1.0", + "p-cancelable": "^2.0.0", + "p-event": "^4.0.0", + "responselike": "^2.0.0", + "to-readable-stream": "^2.0.0", + "type-fest": "^0.10.0" + } + }, + "mimic-response": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", + "dev": true + }, + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "type-fest": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.10.0.tgz", + "integrity": "sha512-EUV9jo4sffrwlg8s0zDhP0T2WD3pru5Xi0+HTE3zTUmBaZNhfkite9PdSJwdXLwPVW0jnAHT56pZHIOYckPEiw==", + "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" + } + }, + "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 + }, + "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 + }, + "octonode": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/octonode/-/octonode-0.10.2.tgz", + "integrity": "sha512-lxKJxAvrw3BuM0Wu3A/TRyFkYxMFWbMm8p7fDO3EoG9KDgOy53d91bjlGR1mmNk1EoF5LjGBx7BmIB+PfmMKLQ==", + "dev": true, + "requires": { + "bluebird": "^3.5.0", + "deep-extend": "^0.6.0", + "randomstring": "^1.1.5", + "request": "^2.72.0" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "dev": true, + "requires": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + } + }, + "openapi-schema-validator": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/openapi-schema-validator/-/openapi-schema-validator-3.0.3.tgz", + "integrity": "sha512-KKpeNEvAmpy6B2JCfyrM4yWjL6vggDCVbBoR8Yfkj0Jltc6PCW+dBbcg+1yrTCuDv80qBQJ6w0ejA71DlOFegA==", + "dev": true, + "requires": { + "ajv": "^6.5.2", + "lodash.merge": "^4.6.1", + "openapi-types": "1.3.4", + "swagger-schema-official": "2.0.0-bab6bed" + }, + "dependencies": { + "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" + } + }, + "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 + } + } + }, + "openapi-types": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-1.3.4.tgz", + "integrity": "sha512-h8rADpW3k/wepLdERKF0VKMAPdoFYNQCLGPmc/f8sgQ2dxUy+7sY4WAX2XDUDjhKTjbJVbxxofLkzy7f1/tE4g==", + "dev": true + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "org-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/org-regex/-/org-regex-1.0.0.tgz", + "integrity": "sha512-7bqkxkEJwzJQUAlyYniqEZ3Ilzjh0yoa62c7gL6Ijxj5bEpPL+8IE1Z0PFj0ywjjXQcdrwR51g9MIcLezR0hKQ==", + "dev": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true + }, + "ow": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/ow/-/ow-0.21.0.tgz", + "integrity": "sha512-dlsoDe39g7mhdsdrC1R/YwjT7yjVqE3svWwOlMGvN690waBkgEZBmKBdkmKvSt5/wZ6E0Jn/nIesPqMZOpPKqw==", + "dev": true, + "requires": { + "@sindresorhus/is": "^4.0.0", + "callsites": "^3.1.0", + "dot-prop": "^6.0.1", + "lodash.isequal": "^4.5.0", + "type-fest": "^0.20.2", + "vali-date": "^1.0.0" + }, + "dependencies": { + "dot-prop": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "dev": true, + "requires": { + "is-obj": "^2.0.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-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==", + "dev": true + }, + "p-event": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz", + "integrity": "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==", + "dev": true, + "requires": { + "p-timeout": "^3.1.0" + }, + "dependencies": { + "p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "dev": true, + "requires": { + "p-finally": "^1.0.0" + } + } + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "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" + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-memoize": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/p-memoize/-/p-memoize-4.0.4.tgz", + "integrity": "sha512-ijdh0DP4Mk6J4FXlOM6vPPoCjPytcEseW8p/k5SDTSSfGV3E9bpt9Yzfifvzp6iohIieoLTkXRb32OWV0fB2Lw==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.3", + "mimic-fn": "^3.0.0", + "p-settle": "^4.1.1" + }, + "dependencies": { + "mimic-fn": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", + "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", + "dev": true + } + } + }, + "p-reflect": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-reflect/-/p-reflect-2.1.0.tgz", + "integrity": "sha512-paHV8NUz8zDHu5lhr/ngGWQiW067DK/+IbJ+RfZ4k+s8y4EKyYCz8pGYWjxCg35eHztpJAt+NUgvN4L+GCbPlg==", + "dev": true + }, + "p-settle": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/p-settle/-/p-settle-4.1.1.tgz", + "integrity": "sha512-6THGh13mt3gypcNMm0ADqVNCcYa3BK6DWsuJWFCuEKP1rpY+OKGp7gaZwVmLspmic01+fsg/fN57MfvDzZ/PuQ==", + "dev": true, + "requires": { + "p-limit": "^2.2.2", + "p-reflect": "^2.1.0" + }, + "dependencies": { + "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-timeout": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-4.1.0.tgz", + "integrity": "sha512-+/wmHtzJuWii1sXn3HCuH/FTwGhrp4tmJTxSKJbfS+vkipci6osxXM5mY0jUiRzWKMTgUT8l7HFbeSwZAynqHw==", + "dev": true + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "dev": true, + "requires": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "dependencies": { + "@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "dev": true + }, + "@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dev": true, + "requires": { + "defer-to-connect": "^1.0.1" + } + }, + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dev": true, + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "dependencies": { + "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" + } + } + } + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dev": true, + "requires": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + }, + "dependencies": { + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + } + } + }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==", + "dev": true + }, + "keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dev": true, + "requires": { + "json-buffer": "3.0.0" + } + }, + "normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "dev": true + }, + "p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "dev": true + }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", + "dev": true, + "requires": { + "lowercase-keys": "^1.0.0" + }, + "dependencies": { + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + } + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "dev": true + } + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "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-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true + }, + "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 + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + }, + "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" + } + } + } + }, + "pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "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 + }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", + "dev": true + }, + "prettier": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "dev": true + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, + "pretty-format": { + "version": "29.0.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.0.3.tgz", + "integrity": "sha512-cHudsvQr1K5vNVLbvYF/nv3Qy/F/BcEKxGuIeMiVMRHxPOO1RxXooP8g/ZrwAp7Dx+KdMZoOc7NxLHhMrP2f9Q==", + "dev": true, + "requires": { + "@jest/schemas": "^29.0.0", + "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 + } + } + }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==", + "dev": true + }, + "printable-characters": { + "version": "1.0.42", + "resolved": "https://registry.npmjs.org/printable-characters/-/printable-characters-1.0.42.tgz", + "integrity": "sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==", + "dev": true + }, + "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 + }, + "pupa": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "dev": true, + "requires": { + "escape-goat": "^2.0.0" + }, + "dependencies": { + "escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "dev": true + } + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "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 + }, + "randombytes": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.3.tgz", + "integrity": "sha512-lDVjxQQFoCG1jcrP06LNo2lbWp4QTShEXnhActFBwYuHprllQV6VUpwreApsYqCgD+N1mHoqJ/BI/4eV4R2GYg==", + "dev": true + }, + "randomstring": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/randomstring/-/randomstring-1.2.2.tgz", + "integrity": "sha512-9FByiB8guWZLbE+akdQiWE3I1I6w7Vn5El4o4y7o5bWQ6DWPcEOp+aLG7Jezc8BVRKKpgJd2ppRX0jnKu1YCfg==", + "dev": true, + "requires": { + "array-uniq": "1.0.2", + "randombytes": "2.0.3" + } + }, + "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" + }, + "dependencies": { + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true + } + } + }, + "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": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "hosted-git-info": { + "version": "2.8.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 + }, + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "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" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "requires": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + } + }, + "regexp-tree": { + "version": "0.1.24", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.24.tgz", + "integrity": "sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw==", + "dev": true + }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true + }, + "registry-auth-token": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz", + "integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==", + "dev": true, + "requires": { + "rc": "1.2.8" + } + }, + "registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "dev": true, + "requires": { + "rc": "^1.2.8" + } + }, + "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" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "requires": { + "is-core-module": "^2.9.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" + } + }, + "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-global": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", + "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", + "dev": true, + "requires": { + "global-dirs": "^0.1.1" + }, + "dependencies": { + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", + "dev": true, + "requires": { + "ini": "^1.3.4" + } + } + } + }, + "responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dev": true, + "requires": { + "lowercase-keys": "^2.0.0" + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "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-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true + }, + "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" + } + }, + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "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": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", + "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==", + "dev": true, + "requires": { + "regexp-tree": "~0.1.1" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "scoped-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/scoped-regex/-/scoped-regex-2.1.0.tgz", + "integrity": "sha512-g3WxHrqSWCZHGHlSrF51VXFdjImhwvH8ZO/pryFH56Qi0cDsZfylQa/t0jCzVQFNbNvM00HfHjkDPEuarKDSWQ==", + "dev": true + }, + "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, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "dev": true, + "requires": { + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "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 + }, + "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 + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "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 + }, + "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.12", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", + "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", + "dev": true + }, + "split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, + "requires": { + "through": "2" + } + }, + "split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "dev": true, + "requires": { + "readable-stream": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "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" + } + }, + "stacktracey": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/stacktracey/-/stacktracey-2.1.8.tgz", + "integrity": "sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==", + "dev": true, + "requires": { + "as-table": "^1.0.36", + "get-source": "^2.0.12" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "string-width": { + "version": "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-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-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "requires": { + "min-indent": "^1.0.0" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "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 + }, + "swagger-parser": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/swagger-parser/-/swagger-parser-10.0.3.tgz", + "integrity": "sha512-nF7oMeL4KypldrQhac8RyHerJeGPD1p2xDh900GPvc+Nk7nWP6jX2FcC7WmkinMoAmoO774+AFXcWsW8gMWEIg==", + "dev": true, + "requires": { + "@apidevtools/swagger-parser": "10.0.3" + }, + "dependencies": { + "@apidevtools/swagger-parser": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/@apidevtools/swagger-parser/-/swagger-parser-10.0.3.tgz", + "integrity": "sha512-sNiLY51vZOmSPFZA5TF35KZ2HbgYklQnTSDnkghamzLb3EkNtcQnrBQEj5AOCxHpTtXpqMCRM1CrmV2rG6nw4g==", + "dev": true, + "requires": { + "@apidevtools/json-schema-ref-parser": "^9.0.6", + "@apidevtools/openapi-schemas": "^2.0.4", + "@apidevtools/swagger-methods": "^3.0.2", + "@jsdevtools/ono": "^7.1.3", + "call-me-maybe": "^1.0.1", + "z-schema": "^5.0.1" + } + }, + "openapi-types": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.0.2.tgz", + "integrity": "sha512-GuTo7FyZjOIWVhIhQSWJVaws6A82sWIGyQogxxYBYKZ0NBdyP2CYSIgOwFfSB+UVoPExk/YzFpyYitHS8KVZtA==", + "dev": true, + "peer": true + } + } + }, + "swagger-schema-official": { + "version": "2.0.0-bab6bed", + "resolved": "https://registry.npmjs.org/swagger-schema-official/-/swagger-schema-official-2.0.0-bab6bed.tgz", + "integrity": "sha512-rCC0NWGKr/IJhtRuPq/t37qvZHI/mH4I4sxflVM+qgVe5Z2uOCivzWaVbuioJaB61kvm5UvB7b49E+oBY0M8jA==", + "dev": true + }, + "symbol-observable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-3.0.0.tgz", + "integrity": "sha512-6tDOXSHiVjuCaasQSWTmHUWn4PuG7qa3+1WT031yTc/swT7+rLiw3GOrFxaH1E3lLP09dH3bVuVDf2gK5rxG3Q==", + "dev": true + }, + "terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + } + }, + "text-extensions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", + "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", + "dev": true + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "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 + }, + "through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dev": true, + "requires": { + "readable-stream": "3" + } + }, + "time-span": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/time-span/-/time-span-4.0.0.tgz", + "integrity": "sha512-MyqZCTGLDZ77u4k+jqg4UlrzPTPZ49NDlaekU6uuFaJLzPIN1woaRXCbGeqOfxwc3Y37ZROGAJ614Rdv7Olt+g==", + "dev": true, + "requires": { + "convert-hrtime": "^3.0.0" + } + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-readable-stream": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-2.1.0.tgz", + "integrity": "sha512-o3Qa6DGg1CEXshSdvWNX2sN4QHqg03SPq7U6jPXRahlQdl5dK8oXjkU/2/sGrnOZKeGV1zLSO8qPwyKklPPE7w==", + "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" + } + }, + "traverse": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", + "integrity": "sha512-kdf4JKs8lbARxWdp7RKdNzoJBhGUcIalSYibuGyHJbmk40pOysQ0+QPvlkCOICOivDWU2IJo2rkrxyTK2AH4fw==", + "dev": true + }, + "trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "dev": true + }, + "ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "requires": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "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 + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "typescript": { + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.3.tgz", + "integrity": "sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==", + "dev": true + }, + "unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dev": true, + "requires": { + "crypto-random-string": "^2.0.0" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + }, + "update-notifier": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", + "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", + "dev": true, + "requires": { + "boxen": "^5.0.0", + "chalk": "^4.1.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.4.0", + "is-npm": "^5.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.1.0", + "pupa": "^2.1.1", + "semver": "^7.3.4", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + }, + "dependencies": { + "global-dirs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", + "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", + "dev": true, + "requires": { + "ini": "2.0.0" + } + }, + "ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true + }, + "is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dev": true, + "requires": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + } + } + } + }, + "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-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", + "dev": true, + "requires": { + "prepend-http": "^2.0.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "vali-date": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", + "integrity": "sha512-sgECfZthyaCKW10N0fm27cg8HYTFK5qMWgypqkXMQ4Wbl/zZKx7xZICgcoxIIE+WFAP/MBL2EFwC/YvLxw3Zeg==", + "dev": true + }, + "valid-url": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz", + "integrity": "sha512-QQDsV8OnSf5Uc30CKSwG9lnhMPe6exHtTXLRYX8uMwKENy640pU+2BgBL0LRbDh/eYRahNCS7aewCx0wf3NYVA==", + "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" + } + }, + "validator": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", + "dev": true + }, + "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" + } + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "requires": { + "defaults": "^1.0.3" + } + }, + "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" + } + }, + "widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dev": true, + "requires": { + "string-width": "^4.0.0" + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "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" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "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" + } + }, + "xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "dev": true + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true + }, + "yargs": { + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", + "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", + "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.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + }, + "dependencies": { + "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 + } + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + }, + "youch": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/youch/-/youch-3.2.2.tgz", + "integrity": "sha512-+xhTK8sY9qV3nLbWVaOUFZPdlQ3wrMKiu3dKqKkAkLaYzzkYmpWY+v+eQIAfbPu7TZhS1G5FhEV++sl8fhuT4w==", + "dev": true, + "requires": { + "cookie": "^0.5.0", + "mustache": "^4.2.0", + "stacktracey": "^2.1.8" + } + }, + "youch-terminal": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/youch-terminal/-/youch-terminal-2.1.5.tgz", + "integrity": "sha512-ObQ2GeG0LnIGiOAq0rLaEdCC8Z+fHlMFcJqsQcLBWo36zlj2GViS7pOKjRGdJ4pJl4ofZmU77O7gwd6lId67PA==", + "dev": true, + "requires": { + "kleur": "^4.1.5" + } + }, + "z-schema": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.4.tgz", + "integrity": "sha512-gm/lx3hDzJNcLwseIeQVm1UcwhWIKpSB4NqH89pTBtFns4k/HDHudsICtvG05Bvw/Mv3jMyk700y5dadueLHdA==", + "dev": true, + "requires": { + "commander": "^2.20.3", + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.7.0" + }, + "dependencies": { + "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, + "optional": true + } + } + } + } +} diff --git a/package.json b/package.json index 45ee899..904aa87 100644 --- a/package.json +++ b/package.json @@ -1,112 +1,56 @@ { "name": "@adonisjs/fold", "version": "8.2.0", - "description": "Dependency manager and IoC container for your next NodeJs application", - "main": "build/index.js", + "description": "Simplest and straight forward implementation for IoC container in JavaScript", "files": [ - "build/src", - "build/index.d.ts", - "build/index.js" + "src", + "index.js" ], + "type": "module", + "exports": { + ".": "./index.js" + }, "scripts": { - "mrm": "mrm --preset=@adonisjs/mrm-preset", "pretest": "npm run lint", - "test": "node -r @adonisjs/require-ts/build/register bin/test.ts", - "lint": "eslint . --ext=.ts", + "test": "node --loader=ts-node/esm bin/test.ts", "clean": "del-cli build", "compile": "npm run lint && npm run clean && tsc", "build": "npm run compile", - "commit": "git-cz", "release": "np --message=\"chore(release): %s\"", "version": "npm run build", - "sync-labels": "github-label-sync --labels ./node_modules/@adonisjs/mrm-preset/gh-labels.json adonisjs/fold", + "prepublishOnly": "npm run build", + "lint": "eslint . --ext=.ts", "format": "prettier --write .", - "prepublishOnly": "npm run build" - }, - "author": "adonisjs,virk", - "license": "MIT", - "repository": { - "type": "git", - "url": "git+https://github.com/poppinss/adonis-fold.git" + "sync-labels": "github-label-sync --labels .github/labels.json adonisjs/fold" }, - "keywords": [ - "ioc", - "dependency", - "injection", - "service", - "provider", - "autoloading" - ], - "bugs": { - "url": "https://github.com/poppinss/adonis-fold/issues" + "publishConfig": { + "access": "public", + "tag": "latest" }, - "homepage": "https://github.com/poppinss/adonis-fold#readme", + "keywords": ["ioc", "container"], + "author": "virk,adonisjs", + "license": "MIT", "devDependencies": { - "@adonisjs/mrm-preset": "^5.0.3", - "@adonisjs/require-ts": "^2.0.12", - "@japa/assert": "^1.3.5", - "@japa/run-failed-tests": "^1.0.8", - "@japa/runner": "^2.1.1", - "@japa/spec-reporter": "^1.2.0", - "@poppinss/dev-utils": "^2.0.3", - "@types/node": "^18.7.15", - "benchmark": "^2.1.4", - "commitizen": "^4.2.5", - "cz-conventional-changelog": "^3.3.0", - "del-cli": "^5.0.0", - "eslint": "^8.23.0", + "@commitlint/cli": "^17.0.2", + "@commitlint/config-conventional": "^17.0.2", + "@japa/assert": "^1.3.4", + "@japa/run-failed-tests": "^1.0.7", + "@japa/runner": "^2.0.9", + "@japa/spec-reporter": "^1.1.12", + "@swc/core": "^1.2.203", + "@types/node": "^18.0.0", + "del-cli": "^4.0.1", + "ejs": "^3.1.8", + "eslint": "^8.17.0", "eslint-config-prettier": "^8.5.0", - "eslint-plugin-adonis": "^2.1.0", - "eslint-plugin-prettier": "^4.2.1", + "eslint-plugin-adonis": "^3.0.2", + "eslint-plugin-prettier": "^4.0.0", "github-label-sync": "^2.2.0", "husky": "^8.0.1", - "mrm": "^4.1.0", - "np": "^7.6.2", + "np": "^7.6.1", "prettier": "^2.7.1", - "reflect-metadata": "^0.1.13", - "typescript": "^4.8.2" - }, - "nyc": { - "exclude": [ - "test" - ], - "extension": [ - ".ts" - ] - }, - "husky": { - "hooks": { - "commit-msg": "node ./node_modules/@adonisjs/mrm-preset/validateCommit/conventional/validate.js" - } - }, - "config": { - "commitizen": { - "path": "cz-conventional-changelog" - } - }, - "np": { - "contents": ".", - "anyBranch": false - }, - "dependencies": { - "@poppinss/utils": "^5.0.0" - }, - "publishConfig": { - "access": "public", - "tag": "latest" - }, - "mrmConfig": { - "core": true, - "license": "MIT", - "services": [ - "github-actions" - ], - "minNodeVersion": "14.15.4", - "probotApps": [ - "stale", - "lock" - ], - "runGhActionsOnWindows": false + "ts-node": "^10.8.1", + "typescript": "^4.7.3" }, "eslintConfig": { "extends": [ @@ -137,5 +81,16 @@ "bracketSpacing": true, "arrowParens": "always", "printWidth": 100 + }, + "commitlint": { + "extends": [ + "@commitlint/config-conventional" + ] + }, + "np": { + "message": "chore(release): %s", + "tag": "latest", + "branch": "main", + "anyBranch": false } } diff --git a/perf/foo.js b/perf/foo.js deleted file mode 100644 index 4ba52ba..0000000 --- a/perf/foo.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = {} diff --git a/perf/index.js b/perf/index.js deleted file mode 100644 index d9e321c..0000000 --- a/perf/index.js +++ /dev/null @@ -1,42 +0,0 @@ -const Benchmark = require('benchmark') -const suite = new Benchmark.Suite() - -const { Ioc } = require('..') -const ioc = new Ioc() -const ioc1 = new Ioc(true) - -function bind(container) { - container.bind('App/Config', () => { - return 'config' - }) - - container.bind('App/Logger', () => { - return 'logger' - }) - - container.bind('App/Server', (app) => { - return `${app.use('App/Config')}-${app.use('App/Logger')}` - }) -} - -bind(ioc) -bind(ioc1) - -suite - .add('No emitter', function () { - ioc.use('App/Server') - ioc.use('App/Config') - ioc.use('App/Logger') - }) - .add('Emitter', function () { - ioc1.use('App/Server') - ioc1.use('App/Config') - ioc1.use('App/Logger') - }) - .on('cycle', function (event) { - console.log(String(event.target)) - }) - .on('complete', function () { - console.log('Fastest is ' + this.filter('fastest').map('name')) - }) - .run({ async: true }) diff --git a/perf/require.js b/perf/require.js deleted file mode 100644 index 474b69e..0000000 --- a/perf/require.js +++ /dev/null @@ -1,21 +0,0 @@ -const Benchmark = require('benchmark') -const suite = new Benchmark.Suite() - -const { Ioc } = require('..') -const ioc = new Ioc() - -/** - * Bind require as a singleton to IoC container - */ -ioc.alias(__dirname, 'perf') - -suite - .add('Ioc use', () => ioc.use('perf/foo')) /** IoC container */ - .add('require', () => require('./foo')) /** Require */ - .on('cycle', function (event) { - console.log(String(event.target)) - }) - .on('complete', function () { - console.log('Fastest is ' + this.filter('fastest').map('name')) - }) - .run({ async: true }) diff --git a/src/Contracts/index.ts b/src/Contracts/index.ts deleted file mode 100644 index 95afd0e..0000000 --- a/src/Contracts/index.ts +++ /dev/null @@ -1,412 +0,0 @@ -/* - * @adonisjs/fold - * - * (c) Harminder Virk - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -type Function = (...args: any[]) => any - -export type ExtractFunctions = { - [P in keyof T]: T[P] extends Function ? P : never -}[keyof T] - -/** - * Unwraps the promise - */ -type UnWrapPromise = T extends Promise ? U : T - -/** - * Shape of the bind callback method - */ -export type BindCallback = ( - container: Container -) => ReturnValue - -/** - * Shape of the fake callback method - */ -export type FakeCallback = ( - container: Container, - originalValue: ReturnValue -) => ReturnValue - -/** - * Shape of resolved lookup node, resolved using `getResolver().resolve()` - * method. - */ -export type IocResolverLookupNode = { - namespace: Namespace - type: 'binding' | 'alias' - method: string -} - -/** - * Shape of class constructor - */ -export type Constructor = new (...args: any[]) => T - -/** - * Shape of class constructor with `makePlain` property - */ -export type PlainConstructor = { - makePlain: true -} - -/** - * Type of the "withBindings" method - */ -export interface WithBindings { - ( - namespaces: [...Bindings], - cb: ( - ...args: { - [M in keyof Bindings]: Bindings[M] extends keyof ContainerBindings - ? ContainerBindings[Bindings[M]] - : any - } - ) => void - ): void - ( - namespaces: readonly [...Namespace], - cb: ( - ...args: { - [M in keyof Namespace]: Namespace[M] extends keyof ContainerBindings - ? ContainerBindings[Namespace[M]] - : any - } - ) => void - ): void -} - -/** - * Finding return type of the `ioc.make` method based upon the - * input argument. - * - * - String and LookupNode = Returns any - * - Class constructor with "makePlain" are returned as it is - * - Otherwise an instance of the class constructor is returned - * - All other values are returned as it is - */ -export type InferMakeType = T extends string | LookupNode - ? any - : T extends PlainConstructor - ? T - : T extends Constructor - ? A - : T - -/** - * Shape of lookup node pulled using `ioc.lookup` method. This node - * can be passed to `ioc.use`, or `ioc.make` to skip many checks - * and resolve the binding right away. - */ -export type LookupNode = { - namespace: Namespace - type: 'binding' | 'alias' -} - -/** - * Ioc container interface - */ -export interface IocContract { - /** - * Registered aliases. The key is the alias and value is the - * absolute directory path - */ - importAliases: { [alias: string]: string } - - /** - * Enable/disable proxies. Proxies are mainly required for fakes to - * work - */ - useProxies(enable?: boolean): this - - /** - * Define the module type for resolving auto import aliases. Defaults - * to `cjs` - */ - module: 'cjs' | 'esm' - - /** - * Register a binding with a callback. The callback return value will be - * used when binding is resolved - */ - bind( - binding: Binding, - callback: BindCallback - ): this - bind( - binding: Binding, - callback: BindCallback< - Binding extends keyof ContainerBindings ? ContainerBindings[Binding] : any, - this - > - ): this - - /** - * Same as the [[bind]] method, but registers a singleton only. Singleton's callback - * is invoked only for the first time and then the cached value is used - */ - singleton( - binding: Binding, - callback: BindCallback - ): this - singleton( - binding: Binding, - callback: BindCallback< - Binding extends keyof ContainerBindings ? ContainerBindings[Binding] : any, - this - > - ): this - - /** - * Define an import alias - */ - alias(absolutePath: string, alias: string): this - - /** - * Register a fake for a namespace. Fakes works both for "bindings" and "import aliases". - * Fakes only work when proxies are enabled using "useProxies". - */ - fake( - namespace: Namespace, - callback: FakeCallback - ): this - fake( - namespace: Namespace, - callback: FakeCallback< - Namespace extends keyof ContainerBindings ? ContainerBindings[Namespace] : any, - this - > - ): this - - /** - * Clear selected or all the fakes. Calling the method with no arguments - * will clear all the fakes - */ - restore(namespace?: Namespace): this - restore(namespace?: string): this - - /** - * Find if a fake has been registered for a given namespace - */ - hasFake(namespace: Namespace): boolean - hasFake(namespace: string): boolean - - /** - * Find if a binding exists for a given namespace - */ - hasBinding(namespace: Binding): boolean - hasBinding(namespace: string): boolean - - /** - * Find if a namespace is part of the auto import aliases. Returns false, when namespace - * is an alias path but has an explicit binding too - */ - isAliasPath(namespace: string): boolean - - /** - * Lookup a namespace. The output contains the complete namespace, - * along with its type. The type is an "alias" or a "binding". - * - * Null is returned when unable to lookup the namespace inside the container - * - * Note: This method just checks if a namespace is registered or binding - * or can be it resolved from auto import aliases or not. However, - * it doesn't check for the module existence on the disk. - * - * Optionally you can define a prefix namespace - * to be used to build the complete namespace. For example: - * - * - namespace: UsersController - * - prefixNamespace: App/Controllers/Http - * - Output: App/Controllers/Http/UsersController - * - * Prefix namespace is ignored for absolute namespaces. For example: - * - * - namespace: /App/UsersController - * - prefixNamespace: App/Controllers/Http - * - Output: App/UsersController - */ - lookup>( - namespace: Namespace | LookupNode, - prefixNamespace?: string - ): LookupNode - lookup( - namespace: Namespace | LookupNode, - prefixNamespace?: string - ): Namespace extends keyof ContainerBindings ? LookupNode : LookupNode | null - - /** - * Same as [[lookup]]. But raises exception instead of returning null - */ - lookupOrFail>( - namespace: Namespace | LookupNode, - prefixNamespace?: string - ): LookupNode - lookupOrFail( - namespace: Namespace | LookupNode, - prefixNamespace?: string - ): Namespace extends keyof ContainerBindings ? LookupNode : LookupNode - - /** - * Resolve a binding by invoking the binding factory function. An exception - * is raised, if the binding namespace is unregistered. - */ - resolveBinding>( - binding: Binding - ): ContainerBindings[Binding] - resolveBinding( - namespace: Binding - ): Binding extends keyof ContainerBindings ? ContainerBindings[Binding] : any - - /** - * Import namespace from the auto import aliases. This method assumes you are - * using native ES modules - */ - import(namespace: string): Promise - - /** - * Same as the "import" method, but uses CJS for requiring the module from its - * path - */ - require(namespace: string): any - - /** - * The use method looks up a namespace inside both the bindings and the - * auto import aliases - */ - use>( - lookupNode: Binding | LookupNode - ): ContainerBindings[Binding] - use( - lookupNode: Binding | LookupNode - ): Binding extends keyof ContainerBindings ? ContainerBindings[Binding] : any - - /** - * Same as the [[use]] method, but instead uses ES modules for resolving - * the auto import aliases - */ - useAsync>( - lookupNode: Binding | LookupNode - ): Promise - useAsync( - lookupNode: Binding | LookupNode - ): Promise - - /** - * Makes an instance of the class by first resolving it. - */ - make>( - lookupNode: Binding | LookupNode, - args?: any[] - ): ContainerBindings[Binding] - make( - value: T | LookupNode, - args?: any[] - ): T extends keyof ContainerBindings ? ContainerBindings[T] : InferMakeType - - /** - * Same as the [[make]] method, but instead uses ES modules for resolving - * the auto import aliases - */ - makeAsync>( - lookupNode: Binding | LookupNode, - args?: any[] - ): Promise - makeAsync( - value: T | LookupNode, - args?: any[] - ): Promise> - - /** - * The "withBindings" method invokes the defined callback when it is - * able to resolve all the mentioned bindings. - */ - withBindings: WithBindings - - /** - * @deprecated: Use "withBindings" instead - */ - with: WithBindings - - /** - * Call a method on an object and automatically inject its depdencies - */ - call>( - target: T, - method: Method, - args?: any[] - ): T[Method] extends Function ? ReturnType : any - - /** - * Call a method on an object and automatically inject its depdencies - */ - callAsync>( - target: T, - method: Method, - args?: any[] - ): T[Method] extends Function ? Promise>> : Promise - - /** - * Trap container lookup calls. It includes - * - * - Ioc.use - * - Ioc.useAsync - * - Ioc.make - * - Ioc.makeAsync - * - Ioc.require - * - Ioc.import - * - Ioc.resolveBinding - */ - trap(callback: (namespace: string) => any): this - - /** - * Returns the resolver instance to resolve Ioc container bindings with - * little ease. Since, the IocResolver uses an in-memory cache to - * improve the lookup speed, we suggest keeping a reference to - * the output of this method to leverage caching - */ - getResolver( - fallbackMethod?: string, - rcNamespaceKey?: string, - fallbackNamespace?: string - ): IocResolverContract -} - -/** - * IoC resolver allows resolving IoC container bindings by defining - * prefix namespaces - */ -export interface IocResolverContract { - /** - * Resolve IoC container binding - */ - resolve>( - namespace: Namespace, - prefixNamespace?: string - ): IocResolverLookupNode - resolve( - namespace: Namespace, - prefixNamespace?: string - ): Namespace extends keyof ContainerBindings - ? IocResolverLookupNode - : IocResolverLookupNode - - /** - * Call method on an IoC container binding - */ - call>( - namespace: Namespace | string, - prefixNamespace?: string, - args?: any[] | ((instance: any) => any[]) - ): Promise - call>( - namespace: IocResolverLookupNode, - prefixNamespace: undefined, - args?: any[] | ((instance: any) => any[]) - ): Promise -} diff --git a/src/Exceptions/InvalidInjectionException.ts b/src/Exceptions/InvalidInjectionException.ts deleted file mode 100644 index 9706804..0000000 --- a/src/Exceptions/InvalidInjectionException.ts +++ /dev/null @@ -1,23 +0,0 @@ -/* - * @adonisjs/fold - * - * (c) Harminder Virk - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -import { Exception } from '@poppinss/utils' - -/** - * Raised when trying to inject a primitive value like "StringConstructor" - * to a class constructor or method - */ -export class InvalidInjectionException extends Exception { - public static invoke(value: any, parentName: string, index: number) { - const primitiveName = `{${value.name} Constructor}` - return new this( - `Cannot inject "${primitiveName}" to "${parentName}" at position "${index + 1}"` - ) - } -} diff --git a/src/Exceptions/IocLookupException.ts b/src/Exceptions/IocLookupException.ts deleted file mode 100644 index fc6fc1d..0000000 --- a/src/Exceptions/IocLookupException.ts +++ /dev/null @@ -1,41 +0,0 @@ -/* - * @adonisjs/fold - * - * (c) Harminder Virk - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -import { Exception } from '@poppinss/utils' - -/** - * Raised when unable to lookup a namespace - */ -export class IocLookupException extends Exception { - public static lookupFailed(namespace: string) { - return new this( - `Cannot resolve "${namespace}" namespace from the IoC Container`, - 500, - 'E_IOC_LOOKUP_FAILED' - ) - } - - /** - * Invalid namespace type - */ - public static invalidNamespace() { - return new this( - '"Ioc.lookup" accepts a namespace string or a lookup node', - 500, - 'E_INVALID_IOC_NAMESPACE' - ) - } - - /** - * Fake is missing and yet resolved - */ - public static missingFake(namespace: string) { - return new this(`Cannot resolve fake for "${namespace}" namespace`, 500, 'E_MISSING_IOC_FAKE') - } -} diff --git a/src/Ioc/Bindings.ts b/src/Ioc/Bindings.ts deleted file mode 100644 index 4963ed7..0000000 --- a/src/Ioc/Bindings.ts +++ /dev/null @@ -1,70 +0,0 @@ -/* - * @adonisjs/fold - * - * (c) Harminder Virk - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -import { IocContract, BindCallback } from '../Contracts' -import { IocLookupException } from '../Exceptions/IocLookupException' - -/** - * Manages the IoC container bindings - */ -export class Bindings { - /** - * Registered bindings - */ - private list: Map< - string, - { - callback: BindCallback - cachedValue?: any - singleton: boolean - } - > = new Map() - - constructor(private container: IocContract) {} - - /** - * Find if namespace is a binding - */ - public has(namespace: string): boolean { - return this.list.has(namespace) - } - - /** - * Define a binding - */ - public register( - binding: string, - callback: BindCallback, - singleton: boolean - ): this { - this.list.set(binding, { callback, singleton }) - return this - } - - /** - * Resolve a binding. An exception is raised, if the binding is missing - */ - public resolve(binding: string) { - const bindingNode = this.list.get(binding) - if (!bindingNode) { - throw IocLookupException.lookupFailed(binding) - } - - let resolvedValue: any - - if (bindingNode.singleton) { - bindingNode.cachedValue = bindingNode.cachedValue ?? bindingNode.callback(this.container) - resolvedValue = bindingNode.cachedValue - } else { - resolvedValue = bindingNode.callback(this.container) - } - - return resolvedValue - } -} diff --git a/src/Ioc/Fakes.ts b/src/Ioc/Fakes.ts deleted file mode 100644 index d3463d9..0000000 --- a/src/Ioc/Fakes.ts +++ /dev/null @@ -1,67 +0,0 @@ -/* - * @adonisjs/fold - * - * (c) Harminder Virk - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -import { FakeCallback, IocContract } from '../Contracts' -import { IocLookupException } from '../Exceptions/IocLookupException' - -/** - * Manages the container fakes - */ -export class Fakes { - /** - * Registered fakes - */ - private list: Map; cachedValue?: any }> = - new Map() - - constructor(private container: IocContract) {} - - /** - * Register a fake for a given namespace - */ - public register(namespace: string, callback: FakeCallback): this { - this.list.set(namespace, { callback }) - return this - } - - /** - * Find if namespace has a fake registered - */ - public has(namespace: string): boolean { - return this.list.has(namespace) - } - - /** - * Clear all fakes - */ - public clear() { - return this.list.clear() - } - - /** - * Delete fake for a given namespace - */ - public delete(namespace: string) { - return this.list.delete(namespace) - } - - /** - * Resolve the fake for a given namespace. An exception is raised if - * not fake is defined - */ - public resolve(namespace: string, originalValue: any): boolean { - const fake = this.list.get(namespace) - if (!fake) { - throw IocLookupException.missingFake(namespace) - } - - fake.cachedValue = fake.cachedValue ?? fake.callback(this.container, originalValue) - return fake.cachedValue - } -} diff --git a/src/Ioc/ImportAliases.ts b/src/Ioc/ImportAliases.ts deleted file mode 100644 index cc0e728..0000000 --- a/src/Ioc/ImportAliases.ts +++ /dev/null @@ -1,119 +0,0 @@ -/* - * @adonisjs/fold - * - * (c) Harminder Virk - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -import { normalize } from 'path' -import { IocContract } from '../Contracts' -import { IocLookupException } from '../Exceptions/IocLookupException' - -/** - * Manages the import aliases - */ -export class ImportAliases { - /** - * Registered aliases - */ - public list: { [alias: string]: string } = {} - - /** - * In-memory require cache to speed up lookup calls. Yes, "require" - * is slow. Check "perf/require.js" - */ - private requireCache: Map = new Map() - - constructor(private container: IocContract) {} - - /** - * Returns the matching alias for the given namespace - */ - private getPathAlias(namespace: string): string | undefined { - return Object.keys(this.list).find((alias) => { - return namespace.startsWith(`${alias}/`) - }) - } - - /** - * Returns path for a given alias - */ - private makeAliasPath(namespace: string, alias: string) { - return normalize(namespace.replace(alias, this.list[alias])) - } - - /** - * Register an import alias - */ - public register(absolutePath: string, alias: string): this { - this.list[alias] = absolutePath - return this - } - - /** - * Find if a namespace is part of the import aliases - */ - public has(namespace: string): boolean { - return !!this.getPathAlias(namespace) - } - - /** - * Import the namespace from the registered import aliases. - */ - public resolve(namespace: string) { - const alias = this.getPathAlias(namespace) - if (!alias) { - throw IocLookupException.lookupFailed(namespace) - } - - const cacheItem = this.requireCache.get(namespace) - if (cacheItem) { - return cacheItem.value - } - - /** - * Absolute path to the module - */ - const diskPath = this.makeAliasPath(namespace, alias) - - /** - * Require the module - */ - const value = require(diskPath) - - /** - * Cache the output - */ - this.requireCache.set(namespace, { diskPath, value }) - - /** - * Return the value - */ - return value - } - - /** - * Same as [[resolve]] but uses ES modules - */ - public async resolveAsync(namespace: string) { - /** - * Piggy back on resolve when using cjs module system - */ - if (this.container.module === 'cjs') { - return this.resolve(namespace) - } - - const alias = this.getPathAlias(namespace) - if (!alias) { - throw IocLookupException.lookupFailed(namespace) - } - - /** - * Import the module. The following code will only compile to esm - * when the output of this build is esm - */ - return import(this.makeAliasPath(namespace, alias)) - } -} diff --git a/src/Ioc/Injector.ts b/src/Ioc/Injector.ts deleted file mode 100644 index 83c5e09..0000000 --- a/src/Ioc/Injector.ts +++ /dev/null @@ -1,168 +0,0 @@ -/* - * @adonisjs/fold - * - * (c) Harminder Virk - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -import { IocContract } from '../Contracts' -import { isPrimtiveConstructor } from '../helpers' -import { types } from '@poppinss/utils/build/helpers' -import { InvalidInjectionException } from '../Exceptions/InvalidInjectionException' - -/** - * Exposes the API to injecting dependencies to a class or a method - */ -export class Injector { - constructor(private container: IocContract) {} - - /** - * Resolves the injections to be injected to a method or the - * class constructor - */ - private resolve(targetName: string, injections: any[], runtimeValues: any[]): any[] { - /** - * If the runtime values length is greater or same as the length - * of injections, then we treat them as the source of truth - * and inject them as it is - */ - if (runtimeValues.length >= injections.length) { - return runtimeValues - } - - /** - * Loop over all the injections and give preference to runtime value - * for a given index, otherwise fallback to `container.make`. - */ - return injections.map((injection: any, index: number) => { - if (runtimeValues[index] !== undefined) { - return runtimeValues[index] - } - - /** - * Disallow object and primitive constructors - */ - if (isPrimtiveConstructor(injection)) { - throw InvalidInjectionException.invoke(injections[index], targetName, index) - } - - return this.container.make(injection) - }) - } - - /** - * Resolves the injections to be injected to a method or the - * class constructor - */ - private async resolveAsync( - targetName: string, - injections: any[], - runtimeValues: any[] - ): Promise { - /** - * If the runtime values length is greater or same as the length - * of injections, then we treat them as the source of truth - * and inject them as it is - */ - if (runtimeValues.length >= injections.length) { - return runtimeValues - } - - /** - * Loop over all the injections and give preference to runtime value - * for a given index, otherwise fallback to `container.makeAsync`. - */ - return Promise.all( - injections.map((injection: any, index: number) => { - if (runtimeValues[index] !== undefined) { - return runtimeValues[index] - } - - /** - * Disallow object and primitive constructors - */ - if (isPrimtiveConstructor(injection)) { - throw InvalidInjectionException.invoke(injections[index], targetName, index) - } - - return this.container.makeAsync(injection) - }) - ) - } - - /** - * Find if the value can be instantiated - */ - private isNewable(target: any) { - return (types.isFunction(target) || types.isClass(target)) && target.makePlain !== true - } - - /** - * Get injections for a given property from the target - */ - private getInjections(target: any, prop: string): any[] { - return target.hasOwnProperty('inject') ? target.inject[prop] || [] : [] - } - - /** - * Inject dependencies to the constructor of the class - */ - public make(target: any, runtimeValues: any[]) { - if (!this.isNewable(target)) { - return target - } - - return new target( - ...this.resolve(target.name, this.getInjections(target, 'instance'), runtimeValues) - ) - } - - /** - * Inject dependencies asynchronously to the constructor of the class - */ - public async makeAsync(target: any, runtimeValues: any[]) { - if (!this.isNewable(target)) { - return target - } - - return new target( - ...(await this.resolveAsync( - target.name, - this.getInjections(target, 'instance'), - runtimeValues - )) - ) - } - - /** - * Injects dependencies to the class method - */ - public call(target: any, method: string, runtimeValues: any[]) { - const constructor = target.constructor - - return target[method]( - ...this.resolve( - `${constructor.name}.${method}`, - this.getInjections(constructor, method), - runtimeValues - ) - ) - } - - /** - * Injects dependencies asynchronously to the class method - */ - public async callAsync(target: any, method: string, runtimeValues: any[]) { - const constructor = target.constructor - - return target[method]( - ...(await this.resolveAsync( - `${constructor.name}.${method}`, - this.getInjections(constructor, method), - runtimeValues - )) - ) - } -} diff --git a/src/Ioc/IocProxy.ts b/src/Ioc/IocProxy.ts deleted file mode 100644 index 3fcc9df..0000000 --- a/src/Ioc/IocProxy.ts +++ /dev/null @@ -1,117 +0,0 @@ -/* - * @adonisjs/fold - * - * (c) Harminder Virk - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -import type { Fakes } from './Fakes' - -function getBindingValue(handler: { options: Fakes; namespace: string; value: any }) { - return handler.options.has(handler.namespace) - ? handler.options.resolve(handler.namespace, handler.value) - : handler.value -} - -/** - * Proxy handler to handle objects - */ -const objectHandler = (options: { options: Fakes; namespace: string; value: any }) => { - return { - get(_: object, key: string, receiver?: any) { - const descriptor = Object.getOwnPropertyDescriptor(options.value, key) - - /** - * Handling the proxy invariants use case. Learn more - * - * https://262.ecma-international.org/8.0/#sec-proxy-object-internal-methods-and-internal-slots-get-p-receiver - * - * Check the following "get" trap - * https://github.com/kpruden/on-change/blob/5b80da1f5f7ac80c37d7bd19122188acb7ad0b19/index.js#L44-L66 - */ - if (descriptor && !descriptor.configurable) { - if (descriptor.set && !descriptor.get) { - return undefined - } - if (descriptor.writable === false) { - return Reflect.get(options.value, key, receiver) - } - } - - return Reflect.get(getBindingValue(options), key, receiver) - }, - - apply(_: object, thisArgument: any, args: any[]) { - return Reflect.apply(getBindingValue(options), thisArgument, args) - }, - - defineProperty(_: object, propertyKey: PropertyKey, attributes: PropertyDescriptor) { - return Reflect.defineProperty(getBindingValue(options), propertyKey, attributes) - }, - - deleteProperty(_: object, propertyKey: PropertyKey) { - return Reflect.deleteProperty(getBindingValue(options), propertyKey) - }, - - getOwnPropertyDescriptor(_: object, propertyKey: PropertyKey) { - return Reflect.getOwnPropertyDescriptor(getBindingValue(options), propertyKey) - }, - - getPrototypeOf(_: object) { - return Reflect.getPrototypeOf(getBindingValue(options)) - }, - - has(_: object, propertyKey: PropertyKey) { - return Reflect.has(getBindingValue(options), propertyKey) - }, - - isExtensible(_: object) { - return Reflect.isExtensible(getBindingValue(options)) - }, - - ownKeys(_: object) { - return Reflect.ownKeys(getBindingValue(options)) - }, - - preventExtensions() { - throw new Error('Cannot prevent extensions during a fake') - }, - - set(_: object, propertyKey: PropertyKey, value: any, receiver?: any) { - return Reflect.set(getBindingValue(options), propertyKey, value, receiver) - }, - - setPrototypeOf(_: object, proto: object | null) { - return Reflect.setPrototypeOf(getBindingValue(options), proto) - }, - } -} - -/** - * Proxy handler to handle classes and functions - */ -const classHandler = (options: { options: Fakes; namespace: string; value: any }) => { - return Object.assign({}, objectHandler(options), { - construct(_: object, args: any[], newTarget?: any) { - return Reflect.construct(getBindingValue(options), args, newTarget) - }, - }) -} - -/** - * Proxies the objects to fallback to fake, when it exists. - */ -export class IocProxyObject { - constructor(public namespace: string, public value: any, public options: Fakes) { - return new Proxy(value, objectHandler({ namespace, value, options })) - } -} - -/** - * Proxies the class constructor to fallback to fake, when it exists. - */ -export function IocProxyClass(namespace: string, value: any, options: Fakes) { - return new Proxy(value, classHandler({ namespace, value, options })) -} diff --git a/src/Ioc/index.ts b/src/Ioc/index.ts deleted file mode 100644 index edea6e8..0000000 --- a/src/Ioc/index.ts +++ /dev/null @@ -1,552 +0,0 @@ -/* - * @adonisjs/fold - * - * (c) Harminder Virk - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -import { Exception } from '@poppinss/utils' -import { types } from '@poppinss/utils/build/helpers' -import { IocContract, BindCallback, FakeCallback, LookupNode, InferMakeType } from '../Contracts' - -import { Fakes } from './Fakes' -import { Bindings } from './Bindings' -import { Injector } from './Injector' -import { IocResolver } from '../Resolver' -import { ImportAliases } from './ImportAliases' -import { ensureIsFunction, isEsm } from '../helpers' -import { IocProxyClass, IocProxyObject } from './IocProxy' -import { IocLookupException } from '../Exceptions/IocLookupException' - -export class Ioc implements IocContract { - private fakes: Fakes = new Fakes(this) - private bindings: Bindings = new Bindings(this) - private injector: Injector = new Injector(this) - private aliases: ImportAliases = new ImportAliases(this) - - /** - * The current state of using proxies - */ - private usingProxies: boolean = false - - /** - * A custom method to trap `ioc.use` and `ioc.make` statements - */ - private trapCallback: (namespace: string) => any - - /** - * Define the module type for resolving auto import aliases. Defaults - * to `cjs` - */ - public module: 'cjs' | 'esm' = 'cjs' - - /** - * Registered aliases. The key is the alias and value is the - * absolute directory path - */ - public get importAliases(): IocContract['importAliases'] { - return this.aliases.list - } - - /** - * Detect if the module export value is an esm module - */ - private isEsm(value: any) { - return this.module === 'esm' ? true : isEsm(value) - } - - /** - * Wraps object and class to a proxy to enable the fakes - * API - */ - private wrapAsProxy(namespace: string, value: any) { - /** - * Wrap objects inside proxy - */ - if (types.isObject(value)) { - return new IocProxyObject(namespace, value, this.fakes) - } - - /** - * Wrap class inside proxy - */ - if (types.isClass(value)) { - return IocProxyClass(namespace, value, this.fakes) - } - - return value - } - - /** - * Wrap value inside proxy by also inspecting for esm - * default exports - */ - private wrapEsmModuleAsProxy(namespace: string, value: any) { - /** - * Wrap the default export of esm modules inside in a proxy and - * not the entire module - */ - if (this.isEsm(value)) { - if (value.default) { - /** - * We should never mutate the actual ESM module object and always clone it first - * for abvious reasons that objects are shared by reference - */ - const clonedModule = Object.getOwnPropertyNames(value).reduce((result, key) => { - result[key] = value[key] - return result - }, {}) - - clonedModule.default = this.wrapAsProxy(namespace, clonedModule.default) - return clonedModule - } - - /** - * We don't proxy named exports as we don't have a good story on what to proxy - * - * - Should we proxy the whole module? - * - Or should be expose api to allow proxying a selected set of modules - */ - return value - } - - return this.wrapAsProxy(namespace, value) - } - - /** - * Makes an instance of a class by injecting dependencies - */ - private makeRaw(value: T, args?: any[]): InferMakeType { - return this.injector.make(value, args || []) - } - - /** - * Makes an instance of a class asynchronously by injecting dependencies - */ - private async makeRawAsync(value: T, args?: any[]): Promise> { - return this.injector.makeAsync(value, args || []) - } - - /** - * Enable/disable proxies. Proxies are mainly required for fakes to - * work - */ - public useProxies(enable: boolean = true): this { - this.usingProxies = !!enable - return this - } - - /** - * Register a binding with a callback. The callback return value will be - * used when binding is resolved - */ - public bind(binding: string, callback: BindCallback): this { - ensureIsFunction(callback, '"ioc.bind" expect 2nd argument to be a function') - this.bindings.register(binding, callback, false) - return this - } - - /** - * Same as the [[bind]] method, but registers a singleton only. Singleton's callback - * is invoked only for the first time and then the cached value is used - */ - public singleton(binding: string, callback: BindCallback): this { - ensureIsFunction(callback, '"ioc.singleton" expect 2nd argument to be a function') - this.bindings.register(binding, callback, true) - return this - } - - /** - * Define an import alias - */ - public alias(absolutePath: string, alias: string): this { - this.aliases.register(absolutePath, alias) - return this - } - - /** - * Register a fake for a namespace. Fakes works both for "bindings" and "import aliases". - * Fakes only work when proxies are enabled using "useProxies". - */ - public fake(namespace: string, callback: FakeCallback): this { - ensureIsFunction(callback, '"ioc.fake" expect 2nd argument to be a function') - this.fakes.register(namespace, callback) - return this - } - - /** - * Clear selected or all the fakes. Calling the method with no arguments - * will clear all the fakes - */ - public restore(namespace?: string): this { - namespace ? this.fakes.delete(namespace) : this.fakes.clear() - return this - } - - /** - * Find if a fake has been registered for a given namespace - */ - public hasFake(namespace: string): boolean { - return this.fakes.has(namespace) - } - - /** - * Find if a binding exists for a given namespace - */ - public hasBinding(namespace: string): boolean { - return this.bindings.has(namespace) - } - - /** - * Find if a namespace is part of the auto import aliases. Returns false, when namespace - * is an alias path but has an explicit binding too - */ - public isAliasPath(namespace: string): boolean { - if (this.bindings.has(namespace)) { - return false - } - - return this.aliases.has(namespace) - } - - /** - * Lookup a namespace. The output contains the complete namespace, - * along with its type. The type is an "alias" or a "binding". - * - * Null is returned when unable to lookup the namespace inside the container - * - * Note: This method just checks if a namespace is registered or binding - * or can be it resolved from auto import aliases or not. However, - * it doesn't check for the module existence on the disk. - * - * Optionally you can define a prefix namespace - * to be used to build the complete namespace. For example: - * - * - namespace: UsersController - * - prefixNamespace: App/Controllers/Http - * - Output: App/Controllers/Http/UsersController - * - * Prefix namespace is ignored for absolute namespaces. For example: - * - * - namespace: /App/UsersController - * - prefixNamespace: App/Controllers/Http - * - Output: App/UsersController - */ - public lookup(namespace: string | LookupNode, prefixNamespace?: string): null | any { - if (typeof namespace !== 'string' && namespace['namespace'] && namespace['type']) { - return namespace - } - - /** - * Ensure namespace is defined as a string only - */ - if (typeof namespace !== 'string') { - throw IocLookupException.invalidNamespace() - } - - /** - * Build complete namespace - */ - if (namespace.startsWith('/')) { - namespace = namespace.substr(1) - } else if (prefixNamespace) { - namespace = `${prefixNamespace.replace(/\/$/, '')}/${namespace}` - } - - /** - * Namespace is a binding - */ - if (this.hasBinding(namespace)) { - return { - type: 'binding', - namespace: namespace, - } - } - - /** - * Namespace is an alias - */ - if (this.isAliasPath(namespace)) { - return { - type: 'alias', - namespace: namespace, - } - } - - return null - } - - /** - * Same as [[lookup]]. But raises exception instead of returning null - */ - public lookupOrFail( - namespace: string | LookupNode, - prefixNamespace?: string - ): LookupNode { - const lookupNode = this.lookup(namespace, prefixNamespace) - if (!lookupNode) { - throw IocLookupException.lookupFailed(namespace as string) - } - - return lookupNode - } - - /** - * Resolve a binding by invoking the binding factory function. An exception - * is raised, if the binding namespace is unregistered. - */ - public resolveBinding(binding: string) { - if (this.trapCallback) { - return this.trapCallback(binding) - } - - const value = this.bindings.resolve(binding) - if (this.usingProxies) { - return this.wrapAsProxy(binding, value) - } - - return value - } - - /** - * Import namespace from the auto import aliases. This method assumes you are - * using native ES modules - */ - public async import(namespace: string) { - if (this.trapCallback) { - return this.trapCallback(namespace) - } - - const value = await this.aliases.resolveAsync(namespace) - if (this.usingProxies) { - return this.wrapEsmModuleAsProxy(namespace, value) - } - - return value - } - - /** - * Same as the "import" method, but uses CJS for requiring the module from its - * path - */ - public require(namespace: string) { - if (this.trapCallback) { - return this.trapCallback(namespace) - } - - const value = this.aliases.resolve(namespace) - if (this.usingProxies) { - return this.wrapEsmModuleAsProxy(namespace, value) - } - - return value - } - - /** - * The use method looks up a namespace inside both the bindings and the - * auto import aliases - */ - public use(namespace: string | LookupNode) { - if (this.trapCallback) { - return this.trapCallback(typeof namespace === 'string' ? namespace : namespace['namespace']) - } - - const lookupNode = this.lookupOrFail(namespace) - if (lookupNode.type === 'alias') { - return this.require(lookupNode.namespace) - } - - return this.resolveBinding(lookupNode.namespace) - } - - /** - * Same as the [[use]] method, but instead uses ES modules for resolving - * the auto import aliases - */ - public async useAsync(namespace: string | LookupNode) { - if (this.trapCallback) { - return this.trapCallback(typeof namespace === 'string' ? namespace : namespace['namespace']) - } - - const lookupNode = this.lookupOrFail(namespace) - if (lookupNode.type === 'alias') { - return this.import(lookupNode.namespace) - } - - return this.resolveBinding(lookupNode.namespace) - } - - /** - * Makes an instance of the class by first resolving it. - */ - public make(namespace: LookupNode | any, args?: any[]) { - const isContainerNamespace = - typeof namespace === 'string' || (namespace['namespace'] && namespace['type']) - - /** - * Value is not a container namespace or a lookup - * node - */ - if (!isContainerNamespace) { - return this.makeRaw(namespace, args) - } - - /** - * Invoke trap callback (if registered) - */ - if (this.trapCallback) { - return this.trapCallback(typeof namespace === 'string' ? namespace : namespace['namespace']) - } - - const lookupNode = this.lookupOrFail(namespace) - - /** - * We do not touch bindings at all. The factory function - * return value is used as it is - */ - if (lookupNode.type === 'binding') { - return this.resolveBinding(lookupNode.namespace) - } - - const value = this.require(lookupNode.namespace) - - /** - * We attempt to make an instance of only the export - * default of a ES module - */ - if (this.isEsm(value) && value.default) { - return this.makeRaw(value.default, args || []) - } - - return this.makeRaw(value, args) - } - - /** - * Same as the [[make]] method, but instead uses ES modules for resolving - * the auto import aliases - */ - public async makeAsync(namespace: LookupNode | any, args?: any[]) { - const isContainerNamespace = - typeof namespace === 'string' || (namespace['namespace'] && namespace['type']) - - /** - * Value is not a container namespace or a lookup - * node - */ - if (!isContainerNamespace) { - return this.makeRawAsync(namespace, args) - } - - /** - * Invoke trap callback (if registered) - */ - if (this.trapCallback) { - return this.trapCallback(typeof namespace === 'string' ? namespace : namespace['namespace']) - } - - const lookupNode = this.lookupOrFail(namespace) - - /** - * We do not touch bindings at all. The factory function - * return value is used as it is - */ - if (lookupNode.type === 'binding') { - return this.resolveBinding(lookupNode.namespace) - } - - const value = await this.import(lookupNode.namespace) - - /** - * We attempt to make an instance of only the export - * default of a ES module - */ - if (this.isEsm(value) && value.default) { - return this.makeRawAsync(value.default, args || []) - } - - return this.makeRawAsync(value, args) - } - - /** - * Define a callback to be called when all of the container - * bindings are available. - * - * Note: This method is exclusive for bindings and doesn't resolve - * auto import aliases - */ - public withBindings(namespaces: readonly any[], cb: (...args: any) => void): void { - if (namespaces.every((namespace) => this.hasBinding(namespace))) { - /** - * The callback accepts a tuple, whereas map returns an array. So we - * need to cast the value to any by hand - */ - cb(...namespaces.map((namespace) => this.resolveBinding(namespace))) - } - } - - /** - * @deprecated: Use "withBindings" instead - */ - public with(namespaces: readonly any[], cb: (...args: any) => void): void { - process.emitWarning( - 'DeprecationWarning', - 'container.with() is deprecated. Use container.withBindings() instead' - ) - return this.withBindings(namespaces, cb) - } - - /** - * Call method on an object and automatically resolve its depdencies - */ - public call(target: any, method: any, args?: any[]) { - if (typeof target[method] !== 'function') { - throw new Exception(`Missing method "${method}" on "${target.constructor.name}"`) - } - - return this.injector.call(target, method as string, args || []) - } - - /** - * Same as [[call]], but uses ES modules for resolving the auto - * import aliases - */ - public async callAsync(target: any, method: any, args?: any[]) { - if (typeof target[method] !== 'function') { - throw new Exception(`Missing method "${method}" on "${target.constructor.name}"`) - } - - return this.injector.callAsync(target, method as string, args || []) - } - - /** - * Trap container lookup calls. It includes - * - * - Ioc.use - * - Ioc.useAsync - * - Ioc.make - * - Ioc.makeAsync - * - Ioc.require - * - Ioc.import - * - Ioc.resolveBinding - */ - public trap(callback: (namespace: string) => any): this { - this.trapCallback = callback - return this - } - - /** - * Returns the resolver instance to resolve Ioc container bindings with - * little ease. Since, the IocResolver uses an in-memory cache to - * improve the lookup speed, we suggest keeping a reference to - * the output of this method to leverage caching - */ - public getResolver( - fallbackMethod?: string, - rcNamespaceKey?: string, - fallbackNamespace?: string - ): IocResolver { - return new IocResolver(this, fallbackMethod, rcNamespaceKey, fallbackNamespace) - } -} diff --git a/src/Registrar/index.ts b/src/Registrar/index.ts deleted file mode 100644 index 21cfa9f..0000000 --- a/src/Registrar/index.ts +++ /dev/null @@ -1,149 +0,0 @@ -/* - * @adonisjs/fold - * - * (c) Harminder Virk - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -import { dirname } from 'path' -import { esmRequire, Exception } from '@poppinss/utils' -import { resolveFrom } from '@poppinss/utils/build/helpers' -import { Constructor } from '../Contracts' - -/** - * Registrar is used to register and boot the providers - */ -export class Registrar { - /** - * The first level of provider paths provided to the registrar - */ - private providersPaths: string[] = [] - - /** - * An array of loaded providers. Their can be more providers than the - * `_providersPaths` array, since each provider can provide it's - * own sub providers - */ - private providers: any[] = [] - - /** - * Method to instantiate provider instances. One can also defined - * a custom instantiater function - */ - private providersInstantiater = >(provider: T) => - new provider(...this.providerConstructorParams) - - /** - * Whether or not the providers can be collected - */ - private collected: boolean = false - - constructor(private providerConstructorParams: any[], private basePath?: string) {} - - /** - * Load the provider by requiring the file from the disk - * and instantiate it. If ioc container is using ES6 - * imports, then default exports are handled - * automatically. - */ - private async loadProvider(providerPath: string, basePath?: string) { - providerPath = this.basePath - ? resolveFrom(basePath || this.basePath, providerPath) - : providerPath - - const provider = esmRequire(providerPath) - - if (typeof provider !== 'function') { - throw new Exception(`"${providerPath}" provider must use export default statement`) - } - - return { - provider: this.providersInstantiater(provider), - resolvedPath: dirname(providerPath), - } - } - - /** - * Loop's over an array of provider paths and pushes them to the - * `providers` collection. This collection is later used to - * register and boot providers - */ - private async collect(providerPaths: string[], basePath?: string) { - for (let providerPath of providerPaths) { - const { provider, resolvedPath } = await this.loadProvider(providerPath, basePath) - this.providers.push(provider) - - if (provider.provides) { - await this.collect(provider.provides, resolvedPath) - } - } - } - - /** - * Register an array of provider paths - */ - public useProviders( - providersPaths: string[], - callback?: >(provider: T) => InstanceType - ): this { - this.providersPaths = providersPaths - - if (typeof callback === 'function') { - this.providersInstantiater = callback - } - - return this - } - - /** - * Register all the providers by instantiating them and - * calling the `register` method. - * - * The provider instance will be returned, which can be used - * to boot them as well. - */ - public async register() { - if (this.collected) { - return this.providers - } - - this.collected = true - await this.collect(this.providersPaths) - - /** - * Register collected providers - */ - this.providers.forEach((provider) => { - if (typeof provider.register === 'function') { - provider.register() - } - }) - - return this.providers - } - - /** - * Boot all the providers by calling the `boot` method. - * Boot methods are called in series. - */ - public async boot() { - const providers = await this.register() - - for (let provider of providers) { - if (typeof provider.boot === 'function') { - await provider.boot() - } - } - } - - /** - * Register an boot providers together. - */ - public async registerAndBoot() { - const providers = await this.register() - await this.boot() - return providers - } -} diff --git a/src/Resolver/index.ts b/src/Resolver/index.ts deleted file mode 100644 index a88a5b1..0000000 --- a/src/Resolver/index.ts +++ /dev/null @@ -1,115 +0,0 @@ -/* - * @adonisjs/fold - * - * (c) Harminder Virk - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -import { IocContract, IocResolverLookupNode, IocResolverContract } from '../Contracts' - -/** - * Exposes the API to resolve and call bindings from the IoC container. The resolver - * internally caches the IoC container lookup nodes to boost performance. - */ -export class IocResolver implements IocResolverContract { - private lookupCache: { [key: string]: IocResolverLookupNode } = {} - - /** - * The namespace that will be used as a prefix when resolving - * bindings - */ - private prefixNamespace = this.getPrefixNamespace() - - constructor( - private container: IocContract, - private fallbackMethod?: string, - private rcNamespaceKey?: string, - private fallbackNamespace?: string - ) {} - - /** - * Returns the prefix namespace by giving preference to the - * `.adonisrc.json` file - */ - private getPrefixNamespace(): string | undefined { - /** - * Use fallback namespace, when lookup inside rcFile is not required - */ - if (!this.rcNamespaceKey) { - return this.fallbackNamespace - } - - /** - * If container doesn't have `Application` binding, then there is no - * way for us to read rcFile namespaces and hence we use the fallback - * namespace - */ - if (!this.container.hasBinding('Adonis/Core/Application')) { - return this.fallbackNamespace - } - - /** - * Attempt to resolve the rcNamespace key from the rcFile - * For example: The rc file has following namespaces - * { - * "controllers": "App/Controllers/Http" - * } - * We will use the value next to the `controllers` key - */ - const application = this.container.use('Adonis/Core/Application') - return application.namespacesMap.get(this.rcNamespaceKey) || this.fallbackNamespace - } - - /** - * Resolves the namespace and returns it's lookup node - */ - public resolve( - namespace: string, - prefixNamespace: string | undefined = this.prefixNamespace - ): IocResolverLookupNode { - const cacheKey = prefixNamespace ? `${prefixNamespace}/${namespace}` : namespace - - /** - * Return from cache, when the node exists - */ - const cacheNode = this.lookupCache[cacheKey] - if (cacheNode) { - return cacheNode - } - - let method = this.fallbackMethod || 'handle' - - /** - * Split the namespace to lookup the method on it. If method isn't - * defined, we will use the conventional `handle` method. - */ - const tokens = namespace.split('.') - if (tokens.length > 1) { - method = tokens.pop()! - } - - const lookupNode = this.container.lookupOrFail(tokens.join('.'), prefixNamespace) - this.lookupCache[cacheKey] = { ...lookupNode, method } - return this.lookupCache[cacheKey] - } - - /** - * Calls the namespace.method expression with any arguments that needs to - * be passed. Also supports type-hinting dependencies. - */ - public async call( - namespace: string | IocResolverLookupNode, - prefixNamespace?: string, - args?: any[] | ((instance: any) => any[]) - ): Promise { - const lookupNode = - typeof namespace === 'string' ? this.resolve(namespace, prefixNamespace) : namespace - - const instance = await this.container.makeAsync(lookupNode.namespace) - args = typeof args === 'function' ? args(instance) : args - - return this.container.callAsync(instance, lookupNode.method, args) - } -} diff --git a/src/decorators/index.ts b/src/decorators/index.ts deleted file mode 100644 index 4e8fbe6..0000000 --- a/src/decorators/index.ts +++ /dev/null @@ -1,69 +0,0 @@ -/* - * @adonisjs/fold - * - * (c) Harminder Virk - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/** - * Injects bindings to the class constructor - */ -export function inject(value?: any) { - function decorator(target: any, propertyKey: string): void - // eslint-disable-next-line no-redeclare - function decorator(target: any): void - // eslint-disable-next-line no-redeclare - function decorator(target: any, propertyKey?: string): void { - /** - * Consturctor injections - */ - if (!propertyKey) { - if (!target.hasOwnProperty('inject')) { - Object.defineProperty(target, 'inject', { - value: {}, - }) - } - - target.inject.instance = target.inject.instance || [] - - const constructorParams = Reflect.getMetadata('design:paramtypes', target) - - if (constructorParams) { - constructorParams.forEach((param: any, index: number) => { - if (value && value[index]) { - target.inject.instance.push(value[index]) - } else { - target.inject.instance.push(param) - } - }) - } - return - } - - /** - * Parameter injections - */ - if (!target.constructor.hasOwnProperty('inject')) { - Object.defineProperty(target.constructor, 'inject', { - value: {}, - }) - } - - target.constructor.inject[propertyKey] = target.constructor.inject[propertyKey] || [] - - const methodParams = Reflect.getMetadata('design:paramtypes', target, propertyKey) - if (methodParams) { - methodParams.forEach((param: any, index: number) => { - if (value && value[index]) { - target.constructor.inject[propertyKey].push(value[index]) - } else { - target.constructor.inject[propertyKey].push(param) - } - }) - } - } - - return decorator -} diff --git a/src/helpers.ts b/src/helpers.ts deleted file mode 100644 index 524ffc5..0000000 --- a/src/helpers.ts +++ /dev/null @@ -1,35 +0,0 @@ -/* - * @adonisjs/fold - * - * (c) Harminder Virk - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -import { Exception } from '@poppinss/utils' - -/** - * Returns a boolean telling if value is an esm module - * with `export default`. - */ -export function isEsm(value: any): boolean { - return value && value.__esModule -} - -/** - * Returns a boolean telling if value is a primitive or object constructor. - */ -export function isPrimtiveConstructor(value: any): boolean { - return [String, Function, Object, Date, Number, Boolean].indexOf(value) > -1 -} - -/** - * Raises error with a message when callback is not - * a function. - */ -export function ensureIsFunction(callback: Function, message: string) { - if (typeof callback !== 'function') { - throw new Exception(message, 500, 'E_RUNTIME_EXCEPTION') - } -} diff --git a/src/user.ts b/src/user.ts new file mode 100644 index 0000000..d4e20bc --- /dev/null +++ b/src/user.ts @@ -0,0 +1,13 @@ +export class User { + #firstname: string + #lastname: string + + constructor(firstname: string, lastname: string) { + this.#firstname = firstname + this.#lastname = lastname + } + + get fullName() { + return `${this.#firstname} ${this.#lastname}` + } +} diff --git a/test/ioc-resolver.spec.ts b/test/ioc-resolver.spec.ts deleted file mode 100644 index e5d1687..0000000 --- a/test/ioc-resolver.spec.ts +++ /dev/null @@ -1,186 +0,0 @@ -/* - * @adonisjs/fold - * - * (c) Harminder Virk - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -import { test } from '@japa/runner' -import { Ioc } from '../src/Ioc' - -test.group('Ioc Resolver', () => { - test('call handle method when no explicit method is defined', async ({ assert }) => { - class UserController { - public handle() { - return 'foo' - } - } - - const ioc = new Ioc() - ioc.bind('App/UserController', () => new UserController()) - - const resolver = ioc.getResolver() - assert.equal(await resolver.call('App/UserController'), 'foo') - }) - - test('call namespace expression with method', async ({ assert }) => { - class UserController { - public getUser() { - return 'foo' - } - } - - const ioc = new Ioc() - ioc.bind('App/UserController', () => new UserController()) - - const resolver = ioc.getResolver() - assert.equal(await resolver.call('App/UserController.getUser'), 'foo') - }) - - test('call async namespace expression', async ({ assert }) => { - class UserController { - public async getUser() { - return 'foo' - } - } - - const ioc = new Ioc() - ioc.bind('App/UserController', () => new UserController()) - - const resolver = ioc.getResolver() - const value = await resolver.call('App/UserController.getUser') - assert.equal(value, 'foo') - }) - - test('raise exception when unable to lookup namespace', async ({ assert }) => { - assert.plan(1) - - const ioc = new Ioc() - const resolver = ioc.getResolver() - - try { - await resolver.call('App/UserController.getUser') - } catch ({ message }) { - assert.equal( - message, - 'E_IOC_LOOKUP_FAILED: Cannot resolve "App/UserController" namespace from the IoC Container' - ) - } - }) - - test('allow runtime prefix namespace', async ({ assert }) => { - class UserController { - public handle() { - return 'foo' - } - } - - const ioc = new Ioc() - ioc.bind('App/UserController', () => new UserController()) - - const resolver = ioc.getResolver() - assert.equal(await resolver.call('UserController', 'App'), 'foo') - }) - - test('handle use case where namespace is same but prefix namespace is different', async ({ - assert, - }) => { - class UserController { - public handle() { - return 'user' - } - } - - class AdminController { - public handle() { - return 'admin' - } - } - - const ioc = new Ioc() - ioc.bind('App/UserController', () => new UserController()) - ioc.bind('Admin/UserController', () => new AdminController()) - - const resolver = ioc.getResolver() - assert.equal(await resolver.call('UserController', 'App'), 'user') - assert.equal(await resolver.call('UserController', 'Admin'), 'admin') - }) - - test('handle use case where namespace is same but defined a different runtime prefix namespace', async ({ - assert, - }) => { - class UserController { - public handle() { - return 'user' - } - } - - class AdminController { - public handle() { - return 'admin' - } - } - - const ioc = new Ioc() - ioc.bind('App/UserController', () => new UserController()) - ioc.bind('Admin/UserController', () => new AdminController()) - - const resolver = ioc.getResolver(undefined, undefined, 'App') - assert.equal(await resolver.call('UserController'), 'user') - assert.equal(await resolver.call('UserController', 'Admin'), 'admin') - }) - - test('pass resolve result to the call method', async ({ assert }) => { - class UserController { - public getUser() { - return 'foo' - } - } - - const ioc = new Ioc() - ioc.bind('App/UserController', () => new UserController()) - - const resolver = ioc.getResolver() - const lookupNode = resolver.resolve('App/UserController.getUser') - assert.equal(await resolver.call(lookupNode), 'foo') - }) - - test('pass arguments to the call method', async ({ assert }) => { - class UserController { - public getUser(input: string) { - return input - } - } - - const ioc = new Ioc() - ioc.bind('App/UserController', () => new UserController()) - - const resolver = ioc.getResolver() - const lookupNode = resolver.resolve('App/UserController.getUser') - assert.equal(await resolver.call(lookupNode, undefined, ['foo']), 'foo') - }) - - test('pass arguments to the call method from a function', async ({ assert }) => { - class UserController { - public selfInput = 'foo' - - public getUser(input: string) { - return input - } - } - - const ioc = new Ioc() - ioc.bind('App/UserController', () => new UserController()) - - const resolver = ioc.getResolver() - const lookupNode = resolver.resolve('App/UserController.getUser') - assert.equal( - await resolver.call(lookupNode, undefined, (controller) => { - return [controller.selfInput] - }), - 'foo' - ) - }) -}) diff --git a/test/ioc.spec.ts b/test/ioc.spec.ts deleted file mode 100644 index 9bd201e..0000000 --- a/test/ioc.spec.ts +++ /dev/null @@ -1,2030 +0,0 @@ -/* - * @adonisjs/fold - * - * (c) Harminder Virk - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -import { test } from '@japa/runner' -import 'reflect-metadata' -import { join } from 'path' -import { types } from 'util' -import { Filesystem } from '@poppinss/dev-utils' - -import { Ioc } from '../src/Ioc' -import { inject } from '../src/decorators' - -const fs = new Filesystem(join(__dirname, './app')) - -test.group('Ioc', () => { - test('raise error when bind callback is not a function', ({ assert }) => { - const ioc = new Ioc() - const fn = () => (ioc as any).bind('App/Foo', 'hello') - assert.throws(fn, 'E_RUNTIME_EXCEPTION: "ioc.bind" expect 2nd argument to be a function') - }) - - test('add binding to the container', ({ assert }) => { - const ioc = new Ioc() - ioc.bind('App/Foo', () => { - return 'foo' - }) - - assert.deepEqual(ioc.lookup('App/Foo'), { namespace: 'App/Foo', type: 'binding' }) - }) - - test('add singleton binding to the container', ({ assert }) => { - const ioc = new Ioc() - ioc.singleton('App/Foo', () => { - return 'foo' - }) - - assert.deepEqual(ioc.lookup('App/Foo'), { namespace: 'App/Foo', type: 'binding' }) - }) - - test('register import alias', ({ assert }) => { - const ioc = new Ioc() - ioc.alias(join(__dirname, './app'), 'App') - - assert.deepEqual(ioc.lookup('App/Foo'), { namespace: 'App/Foo', type: 'alias' }) - assert.isNull(ioc.lookup('Apple/Foo')) - assert.deepEqual(ioc.importAliases, { App: join(__dirname, './app') }) - }) - - test('register fake', ({ assert }) => { - const ioc = new Ioc() - ioc.fake('App/Foo', () => {}) - - assert.isTrue(ioc.hasFake('App/Foo')) - }) - - test('return true from "hasBinding" when binding exists', ({ assert }) => { - const ioc = new Ioc() - ioc.bind('App/Foo', () => { - return { foo: true } - }) - - assert.isTrue(ioc.hasBinding('App/Foo')) - assert.isFalse(ioc.hasBinding('Foo')) - }) - - test('return true from "isAliasPath" when namespace is part of import aliases', ({ assert }) => { - const ioc = new Ioc() - ioc.alias(join(__dirname, './app'), 'App') - - assert.isTrue(ioc.isAliasPath('App/Foo')) - assert.isFalse(ioc.isAliasPath('Foo')) - }) - - test('return false from "isAliasPath" when import alias has a conflict with binding', ({ - assert, - }) => { - const ioc = new Ioc() - - ioc.alias(join(__dirname, './app'), 'App') - ioc.bind('App/Foo', () => { - return { foo: true } - }) - - assert.isFalse(ioc.isAliasPath('App/Foo')) - assert.isFalse(ioc.isAliasPath('Foo')) - }) - - test('return true from "hasFake" when fake exists', ({ assert }) => { - const ioc = new Ioc() - ioc.fake('App/Foo', () => {}) - - assert.isTrue(ioc.hasFake('App/Foo')) - }) -}) - -test.group('Ioc | lookup', () => { - test('lookup namespace', ({ assert }) => { - const ioc = new Ioc() - ioc.bind('App/Foo', () => { - return 'foo' - }) - - assert.deepEqual(ioc.lookup('App/Foo'), { - namespace: 'App/Foo', - type: 'binding', - }) - }) - - test('lookup absolute namespace', ({ assert }) => { - const ioc = new Ioc() - ioc.bind('App/Foo', () => { - return 'foo' - }) - - assert.deepEqual(ioc.lookup('/App/Foo'), { - namespace: 'App/Foo', - type: 'binding', - }) - }) - - test('lookup namespace with a prefix', ({ assert }) => { - const ioc = new Ioc() - ioc.bind('App/Foo', () => { - return 'foo' - }) - - assert.deepEqual(ioc.lookup('Foo', 'App'), { - namespace: 'App/Foo', - type: 'binding', - }) - }) - - test('lookup absolute namespace with a prefix', ({ assert }) => { - const ioc = new Ioc() - ioc.bind('App/Foo', () => { - return 'foo' - }) - - assert.deepEqual(ioc.lookup('/App/Foo', 'App'), { - namespace: 'App/Foo', - type: 'binding', - }) - }) - - test('lookup namespace from aliases', ({ assert }) => { - const ioc = new Ioc() - ioc.alias(join(__dirname, './app'), 'App') - - assert.deepEqual(ioc.lookup('App/Foo'), { - namespace: 'App/Foo', - type: 'alias', - }) - }) - - test('lookup namespace from aliases with a prefix', ({ assert }) => { - const ioc = new Ioc() - ioc.alias(join(__dirname, './app'), 'App') - - assert.deepEqual(ioc.lookup('Foo', 'App'), { - namespace: 'App/Foo', - type: 'alias', - }) - }) - - test('lookup absolute namespace from aliases with a prefix', ({ assert }) => { - const ioc = new Ioc() - ioc.alias(join(__dirname, './app'), 'App') - - assert.deepEqual(ioc.lookup('/App/Foo', 'App'), { - namespace: 'App/Foo', - type: 'alias', - }) - }) - - test('give preference to binding when alias and binding namespace has a conflict', ({ - assert, - }) => { - const ioc = new Ioc() - ioc.alias(join(__dirname, './app'), 'App') - - ioc.bind('App/Foo', () => { - return 'foo' - }) - - assert.deepEqual(ioc.lookup('App/Foo'), { namespace: 'App/Foo', type: 'binding' }) - }) - - test('return null when namespace is not a binding and neither part of import aliases', ({ - assert, - }) => { - const ioc = new Ioc() - assert.isNull(ioc.lookup('App/Foo')) - }) -}) - -test.group('Ioc | resolveBinding', () => { - test('resolve binding', ({ assert }) => { - const ioc = new Ioc() - ioc.bind('App/Foo', () => { - return 'foo' - }) - - assert.equal(ioc.resolveBinding('App/Foo'), 'foo') - }) - - test('do not resolve import alias', ({ assert }) => { - const ioc = new Ioc() - ioc.alias(join(__dirname, './app'), 'App') - - assert.throws( - () => ioc.resolveBinding('App/Foo'), - 'E_IOC_LOOKUP_FAILED: Cannot resolve "App/Foo" namespace from the IoC Container' - ) - }) - - test('raise exception when binding is not registered', ({ assert }) => { - const ioc = new Ioc() - assert.throws( - () => ioc.resolveBinding('App/Foo'), - 'E_IOC_LOOKUP_FAILED: Cannot resolve "App/Foo" namespace from the IoC Container' - ) - }) - - test('resolve binding on every call', ({ assert }) => { - const ioc = new Ioc() - ioc.bind('App/Foo', () => { - return Symbol('foo') - }) - - assert.notStrictEqual(ioc.resolveBinding('App/Foo'), ioc.resolveBinding('App/Foo')) - }) - - test('do not resolve singleton in subsequent calls', ({ assert }) => { - const ioc = new Ioc() - ioc.singleton('App/Foo', () => { - return Symbol('foo') - }) - - assert.strictEqual(ioc.resolveBinding('App/Foo'), ioc.resolveBinding('App/Foo')) - }) - - test('wrap output "object" inside proxy when fake is registered', ({ assert }) => { - const ioc = new Ioc() - ioc.bind('App/Foo', () => { - return { foo: true } - }) - - ioc.useProxies() - ioc.fake('App/Foo', () => { - return { foo: false } - }) - - assert.deepEqual(ioc.resolveBinding('App/Foo'), { foo: false }) - }) - - test('wrap output "class constructor" inside proxy when fake is registered', ({ assert }) => { - const ioc = new Ioc() - class User { - public username = 'user' - } - class FakeUser { - public username = 'fakeuser' - } - - ioc.bind('App/Foo', () => { - return User - }) - - ioc.useProxies() - ioc.fake('App/Foo', () => { - return FakeUser - }) - - assert.equal(new (ioc.resolveBinding('App/Foo'))().username, 'fakeuser') - }) - - test('instantiating class without defining the fake should work fine', ({ assert }) => { - const ioc = new Ioc() - - @inject(['App/Bar']) - class User { - public username = 'virk' - } - - ioc.bind('App/Bar', () => { - return {} - }) - - ioc.bind('App/Foo', () => { - return User - }) - - ioc.useProxies(true) - assert.equal(ioc.make(ioc.resolveBinding('App/Foo')).username, 'virk') - }) - - test('class "static properties" must point to fake class', ({ assert }) => { - const ioc = new Ioc() - class User { - public static userName = 'virk' - } - - class FakeUser { - public static userName = 'nikk' - } - - ioc.bind('App/Foo', () => { - return User - }) - - ioc.useProxies() - ioc.fake('App/Foo', () => { - return FakeUser - }) - - assert.equal(ioc.resolveBinding('App/Foo').userName, 'nikk') - }) - - test('class non configurable properties should point to original object', ({ assert }) => { - const ioc = new Ioc() - class User { - public static userName = 'virk' - } - - class FakeUser { - public static userName = 'nikk' - } - - ioc.bind('App/Foo', () => { - return User - }) - - ioc.useProxies() - ioc.fake('App/Foo', () => { - return FakeUser - }) - - const Foo = ioc.resolveBinding('App/Foo') - const foo = new Foo() - - assert.equal(foo.constructor.userName, 'virk') - }) - - test('class "constructor" must point to the original object, when "no fake is defined"', ({ - assert, - }) => { - const ioc = new Ioc() - class User { - public static userName = 'virk' - } - - ioc.bind('App/Foo', () => { - return User - }) - - ioc.useProxies() - - const Foo = ioc.resolveBinding('App/Foo') - const foo = new Foo() - - assert.equal(foo.constructor.userName, 'virk') - }) - - test('super class "constructor" must point to the fake class', ({ assert }) => { - const ioc = new Ioc() - class User { - public static userName = 'virk' - public username = 'virk' - } - - class FakeUser { - public static userName = 'romain' - public username = 'romain' - } - - ioc.bind('App/Foo', () => { - return User - }) - - ioc.useProxies() - ioc.fake('App/Foo', () => { - return FakeUser - }) - - class Bar extends ioc.resolveBinding('App/Foo') { - public static userName = 'nikk' - public username = 'nikk' - } - - const bar = new Bar() - assert.deepEqual(bar.constructor, Bar) - assert.deepEqual(bar.constructor['userName'], 'nikk') - assert.deepEqual(bar.username, 'nikk') - assert.deepEqual(Object.getPrototypeOf(bar.constructor)['userName'], 'romain') - }) - - test('super class "constructor" must point to the original class, when "no fake is defined"', ({ - assert, - }) => { - const ioc = new Ioc() - class User { - public static userName = 'virk' - public username = 'virk' - } - - ioc.bind('App/Foo', () => { - return User - }) - ioc.useProxies() - - class Bar extends ioc.resolveBinding('App/Foo') { - public static userName = 'nikk' - public username = 'nikk' - } - - const bar = new Bar() - assert.deepEqual(bar.constructor, Bar) - assert.deepEqual(bar.constructor['userName'], 'nikk') - assert.deepEqual(bar.username, 'nikk') - assert.deepEqual(Object.getPrototypeOf(bar.constructor)['userName'], 'virk') - }) - - test('do not wrap "literal" values inside proxy', ({ assert }) => { - const ioc = new Ioc() - class FakeUser { - public static userName = 'nikk' - } - - ioc.bind('App/Foo', () => { - return 'foo' - }) - - ioc.useProxies() - ioc.fake('App/Foo', () => { - return FakeUser - }) - - assert.equal(ioc.resolveBinding('App/Foo'), 'foo') - }) - - test('trap "ioc.use" statement when binding is defined', ({ assert }) => { - const ioc = new Ioc() - ioc.bind('App/Foo', () => { - return 'foo' - }) - - ioc.trap(() => { - return { name: 'foo' } - }) - - assert.deepEqual(ioc.use('App/Foo'), { name: 'foo' }) - }) - - test('trap "ioc.use" statement when binding is not defined', ({ assert }) => { - const ioc = new Ioc() - ioc.trap(() => { - return { name: 'foo' } - }) - - assert.deepEqual(ioc.use('App/Foo'), { name: 'foo' }) - }) -}) - -test.group('Ioc | require', (group) => { - group.each.teardown(async () => { - await fs.cleanup() - }) - - test('import "esm ts" module', async ({ assert }) => { - await fs.add( - 'app/User.ts', - ` - export default class User { - public username = 'virk' - } - ` - ) - - const ioc = new Ioc() - ioc.alias(join(fs.basePath, './app'), 'App') - const resolved = ioc.require('App/User') - - assert.property(resolved, 'default') - assert.equal(new resolved.default().username, 'virk') - }) - - test('handle path subsitions carefully', async ({ assert }) => { - await fs.add( - 'app/User/App/User.ts', - ` - export default class User { - public username = 'virk' - } - ` - ) - - const ioc = new Ioc() - ioc.alias(join(fs.basePath, './app'), 'App') - const resolved = ioc.require('App/User/App/User') - - assert.property(resolved, 'default') - assert.equal(new resolved.default().username, 'virk') - }) - - test('import "cjs js" module', async ({ assert }) => { - await fs.add( - 'app/User.cjs.js', - ` - module.exports = class User { - constructor() { - this.username = 'virk' - } - } - ` - ) - - const ioc = new Ioc() - ioc.alias(join(fs.basePath, './app'), 'App') - const resolved = ioc.require('App/User.cjs') - - assert.equal(new resolved().username, 'virk') - }) - - test('raise exception when module is missing', async ({ assert }) => { - assert.plan(1) - - const ioc = new Ioc() - ioc.alias(join(fs.basePath, './app'), 'App') - - try { - ioc.require('App/Foo') - } catch (error) { - assert.match(error.message, /Cannot find module/) - } - }) - - test('wrap output "object" inside proxy when fake is registered', async ({ assert }) => { - await fs.add( - 'app/User.ts', - ` - const user = { - username: 'virk' - } - export default user - ` - ) - - await fs.add( - 'app/User.cjs.js', - ` - module.exports = { - username: 'virk' - } - ` - ) - - const ioc = new Ioc() - ioc.alias(join(fs.basePath, './app'), 'App') - ioc.useProxies() - - ioc.fake('App/User', () => { - return { username: 'romain' } - }) - - ioc.fake('App/User.cjs', () => { - return { username: 'romain' } - }) - - assert.deepEqual(ioc.require('App/User').default, { username: 'romain' }) - assert.isTrue(ioc.require('App/User').__esModule) - assert.deepEqual(ioc.require('App/User.cjs'), { username: 'romain' }) - - ioc.useProxies(false) - - assert.deepEqual(ioc.require('App/User').default, { username: 'virk' }) - assert.isTrue(ioc.require('App/User').__esModule) - assert.deepEqual(ioc.require('App/User.cjs'), { username: 'virk' }) - }) - - test('wrap output "class constructor" inside proxy when fake is registered', async ({ - assert, - }) => { - await fs.add( - 'app/User.ts', - ` - export default class User { - public username = 'virk' - } - ` - ) - - await fs.add( - 'app/User.cjs.js', - ` - module.exports = class User { - constructor() { - this.username = 'virk' - } - } - ` - ) - - const ioc = new Ioc() - ioc.alias(join(fs.basePath, './app'), 'App') - ioc.useProxies() - - ioc.fake('App/User', () => { - return class FakeUser { - public username = 'romain' - } - }) - - ioc.fake('App/User.cjs', () => { - return class FakeUser { - public username = 'romain' - } - }) - - assert.equal(new (ioc.require('App/User').default)().username, 'romain') - assert.isTrue(ioc.require('App/User').__esModule) - assert.equal(new (ioc.require('App/User.cjs'))().username, 'romain') - - ioc.useProxies(false) - - assert.equal(new (ioc.require('App/User').default)().username, 'virk') - assert.isTrue(ioc.require('App/User').__esModule) - assert.equal(new (ioc.require('App/User.cjs'))().username, 'virk') - }) - - test('class "static properties" must point to fake class', async ({ assert }) => { - await fs.add( - 'app/User.ts', - ` - export default class User { - public static userName = 'virk' - } - ` - ) - - await fs.add( - 'app/User.cjs.js', - ` - module.exports = class User { - static get userName() { - return 'virk' - } - } - ` - ) - - const ioc = new Ioc() - ioc.alias(join(fs.basePath, './app'), 'App') - ioc.useProxies() - - ioc.fake('App/User', () => { - return class FakeUser { - public static userName = 'romain' - } - }) - - ioc.fake('App/User.cjs', () => { - return class FakeUser { - public static userName = 'romain' - } - }) - - ioc.useProxies() - assert.equal(ioc.require('App/User').default.userName, 'romain') - assert.equal(ioc.require('App/User.cjs').userName, 'romain') - - ioc.useProxies(false) - assert.equal(ioc.require('App/User').default.userName, 'virk') - assert.equal(ioc.require('App/User.cjs').userName, 'virk') - }) - - test('class non configurable properties should point to original object', async ({ assert }) => { - await fs.add( - 'app/User.ts', - ` - export default class User { - public static userName = 'virk' - } - ` - ) - - await fs.add( - 'app/User.cjs.js', - ` - module.exports = class User { - static get userName() { - return 'virk' - } - } - ` - ) - - const ioc = new Ioc() - ioc.alias(join(fs.basePath, './app'), 'App') - ioc.useProxies() - - ioc.fake('App/User', () => { - return class FakeUser { - public static userName = 'romain' - } - }) - - ioc.fake('App/User.cjs', () => { - return class FakeUser { - public static userName = 'romain' - } - }) - - ioc.useProxies() - - const fakeUser = new (ioc.require('App/User').default)() - assert.equal(fakeUser.constructor.userName, 'virk') - - const fakeUserCjs = new (ioc.require('App/User.cjs'))() - assert.equal(fakeUserCjs.constructor.userName, 'virk') - - ioc.useProxies(false) - - const user = new (ioc.require('App/User').default)() - assert.equal(user.constructor.userName, 'virk') - - const userCjs = new (ioc.require('App/User.cjs'))() - assert.equal(userCjs.constructor.userName, 'virk') - }) - - test('class "constructor" must point to the original object, when "no fake is defined"', async ({ - assert, - }) => { - await fs.add( - 'app/User.ts', - ` - export default class User { - public static userName = 'virk' - } - ` - ) - - await fs.add( - 'app/User.cjs.js', - ` - module.exports = class User { - static get userName() { - return 'virk' - } - } - ` - ) - - const ioc = new Ioc() - ioc.alias(join(fs.basePath, './app'), 'App') - ioc.useProxies() - - const user = new (ioc.require('App/User').default)() - assert.equal(user.constructor.userName, 'virk') - - const userCjs = new (ioc.require('App/User.cjs'))() - assert.equal(userCjs.constructor.userName, 'virk') - }) - - test('super class "constructor" must point to the fake class', async ({ assert }) => { - await fs.add( - 'app/User.ts', - `export default class User { - public static userName = 'virk' - public username = 'virk' - }` - ) - - const ioc = new Ioc() - ioc.alias(join(fs.basePath, './app'), 'App') - ioc.useProxies() - - ioc.fake('App/User', () => { - return class FakeUser { - public static userName = 'romain' - public username = 'romain' - } - }) - - const User = ioc.require('App/User').default - class Bar extends User { - public static userName = 'nikk' - public username = 'nikk' - } - - const bar = new Bar() - assert.deepEqual(bar.constructor, Bar) - assert.deepEqual(bar.constructor['userName'], 'nikk') - assert.deepEqual(bar.username, 'nikk') - assert.deepEqual(Object.getPrototypeOf(bar.constructor)['userName'], 'romain') - }) - - test('super class "constructor" must point to the original class, when "no fake is defined"', async ({ - assert, - }) => { - await fs.add( - 'app/User.ts', - `export default class User { - public static userName = 'virk' - public username = 'virk' - }` - ) - - const ioc = new Ioc() - ioc.alias(join(fs.basePath, './app'), 'App') - ioc.useProxies() - - const User = ioc.require('App/User').default - class Bar extends User { - public static userName = 'nikk' - public username = 'nikk' - } - - const bar = new Bar() - assert.deepEqual(bar.constructor, Bar) - assert.deepEqual(bar.constructor['userName'], 'nikk') - assert.deepEqual(bar.username, 'nikk') - assert.deepEqual(Object.getPrototypeOf(bar.constructor)['userName'], 'virk') - }) - - test('do not wrap "literal" values inside proxy', async ({ assert }) => { - await fs.add( - 'app/User.ts', - `const name = 'virk' - - export default name - ` - ) - - const ioc = new Ioc() - ioc.alias(join(fs.basePath, './app'), 'App') - ioc.useProxies() - - ioc.fake('App/User', () => { - return class FakeUser { - public static userName = 'nikk' - } - }) - - assert.equal(ioc.require('App/User').default, 'virk') - }) - - test('trap "ioc.use" statement when binding is defined', ({ assert }) => { - const ioc = new Ioc() - ioc.bind('App/Foo', () => { - return 'foo' - }) - - ioc.trap(() => { - return { name: 'foo' } - }) - - assert.deepEqual(ioc.use('App/Foo'), { name: 'foo' }) - }) - - test('trap "ioc.use" statement when binding is not defined', ({ assert }) => { - const ioc = new Ioc() - ioc.trap(() => { - return { name: 'foo' } - }) - - assert.deepEqual(ioc.use('App/Foo'), { name: 'foo' }) - }) -}) - -test.group('Ioc | make', (group) => { - group.each.teardown(async () => { - await fs.cleanup() - }) - - test('make instance of a class', ({ assert }) => { - const ioc = new Ioc() - class Foo {} - - assert.instanceOf(ioc.make(Foo), Foo) - }) - - test('make instance and inject dependencies', ({ assert }) => { - const ioc = new Ioc() - - class Bar {} - ioc.bind('App/Bar', () => { - return new Bar() - }) - - class Foo { - constructor(public bar: Bar) {} - - /** - * Class injections - */ - public static get inject() { - return { - instance: ['App/Bar'], - } - } - } - - assert.instanceOf(ioc.make(Foo).bar, Bar) - }) - - test('make instance of a class and inject dependencies with runtime dependencies', ({ - assert, - }) => { - const ioc = new Ioc() - - class Bar {} - class Baz {} - ioc.bind('App/Bar', () => { - return new Bar() - }) - - class Foo { - constructor(public bar: Bar, public foo: any) {} - - /** - * Class injections - */ - public static get inject() { - return { - instance: ['App/Bar'], - } - } - } - - assert.equal(ioc.make(Foo, [new Bar(), 'foo']).foo, 'foo') - assert.instanceOf(ioc.make(Foo, [new Bar(), 'foo']).bar, Bar) - assert.instanceOf(ioc.make(Foo, [new Baz(), 'foo']).bar, Baz) - }) - - test('do not make instance when makePlain is set to true', ({ assert }) => { - const ioc = new Ioc() - class Foo { - constructor(public bar: Bar) {} - - public static get makePlain(): true { - return true - } - - public static get inject() { - return ['App/Bar'] - } - } - - class Bar {} - - ioc.bind('App/Bar', () => { - return new Bar() - }) - - assert.deepEqual(ioc.make(Foo), Foo) - }) - - test('do not make instance when namespace is a binding', ({ assert }) => { - const ioc = new Ioc() - class Bar {} - - ioc.bind('App/Bar', () => { - return Bar - }) - - assert.deepEqual(ioc.make('App/Bar'), Bar) - }) - - test('make instance when namespace is part of directory aliases', async ({ assert }) => { - await fs.add( - 'Foo.js', - `module.exports = class Foo { - constructor () { - this.name = 'foo' - } - }` - ) - - const ioc = new Ioc() - ioc.alias(join(fs.basePath), 'Admin') - assert.deepEqual(ioc.make('Admin/Foo').name, 'foo') - }) - - test('inject dependencies when namespace is part of directory aliases', async ({ assert }) => { - await fs.add( - 'Foo.js', - `module.exports = class Foo { - constructor (bar) { - this.bar = bar - } - - static get inject() { - return { - instance: ['App/Bar'], - } - } - }` - ) - - const ioc = new Ioc() - class Bar {} - ioc.bind('App/Bar', () => { - return new Bar() - }) - - ioc.alias(join(fs.basePath), 'Admin') - assert.instanceOf(ioc.make('Admin/Foo').bar, Bar) - }) - - test('allow faking directory aliases namespace', async ({ assert }) => { - await fs.add( - 'Foo.js', - `module.exports = class Foo { - constructor () { - this.name = 'foo' - } - }` - ) - - const ioc = new Ioc() - ioc.alias(join(fs.basePath), 'Admin') - ioc.useProxies() - - class Bar { - public name = 'bar' - } - ioc.fake('Admin/Foo', () => { - return Bar - }) - - assert.equal(ioc.make('Admin/Foo').name, 'bar') - assert.isTrue(types.isProxy(ioc.use('Admin/Foo'))) - }) - - test('make instance when namespace is part of directory aliases', async ({ assert }) => { - await fs.add( - 'Bar.ts', - `export default class Bar { - constructor () { - this.name = 'bar' - } - }` - ) - - const ioc = new Ioc() - ioc.alias(join(fs.basePath), 'Admin') - assert.deepEqual(ioc.make('Admin/Bar').name, 'bar') - }) - - test('inject dependencies when namespace is part of directory aliases', async ({ assert }) => { - await fs.add( - 'Bar.ts', - `export default class Bar { - constructor (baz) { - this.baz = baz - } - - static get inject() { - return { - instance: ['App/Baz'], - } - } - }` - ) - - const ioc = new Ioc() - class Baz {} - ioc.bind('App/Baz', () => { - return new Baz() - }) - - ioc.alias(join(fs.basePath), 'Admin') - assert.instanceOf(ioc.make('Admin/Bar').baz, Baz) - }) - - test('allow faking directory aliases namespace', async ({ assert }) => { - await fs.add( - 'Bar.ts', - `export default class Bar { - constructor () { - this.name = 'bar' - } - }` - ) - - const ioc = new Ioc() - ioc.alias(join(fs.basePath), 'Admin') - ioc.useProxies() - - class Baz { - public name = 'baz' - } - - ioc.fake('Admin/Bar', () => { - return Baz - }) - - assert.equal(ioc.make('Admin/Bar').name, 'baz') - assert.isTrue(types.isProxy(ioc.use('Admin/Bar').default)) - }) - - test('do not make esm named exports', async ({ assert }) => { - await fs.add( - 'Bar.ts', - `export class Bar { - public name = 'bar' - }` - ) - - const ioc = new Ioc() - ioc.alias(fs.basePath, 'App') - assert.equal(ioc.make('App/Bar').Bar.name, 'Bar') - }) - - test('do not proxy named exports', async ({ assert }) => { - await fs.add( - 'Bar.ts', - `export class Bar { - public name = 'bar' - }` - ) - - const ioc = new Ioc() - ioc.useProxies() - - ioc.alias(fs.basePath, 'App') - assert.isFalse(types.isProxy(ioc.make('App/Bar'))) - }) - - test('trap "ioc.make" statement when binding is defined', ({ assert }) => { - const ioc = new Ioc() - ioc.bind('App/Foo', () => { - return 'foo' - }) - - ioc.trap(() => { - return { name: 'foo' } - }) - - assert.deepEqual(ioc.make('App/Foo'), { name: 'foo' }) - }) - - test('trap "ioc.make" statement when binding is not defined', ({ assert }) => { - const ioc = new Ioc() - ioc.trap(() => { - return { name: 'foo' } - }) - - assert.deepEqual(ioc.make('App/Foo'), { name: 'foo' }) - }) -}) - -test.group('Ioc | withBindings', () => { - test('execute the callback when all bindings exists', async ({ assert }) => { - assert.plan(2) - const ioc = new Ioc() - - ioc.bind('App/Foo', () => { - return 'foo' - }) - - ioc.bind('App/Bar', () => { - return 'bar' - }) - - ioc.withBindings(['App/Foo', 'App/Bar'], (foo, bar) => { - assert.equal(foo, 'foo') - assert.equal(bar, 'bar') - }) - }) - - test('do not execute the callback if any bindings is missing', async () => { - const ioc = new Ioc() - - ioc.bind('App/Foo', () => { - return 'foo' - }) - - ioc.withBindings(['App/Foo', 'App/Bar'], () => { - throw new Error('Never expected to be called') - }) - }) -}) - -test.group('Ioc | Proxy', (group) => { - group.each.teardown(async () => { - await fs.cleanup() - }) - - test('ensure proxy traps works fine on class instance', ({ assert }) => { - class Foo { - public name = 'foo' - public getName() { - return this.name - } - } - - const ioc = new Ioc() - ioc.useProxies() - ioc.bind('App/Foo', () => { - return new Foo() - }) - - const value = ioc.use('App/Foo') - assert.equal(value.name, 'foo') - assert.equal(value.getName(), 'foo') - assert.isUndefined(value.nonProp) - - value.nonProp = true - assert.isTrue(value.nonProp) - assert.equal(value.constructor.name, 'Foo') - - assert.deepEqual(Object.getOwnPropertyNames(Object.getPrototypeOf(value)), [ - 'constructor', - 'getName', - ]) - }) - - test('ensure proxy traps works fine with fakes', ({ assert }) => { - class Foo { - public name = 'foo' - public getName() { - return this.name - } - public invoke(...args: any[]) { - return args.concat(['real']) - } - } - - class FooFake { - public name = 'foofake' - public getName() { - return this.name - } - } - - const ioc = new Ioc() - ioc.bind('App/Foo', () => { - return new Foo() - }) - - ioc.useProxies() - const value = ioc.use('App/Foo') - - /** - * Trap get - */ - assert.equal(value.name, 'foo') - - /** - * Trap get (hold scope) - */ - assert.equal(value.getName(), 'foo') - - /** - * Trap get (reflect truth) - */ - assert.isUndefined(value.nonProp) - - /** - * Trap set - */ - value.nonProp = true - assert.isTrue(value.nonProp) - - /** - * Trap get constructor - */ - assert.equal(value.constructor.name, 'Foo') - - /** - * Trap getPrototypeOf - */ - assert.deepEqual(Object.getOwnPropertyNames(Object.getPrototypeOf(value)), [ - 'constructor', - 'getName', - 'invoke', - ]) - - /** - * Trap ownKeys - */ - assert.deepEqual(Object.getOwnPropertyNames(value), ['name', 'nonProp']) - - /** - * Trap isExtensible - */ - assert.isTrue(Object.isExtensible(value)) - - /** - * Trap deleteProperty - */ - delete value.nonProp - assert.isUndefined(value.nonProp) - - /** - * Trap has - */ - assert.isTrue('name' in value) - assert.isFalse('nonProp' in value) - - /** - * Trap setPrototypeOf - */ - Object.setPrototypeOf(value, { - getName() { - return 'proto name' - }, - }) - - assert.equal(value.getName(), 'proto name') - Object.setPrototypeOf(value, Foo.prototype) - assert.equal(value.getName(), 'foo') - - /** - * Trap preventExtensions - */ - const fn = () => Object.preventExtensions(value) - assert.throws(fn, 'Cannot prevent extensions during a fake') - - ioc.fake('App/Foo', () => { - return new FooFake() - }) - - /** - * Trap get - */ - assert.equal(value.name, 'foofake') - - /** - * Trap get (hold scope) - */ - assert.equal(value.getName(), 'foofake') - - /** - * Trap get (reflect truth) - */ - assert.isUndefined(value.nonProp) - - /** - * Trap set - */ - value.nonProp = true - assert.isTrue(value.nonProp) - - /** - * Trap get constructor - */ - assert.equal(value.constructor.name, 'FooFake') - - /** - * Trap getPrototypeOf - */ - assert.deepEqual(Object.getOwnPropertyNames(Object.getPrototypeOf(value)), [ - 'constructor', - 'getName', - ]) - - /** - * Trap ownKeys - */ - assert.deepEqual(Object.getOwnPropertyNames(value), ['name', 'nonProp']) - - /** - * Trap isExtensible - */ - assert.isTrue(Object.isExtensible(value)) - - /** - * Trap deleteProperty - */ - delete value.nonProp - assert.isUndefined(value.nonProp) - - /** - * Trap has - */ - assert.isTrue('name' in value) - assert.isFalse('nonProp' in value) - - /** - * Trap setPrototypeOf - */ - Object.setPrototypeOf(value, { - getName() { - return 'proto name' - }, - }) - - assert.equal(value.getName(), 'proto name') - Object.setPrototypeOf(value, Foo.prototype) - assert.equal(value.getName(), 'foofake') - - /** - * Trap preventExtensions - */ - const fn1 = () => Object.preventExtensions(value) - assert.throws(fn1, 'Cannot prevent extensions during a fake') - }) - - test('ensure proxy traps works fine when fake has been restored', ({ assert }) => { - class Foo { - public name = 'foo' - public getName() { - return this.name - } - } - - class FooFake { - public name = 'foofake' - public getName() { - return this.name - } - } - - const ioc = new Ioc() - ioc.useProxies() - - ioc.bind('App/Foo', () => { - return new Foo() - }) - - const value = ioc.use('App/Foo') - assert.equal(value.name, 'foo') - assert.equal(value.getName(), 'foo') - assert.isUndefined(value.nonProp) - - value.nonProp = true - - assert.isTrue(value.nonProp) - assert.equal(value.constructor.name, 'Foo') - assert.deepEqual(Object.getOwnPropertyNames(Object.getPrototypeOf(value)), [ - 'constructor', - 'getName', - ]) - - // Fake added - ioc.fake('App/Foo', () => { - return new FooFake() - }) - - assert.equal(value.name, 'foofake') - assert.equal(value.getName(), 'foofake') - assert.isUndefined(value.nonProp) - - value.nonProp = true - - assert.isTrue(value.nonProp) - assert.equal(value.constructor.name, 'FooFake') - assert.deepEqual(Object.getOwnPropertyNames(Object.getPrototypeOf(value)), [ - 'constructor', - 'getName', - ]) - - // Fake restored - ioc.restore('App/Foo') - - assert.equal(value.name, 'foo') - assert.equal(value.getName(), 'foo') - assert.equal(value.constructor.name, 'Foo') - assert.deepEqual(Object.getOwnPropertyNames(Object.getPrototypeOf(value)), [ - 'constructor', - 'getName', - ]) - }) - - test('proxy class constructor', ({ assert }) => { - class Foo { - public name = 'foo' - public getName() { - return this.name - } - } - - class FooFake { - public name = 'foofake' - public getName() { - return this.name - } - } - - const ioc = new Ioc() - ioc.useProxies() - ioc.bind('App/Foo', () => { - return Foo - }) - - const value = ioc.use('App/Foo') - assert.instanceOf(new value(), Foo) - - ioc.fake('App/Foo', () => { - return FooFake - }) - - assert.equal(new value().name, 'foofake') - }) - - test('proxy class constructor via ioc.make', ({ assert }) => { - class Foo { - public name = 'foo' - public getName() { - return this.name - } - } - - class FooFake { - public name = 'foofake' - public getName() { - return this.name - } - } - - const ioc = new Ioc() - ioc.useProxies() - ioc.bind('App/Foo', () => { - return Foo - }) - - const value = ioc.make('App/Foo') - assert.instanceOf(new value(), Foo) - - ioc.fake('App/Foo', () => { - return FooFake - }) - - assert.equal(ioc.make(value).name, 'foofake') - }) - - test('proxy class constructor when no fake is defined', ({ assert }) => { - class Foo { - public name = 'foo' - public getName() { - return this.name - } - } - - const ioc = new Ioc() - ioc.useProxies() - ioc.bind('App/Foo', () => { - return Foo - }) - - const value = ioc.make('App/Foo') - assert.instanceOf(new value(), Foo) - assert.equal(new value().name, 'foo') - }) - - test('proxy class constructor via ioc.make when no fake is defined', ({ assert }) => { - class Foo { - public name = 'foo' - public getName() { - return this.name - } - } - - const ioc = new Ioc() - ioc.useProxies() - ioc.bind('App/Foo', () => { - return Foo - }) - - const value = ioc.make('App/Foo') - assert.instanceOf(new value(), Foo) - assert.equal(ioc.make(value).name, 'foo') - }) - - test('do not proxy literals when using ioc.make', ({ assert }) => { - const ioc = new Ioc() - ioc.useProxies() - ioc.bind('App/Foo', () => { - return 'foo' - }) - - const value = ioc.make('App/Foo') - assert.equal(value, 'foo') - - ioc.fake('App/Foo', () => { - return 'fakefake' - }) - - assert.equal(value, 'foo') - }) - - test('do not proxy literals when using ioc.use', ({ assert }) => { - const ioc = new Ioc() - ioc.useProxies() - ioc.bind('App/Foo', () => { - return 'foo' - }) - - const value = ioc.use('App/Foo') - assert.equal(value, 'foo') - - ioc.fake('App/Foo', () => { - return 'fakefake' - }) - assert.equal(value, 'foo') - }) - - test('proxy autoloaded class using use', async ({ assert }) => { - await fs.add( - 'Bar.ts', - `export = class Bar { - public name = 'bar' - }` - ) - - const ioc = new Ioc() - ioc.alias(fs.basePath, 'App') - - class BarFake { - public name = 'barfake' - public getName() { - return this.name - } - } - - ioc.useProxies() - const value = ioc.use('App/Bar') - assert.equal(new value().name, 'bar') - - ioc.fake('App/Bar', () => { - return BarFake - }) - assert.equal(new value().name, 'barfake') - }) - - test('proxy bindings using use', async ({ assert }) => { - const ioc = new Ioc() - ioc.bind('App/Bar', () => { - class Bar { - public name = 'bar' - } - return Bar - }) - - class FooFake { - public name = 'foofake' - public getName() { - return this.name - } - } - - ioc.useProxies() - const value = ioc.use('App/Bar') - assert.equal(new value().name, 'bar') - - ioc.fake('App/Bar', () => { - return FooFake - }) - assert.equal(new value().name, 'foofake') - }) - - test('proxy autoloaded class using make', async ({ assert }) => { - await fs.add( - 'Bar.ts', - `export default class Bar { - public name = 'bar' - }` - ) - - const ioc = new Ioc() - ioc.alias(fs.basePath, 'App') - - class BarFake { - public name = 'barfake' - public getName() { - return this.name - } - } - - ioc.useProxies() - assert.equal(ioc.make('App/Bar').name, 'bar') - - ioc.fake('App/Bar', () => { - return BarFake - }) - - assert.equal(ioc.make('App/Bar').name, 'barfake') - }) - - test('proxy bindings using make', ({ assert }) => { - class Foo { - public name = 'foo' - public getName() { - return this.name - } - } - - class FooFake { - public name = 'foofake' - public getName() { - return this.name - } - } - - const ioc = new Ioc() - ioc.useProxies() - ioc.bind('App/Foo', () => { - return new Foo() - }) - - const value = ioc.make('App/Foo') - assert.equal(value.name, 'foo') - - ioc.fake('App/Foo', () => { - return new FooFake() - }) - assert.equal(value.name, 'foofake') - }) -}) - -test.group('Ioc | inject decorator', () => { - test('set inject property for constructor injections', ({ assert }) => { - @inject(['App/Bar']) - class Foo { - constructor(public bar: any) {} - } - - assert.deepEqual(Foo['inject'], { - instance: ['App/Bar'], - }) - }) - - test('set inject property for constructor injections via reflection', ({ assert }) => { - class Bar {} - - @inject() - class Foo { - constructor(public bar: Bar) {} - } - - assert.deepEqual(Foo['inject'], { - instance: [Bar], - }) - }) - - test('set inject property for constructor by mix-matching reflection and custom injections', ({ - assert, - }) => { - class Bar {} - - @inject(['App/Baz']) - class Foo { - constructor(public baz: any, public bar: Bar) {} - } - - assert.deepEqual(Foo['inject'], { instance: ['App/Baz', Bar] }) - }) - - test('define custom injections after reflection index', ({ assert }) => { - class Bar {} - - @inject([null, 'App/Baz']) - class Foo { - constructor(public bar: Bar, public baz: any) {} - } - - assert.deepEqual(Foo['inject'], { instance: [Bar, 'App/Baz'] }) - }) - - test('set injections when parameter has no type', ({ assert }) => { - class Bar {} - - @inject() - class Foo { - constructor(public bar: Bar, public baz) {} - } - - assert.deepEqual(Foo['inject'], { instance: [Bar, Object] }) - }) - - test('set parameter injections', ({ assert }) => { - class Bar {} - - class Foo { - @inject() - public greet(_bar: Bar) {} - } - - assert.deepEqual(Foo['inject'], { greet: [Bar] }) - }) - - test('set multiple parameter injections', ({ assert }) => { - class Bar {} - - class Foo { - @inject() - public greet(_bar: Bar, _baz: any) {} - } - - assert.deepEqual(Foo['inject'], { greet: [Bar, Object] }) - }) - - test('inject constructor dependencies injected via decorator', ({ assert }) => { - const ioc = new Ioc() - class Bar {} - - @inject() - class Foo { - constructor(public bar: Bar) {} - } - - assert.instanceOf(ioc.make(Foo).bar, Bar) - }) - - test('inject constructor dependencies with runtime arguments', ({ assert }) => { - const ioc = new Ioc() - class Bar {} - - @inject() - class Foo { - constructor(public username: string, public bar: Bar) {} - } - - const foo = ioc.make(Foo, ['virk']) - - assert.instanceOf(foo.bar, Bar) - assert.equal(foo.username, 'virk') - }) - - test('raise error when class has primitive or object constructor injections', ({ assert }) => { - const ioc = new Ioc() - - @inject() - class Foo { - constructor(public baz: string) {} - } - - const fn = () => ioc.make(Foo) - assert.throws(fn, 'Cannot inject "{String Constructor}" to "Foo" at position "1"') - }) - - test('inject method dependencies injected via decorator', ({ assert }) => { - assert.plan(1) - const ioc = new Ioc() - - class Bar {} - - class Foo { - @inject() - public greet(bar: Bar) { - assert.instanceOf(bar, Bar) - } - } - - ioc.call(ioc.make(Foo), 'greet', []) - }) - - test('inject method dependencies with runtime arguments', ({ assert }) => { - assert.plan(2) - const ioc = new Ioc() - - class Bar {} - - class Foo { - @inject() - public greet(username: string, bar: Bar) { - assert.equal(username, 'virk') - assert.instanceOf(bar, Bar) - } - } - - ioc.call(ioc.make(Foo), 'greet', ['virk']) - }) - - test('inject method dependencies with interface type hinting', ({ assert }) => { - assert.plan(2) - const ioc = new Ioc() - - interface BarContract {} - class Bar {} - - ioc.bind('App/Bar', () => { - return new Bar() - }) - - class Foo { - @inject([null, 'App/Bar']) - public greet(username: string, bar: BarContract) { - assert.equal(username, 'virk') - assert.instanceOf(bar, Bar) - } - } - - ioc.call(ioc.make(Foo), 'greet', ['virk']) - }) - - test('raise error when method has primitive or object constructor injections', ({ assert }) => { - const ioc = new Ioc() - class Bar {} - - class Foo { - @inject() - public greet(_username: string, _bar: Bar) {} - } - - const fn = () => ioc.call(ioc.make(Foo), 'greet', []) - assert.throws(fn, 'Cannot inject "{String Constructor}" to "Foo.greet" at position "1"') - }) - - test('call object method even when it has zero injections', ({ assert }) => { - assert.plan(1) - const ioc = new Ioc() - - class Foo { - public greet() { - assert.isTrue(true) - } - } - - ioc.call(ioc.make(Foo), 'greet') - }) -}) - -test.group('Ioc | lookup resolve', (group) => { - group.each.teardown(async () => { - await fs.cleanup() - }) - - test('lookup binding from a lookup node', ({ assert }) => { - const ioc = new Ioc() - ioc.bind('App/Foo', () => { - return 'foo' - }) - - assert.equal(ioc.use({ type: 'binding', namespace: 'App/Foo' }), 'foo') - }) - - test('lookup directory alias value from a lookup node', async ({ assert }) => { - await fs.add('Foo.js', "module.exports = 'bar'") - - const ioc = new Ioc() - ioc.alias(fs.basePath, 'App') - - assert.equal(ioc.use({ type: 'alias', namespace: 'App/Foo' }), 'bar') - }) - - test('raise exception when unable to resolve lookup namespace', async ({ assert }) => { - await fs.add('Foo.js', "module.exports = 'bar'") - const ioc = new Ioc() - - ioc.alias(fs.basePath, 'App') - - const fn = () => ioc.use({ type: 'binding', namespace: 'App/Foo' }) - assert.throws( - fn, - 'E_IOC_LOOKUP_FAILED: Cannot resolve "App/Foo" namespace from the IoC Container' - ) - }) - - test('do not resolve binding for autoload lookup node', async ({ assert }) => { - await fs.add('Foo.js', "module.exports = 'bar'") - const ioc = new Ioc() - - ioc.bind('App/Foo', () => { - return 'foo' - }) - - const fn = () => ioc.use({ type: 'alias', namespace: 'App/Foo' }) - assert.throws( - fn, - 'E_IOC_LOOKUP_FAILED: Cannot resolve "App/Foo" namespace from the IoC Container' - ) - }) - - test('make binding from binding lookup node', ({ assert }) => { - const ioc = new Ioc() - class Bar {} - - ioc.bind('App/Foo', () => { - return Bar - }) - - assert.equal(ioc.make({ type: 'binding', namespace: 'App/Foo' }), Bar) - }) - - test('make binding from autoloaded lookup node', async ({ assert }) => { - await fs.add( - 'Foo.js', - ` - module.exports = class Bar { - constructor () { - this.name = 'bar' - } - } - ` - ) - - const ioc = new Ioc() - ioc.alias(fs.basePath, 'App') - - assert.equal(ioc.make({ type: 'alias', namespace: 'App/Foo' }).name, 'bar') - }) - - test('do not make binding for autoload lookup node', async ({ assert }) => { - await fs.add('Foo.js', "module.exports = 'bar'") - const ioc = new Ioc() - - ioc.bind('App/Foo', () => { - return 'foo' - }) - - const fn = () => ioc.make({ type: 'alias', namespace: 'App/Foo' }) - assert.throws( - fn, - 'E_IOC_LOOKUP_FAILED: Cannot resolve "App/Foo" namespace from the IoC Container' - ) - }) - - test('raise exception when unable to make lookup namespace', async ({ assert }) => { - await fs.add('Foo.js', "module.exports = 'bar'") - - const ioc = new Ioc() - ioc.alias(fs.basePath, 'App') - - const fn = () => ioc.make({ type: 'binding', namespace: 'App/Foo' }) - - assert.throws( - fn, - 'E_IOC_LOOKUP_FAILED: Cannot resolve "App/Foo" namespace from the IoC Container' - ) - }) -}) diff --git a/test/registrar.spec.ts b/test/registrar.spec.ts deleted file mode 100644 index 1778bd2..0000000 --- a/test/registrar.spec.ts +++ /dev/null @@ -1,230 +0,0 @@ -/* - * @adonisjs/fold - * - * (c) Harminder Virk - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -import { Filesystem } from '@poppinss/dev-utils' -import { join } from 'path' - -import { test } from '@japa/runner' -import { Registrar } from '../src/Registrar' -import { Ioc } from '../src/Ioc' - -const fs = new Filesystem(join(__dirname, './app')) - -test.group('Registrar', (group) => { - group.each.teardown(async () => { - await fs.cleanup() - }) - - test('register an array of providers', async ({ assert }) => { - await fs.add( - 'providers/FooProvider.js', - `module.exports = class MyProvider { - constructor () { - this.registered = false - } - - register () { - this.registered = true - } - }` - ) - - const registrar = new Registrar([[new Ioc()]]) - registrar.useProviders([join(fs.basePath, 'providers', 'FooProvider')]) - - const providers = await registrar.register() - assert.isTrue((providers[0] as any).registered) - }) - - test('register an array of providers when defined as es6 modules', async ({ assert }) => { - await fs.add( - 'providers/BarProvider.ts', - `export default class MyProvider { - public registered = false - register () { - this.registered = true - } - }` - ) - - const registrar = new Registrar([new Ioc()]) - registrar.useProviders([join(fs.basePath, 'providers', 'BarProvider')]) - - const providers = await registrar.register() - assert.isTrue((providers[0] as any).registered) - }) - - test('register and boot providers together', async ({ assert }) => { - await fs.add( - 'providers/BarProvider.ts', - `export default class MyProvider { - public registered = false - public booted = false - - register () { - this.registered = true - } - - async boot () { - this.booted = true - } - }` - ) - - const registrar = new Registrar([new Ioc()]) - registrar.useProviders([join(fs.basePath, 'providers', 'BarProvider')]) - - const providers = await registrar.registerAndBoot() - assert.isTrue((providers[0] as any).registered) - assert.isTrue((providers[0] as any).booted) - }) - - test('let providers define their own sub providers', async ({ assert }) => { - await fs.add( - 'providers/BazProvider.ts', - `export default class MyProvider { - public registered = false - public booted = false - - register () { - this.registered = true - } - - async boot () { - this.booted = true - } - }` - ) - - await fs.add( - 'providers/BarProvider.ts', - `export default class MyProvider { - public registered = false - public booted = false - - public provides = ['${join(fs.basePath, 'providers', 'BazProvider')}'] - - register () { - this.registered = true - } - - async boot () { - this.booted = true - } - }` - ) - - const registrar = new Registrar([new Ioc()]) - registrar.useProviders([join(fs.basePath, 'providers', 'BarProvider')]) - - const providers = await registrar.registerAndBoot() - assert.isTrue((providers[0] as any).registered) - assert.isTrue((providers[0] as any).booted) - - assert.isTrue((providers[1] as any).registered) - assert.isTrue((providers[1] as any).booted) - }) - - test('raise exception when provider is not exported as a default export', async ({ assert }) => { - assert.plan(1) - - await fs.add( - 'providers/BarProvider.ts', - `export class MyProvider { - public registered = false - public booted = false - - register () { - this.registered = true - } - - async boot () { - this.booted = true - } - }` - ) - - const providerPath = join(fs.basePath, 'providers', 'BarProvider') - const registrar = new Registrar([new Ioc()]) - registrar.useProviders([providerPath]) - - try { - await registrar.register() - } catch (error) { - assert.equal(error.message, `"${providerPath}" provider must use export default statement`) - } - }) - - test('resolve providers from relative path', async ({ assert }) => { - await fs.add( - 'providers/FooProvider.js', - `module.exports = class MyProvider { - constructor () { - this.registered = false - } - - register () { - this.registered = true - } - }` - ) - - const registrar = new Registrar([new Ioc()], fs.basePath) - registrar.useProviders(['./providers/FooProvider.js']) - - const providers = await registrar.register() - assert.isTrue((providers[0] as any).registered) - }) - - test('resolve sub providers from relative path', async ({ assert }) => { - await fs.add( - 'providers/BazProvider.ts', - `export default class MyProvider { - public registered = false - public booted = false - - register () { - this.registered = true - } - - async boot () { - this.booted = true - } - }` - ) - - await fs.add( - 'providers/BarProvider.ts', - `export default class MyProvider { - public registered = false - public booted = false - - public provides = ['./BazProvider'] - - register () { - this.registered = true - } - - async boot () { - this.booted = true - } - }` - ) - - const registrar = new Registrar([[new Ioc()]], fs.basePath) - registrar.useProviders(['./providers/BarProvider']) - - const providers = await registrar.registerAndBoot() - assert.isTrue((providers[0] as any).registered) - assert.isTrue((providers[0] as any).booted) - - assert.isTrue((providers[1] as any).registered) - assert.isTrue((providers[1] as any).booted) - }) -}) diff --git a/tests/maths.spec.ts b/tests/maths.spec.ts new file mode 100644 index 0000000..aed2d70 --- /dev/null +++ b/tests/maths.spec.ts @@ -0,0 +1,8 @@ +import { test } from '@japa/runner' + +test.group('Maths.add', () => { + test('add two numbers', ({ assert }) => { + // Test logic goes here + assert.equal(2 + 2, 4) + }) +}) diff --git a/tsconfig.json b/tsconfig.json index acec20e..a09dfa7 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,11 +1,28 @@ { - "extends": "./node_modules/@adonisjs/mrm-preset/_tsconfig", "compilerOptions": { - "experimentalDecorators": true, - "emitDecoratorMetadata": true, - "types": [ - "@types/node", - "reflect-metadata" - ] + "target": "ESNext", + "module": "NodeNext", + "lib": ["ESNext"], + "noUnusedLocals": true, + "noUnusedParameters": true, + "isolatedModules": true, + "removeComments": true, + "declaration": true, + "rootDir": "./", + "outDir": "./build", + "strictNullChecks": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "esModuleInterop": true, + "noImplicitAny": true, + "strictFunctionTypes": true, + "noImplicitThis": true, + "skipLibCheck": true, + "types": ["@types/node"] + }, + "include": ["./**/*"], + "exclude": ["./node_modules", "./build"], + "ts-node": { + "swc": true } } From e7ec31985fff230e0b2ce8b5528cf76b78d7995c Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Thu, 15 Sep 2022 16:34:57 +0530 Subject: [PATCH 002/145] ci: fix tests importer to normalize paths before import --- bin/test.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/bin/test.ts b/bin/test.ts index 30bf0cc..cd696b8 100644 --- a/bin/test.ts +++ b/bin/test.ts @@ -1,4 +1,5 @@ import { assert } from '@japa/assert' +import { pathToFileURL } from 'node:url' import { specReporter } from '@japa/spec-reporter' import { runFailedTests } from '@japa/run-failed-tests' import { processCliArgs, configure, run } from '@japa/runner' @@ -22,7 +23,7 @@ configure({ files: ['tests/**/*.spec.ts'], plugins: [assert(), runFailedTests()], reporters: [specReporter()], - importer: (filePath) => import(filePath), + importer: (filePath) => import(pathToFileURL(filePath).href), }, }) From 9806e17ccfc19b787c6db1211a981ac972293d3b Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Thu, 15 Sep 2022 16:37:52 +0530 Subject: [PATCH 003/145] refactor: add neccessary dot files --- .editorconfig | 15 +++++++++++++++ .npmrc | 1 + .prettierignore | 3 +++ 3 files changed, 19 insertions(+) create mode 100644 .editorconfig create mode 100644 .npmrc create mode 100644 .prettierignore diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..4d8e8a7 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,15 @@ +# http://editorconfig.org + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.json] +insert_final_newline = ignore + +[*.md] +trim_trailing_whitespace = false diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..43c97e7 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +package-lock=false diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..93985d9 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,3 @@ +build +docs +*.html From ef1fb7c3ae80e19dc592dfdda46c03a2f0cb5743 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Thu, 15 Sep 2022 16:42:48 +0530 Subject: [PATCH 004/145] chore: remove ejs --- package-lock.json | 15653 -------------------------------------------- package.json | 22 +- 2 files changed, 18 insertions(+), 15657 deletions(-) delete mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index c3f3de9..0000000 --- a/package-lock.json +++ /dev/null @@ -1,15653 +0,0 @@ -{ - "name": "@adonisjs/fold", - "version": "8.2.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "@adonisjs/fold", - "version": "8.2.0", - "license": "MIT", - "devDependencies": { - "@commitlint/cli": "^17.0.2", - "@commitlint/config-conventional": "^17.0.2", - "@japa/assert": "^1.3.4", - "@japa/run-failed-tests": "^1.0.7", - "@japa/runner": "^2.0.9", - "@japa/spec-reporter": "^1.1.12", - "@swc/core": "^1.2.203", - "@types/node": "^18.0.0", - "del-cli": "^4.0.1", - "ejs": "^3.1.8", - "eslint": "^8.17.0", - "eslint-config-prettier": "^8.5.0", - "eslint-plugin-adonis": "^3.0.2", - "eslint-plugin-prettier": "^4.0.0", - "github-label-sync": "^2.2.0", - "husky": "^8.0.1", - "np": "^7.6.1", - "prettier": "^2.7.1", - "ts-node": "^10.8.1", - "typescript": "^4.7.3" - } - }, - "node_modules/@apidevtools/json-schema-ref-parser": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz", - "integrity": "sha512-GBD2Le9w2+lVFoc4vswGI/TjkNIZSVp7+9xPf+X3uidBfWnAeUWmquteSyt0+VCrhNMWj/FTABISQrD3Z/YA+w==", - "dev": true, - "dependencies": { - "@jsdevtools/ono": "^7.1.3", - "@types/json-schema": "^7.0.6", - "call-me-maybe": "^1.0.1", - "js-yaml": "^4.1.0" - } - }, - "node_modules/@apidevtools/json-schema-ref-parser/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/@apidevtools/json-schema-ref-parser/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/@apidevtools/openapi-schemas": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@apidevtools/openapi-schemas/-/openapi-schemas-2.1.0.tgz", - "integrity": "sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/@apidevtools/swagger-methods": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@apidevtools/swagger-methods/-/swagger-methods-3.0.2.tgz", - "integrity": "sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==", - "dev": true - }, - "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "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/@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/@commitlint/cli": { - "version": "17.1.2", - "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-17.1.2.tgz", - "integrity": "sha512-h/4Hlka3bvCLbnxf0Er2ri5A44VMlbMSkdTRp8Adv2tRiklSTRIoPGs7OEXDv3EoDs2AAzILiPookgM4Gi7LOw==", - "dev": true, - "dependencies": { - "@commitlint/format": "^17.0.0", - "@commitlint/lint": "^17.1.0", - "@commitlint/load": "^17.1.2", - "@commitlint/read": "^17.1.0", - "@commitlint/types": "^17.0.0", - "execa": "^5.0.0", - "lodash": "^4.17.19", - "resolve-from": "5.0.0", - "resolve-global": "1.0.0", - "yargs": "^17.0.0" - }, - "bin": { - "commitlint": "cli.js" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/config-conventional": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-17.1.0.tgz", - "integrity": "sha512-WU2p0c9/jLi8k2q2YrDV96Y8XVswQOceIQ/wyJvQxawJSCasLdRB3kUIYdNjOCJsxkpoUlV/b90ZPxp1MYZDiA==", - "dev": true, - "dependencies": { - "conventional-changelog-conventionalcommits": "^5.0.0" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/config-validator": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-17.1.0.tgz", - "integrity": "sha512-Q1rRRSU09ngrTgeTXHq6ePJs2KrI+axPTgkNYDWSJIuS1Op4w3J30vUfSXjwn5YEJHklK3fSqWNHmBhmTR7Vdg==", - "dev": true, - "dependencies": { - "@commitlint/types": "^17.0.0", - "ajv": "^8.11.0" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/ensure": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-17.0.0.tgz", - "integrity": "sha512-M2hkJnNXvEni59S0QPOnqCKIK52G1XyXBGw51mvh7OXDudCmZ9tZiIPpU882p475Mhx48Ien1MbWjCP1zlyC0A==", - "dev": true, - "dependencies": { - "@commitlint/types": "^17.0.0", - "lodash": "^4.17.19" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/execute-rule": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-17.0.0.tgz", - "integrity": "sha512-nVjL/w/zuqjCqSJm8UfpNaw66V9WzuJtQvEnCrK4jDw6qKTmZB+1JQ8m6BQVZbNBcwfYdDNKnhIhqI0Rk7lgpQ==", - "dev": true, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/format": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-17.0.0.tgz", - "integrity": "sha512-MZzJv7rBp/r6ZQJDEodoZvdRM0vXu1PfQvMTNWFb8jFraxnISMTnPBWMMjr2G/puoMashwaNM//fl7j8gGV5lA==", - "dev": true, - "dependencies": { - "@commitlint/types": "^17.0.0", - "chalk": "^4.1.0" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/is-ignored": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-17.1.0.tgz", - "integrity": "sha512-JITWKDMHhIh8IpdIbcbuH9rEQJty1ZWelgjleTFrVRAcEwN/sPzk1aVUXRIZNXMJWbZj8vtXRJnFihrml8uECQ==", - "dev": true, - "dependencies": { - "@commitlint/types": "^17.0.0", - "semver": "7.3.7" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/lint": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-17.1.0.tgz", - "integrity": "sha512-ltpqM2ogt/+SDhUaScFo0MdscncEF96lvQTPMM/VTTWlw7sTGLLWkOOppsee2MN/uLNNWjQ7kqkd4h6JqoM9AQ==", - "dev": true, - "dependencies": { - "@commitlint/is-ignored": "^17.1.0", - "@commitlint/parse": "^17.0.0", - "@commitlint/rules": "^17.0.0", - "@commitlint/types": "^17.0.0" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/load": { - "version": "17.1.2", - "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-17.1.2.tgz", - "integrity": "sha512-sk2p/jFYAWLChIfOIp/MGSIn/WzZ0vkc3afw+l4X8hGEYkvDe4gQUUAVxjl/6xMRn0HgnSLMZ04xXh5pkTsmgg==", - "dev": true, - "dependencies": { - "@commitlint/config-validator": "^17.1.0", - "@commitlint/execute-rule": "^17.0.0", - "@commitlint/resolve-extends": "^17.1.0", - "@commitlint/types": "^17.0.0", - "@types/node": "^14.0.0", - "chalk": "^4.1.0", - "cosmiconfig": "^7.0.0", - "cosmiconfig-typescript-loader": "^4.0.0", - "lodash": "^4.17.19", - "resolve-from": "^5.0.0", - "ts-node": "^10.8.1", - "typescript": "^4.6.4" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/load/node_modules/@types/node": { - "version": "14.18.29", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.29.tgz", - "integrity": "sha512-LhF+9fbIX4iPzhsRLpK5H7iPdvW8L4IwGciXQIOEcuF62+9nw/VQVsOViAOOGxY3OlOKGLFv0sWwJXdwQeTn6A==", - "dev": true - }, - "node_modules/@commitlint/message": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-17.0.0.tgz", - "integrity": "sha512-LpcwYtN+lBlfZijHUdVr8aNFTVpHjuHI52BnfoV01TF7iSLnia0jttzpLkrLmI8HNQz6Vhr9UrxDWtKZiMGsBw==", - "dev": true, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/parse": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-17.0.0.tgz", - "integrity": "sha512-cKcpfTIQYDG1ywTIr5AG0RAiLBr1gudqEsmAGCTtj8ffDChbBRxm6xXs2nv7GvmJN7msOt7vOKleLvcMmRa1+A==", - "dev": true, - "dependencies": { - "@commitlint/types": "^17.0.0", - "conventional-changelog-angular": "^5.0.11", - "conventional-commits-parser": "^3.2.2" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/read": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-17.1.0.tgz", - "integrity": "sha512-73BoFNBA/3Ozo2JQvGsE0J8SdrJAWGfZQRSHqvKaqgmY042Su4gXQLqvAzgr55S9DI1l9TiU/5WDuh8IE86d/g==", - "dev": true, - "dependencies": { - "@commitlint/top-level": "^17.0.0", - "@commitlint/types": "^17.0.0", - "fs-extra": "^10.0.0", - "git-raw-commits": "^2.0.0", - "minimist": "^1.2.6" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/resolve-extends": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-17.1.0.tgz", - "integrity": "sha512-jqKm00LJ59T0O8O4bH4oMa4XyJVEOK4GzH8Qye9XKji+Q1FxhZznxMV/bDLyYkzbTodBt9sL0WLql8wMtRTbqQ==", - "dev": true, - "dependencies": { - "@commitlint/config-validator": "^17.1.0", - "@commitlint/types": "^17.0.0", - "import-fresh": "^3.0.0", - "lodash": "^4.17.19", - "resolve-from": "^5.0.0", - "resolve-global": "^1.0.0" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/rules": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-17.0.0.tgz", - "integrity": "sha512-45nIy3dERKXWpnwX9HeBzK5SepHwlDxdGBfmedXhL30fmFCkJOdxHyOJsh0+B0RaVsLGT01NELpfzJUmtpDwdQ==", - "dev": true, - "dependencies": { - "@commitlint/ensure": "^17.0.0", - "@commitlint/message": "^17.0.0", - "@commitlint/to-lines": "^17.0.0", - "@commitlint/types": "^17.0.0", - "execa": "^5.0.0" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/to-lines": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-17.0.0.tgz", - "integrity": "sha512-nEi4YEz04Rf2upFbpnEorG8iymyH7o9jYIVFBG1QdzebbIFET3ir+8kQvCZuBE5pKCtViE4XBUsRZz139uFrRQ==", - "dev": true, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/top-level": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-17.0.0.tgz", - "integrity": "sha512-dZrEP1PBJvodNWYPOYiLWf6XZergdksKQaT6i1KSROLdjf5Ai0brLOv5/P+CPxBeoj3vBxK4Ax8H1Pg9t7sHIQ==", - "dev": true, - "dependencies": { - "find-up": "^5.0.0" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/types": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-17.0.0.tgz", - "integrity": "sha512-hBAw6U+SkAT5h47zDMeOu3HSiD0SODw4Aq7rRNh1ceUmL7GyLKYhPbUvlRWqZ65XjBLPHZhFyQlRaPNz8qvUyQ==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.2.tgz", - "integrity": "sha512-AXYd23w1S/bv3fTs3Lz0vjiYemS08jWkI3hYyS9I1ry+0f+Yjs1wm+sU0BS8qDOPrBIkp4qHYC16I8uVtpLajQ==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.4.0", - "globals": "^13.15.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/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/@eslint/eslintrc/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@eslint/eslintrc/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/@financial-times/origami-service-makefile": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@financial-times/origami-service-makefile/-/origami-service-makefile-7.0.3.tgz", - "integrity": "sha512-aKe65sZ3XgZ/0Sm0MDLbGrcO3G4DRv/bVW4Gpmw68cRZV9IBE7h/pwfR3Rs7njNSZMFkjS4rPG/YySv9brQByA==", - "dev": true - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", - "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/gitignore-to-minimatch": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", - "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "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": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "node_modules/@japa/assert": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/@japa/assert/-/assert-1.3.6.tgz", - "integrity": "sha512-aFyCRdLAgYR4P45CayMY7MlzHKLp+oKr2fGj34jObWqmNZOWgFJuEcwBGoqbr+ApL/9Qhkcq0hoFL2FyfFJ7Jw==", - "dev": true, - "dependencies": { - "@types/chai": "^4.3.3", - "api-contract-validator": "^2.2.8", - "chai": "^4.3.6", - "macroable": "^7.0.1" - }, - "peerDependencies": { - "@japa/runner": "^2.1.1" - } - }, - "node_modules/@japa/base-reporter": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@japa/base-reporter/-/base-reporter-1.0.2.tgz", - "integrity": "sha512-ONuLhtQ2UKAqooxm0VjILtZ+r3FvIuIjIh66qyMrfZZUE9Ht+dVxjmnMKRo1MgLnP9D6Rh98JUJEVaiJfgEEKQ==", - "dev": true, - "dependencies": { - "@japa/errors-printer": "^1.3.10", - "@poppinss/cliui": "^3.0.2", - "ms": "^2.1.3" - }, - "peerDependencies": { - "@japa/core": "^7.0.0" - } - }, - "node_modules/@japa/base-reporter/node_modules/@japa/errors-printer": { - "version": "1.3.10", - "resolved": "https://registry.npmjs.org/@japa/errors-printer/-/errors-printer-1.3.10.tgz", - "integrity": "sha512-tUTHnDiGXnhKHZry63sSb4wS3bs2wxvrUOofDzYKilmAY0nUGCIQwpkpSaqVmC3l0xqk29EhBZJewmDCrUBIPw==", - "dev": true, - "dependencies": { - "@poppinss/cliui": "^3.0.2", - "jest-diff": "^29.0.1", - "youch": "^3.2.1", - "youch-terminal": "^2.1.5" - } - }, - "node_modules/@japa/core": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@japa/core/-/core-7.2.0.tgz", - "integrity": "sha512-CnF1NoNgQWH0UALJQ+YNJjXMXdFYb+wlGdppFptsvn2FmjejWFtXeuPCACl4hX4vQahfPKEojSIRKL4iTML6FQ==", - "dev": true, - "dependencies": { - "@poppinss/hooks": "^6.0.2-0", - "async-retry": "^1.3.3", - "emittery": "^0.13.1", - "macroable": "^7.0.1", - "time-span": "^4.0.0" - } - }, - "node_modules/@japa/errors-printer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@japa/errors-printer/-/errors-printer-2.0.1.tgz", - "integrity": "sha512-6ngqHgvgDzVVz2zMd+vCziAfVoAyDxOXvgvHNNVAddAtbmd62eyFexG0hfTUZnkY8EthVG7o8lv6XpcsJL1kxA==", - "dev": true, - "dependencies": { - "@poppinss/cliui": "^3.0.2", - "jest-diff": "^29.0.2", - "youch": "^3.2.2", - "youch-terminal": "^2.1.5" - } - }, - "node_modules/@japa/run-failed-tests": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@japa/run-failed-tests/-/run-failed-tests-1.1.0.tgz", - "integrity": "sha512-kwD/esM3Mc+4eslhAN31e5r/fCMHi9kNlg4FvetgdmS6bR9XTlTR3Cy2fJ4LwMYhNcLFRcBEw9x8d0Nobq9ryg==", - "dev": true, - "dependencies": { - "@poppinss/cliui": "^3.0.2", - "find-cache-dir": "^3.3.2", - "fs-extra": "^10.1.0" - }, - "peerDependencies": { - "@japa/runner": "^2.1.1" - } - }, - "node_modules/@japa/runner": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@japa/runner/-/runner-2.2.1.tgz", - "integrity": "sha512-jP7soKxHm791YzVelwQOZQ1WItgQvbFo0hR0iwULcPqYs/Vh2p70ojPwjYgQ0HbfxyKAEUOjGJXTePRxF2JapQ==", - "dev": true, - "dependencies": { - "@japa/core": "^7.2.0", - "@japa/errors-printer": "^2.0.1", - "@poppinss/cliui": "^3.0.2", - "@poppinss/hooks": "^6.0.2-0", - "fast-glob": "^3.2.12", - "getopts": "^2.3.0", - "inclusion": "^1.0.1" - } - }, - "node_modules/@japa/spec-reporter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@japa/spec-reporter/-/spec-reporter-1.3.0.tgz", - "integrity": "sha512-YTl51H0zAHLJTpTajbRjplRaXqSWUpQaJvtWWrjVGPYVPEfB3RrRHFsRXwpTZI/IZN+/eaZ+ZX/ucZfmFrzY+g==", - "dev": true, - "dependencies": { - "@japa/base-reporter": "^1.0.2", - "@japa/errors-printer": "^2.0.1", - "@poppinss/cliui": "^3.0.2", - "ms": "^2.1.3" - } - }, - "node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", - "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" - }, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/@jest/types/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@jsdevtools/ono": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", - "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", - "dev": true - }, - "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/@poppinss/cliui": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@poppinss/cliui/-/cliui-3.0.2.tgz", - "integrity": "sha512-nrAosoQy0ex3wSw3VuigLs3XCsxDsnNvx4ZL4ZvdZlygrChMUKPKnlxctQk13IyUHaH4F/wvaHnfWg/inhA36w==", - "dev": true, - "dependencies": { - "@poppinss/colors": "^3.0.2", - "cli-boxes": "^3.0.0", - "cli-table3": "^0.6.1", - "color-support": "^1.1.3", - "log-update": "^4.0.0", - "pretty-hrtime": "^1.0.3", - "string-width": "^4.2.2" - } - }, - "node_modules/@poppinss/colors": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@poppinss/colors/-/colors-3.0.2.tgz", - "integrity": "sha512-kgIiDPKUV0IaNtzLKricxd3mMWepqCbgh2Mb0M8C5zyS1bJ0K86s6dMu9xEKtF2XksqyE0qV4ANtMnTCMjQgvA==", - "dev": true, - "dependencies": { - "color-support": "^1.1.3", - "kleur": "^4.1.4" - } - }, - "node_modules/@poppinss/hooks": { - "version": "6.0.2-0", - "resolved": "https://registry.npmjs.org/@poppinss/hooks/-/hooks-6.0.2-0.tgz", - "integrity": "sha512-mG0hnQlxgflvxyM6t/XO8z/FwotsYRXPhtLZ3cz3iyk4t8xaNtOihSANBcvqdkxZCtGBvotNIf/GnES9hvlfSQ==", - "dev": true - }, - "node_modules/@samverschueren/stream-to-observable": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.1.tgz", - "integrity": "sha512-c/qwwcHyafOQuVQJj0IlBjf5yYgBI7YPJ77k4fOJYesb41jio65eaJODRUmfYKhTOFBrIZ66kgvGPlNbjuoRdQ==", - "dev": true, - "dependencies": { - "any-observable": "^0.3.0" - }, - "engines": { - "node": ">=6" - }, - "peerDependenciesMeta": { - "rxjs": { - "optional": true - }, - "zen-observable": { - "optional": true - } - } - }, - "node_modules/@samverschueren/stream-to-observable/node_modules/any-observable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.3.0.tgz", - "integrity": "sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sinclair/typebox": { - "version": "0.24.41", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.41.tgz", - "integrity": "sha512-TJCgQurls4FipFvHeC+gfAzb+GGstL0TDwYJKQVtTeSvJIznWzP7g3bAd5gEBlr8+bIxqnWS9VGVWREDhmE8jA==", - "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/@swc/core": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.1.tgz", - "integrity": "sha512-ztB5N63UGLIOM60Vg+deHVigEnDAEAttiTQk4T91/i11SoOO65P9z8Bey01XFTxF0Alc2OJxkt8TBcq+n5mMYQ==", - "dev": true, - "hasInstallScript": true, - "bin": { - "swcx": "run_swcx.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/swc" - }, - "optionalDependencies": { - "@swc/core-android-arm-eabi": "1.3.1", - "@swc/core-android-arm64": "1.3.1", - "@swc/core-darwin-arm64": "1.3.1", - "@swc/core-darwin-x64": "1.3.1", - "@swc/core-freebsd-x64": "1.3.1", - "@swc/core-linux-arm-gnueabihf": "1.3.1", - "@swc/core-linux-arm64-gnu": "1.3.1", - "@swc/core-linux-arm64-musl": "1.3.1", - "@swc/core-linux-x64-gnu": "1.3.1", - "@swc/core-linux-x64-musl": "1.3.1", - "@swc/core-win32-arm64-msvc": "1.3.1", - "@swc/core-win32-ia32-msvc": "1.3.1", - "@swc/core-win32-x64-msvc": "1.3.1" - } - }, - "node_modules/@swc/core-android-arm-eabi": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@swc/core-android-arm-eabi/-/core-android-arm-eabi-1.3.1.tgz", - "integrity": "sha512-fZ6nTalHWYn1OHfU87yF8s24edgQ4COHydLlPcpU/pwSH90hCwy/fgna5PpUBw0rfzGBttX0/0yMorC7ZSar4Q==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "dependencies": { - "@swc/wasm": "1.2.122" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-android-arm64": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@swc/core-android-arm64/-/core-android-arm64-1.3.1.tgz", - "integrity": "sha512-aDrV22ajQ4NYOwxEWvipPpdhHaLqU5W1rxRap5N1KSetzwGIk6NMd31o6Jotoxf7tB8qtLlo5VyNok4adJRVYg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "dependencies": { - "@swc/wasm": "1.2.130" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-android-arm64/node_modules/@swc/wasm": { - "version": "1.2.130", - "resolved": "https://registry.npmjs.org/@swc/wasm/-/wasm-1.2.130.tgz", - "integrity": "sha512-rNcJsBxS70+pv8YUWwf5fRlWX6JoY/HJc25HD/F8m6Kv7XhJdqPPMhyX6TKkUBPAG7TWlZYoxa+rHAjPy4Cj3Q==", - "dev": true, - "optional": true - }, - "node_modules/@swc/core-darwin-arm64": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.1.tgz", - "integrity": "sha512-yom8pqaDhsncQaqp+NdXk1YEtWoqPrfsyKJP3RriTbUjXS/20q/WNfkkJjxUuaFZC6PH/MuvrLzD6Z6ZuZvLaA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-darwin-x64": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.1.tgz", - "integrity": "sha512-Q2kH2i5pS0dvauOiRR4s7atH+Qrhe1LmiCv1D2U+AghZMfDcxi3DBTxrae/YqmDYm3GxHH3ZSAFHR3E0SeiSSg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-freebsd-x64": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@swc/core-freebsd-x64/-/core-freebsd-x64-1.3.1.tgz", - "integrity": "sha512-f2a+rPGrhAICF+Du/nHWZlYzltX1/fWyt+v0IP+r0Zh4drgTrt5G3sMYrQVTjsKvI8R6tV2Q7BfYvDIQXwE1pw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "dependencies": { - "@swc/wasm": "1.2.130" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-freebsd-x64/node_modules/@swc/wasm": { - "version": "1.2.130", - "resolved": "https://registry.npmjs.org/@swc/wasm/-/wasm-1.2.130.tgz", - "integrity": "sha512-rNcJsBxS70+pv8YUWwf5fRlWX6JoY/HJc25HD/F8m6Kv7XhJdqPPMhyX6TKkUBPAG7TWlZYoxa+rHAjPy4Cj3Q==", - "dev": true, - "optional": true - }, - "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.1.tgz", - "integrity": "sha512-Q1zGHJMvAEkFdW7A2dthFrswf/HezhC2kOSoOmitz+KxWBZ0YSj8k9ImLYGFf7S8Vi0KVzLUaE1jCGK2oePx/A==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "dependencies": { - "@swc/wasm": "1.2.130" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm-gnueabihf/node_modules/@swc/wasm": { - "version": "1.2.130", - "resolved": "https://registry.npmjs.org/@swc/wasm/-/wasm-1.2.130.tgz", - "integrity": "sha512-rNcJsBxS70+pv8YUWwf5fRlWX6JoY/HJc25HD/F8m6Kv7XhJdqPPMhyX6TKkUBPAG7TWlZYoxa+rHAjPy4Cj3Q==", - "dev": true, - "optional": true - }, - "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.1.tgz", - "integrity": "sha512-5OPkiU2A4Ijt2cRzi2FCGPkAC+wRvAb0TmUkL4Lj2PXPzM5RtEd2AoYmpQhV+YEOXO4XdnKwgBmdeiQV5K8eXA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.1.tgz", - "integrity": "sha512-oTIeS7kEKSUrTxavYBEfqjqoIiHtbwSdgp/rrn2hz7CDG1B1imRHnsjwdh4YaYLsm8RcCH9+GABnHxJd3Nd6qg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.1.tgz", - "integrity": "sha512-gNojY1qIKksK9kNdY4pqrlUILTxfqSWtXjX0qV2mlxgwRpnOATJnMx585q09cOZnkN2/QB+33pXnT8z/wxuGzQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-x64-musl": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.1.tgz", - "integrity": "sha512-WXNagCsjul7U9uYYP1JkUUVtvqXRDDWjvdegqrtQ99/De+HoWr+fCPgvENgOsSwb0clPTBuiGm2PTnK6kDQ0Sw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.1.tgz", - "integrity": "sha512-3LSDJtpYNgN4N/pd/YzHAWKaF2Y/1P9t83vHfPos77hQ+KzFaiyT7YIG1qfYy1AD8MGC28l2bJNH2gia3bcERA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "dependencies": { - "@swc/wasm": "1.2.130" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-arm64-msvc/node_modules/@swc/wasm": { - "version": "1.2.130", - "resolved": "https://registry.npmjs.org/@swc/wasm/-/wasm-1.2.130.tgz", - "integrity": "sha512-rNcJsBxS70+pv8YUWwf5fRlWX6JoY/HJc25HD/F8m6Kv7XhJdqPPMhyX6TKkUBPAG7TWlZYoxa+rHAjPy4Cj3Q==", - "dev": true, - "optional": true - }, - "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.1.tgz", - "integrity": "sha512-0VfPVkQx7jV7k71tTQY5HchDrALWjrHF8AcaaCojXQpb9ftktLxaCUdTWlQ+Y958GkgG7QX+HEo95ImZ+cYRHQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "dependencies": { - "@swc/wasm": "1.2.130" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-ia32-msvc/node_modules/@swc/wasm": { - "version": "1.2.130", - "resolved": "https://registry.npmjs.org/@swc/wasm/-/wasm-1.2.130.tgz", - "integrity": "sha512-rNcJsBxS70+pv8YUWwf5fRlWX6JoY/HJc25HD/F8m6Kv7XhJdqPPMhyX6TKkUBPAG7TWlZYoxa+rHAjPy4Cj3Q==", - "dev": true, - "optional": true - }, - "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.1.tgz", - "integrity": "sha512-jSeqI8+1PGp+lHtyQCieDQxSszOF6UlA3bC2cmC9LAD84xcvsqpt0hsg3GFaw6RR7FsVjMNl/St6y1EEW0mm6Q==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/wasm": { - "version": "1.2.122", - "resolved": "https://registry.npmjs.org/@swc/wasm/-/wasm-1.2.122.tgz", - "integrity": "sha512-sM1VCWQxmNhFtdxME+8UXNyPNhxNu7zdb6ikWpz0YKAQQFRGT5ThZgJrubEpah335SUToNg8pkdDF7ibVCjxbQ==", - "dev": true, - "optional": 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/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", - "dev": true - }, - "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/chai": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.3.tgz", - "integrity": "sha512-hC7OMnszpxhZPduX+m+nrx+uFoLkWOMiR4oa/AZF3MuSETYTZmFfJAHqZEM8MVlvfG7BEUcgvtwoCTxBp6hm3g==", - "dev": true - }, - "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.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", - "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "*", - "@types/istanbul-lib-report": "*" - } - }, - "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/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/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", - "dev": true - }, - "node_modules/@types/node": { - "version": "18.7.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.18.tgz", - "integrity": "sha512-m+6nTEOadJZuTPkKR/SYK3A2d7FZrgElol9UP1Kae90VVU4a6mxnPuLiIW1m4Cq4gZ/nWb9GrdVXJCoCazDAbg==", - "dev": true - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", - "dev": true - }, - "node_modules/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true - }, - "node_modules/@types/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/yargs": { - "version": "15.0.14", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.14.tgz", - "integrity": "sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", - "dev": true - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.37.0.tgz", - "integrity": "sha512-Fde6W0IafXktz1UlnhGkrrmnnGpAo1kyX7dnyHHVrmwJOn72Oqm3eYtddrpOwwel2W8PAK9F3pIL5S+lfoM0og==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.37.0", - "@typescript-eslint/type-utils": "5.37.0", - "@typescript-eslint/utils": "5.37.0", - "debug": "^4.3.4", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.2.0", - "regexpp": "^3.2.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/parser": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.37.0.tgz", - "integrity": "sha512-01VzI/ipYKuaG5PkE5+qyJ6m02fVALmMPY3Qq5BHflDx3y4VobbLdHQkSMg9VPRS4KdNt4oYTMaomFoHonBGAw==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.37.0", - "@typescript-eslint/types": "5.37.0", - "@typescript-eslint/typescript-estree": "5.37.0", - "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.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.37.0.tgz", - "integrity": "sha512-F67MqrmSXGd/eZnujjtkPgBQzgespu/iCZ+54Ok9X5tALb9L2v3G+QBSoWkXG0p3lcTJsL+iXz5eLUEdSiJU9Q==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.37.0", - "@typescript-eslint/visitor-keys": "5.37.0" - }, - "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.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.37.0.tgz", - "integrity": "sha512-BSx/O0Z0SXOF5tY0bNTBcDEKz2Ec20GVYvq/H/XNKiUorUFilH7NPbFUuiiyzWaSdN3PA8JV0OvYx0gH/5aFAQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "5.37.0", - "@typescript-eslint/utils": "5.37.0", - "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/types": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.37.0.tgz", - "integrity": "sha512-3frIJiTa5+tCb2iqR/bf7XwU20lnU05r/sgPJnRpwvfZaqCJBrl8Q/mw9vr3NrNdB/XtVyMA0eppRMMBqdJ1bA==", - "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.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.37.0.tgz", - "integrity": "sha512-JkFoFIt/cx59iqEDSgIGnQpCTRv96MQnXCYvJi7QhBC24uyuzbD8wVbajMB1b9x4I0octYFJ3OwjAwNqk1AjDA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.37.0", - "@typescript-eslint/visitor-keys": "5.37.0", - "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/utils": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.37.0.tgz", - "integrity": "sha512-jUEJoQrWbZhmikbcWSMDuUSxEE7ID2W/QCV/uz10WtQqfOuKZUqFGjqLJ+qhDd17rjgp+QJPqTdPIBWwoob2NQ==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.37.0", - "@typescript-eslint/types": "5.37.0", - "@typescript-eslint/typescript-estree": "5.37.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - }, - "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/visitor-keys": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.37.0.tgz", - "integrity": "sha512-Hp7rT4cENBPIzMwrlehLW/28EVCOcE9U1Z1BQTc8EA8v5qpr7GRGuG+U58V5tTY48zvUOA3KHvw3rA8tY9fbdA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.37.0", - "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/acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", - "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/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dev": true, - "dependencies": { - "string-width": "^4.1.0" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/any-observable": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.5.1.tgz", - "integrity": "sha512-8zv01bgDOp9PTmRTNCAHTw64TFP2rvlX4LvtNJLachaXY+AjmIvLT47fABNPCiIe89hKiSCo2n5zmPqI9CElPA==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - }, - "peerDependenciesMeta": { - "rxjs": { - "optional": true - }, - "zen-observable": { - "optional": true - } - } - }, - "node_modules/api-contract-validator": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/api-contract-validator/-/api-contract-validator-2.2.8.tgz", - "integrity": "sha512-YM3rMcrIp8Thf/WWbVBXBGX793Mm3Phw2pn3VbJpiZkpeTCTtF10huKPrzQ2gSIaK5GjAhTRJMAOyf+rsS7MAw==", - "dev": true, - "dependencies": { - "api-schema-builder": "^2.0.10", - "chalk": "^3.0.0", - "columnify": "^1.5.4", - "jest-diff": "^25.5.0", - "jest-matcher-utils": "^25.5.0", - "lodash.flatten": "^4.4.0", - "lodash.get": "^4.4.2", - "lodash.set": "^4.3.2", - "uri-js": "^4.4.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/api-contract-validator/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/api-contract-validator/node_modules/diff-sequences": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", - "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==", - "dev": true, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/api-contract-validator/node_modules/jest-diff": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.5.0.tgz", - "integrity": "sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A==", - "dev": true, - "dependencies": { - "chalk": "^3.0.0", - "diff-sequences": "^25.2.6", - "jest-get-type": "^25.2.6", - "pretty-format": "^25.5.0" - }, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/api-contract-validator/node_modules/jest-get-type": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", - "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", - "dev": true, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/api-contract-validator/node_modules/pretty-format": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", - "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", - "dev": true, - "dependencies": { - "@jest/types": "^25.5.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - }, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/api-contract-validator/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - }, - "node_modules/api-schema-builder": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/api-schema-builder/-/api-schema-builder-2.0.11.tgz", - "integrity": "sha512-85zbwf8MtPWodhfnmQRW5YD/fuGR12FP+8TbcYai5wbRnoUmPYLftLSbp7NB6zQMPb61Gjz+ApPUSyTdcCos7g==", - "dev": true, - "dependencies": { - "ajv": "^6.12.6", - "clone-deep": "^4.0.1", - "decimal.js": "^10.3.1", - "js-yaml": "^3.14.1", - "json-schema-deref-sync": "^0.14.0", - "lodash.get": "^4.4.2", - "openapi-schema-validator": "^3.0.3", - "swagger-parser": "^10.0.3" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/api-schema-builder/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/api-schema-builder/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/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/array-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-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-uniq": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.2.tgz", - "integrity": "sha512-GVYjmpL05al4dNlKJm53mKE4w9OOLiuVHWorsIA3YVz+Hu0hcn6PtE3Ydl0EqU7v+7ABC4mjjWsnLUxbpno+CA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/as-table": { - "version": "1.0.55", - "resolved": "https://registry.npmjs.org/as-table/-/as-table-1.0.55.tgz", - "integrity": "sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==", - "dev": true, - "dependencies": { - "printable-characters": "^1.0.42" - } - }, - "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/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/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", - "dev": true - }, - "node_modules/async-exit-hook": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", - "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/async-retry": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", - "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", - "dev": true, - "dependencies": { - "retry": "0.13.1" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "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.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", - "dev": true - }, - "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/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/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "node_modules/boxen": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", - "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", - "dev": true, - "dependencies": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.2", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/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/boxen/node_modules/cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/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/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/builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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/cacheable-request/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/call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha512-wCyFsDQkKPwwF8BDwOiWNx/9K45L/hvggQiDbve+viMNMQnWhrlYIuBk09offfwCRtCO9P6XwUttufzU11WCVw==", - "dev": true - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/camelcase-keys/node_modules/quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/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.3.6", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz", - "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==", - "dev": true, - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^3.0.1", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", - "pathval": "^1.1.1", - "type-detect": "^4.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "node_modules/charenc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/ci-info": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.4.0.tgz", - "integrity": "sha512-t5QdPT5jq3o262DOQ8zA6E1tlH2upmUc4Hlvrbx1pGYJuiiHl7O7rvVNI+l8HTVhd/q3Qc9vqimkNk5yiXsAug==", - "dev": true - }, - "node_modules/clean-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", - "integrity": "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/clean-regexp/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/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-boxes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", - "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-table3": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.2.tgz", - "integrity": "sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "node_modules/cli-truncate": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", - "integrity": "sha512-f4r4yJnbT++qUPI9NR4XLDLq41gQ+uqnPItWG0F5ZkehuNiTTa3EY0S4AqTSUOeJ7/zU41oWPQSNkW5BqPL9bg==", - "dev": true, - "dependencies": { - "slice-ansi": "0.0.4", - "string-width": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cli-truncate/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, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cli-truncate/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, - "dependencies": { - "number-is-nan": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cli-truncate/node_modules/slice-ansi": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", - "integrity": "sha512-up04hB2hR92PgjpyU3y/eg91yIBILyjVY26NvvciY3EVVPjybkMszMpXQ9QAkcS3I5rtJBDLoTxxg+qvW8c7rw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cli-truncate/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, - "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/cli-truncate/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, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "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/cliui/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/clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "dev": true, - "dependencies": { - "mimic-response": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true, - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/columnify": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.6.0.tgz", - "integrity": "sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==", - "dev": true, - "dependencies": { - "strip-ansi": "^6.0.1", - "wcwidth": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "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/commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true - }, - "node_modules/compare-func": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", - "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", - "dev": true, - "dependencies": { - "array-ify": "^1.0.0", - "dot-prop": "^5.1.0" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "dev": true, - "dependencies": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/conventional-changelog-angular": { - "version": "5.0.13", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", - "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", - "dev": true, - "dependencies": { - "compare-func": "^2.0.0", - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-conventionalcommits": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-5.0.0.tgz", - "integrity": "sha512-lCDbA+ZqVFQGUj7h9QBKoIpLhl8iihkO0nCTyRNzuXtcd7ubODpYB04IFy31JloiJgG0Uovu8ot8oxRzn7Nwtw==", - "dev": true, - "dependencies": { - "compare-func": "^2.0.0", - "lodash": "^4.17.15", - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-commits-parser": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", - "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", - "dev": true, - "dependencies": { - "is-text-path": "^1.0.1", - "JSONStream": "^1.0.4", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - }, - "bin": { - "conventional-commits-parser": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/convert-hrtime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/convert-hrtime/-/convert-hrtime-3.0.0.tgz", - "integrity": "sha512-7V+KqSvMiHp8yWDuwfww06XleMWVVB9b9tURBx+G7UTADuo5hYPuowKloz4OzOqbPezxgo+fdQ1522WzPG4OeA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "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": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "dev": true - }, - "node_modules/cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", - "dev": true, - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cosmiconfig-typescript-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.0.0.tgz", - "integrity": "sha512-cVpucSc2Tf+VPwCCR7SZzmQTQkPbkk4O01yXsYqXBIbjE1bhwqSyAgYQkRK1un4i0OPziTleqFhdkmOc4RQ/9g==", - "dev": true, - "engines": { - "node": ">=12", - "npm": ">=6" - }, - "peerDependencies": { - "@types/node": "*", - "cosmiconfig": ">=7", - "ts-node": ">=10", - "typescript": ">=3" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "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/crypt": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/dag-map": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/dag-map/-/dag-map-1.0.2.tgz", - "integrity": "sha512-+LSAiGFwQ9dRnRdOeaj7g47ZFJcOUPukAP8J3A3fuZ1g9Y44BG+P1sgApjLXTQPOzC4+7S9Wr8kXsfpINM4jpw==", - "dev": true - }, - "node_modules/dargs": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", - "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "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/data-uri-to-buffer": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-2.0.2.tgz", - "integrity": "sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==", - "dev": true - }, - "node_modules/date-fns": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", - "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==", - "dev": true - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "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/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg==", - "dev": true, - "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decamelize-keys/node_modules/map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decimal.js": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.0.tgz", - "integrity": "sha512-Nv6ENEzyPQ6AItkGwLE2PGKinZZ9g59vSh2BeH6NqPu0OTKZ5ruJsVqh/orbAnqXc9pBbgXAIrc2EyaCj8NpGg==", - "dev": true - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", - "dev": true, - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA==", - "dev": true, - "dependencies": { - "clone": "^1.0.2" - } - }, - "node_modules/defaults/node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, - "engines": { - "node": ">=0.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/del": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", - "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", - "dev": true, - "dependencies": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/del-cli": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/del-cli/-/del-cli-4.0.1.tgz", - "integrity": "sha512-KtR/6cBfZkGDAP2NA7z+bP4p1OMob3wjN9mq13+SWvExx6jT9gFWfLgXEeX8J2B47OKeNCq9yTONmtryQ+m+6g==", - "dev": true, - "dependencies": { - "del": "^6.0.0", - "meow": "^10.1.0" - }, - "bin": { - "del": "cli.js", - "del-cli": "cli.js" - }, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/del-cli/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/del-cli/node_modules/camelcase-keys": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-7.0.2.tgz", - "integrity": "sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==", - "dev": true, - "dependencies": { - "camelcase": "^6.3.0", - "map-obj": "^4.1.0", - "quick-lru": "^5.1.1", - "type-fest": "^1.2.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/del-cli/node_modules/decamelize": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-5.0.1.tgz", - "integrity": "sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/del-cli/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/del-cli/node_modules/meow": { - "version": "10.1.3", - "resolved": "https://registry.npmjs.org/meow/-/meow-10.1.3.tgz", - "integrity": "sha512-0WL7RMCPPdUTE00+GxJjL4d5Dm6eUbmAzxlzywJWiRUKCW093owmZ7/q74tH9VI91vxw9KJJNxAcvdpxb2G4iA==", - "dev": true, - "dependencies": { - "@types/minimist": "^1.2.2", - "camelcase-keys": "^7.0.0", - "decamelize": "^5.0.0", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.2", - "read-pkg-up": "^8.0.0", - "redent": "^4.0.0", - "trim-newlines": "^4.0.2", - "type-fest": "^1.2.2", - "yargs-parser": "^20.2.9" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/del-cli/node_modules/read-pkg": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-6.0.0.tgz", - "integrity": "sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==", - "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^3.0.2", - "parse-json": "^5.2.0", - "type-fest": "^1.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/del-cli/node_modules/read-pkg-up": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-8.0.0.tgz", - "integrity": "sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==", - "dev": true, - "dependencies": { - "find-up": "^5.0.0", - "read-pkg": "^6.0.0", - "type-fest": "^1.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/del-cli/node_modules/redent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz", - "integrity": "sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==", - "dev": true, - "dependencies": { - "indent-string": "^5.0.0", - "strip-indent": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/del-cli/node_modules/strip-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", - "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", - "dev": true, - "dependencies": { - "min-indent": "^1.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/del-cli/node_modules/trim-newlines": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.0.2.tgz", - "integrity": "sha512-GJtWyq9InR/2HRiLZgpIKv+ufIKrVrvjQWEj7PxAXNc5dwbNJkqhAUoAGgzRmULAnoOM5EIpveYd3J2VeSAIew==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/del-cli/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/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/diff-sequences": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.0.0.tgz", - "integrity": "sha512-7Qe/zd1wxSDL4D/X/FPjOMB+ZMDt71W94KYaq05I2l0oQqgXgs7s4ftYYmV38gBSrPz2vcygxfs1xn0FT+rKNA==", - "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/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/duplexer3": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", - "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==", - "dev": true - }, - "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/ejs": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz", - "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==", - "dev": true, - "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/elegant-spinner": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", - "integrity": "sha512-B+ZM+RXvRqQaAmkMlO/oSe5nMUOaUnyfGYCEHoR8wrXsZR2mA0XVibsxV1bvTwxdRWah1PkQqso2EzhILGHtEQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/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-goat": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-3.0.0.tgz", - "integrity": "sha512-w3PwNZJwRxlp47QGzhuEBldEqVHHhh8/tIPcl6ecf2Bou99cdAt0knihBV0Ecc7CGxYduXVBDheH1K2oADRlvw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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.23.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.23.1.tgz", - "integrity": "sha512-w7C1IXCc6fNqjpuYd0yPlcTKKmHlHHktRkzmBPZ+7cvNBQuiNjx0xaMTjAJGCafJhQkrFJooREv0CtrVzmHwqg==", - "dev": true, - "dependencies": { - "@eslint/eslintrc": "^1.3.2", - "@humanwhocodes/config-array": "^0.10.4", - "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", - "@humanwhocodes/module-importer": "^1.0.1", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", - "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.1", - "globals": "^13.15.0", - "globby": "^11.1.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-sdsl": "^4.1.4", - "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.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "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": "8.5.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", - "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", - "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-plugin-adonis": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-adonis/-/eslint-plugin-adonis-3.0.2.tgz", - "integrity": "sha512-tS9GuhyZlPHzpAslXhCto7JEbB21UBoLQLgMXCaeqrOWX9Mg6Rc6r51CZ/9RdWwRXpj3sl/JzpFWqc9JvGObmA==", - "dev": true, - "dependencies": { - "@typescript-eslint/eslint-plugin": "^5.28.0", - "@typescript-eslint/parser": "^5.28.0", - "eslint-plugin-unicorn": "^42.0.0" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "eslint": "^8.0.0" - } - }, - "node_modules/eslint-plugin-prettier": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", - "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", - "dev": true, - "dependencies": { - "prettier-linter-helpers": "^1.0.0" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "eslint": ">=7.28.0", - "prettier": ">=2.0.0" - }, - "peerDependenciesMeta": { - "eslint-config-prettier": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-unicorn": { - "version": "42.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-42.0.0.tgz", - "integrity": "sha512-ixBsbhgWuxVaNlPTT8AyfJMlhyC5flCJFjyK3oKE8TRrwBnaHvUbuIkCM1lqg8ryYrFStL/T557zfKzX4GKSlg==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.15.7", - "ci-info": "^3.3.0", - "clean-regexp": "^1.0.0", - "eslint-utils": "^3.0.0", - "esquery": "^1.4.0", - "indent-string": "^4.0.0", - "is-builtin-module": "^3.1.0", - "lodash": "^4.17.21", - "pluralize": "^8.0.0", - "read-pkg-up": "^7.0.1", - "regexp-tree": "^0.1.24", - "safe-regex": "^2.1.1", - "semver": "^7.3.5", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1" - }, - "peerDependencies": { - "eslint": ">=8.8.0" - } - }, - "node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint/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/eslint/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/eslint/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/eslint/node_modules/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/espree": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", - "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", - "dev": true, - "dependencies": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" - }, - "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.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/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/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "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-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "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/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/figures/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "dev": true, - "dependencies": { - "minimatch": "^5.0.1" - } - }, - "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "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": "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/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.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "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": "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/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/get-source": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/get-source/-/get-source-2.0.12.tgz", - "integrity": "sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==", - "dev": true, - "dependencies": { - "data-uri-to-buffer": "^2.0.0", - "source-map": "^0.6.1" - } - }, - "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/getopts": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/getopts/-/getopts-2.3.0.tgz", - "integrity": "sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA==", - "dev": true - }, - "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-raw-commits": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz", - "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==", - "dev": true, - "dependencies": { - "dargs": "^7.0.0", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - }, - "bin": { - "git-raw-commits": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/github-label-sync": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/github-label-sync/-/github-label-sync-2.2.0.tgz", - "integrity": "sha512-4FBcwA/6XhQtFWZ/+xkwIAJKn7XJlkLBXA+eA3kjJJ6YTFbTynU6Cg9oUN3RXUCBoV2B7fhyEhqN6IwWO/hf3g==", - "dev": true, - "dependencies": { - "@financial-times/origami-service-makefile": "^7.0.3", - "ajv": "^8.6.3", - "chalk": "^4.1.2", - "commander": "^6.2.1", - "got": "^11.8.2", - "js-yaml": "^3.14.1", - "node.extend": "^2.0.2", - "octonode": "^0.10.2" - }, - "bin": { - "github-label-sync": "bin/github-label-sync.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/github-url-from-git": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/github-url-from-git/-/github-url-from-git-1.5.0.tgz", - "integrity": "sha512-WWOec4aRI7YAykQ9+BHmzjyNlkfJFG8QLXnDTsLz/kZefq7qkzdfo4p6fkYYMIq1aj+gZcQs/1HQhQh3DPPxlQ==", - "dev": true - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "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/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/global-dirs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz", - "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==", - "dev": true, - "dependencies": { - "ini": "1.3.7" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/got": { - "version": "11.8.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/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/har-validator/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/har-validator/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/hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", - "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": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", - "dev": true - }, - "node_modules/http-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/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/husky": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.1.tgz", - "integrity": "sha512-xs7/chUH/CKdOCs7Zy0Aev9e/dKOMZf3K1Az1nar3tzlv0jfqnYtu235bstsWTmXOR0EfINrPa97yy4Lz6RiKw==", - "dev": true, - "bin": { - "husky": "lib/bin.js" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/typicode" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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/ignore-walk": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz", - "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==", - "dev": true, - "dependencies": { - "minimatch": "^3.0.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-fresh/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/import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "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": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inclusion": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/inclusion/-/inclusion-1.0.1.tgz", - "integrity": "sha512-TRicJXpIfJN+a47xxjs5nfy2V5l413e4aAtsLYRG+OsDM3A3uloBd/+fDmj23RVuIL9VQfwtb37iIc0rtMw9KA==", - "dev": true, - "dependencies": { - "parent-module": "^2.0.0" - } - }, - "node_modules/inclusion/node_modules/parent-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-2.0.0.tgz", - "integrity": "sha512-uo0Z9JJeWzv8BG+tRcapBKNJ0dro9cLyczGzulS6EfeyAdeC9sbojtW6XwvYxJkEne9En+J2XEl4zyglVeIwFg==", - "dev": true, - "dependencies": { - "callsites": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "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": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "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.7", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", - "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==", - "dev": true - }, - "node_modules/inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.19", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.6.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/inquirer-autosubmit-prompt": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/inquirer-autosubmit-prompt/-/inquirer-autosubmit-prompt-0.2.0.tgz", - "integrity": "sha512-mzNrusCk5L6kSzlN0Ioddn8yzrhYNLli+Sn2ZxMuLechMYAzakiFCIULxsxlQb5YKzthLGfrFACcWoAvM7p04Q==", - "dev": true, - "dependencies": { - "chalk": "^2.4.1", - "inquirer": "^6.2.1", - "rxjs": "^6.3.3" - } - }, - "node_modules/inquirer-autosubmit-prompt/node_modules/ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer-autosubmit-prompt/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/inquirer-autosubmit-prompt/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/inquirer-autosubmit-prompt/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/inquirer-autosubmit-prompt/node_modules/cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", - "dev": true, - "dependencies": { - "restore-cursor": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer-autosubmit-prompt/node_modules/cli-width": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", - "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", - "dev": true - }, - "node_modules/inquirer-autosubmit-prompt/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/inquirer-autosubmit-prompt/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/inquirer-autosubmit-prompt/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/inquirer-autosubmit-prompt/node_modules/figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer-autosubmit-prompt/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/inquirer-autosubmit-prompt/node_modules/inquirer": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", - "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", - "dev": true, - "dependencies": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/inquirer-autosubmit-prompt/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer-autosubmit-prompt/node_modules/mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer-autosubmit-prompt/node_modules/mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==", - "dev": true - }, - "node_modules/inquirer-autosubmit-prompt/node_modules/onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", - "dev": true, - "dependencies": { - "mimic-fn": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer-autosubmit-prompt/node_modules/restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", - "dev": true, - "dependencies": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer-autosubmit-prompt/node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer-autosubmit-prompt/node_modules/string-width/node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer-autosubmit-prompt/node_modules/string-width/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", - "dev": true, - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer-autosubmit-prompt/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/inquirer-autosubmit-prompt/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/is": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/is/-/is-3.3.0.tgz", - "integrity": "sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/is-builtin-module": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.0.tgz", - "integrity": "sha512-phDA4oSGt7vl1n5tJvTWooWWAsXLY+2xCnxNqvKhGEzujg+A43wPlPOyDg3C8XQHN+6k/JTQWJ/j0dQh/qr+Hw==", - "dev": true, - "dependencies": { - "builtin-modules": "^3.3.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "dependencies": { - "ci-info": "^2.0.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-ci/node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "node_modules/is-core-module": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-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-installed-globally": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", - "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", - "dev": true, - "dependencies": { - "global-dirs": "^2.0.1", - "is-path-inside": "^3.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-invalid-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-invalid-path/-/is-invalid-path-0.1.0.tgz", - "integrity": "sha512-aZMG0T3F34mTg4eTdszcGXx54oiZ4NtHSft3hWNJMGJXUUqdIj3cOZuHcU0nCWWcY3jd7yRe/3AEm3vSNTpBGQ==", - "dev": true, - "dependencies": { - "is-glob": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-invalid-path/node_modules/is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-invalid-path/node_modules/is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==", - "dev": true, - "dependencies": { - "is-extglob": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-npm": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", - "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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-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-observable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-1.1.0.tgz", - "integrity": "sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA==", - "dev": true, - "dependencies": { - "symbol-observable": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/is-observable/node_modules/symbol-observable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-promise": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", - "dev": true - }, - "node_modules/is-scoped": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-scoped/-/is-scoped-2.1.0.tgz", - "integrity": "sha512-Cv4OpPTHAK9kHYzkzCrof3VJh7H/PrG2MBUMvvJebaaUMbqhm0YAtXnvh0I3Hnj2tMZWwrRROWLSgfJrKqWmlQ==", - "dev": true, - "dependencies": { - "scoped-regex": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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-text-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", - "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", - "dev": true, - "dependencies": { - "text-extensions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "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-url-superb": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-url-superb/-/is-url-superb-4.0.0.tgz", - "integrity": "sha512-GI+WjezhPPcbM+tqE9LnmsY5qqjwHzTvjJ36wxYX5ujNXefSUJ/T17r5bqDV8yLhcgB59KTPNOc9O9cmHTPWsA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-valid-path": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-valid-path/-/is-valid-path-0.1.1.tgz", - "integrity": "sha512-+kwPrVDu9Ms03L90Qaml+79+6DZHqHyRoANI6IsZJ/g8frhnfchDOBCa0RbQ6/kdHt5CS5OeIEyrYznNuVN+8A==", - "dev": true, - "dependencies": { - "is-invalid-path": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "dev": true - }, - "node_modules/issue-regex": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/issue-regex/-/issue-regex-3.1.0.tgz", - "integrity": "sha512-0RHjbtw9QXeSYnIEY5Yrp2QZrdtz21xBDV9C/GIlY2POmgoS6a7qjkYS5siRKXScnuAj5/SPv1C3YForNCHTJA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/jake": { - "version": "10.8.5", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", - "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", - "dev": true, - "dependencies": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.1", - "minimatch": "^3.0.4" - }, - "bin": { - "jake": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-diff": { - "version": "29.0.3", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.0.3.tgz", - "integrity": "sha512-+X/AIF5G/vX9fWK+Db9bi9BQas7M9oBME7egU7psbn4jlszLFCu0dW63UgeE6cs/GANq4fLaT+8sGHQQ0eCUfg==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.0.0", - "jest-get-type": "^29.0.0", - "pretty-format": "^29.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-get-type": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.0.0.tgz", - "integrity": "sha512-83X19z/HuLKYXYHskZlBAShO7UfLFXu/vWajw9ZNJASN32li8yHMaVGAQqxFW1RCFOkB7cubaL6FaJVQqqJLSw==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.5.0.tgz", - "integrity": "sha512-VWI269+9JS5cpndnpCwm7dy7JtGQT30UHfrnM3mXl22gHGt/b7NkjBqXfbhZ8V4B7ANUsjK18PlSBmG0YH7gjw==", - "dev": true, - "dependencies": { - "chalk": "^3.0.0", - "jest-diff": "^25.5.0", - "jest-get-type": "^25.2.6", - "pretty-format": "^25.5.0" - }, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/jest-matcher-utils/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-matcher-utils/node_modules/diff-sequences": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", - "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==", - "dev": true, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/jest-matcher-utils/node_modules/jest-diff": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.5.0.tgz", - "integrity": "sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A==", - "dev": true, - "dependencies": { - "chalk": "^3.0.0", - "diff-sequences": "^25.2.6", - "jest-get-type": "^25.2.6", - "pretty-format": "^25.5.0" - }, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/jest-matcher-utils/node_modules/jest-get-type": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", - "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", - "dev": true, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/jest-matcher-utils/node_modules/pretty-format": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", - "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", - "dev": true, - "dependencies": { - "@jest/types": "^25.5.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - }, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/jest-matcher-utils/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - }, - "node_modules/js-sdsl": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.4.tgz", - "integrity": "sha512-Y2/yD55y5jteOAmY50JbUZYwk3CP3wnLPEZnlR1w9oKhITrBEtAxwuWKebFf8hMrPMgbYwFoWK/lH2sBkErELw==", - "dev": true - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "dev": true - }, - "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-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-deref-sync": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/json-schema-deref-sync/-/json-schema-deref-sync-0.14.0.tgz", - "integrity": "sha512-yGR1xmhdiD6R0MSrwWcFxQzAj5b3i5Gb/mt5tvQKgFMMeNe0KZYNEN/jWr7G+xn39Azqgcvk4ZKMs8dQl8e4wA==", - "dev": true, - "dependencies": { - "clone": "^2.1.2", - "dag-map": "~1.0.0", - "is-valid-path": "^0.1.1", - "lodash": "^4.17.13", - "md5": "~2.2.0", - "memory-cache": "~0.2.0", - "traverse": "~0.6.6", - "valid-url": "~1.0.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "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": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "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": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true - }, - "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/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/keyv": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.0.tgz", - "integrity": "sha512-2YvuMsA+jnFGtBareKqgANOEKe1mk3HKiXu2fRmAfyxG0MJAywNhi5ttWA3PMjl4NmpyjZNbFifR2vNjW1znfA==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "dev": true, - "dependencies": { - "package-json": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "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/listr": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/listr/-/listr-0.14.3.tgz", - "integrity": "sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA==", - "dev": true, - "dependencies": { - "@samverschueren/stream-to-observable": "^0.3.0", - "is-observable": "^1.1.0", - "is-promise": "^2.1.0", - "is-stream": "^1.1.0", - "listr-silent-renderer": "^1.1.1", - "listr-update-renderer": "^0.5.0", - "listr-verbose-renderer": "^0.5.0", - "p-map": "^2.0.0", - "rxjs": "^6.3.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/listr-input": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/listr-input/-/listr-input-0.2.1.tgz", - "integrity": "sha512-oa8iVG870qJq+OuuMK3DjGqFcwsK1SDu+kULp9kEq09TY231aideIZenr3lFOQdASpAr6asuyJBbX62/a3IIhg==", - "dev": true, - "dependencies": { - "inquirer": "^7.0.0", - "inquirer-autosubmit-prompt": "^0.2.0", - "rxjs": "^6.5.3", - "through": "^2.3.8" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/listr-silent-renderer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz", - "integrity": "sha512-L26cIFm7/oZeSNVhWB6faeorXhMg4HNlb/dS/7jHhr708jxlXrtrBWo4YUxZQkc6dGoxEAe6J/D3juTRBUzjtA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/listr-update-renderer": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz", - "integrity": "sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA==", - "dev": true, - "dependencies": { - "chalk": "^1.1.3", - "cli-truncate": "^0.2.1", - "elegant-spinner": "^1.0.1", - "figures": "^1.7.0", - "indent-string": "^3.0.0", - "log-symbols": "^1.0.2", - "log-update": "^2.3.0", - "strip-ansi": "^3.0.1" - }, - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "listr": "^0.14.2" - } - }, - "node_modules/listr-update-renderer/node_modules/ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/listr-update-renderer/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, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/listr-update-renderer/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/listr-update-renderer/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", - "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/listr-update-renderer/node_modules/cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", - "dev": true, - "dependencies": { - "restore-cursor": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/listr-update-renderer/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/listr-update-renderer/node_modules/figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/listr-update-renderer/node_modules/indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha512-BYqTHXTGUIvg7t1r4sJNKcbDZkL92nkXA8YtRpbjFHRHGDL/NtUeiBJMeE60kIFN/Mg8ESaWQvftaYMGJzQZCQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/listr-update-renderer/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/listr-update-renderer/node_modules/log-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", - "integrity": "sha512-mmPrW0Fh2fxOzdBbFv4g1m6pR72haFLPJ2G5SJEELf1y+iaQrDG6cWCPjy54RHYbZAt7X+ls690Kw62AdWXBzQ==", - "dev": true, - "dependencies": { - "chalk": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/listr-update-renderer/node_modules/log-update": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-2.3.0.tgz", - "integrity": "sha512-vlP11XfFGyeNQlmEn9tJ66rEW1coA/79m5z6BCkudjbAGE83uhAcGYrBFwfs3AdLiLzGRusRPAbSPK9xZteCmg==", - "dev": true, - "dependencies": { - "ansi-escapes": "^3.0.0", - "cli-cursor": "^2.0.0", - "wrap-ansi": "^3.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/listr-update-renderer/node_modules/mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/listr-update-renderer/node_modules/onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", - "dev": true, - "dependencies": { - "mimic-fn": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/listr-update-renderer/node_modules/restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", - "dev": true, - "dependencies": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/listr-update-renderer/node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/listr-update-renderer/node_modules/string-width/node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/listr-update-renderer/node_modules/string-width/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", - "dev": true, - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/listr-update-renderer/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, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/listr-update-renderer/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/listr-update-renderer/node_modules/wrap-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-3.0.1.tgz", - "integrity": "sha512-iXR3tDXpbnTpzjKSylUJRkLuOrEC7hwEB221cgn6wtF8wpmz28puFXAEfPT5zrjM3wahygB//VuWEr1vTkDcNQ==", - "dev": true, - "dependencies": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/listr-update-renderer/node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/listr-update-renderer/node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", - "dev": true, - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/listr-verbose-renderer": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz", - "integrity": "sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw==", - "dev": true, - "dependencies": { - "chalk": "^2.4.1", - "cli-cursor": "^2.1.0", - "date-fns": "^1.27.2", - "figures": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/listr-verbose-renderer/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/listr-verbose-renderer/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/listr-verbose-renderer/node_modules/cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", - "dev": true, - "dependencies": { - "restore-cursor": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/listr-verbose-renderer/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/listr-verbose-renderer/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/listr-verbose-renderer/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/listr-verbose-renderer/node_modules/figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/listr-verbose-renderer/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/listr-verbose-renderer/node_modules/mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/listr-verbose-renderer/node_modules/onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", - "dev": true, - "dependencies": { - "mimic-fn": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/listr-verbose-renderer/node_modules/restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", - "dev": true, - "dependencies": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/listr-verbose-renderer/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/listr/node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/listr/node_modules/p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", - "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.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", - "dev": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/lodash.set": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", - "integrity": "sha512-4hNPN5jlm/N/HLMCO43v8BXKq9Z7QdAGc/VGrRD61w8gN9g/6jF9A4L1pbUgBLCffi0w9VsXfTOij5x8iTyFvg==", - "dev": true - }, - "node_modules/lodash.zip": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz", - "integrity": "sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==", - "dev": true - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", - "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/loupe": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz", - "integrity": "sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==", - "dev": true, - "dependencies": { - "get-func-name": "^2.0.0" - } - }, - "node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/macroable": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/macroable/-/macroable-7.0.1.tgz", - "integrity": "sha512-8bbZLq2JoGI7FdvmDIxed41opR2cqgUUrRN4fVEsajARzfHkZDAzbCg0RW+jIY93YhWuBsMOeLcIyYz5WU4HNQ==", - "dev": true - }, - "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/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "dependencies": { - "p-defer": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/md5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz", - "integrity": "sha512-PlGG4z5mBANDGCKsYQe0CaUYHdZYZt8ZPZLmEt+Urf0W4GlpTX4HescwHU+dc9+Z/G/vZKYZYFrwgm9VxK6QOQ==", - "dev": true, - "dependencies": { - "charenc": "~0.0.1", - "crypt": "~0.0.1", - "is-buffer": "~1.1.1" - } - }, - "node_modules/memory-cache": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/memory-cache/-/memory-cache-0.2.0.tgz", - "integrity": "sha512-OcjA+jzjOYzKmKS6IQVALHLVz+rNTMPoJvCztFaZxwG14wtAW7VRZjwTQu06vKCYOxh4jVnik7ya0SXTB0W+xA==", - "dev": true - }, - "node_modules/meow": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", - "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", - "dev": true, - "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge-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-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": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/minimatch": { - "version": "3.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/minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "dependencies": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/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/mustache": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", - "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", - "dev": true, - "bin": { - "mustache": "bin/mustache" - } - }, - "node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/new-github-release-url": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/new-github-release-url/-/new-github-release-url-1.0.0.tgz", - "integrity": "sha512-dle7yf655IMjyFUqn6Nxkb18r4AOAkzRcgcZv6WZ0IqrOH4QCEZ8Sm6I7XX21zvHdBeeMeTkhR9qT2Z0EJDx6A==", - "dev": true, - "dependencies": { - "type-fest": "^0.4.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/new-github-release-url/node_modules/type-fest": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.4.1.tgz", - "integrity": "sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/node.extend": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node.extend/-/node.extend-2.0.2.tgz", - "integrity": "sha512-pDT4Dchl94/+kkgdwyS2PauDFjZG0Hk0IcHIB+LkW27HLDtdoeMxHTxZh39DYbPP8UflWXWj9JcdDozF+YDOpQ==", - "dev": true, - "dependencies": { - "has": "^1.0.3", - "is": "^3.2.1" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "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-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/np": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/np/-/np-7.6.2.tgz", - "integrity": "sha512-gExmKGKixh7ITc4Q+Lv7nfCby0CVKvzri9zN8970oKD8976T4L5dw8QWUtMcXcIjhFF6h5lbvztao/NurDbmxQ==", - "dev": true, - "dependencies": { - "@samverschueren/stream-to-observable": "^0.3.1", - "any-observable": "^0.5.1", - "async-exit-hook": "^2.0.1", - "chalk": "^4.1.0", - "cosmiconfig": "^7.0.0", - "del": "^6.0.0", - "escape-goat": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "execa": "^5.0.0", - "github-url-from-git": "^1.5.0", - "has-yarn": "^2.1.0", - "hosted-git-info": "^3.0.7", - "ignore-walk": "^3.0.3", - "import-local": "^3.0.2", - "inquirer": "^7.3.3", - "is-installed-globally": "^0.3.2", - "is-interactive": "^1.0.0", - "is-scoped": "^2.1.0", - "issue-regex": "^3.1.0", - "listr": "^0.14.3", - "listr-input": "^0.2.1", - "log-symbols": "^4.0.0", - "meow": "^8.1.0", - "minimatch": "^3.0.4", - "new-github-release-url": "^1.0.0", - "npm-name": "^6.0.1", - "onetime": "^5.1.2", - "open": "^7.3.0", - "ow": "^0.21.0", - "p-memoize": "^4.0.1", - "p-timeout": "^4.1.0", - "pkg-dir": "^5.0.0", - "read-pkg-up": "^7.0.1", - "rxjs": "^6.6.3", - "semver": "^7.3.4", - "split": "^1.0.1", - "symbol-observable": "^3.0.0", - "terminal-link": "^2.1.1", - "update-notifier": "^5.0.1" - }, - "bin": { - "np": "source/cli.js" - }, - "engines": { - "git": ">=2.11.0", - "node": ">=10", - "npm": ">=6.8.0", - "yarn": ">=1.7.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/np?sponsor=1" - } - }, - "node_modules/np/node_modules/hosted-git-info": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.8.tgz", - "integrity": "sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/np/node_modules/pkg-dir": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", - "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", - "dev": true, - "dependencies": { - "find-up": "^5.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm-name": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/npm-name/-/npm-name-6.0.1.tgz", - "integrity": "sha512-fhKRvUAxaYzMEUZim4mXWyfFbVS+M1CbrCLdAo3txWzrctxKka/h+KaBW0O9Cz5uOM00Nldn2JLWhuwnyW3SUw==", - "dev": true, - "dependencies": { - "got": "^10.6.0", - "is-scoped": "^2.1.0", - "is-url-superb": "^4.0.0", - "lodash.zip": "^4.2.0", - "org-regex": "^1.0.0", - "p-map": "^3.0.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.1.0", - "validate-npm-package-name": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-name/node_modules/@sindresorhus/is": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-2.1.1.tgz", - "integrity": "sha512-/aPsuoj/1Dw/kzhkgz+ES6TxG0zfTMGLwuK2ZG00k/iJzYHTLCE8mVU8EPqEOp/lmxPoq1C1C9RYToRKb2KEfg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/npm-name/node_modules/cacheable-lookup": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-2.0.1.tgz", - "integrity": "sha512-EMMbsiOTcdngM/K6gV/OxF2x0t07+vMOWxZNSCRQMjO2MY2nhZQ6OYhOOpyQrbhqsgtvKGI7hcq6xjnA92USjg==", - "dev": true, - "dependencies": { - "@types/keyv": "^3.1.1", - "keyv": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm-name/node_modules/decompress-response": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-5.0.0.tgz", - "integrity": "sha512-TLZWWybuxWgoW7Lykv+gq9xvzOsUjQ9tF09Tj6NSTYGMTCHNXzrPnD6Hi+TgZq19PyTAGH4Ll/NIM/eTGglnMw==", - "dev": true, - "dependencies": { - "mimic-response": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm-name/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/npm-name/node_modules/got": { - "version": "10.7.0", - "resolved": "https://registry.npmjs.org/got/-/got-10.7.0.tgz", - "integrity": "sha512-aWTDeNw9g+XqEZNcTjMMZSy7B7yE9toWOFYip7ofFTLleJhvZwUxxTxkTpKvF+p1SAA4VHmuEy7PiHTHyq8tJg==", - "dev": true, - "dependencies": { - "@sindresorhus/is": "^2.0.0", - "@szmarczak/http-timer": "^4.0.0", - "@types/cacheable-request": "^6.0.1", - "cacheable-lookup": "^2.0.0", - "cacheable-request": "^7.0.1", - "decompress-response": "^5.0.0", - "duplexer3": "^0.1.4", - "get-stream": "^5.0.0", - "lowercase-keys": "^2.0.0", - "mimic-response": "^2.1.0", - "p-cancelable": "^2.0.0", - "p-event": "^4.0.0", - "responselike": "^2.0.0", - "to-readable-stream": "^2.0.0", - "type-fest": "^0.10.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/npm-name/node_modules/mimic-response": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", - "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-name/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/npm-name/node_modules/type-fest": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.10.0.tgz", - "integrity": "sha512-EUV9jo4sffrwlg8s0zDhP0T2WD3pru5Xi0+HTE3zTUmBaZNhfkite9PdSJwdXLwPVW0jnAHT56pZHIOYckPEiw==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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/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, - "engines": { - "node": ">=0.10.0" - } - }, - "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, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/octonode": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/octonode/-/octonode-0.10.2.tgz", - "integrity": "sha512-lxKJxAvrw3BuM0Wu3A/TRyFkYxMFWbMm8p7fDO3EoG9KDgOy53d91bjlGR1mmNk1EoF5LjGBx7BmIB+PfmMKLQ==", - "dev": true, - "dependencies": { - "bluebird": "^3.5.0", - "deep-extend": "^0.6.0", - "randomstring": "^1.1.5", - "request": "^2.72.0" - }, - "engines": { - "node": ">0.4.11" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", - "dev": true, - "dependencies": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/openapi-schema-validator": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/openapi-schema-validator/-/openapi-schema-validator-3.0.3.tgz", - "integrity": "sha512-KKpeNEvAmpy6B2JCfyrM4yWjL6vggDCVbBoR8Yfkj0Jltc6PCW+dBbcg+1yrTCuDv80qBQJ6w0ejA71DlOFegA==", - "dev": true, - "dependencies": { - "ajv": "^6.5.2", - "lodash.merge": "^4.6.1", - "openapi-types": "1.3.4", - "swagger-schema-official": "2.0.0-bab6bed" - } - }, - "node_modules/openapi-schema-validator/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/openapi-schema-validator/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/openapi-types": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-1.3.4.tgz", - "integrity": "sha512-h8rADpW3k/wepLdERKF0VKMAPdoFYNQCLGPmc/f8sgQ2dxUy+7sY4WAX2XDUDjhKTjbJVbxxofLkzy7f1/tE4g==", - "dev": true - }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/org-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/org-regex/-/org-regex-1.0.0.tgz", - "integrity": "sha512-7bqkxkEJwzJQUAlyYniqEZ3Ilzjh0yoa62c7gL6Ijxj5bEpPL+8IE1Z0PFj0ywjjXQcdrwR51g9MIcLezR0hKQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ow": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/ow/-/ow-0.21.0.tgz", - "integrity": "sha512-dlsoDe39g7mhdsdrC1R/YwjT7yjVqE3svWwOlMGvN690waBkgEZBmKBdkmKvSt5/wZ6E0Jn/nIesPqMZOpPKqw==", - "dev": true, - "dependencies": { - "@sindresorhus/is": "^4.0.0", - "callsites": "^3.1.0", - "dot-prop": "^6.0.1", - "lodash.isequal": "^4.5.0", - "type-fest": "^0.20.2", - "vali-date": "^1.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ow/node_modules/dot-prop": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", - "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", - "dev": true, - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-event": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz", - "integrity": "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==", - "dev": true, - "dependencies": { - "p-timeout": "^3.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-event/node_modules/p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", - "dev": true, - "dependencies": { - "p-finally": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-memoize": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/p-memoize/-/p-memoize-4.0.4.tgz", - "integrity": "sha512-ijdh0DP4Mk6J4FXlOM6vPPoCjPytcEseW8p/k5SDTSSfGV3E9bpt9Yzfifvzp6iohIieoLTkXRb32OWV0fB2Lw==", - "dev": true, - "dependencies": { - "map-age-cleaner": "^0.1.3", - "mimic-fn": "^3.0.0", - "p-settle": "^4.1.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/p-memoize?sponsor=1" - } - }, - "node_modules/p-memoize/node_modules/mimic-fn": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", - "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-reflect": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-reflect/-/p-reflect-2.1.0.tgz", - "integrity": "sha512-paHV8NUz8zDHu5lhr/ngGWQiW067DK/+IbJ+RfZ4k+s8y4EKyYCz8pGYWjxCg35eHztpJAt+NUgvN4L+GCbPlg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-settle": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/p-settle/-/p-settle-4.1.1.tgz", - "integrity": "sha512-6THGh13mt3gypcNMm0ADqVNCcYa3BK6DWsuJWFCuEKP1rpY+OKGp7gaZwVmLspmic01+fsg/fN57MfvDzZ/PuQ==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.2", - "p-reflect": "^2.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-settle/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-timeout": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-4.1.0.tgz", - "integrity": "sha512-+/wmHtzJuWii1sXn3HCuH/FTwGhrp4tmJTxSKJbfS+vkipci6osxXM5mY0jUiRzWKMTgUT8l7HFbeSwZAynqHw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "dev": true, - "dependencies": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/package-json/node_modules/@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json/node_modules/@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dev": true, - "dependencies": { - "defer-to-connect": "^1.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json/node_modules/cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dev": true, - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/package-json/node_modules/cacheable-request/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/package-json/node_modules/decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", - "dev": true, - "dependencies": { - "mimic-response": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/package-json/node_modules/defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", - "dev": true - }, - "node_modules/package-json/node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json/node_modules/got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dev": true, - "dependencies": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/package-json/node_modules/got/node_modules/lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/package-json/node_modules/json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==", - "dev": true - }, - "node_modules/package-json/node_modules/keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.0" - } - }, - "node_modules/package-json/node_modules/normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/package-json/node_modules/p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json/node_modules/responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", - "dev": true, - "dependencies": { - "lowercase-keys": "^1.0.0" - } - }, - "node_modules/package-json/node_modules/responselike/node_modules/lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/package-json/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/package-json/node_modules/to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "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": "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/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "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-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/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/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/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/pluralize": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", - "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "dependencies": { - "fast-diff": "^1.1.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/pretty-format": { - "version": "29.0.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.0.3.tgz", - "integrity": "sha512-cHudsvQr1K5vNVLbvYF/nv3Qy/F/BcEKxGuIeMiVMRHxPOO1RxXooP8g/ZrwAp7Dx+KdMZoOc7NxLHhMrP2f9Q==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "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/pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/printable-characters": { - "version": "1.0.42", - "resolved": "https://registry.npmjs.org/printable-characters/-/printable-characters-1.0.42.tgz", - "integrity": "sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==", - "dev": true - }, - "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/pupa": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", - "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", - "dev": true, - "dependencies": { - "escape-goat": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pupa/node_modules/escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", - "dev": true, - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, - "node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/randombytes": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.3.tgz", - "integrity": "sha512-lDVjxQQFoCG1jcrP06LNo2lbWp4QTShEXnhActFBwYuHprllQV6VUpwreApsYqCgD+N1mHoqJ/BI/4eV4R2GYg==", - "dev": true - }, - "node_modules/randomstring": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/randomstring/-/randomstring-1.2.2.tgz", - "integrity": "sha512-9FByiB8guWZLbE+akdQiWE3I1I6w7Vn5El4o4y7o5bWQ6DWPcEOp+aLG7Jezc8BVRKKpgJd2ppRX0jnKu1YCfg==", - "dev": true, - "dependencies": { - "array-uniq": "1.0.2", - "randombytes": "2.0.3" - }, - "bin": { - "randomstring": "bin/randomstring" - }, - "engines": { - "node": "*" - } - }, - "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/rc/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": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/read-pkg/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/readable-stream": { - "version": "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/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/regexp-tree": { - "version": "0.1.24", - "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.24.tgz", - "integrity": "sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw==", - "dev": true, - "bin": { - "regexp-tree": "bin/regexp-tree" - } - }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/registry-auth-token": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz", - "integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==", - "dev": true, - "dependencies": { - "rc": "1.2.8" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "dev": true, - "dependencies": { - "rc": "^1.2.8" - }, - "engines": { - "node": ">=8" - } - }, - "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/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.9.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-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-global": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", - "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", - "dev": true, - "dependencies": { - "global-dirs": "^0.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-global/node_modules/global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", - "dev": true, - "dependencies": { - "ini": "^1.3.4" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", - "dev": true, - "dependencies": { - "lowercase-keys": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/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-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "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/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "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": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", - "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==", - "dev": true, - "dependencies": { - "regexp-tree": "~0.1.1" - } - }, - "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/scoped-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/scoped-regex/-/scoped-regex-2.1.0.tgz", - "integrity": "sha512-g3WxHrqSWCZHGHlSrF51VXFdjImhwvH8ZO/pryFH56Qi0cDsZfylQa/t0jCzVQFNbNvM00HfHjkDPEuarKDSWQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "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, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "dev": true, - "dependencies": { - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/semver-diff/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "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/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/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/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "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/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.12", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", - "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", - "dev": true - }, - "node_modules/split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "dev": true, - "dependencies": { - "through": "2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", - "dev": true, - "dependencies": { - "readable-stream": "^3.0.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "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/stacktracey": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/stacktracey/-/stacktracey-2.1.8.tgz", - "integrity": "sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==", - "dev": true, - "dependencies": { - "as-table": "^1.0.36", - "get-source": "^2.0.12" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "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/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-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/swagger-parser": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/swagger-parser/-/swagger-parser-10.0.3.tgz", - "integrity": "sha512-nF7oMeL4KypldrQhac8RyHerJeGPD1p2xDh900GPvc+Nk7nWP6jX2FcC7WmkinMoAmoO774+AFXcWsW8gMWEIg==", - "dev": true, - "dependencies": { - "@apidevtools/swagger-parser": "10.0.3" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/swagger-parser/node_modules/@apidevtools/swagger-parser": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/@apidevtools/swagger-parser/-/swagger-parser-10.0.3.tgz", - "integrity": "sha512-sNiLY51vZOmSPFZA5TF35KZ2HbgYklQnTSDnkghamzLb3EkNtcQnrBQEj5AOCxHpTtXpqMCRM1CrmV2rG6nw4g==", - "dev": true, - "dependencies": { - "@apidevtools/json-schema-ref-parser": "^9.0.6", - "@apidevtools/openapi-schemas": "^2.0.4", - "@apidevtools/swagger-methods": "^3.0.2", - "@jsdevtools/ono": "^7.1.3", - "call-me-maybe": "^1.0.1", - "z-schema": "^5.0.1" - }, - "peerDependencies": { - "openapi-types": ">=7" - } - }, - "node_modules/swagger-parser/node_modules/openapi-types": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.0.2.tgz", - "integrity": "sha512-GuTo7FyZjOIWVhIhQSWJVaws6A82sWIGyQogxxYBYKZ0NBdyP2CYSIgOwFfSB+UVoPExk/YzFpyYitHS8KVZtA==", - "dev": true, - "peer": true - }, - "node_modules/swagger-schema-official": { - "version": "2.0.0-bab6bed", - "resolved": "https://registry.npmjs.org/swagger-schema-official/-/swagger-schema-official-2.0.0-bab6bed.tgz", - "integrity": "sha512-rCC0NWGKr/IJhtRuPq/t37qvZHI/mH4I4sxflVM+qgVe5Z2uOCivzWaVbuioJaB61kvm5UvB7b49E+oBY0M8jA==", - "dev": true - }, - "node_modules/symbol-observable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-3.0.0.tgz", - "integrity": "sha512-6tDOXSHiVjuCaasQSWTmHUWn4PuG7qa3+1WT031yTc/swT7+rLiw3GOrFxaH1E3lLP09dH3bVuVDf2gK5rxG3Q==", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/text-extensions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", - "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "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/through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "dev": true, - "dependencies": { - "readable-stream": "3" - } - }, - "node_modules/time-span": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/time-span/-/time-span-4.0.0.tgz", - "integrity": "sha512-MyqZCTGLDZ77u4k+jqg4UlrzPTPZ49NDlaekU6uuFaJLzPIN1woaRXCbGeqOfxwc3Y37ZROGAJ614Rdv7Olt+g==", - "dev": true, - "dependencies": { - "convert-hrtime": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/to-readable-stream": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-2.1.0.tgz", - "integrity": "sha512-o3Qa6DGg1CEXshSdvWNX2sN4QHqg03SPq7U6jPXRahlQdl5dK8oXjkU/2/sGrnOZKeGV1zLSO8qPwyKklPPE7w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "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/traverse": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", - "integrity": "sha512-kdf4JKs8lbARxWdp7RKdNzoJBhGUcIalSYibuGyHJbmk40pOysQ0+QPvlkCOICOivDWU2IJo2rkrxyTK2AH4fw==", - "dev": true - }, - "node_modules/trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "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/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/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/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typescript": { - "version": "4.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.3.tgz", - "integrity": "sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dev": true, - "dependencies": { - "crypto-random-string": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/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/update-notifier": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", - "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", - "dev": true, - "dependencies": { - "boxen": "^5.0.0", - "chalk": "^4.1.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.4.0", - "is-npm": "^5.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.1.0", - "pupa": "^2.1.1", - "semver": "^7.3.4", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/yeoman/update-notifier?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/global-dirs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", - "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", - "dev": true, - "dependencies": { - "ini": "2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/update-notifier/node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/update-notifier/node_modules/is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dev": true, - "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", - "dev": true, - "dependencies": { - "prepend-http": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true, - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "node_modules/vali-date": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", - "integrity": "sha512-sgECfZthyaCKW10N0fm27cg8HYTFK5qMWgypqkXMQ4Wbl/zZKx7xZICgcoxIIE+WFAP/MBL2EFwC/YvLxw3Zeg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/valid-url": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz", - "integrity": "sha512-QQDsV8OnSf5Uc30CKSwG9lnhMPe6exHtTXLRYX8uMwKENy640pU+2BgBL0LRbDh/eYRahNCS7aewCx0wf3NYVA==", - "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/validator": { - "version": "13.7.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", - "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "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/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, - "dependencies": { - "defaults": "^1.0.3" - } - }, - "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/widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "dev": true, - "dependencies": { - "string-width": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "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/xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "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/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/yargs": { - "version": "17.5.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", - "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", - "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.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs/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/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "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" - } - }, - "node_modules/youch": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/youch/-/youch-3.2.2.tgz", - "integrity": "sha512-+xhTK8sY9qV3nLbWVaOUFZPdlQ3wrMKiu3dKqKkAkLaYzzkYmpWY+v+eQIAfbPu7TZhS1G5FhEV++sl8fhuT4w==", - "dev": true, - "dependencies": { - "cookie": "^0.5.0", - "mustache": "^4.2.0", - "stacktracey": "^2.1.8" - } - }, - "node_modules/youch-terminal": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/youch-terminal/-/youch-terminal-2.1.5.tgz", - "integrity": "sha512-ObQ2GeG0LnIGiOAq0rLaEdCC8Z+fHlMFcJqsQcLBWo36zlj2GViS7pOKjRGdJ4pJl4ofZmU77O7gwd6lId67PA==", - "dev": true, - "dependencies": { - "kleur": "^4.1.5" - } - }, - "node_modules/z-schema": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.4.tgz", - "integrity": "sha512-gm/lx3hDzJNcLwseIeQVm1UcwhWIKpSB4NqH89pTBtFns4k/HDHudsICtvG05Bvw/Mv3jMyk700y5dadueLHdA==", - "dev": true, - "dependencies": { - "lodash.get": "^4.4.2", - "lodash.isequal": "^4.5.0", - "validator": "^13.7.0" - }, - "bin": { - "z-schema": "bin/z-schema" - }, - "engines": { - "node": ">=8.0.0" - }, - "optionalDependencies": { - "commander": "^2.20.3" - } - }, - "node_modules/z-schema/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, - "optional": true - } - }, - "dependencies": { - "@apidevtools/json-schema-ref-parser": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz", - "integrity": "sha512-GBD2Le9w2+lVFoc4vswGI/TjkNIZSVp7+9xPf+X3uidBfWnAeUWmquteSyt0+VCrhNMWj/FTABISQrD3Z/YA+w==", - "dev": true, - "requires": { - "@jsdevtools/ono": "^7.1.3", - "@types/json-schema": "^7.0.6", - "call-me-maybe": "^1.0.1", - "js-yaml": "^4.1.0" - }, - "dependencies": { - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "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" - } - } - } - }, - "@apidevtools/openapi-schemas": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@apidevtools/openapi-schemas/-/openapi-schemas-2.1.0.tgz", - "integrity": "sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==", - "dev": true - }, - "@apidevtools/swagger-methods": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@apidevtools/swagger-methods/-/swagger-methods-3.0.2.tgz", - "integrity": "sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==", - "dev": true - }, - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dev": true, - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true - }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "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" - } - } - } - }, - "@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 - }, - "@commitlint/cli": { - "version": "17.1.2", - "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-17.1.2.tgz", - "integrity": "sha512-h/4Hlka3bvCLbnxf0Er2ri5A44VMlbMSkdTRp8Adv2tRiklSTRIoPGs7OEXDv3EoDs2AAzILiPookgM4Gi7LOw==", - "dev": true, - "requires": { - "@commitlint/format": "^17.0.0", - "@commitlint/lint": "^17.1.0", - "@commitlint/load": "^17.1.2", - "@commitlint/read": "^17.1.0", - "@commitlint/types": "^17.0.0", - "execa": "^5.0.0", - "lodash": "^4.17.19", - "resolve-from": "5.0.0", - "resolve-global": "1.0.0", - "yargs": "^17.0.0" - } - }, - "@commitlint/config-conventional": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-17.1.0.tgz", - "integrity": "sha512-WU2p0c9/jLi8k2q2YrDV96Y8XVswQOceIQ/wyJvQxawJSCasLdRB3kUIYdNjOCJsxkpoUlV/b90ZPxp1MYZDiA==", - "dev": true, - "requires": { - "conventional-changelog-conventionalcommits": "^5.0.0" - } - }, - "@commitlint/config-validator": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-17.1.0.tgz", - "integrity": "sha512-Q1rRRSU09ngrTgeTXHq6ePJs2KrI+axPTgkNYDWSJIuS1Op4w3J30vUfSXjwn5YEJHklK3fSqWNHmBhmTR7Vdg==", - "dev": true, - "requires": { - "@commitlint/types": "^17.0.0", - "ajv": "^8.11.0" - } - }, - "@commitlint/ensure": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-17.0.0.tgz", - "integrity": "sha512-M2hkJnNXvEni59S0QPOnqCKIK52G1XyXBGw51mvh7OXDudCmZ9tZiIPpU882p475Mhx48Ien1MbWjCP1zlyC0A==", - "dev": true, - "requires": { - "@commitlint/types": "^17.0.0", - "lodash": "^4.17.19" - } - }, - "@commitlint/execute-rule": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-17.0.0.tgz", - "integrity": "sha512-nVjL/w/zuqjCqSJm8UfpNaw66V9WzuJtQvEnCrK4jDw6qKTmZB+1JQ8m6BQVZbNBcwfYdDNKnhIhqI0Rk7lgpQ==", - "dev": true - }, - "@commitlint/format": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-17.0.0.tgz", - "integrity": "sha512-MZzJv7rBp/r6ZQJDEodoZvdRM0vXu1PfQvMTNWFb8jFraxnISMTnPBWMMjr2G/puoMashwaNM//fl7j8gGV5lA==", - "dev": true, - "requires": { - "@commitlint/types": "^17.0.0", - "chalk": "^4.1.0" - } - }, - "@commitlint/is-ignored": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-17.1.0.tgz", - "integrity": "sha512-JITWKDMHhIh8IpdIbcbuH9rEQJty1ZWelgjleTFrVRAcEwN/sPzk1aVUXRIZNXMJWbZj8vtXRJnFihrml8uECQ==", - "dev": true, - "requires": { - "@commitlint/types": "^17.0.0", - "semver": "7.3.7" - } - }, - "@commitlint/lint": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-17.1.0.tgz", - "integrity": "sha512-ltpqM2ogt/+SDhUaScFo0MdscncEF96lvQTPMM/VTTWlw7sTGLLWkOOppsee2MN/uLNNWjQ7kqkd4h6JqoM9AQ==", - "dev": true, - "requires": { - "@commitlint/is-ignored": "^17.1.0", - "@commitlint/parse": "^17.0.0", - "@commitlint/rules": "^17.0.0", - "@commitlint/types": "^17.0.0" - } - }, - "@commitlint/load": { - "version": "17.1.2", - "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-17.1.2.tgz", - "integrity": "sha512-sk2p/jFYAWLChIfOIp/MGSIn/WzZ0vkc3afw+l4X8hGEYkvDe4gQUUAVxjl/6xMRn0HgnSLMZ04xXh5pkTsmgg==", - "dev": true, - "requires": { - "@commitlint/config-validator": "^17.1.0", - "@commitlint/execute-rule": "^17.0.0", - "@commitlint/resolve-extends": "^17.1.0", - "@commitlint/types": "^17.0.0", - "@types/node": "^14.0.0", - "chalk": "^4.1.0", - "cosmiconfig": "^7.0.0", - "cosmiconfig-typescript-loader": "^4.0.0", - "lodash": "^4.17.19", - "resolve-from": "^5.0.0", - "ts-node": "^10.8.1", - "typescript": "^4.6.4" - }, - "dependencies": { - "@types/node": { - "version": "14.18.29", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.29.tgz", - "integrity": "sha512-LhF+9fbIX4iPzhsRLpK5H7iPdvW8L4IwGciXQIOEcuF62+9nw/VQVsOViAOOGxY3OlOKGLFv0sWwJXdwQeTn6A==", - "dev": true - } - } - }, - "@commitlint/message": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-17.0.0.tgz", - "integrity": "sha512-LpcwYtN+lBlfZijHUdVr8aNFTVpHjuHI52BnfoV01TF7iSLnia0jttzpLkrLmI8HNQz6Vhr9UrxDWtKZiMGsBw==", - "dev": true - }, - "@commitlint/parse": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-17.0.0.tgz", - "integrity": "sha512-cKcpfTIQYDG1ywTIr5AG0RAiLBr1gudqEsmAGCTtj8ffDChbBRxm6xXs2nv7GvmJN7msOt7vOKleLvcMmRa1+A==", - "dev": true, - "requires": { - "@commitlint/types": "^17.0.0", - "conventional-changelog-angular": "^5.0.11", - "conventional-commits-parser": "^3.2.2" - } - }, - "@commitlint/read": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-17.1.0.tgz", - "integrity": "sha512-73BoFNBA/3Ozo2JQvGsE0J8SdrJAWGfZQRSHqvKaqgmY042Su4gXQLqvAzgr55S9DI1l9TiU/5WDuh8IE86d/g==", - "dev": true, - "requires": { - "@commitlint/top-level": "^17.0.0", - "@commitlint/types": "^17.0.0", - "fs-extra": "^10.0.0", - "git-raw-commits": "^2.0.0", - "minimist": "^1.2.6" - } - }, - "@commitlint/resolve-extends": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-17.1.0.tgz", - "integrity": "sha512-jqKm00LJ59T0O8O4bH4oMa4XyJVEOK4GzH8Qye9XKji+Q1FxhZznxMV/bDLyYkzbTodBt9sL0WLql8wMtRTbqQ==", - "dev": true, - "requires": { - "@commitlint/config-validator": "^17.1.0", - "@commitlint/types": "^17.0.0", - "import-fresh": "^3.0.0", - "lodash": "^4.17.19", - "resolve-from": "^5.0.0", - "resolve-global": "^1.0.0" - } - }, - "@commitlint/rules": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-17.0.0.tgz", - "integrity": "sha512-45nIy3dERKXWpnwX9HeBzK5SepHwlDxdGBfmedXhL30fmFCkJOdxHyOJsh0+B0RaVsLGT01NELpfzJUmtpDwdQ==", - "dev": true, - "requires": { - "@commitlint/ensure": "^17.0.0", - "@commitlint/message": "^17.0.0", - "@commitlint/to-lines": "^17.0.0", - "@commitlint/types": "^17.0.0", - "execa": "^5.0.0" - } - }, - "@commitlint/to-lines": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-17.0.0.tgz", - "integrity": "sha512-nEi4YEz04Rf2upFbpnEorG8iymyH7o9jYIVFBG1QdzebbIFET3ir+8kQvCZuBE5pKCtViE4XBUsRZz139uFrRQ==", - "dev": true - }, - "@commitlint/top-level": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-17.0.0.tgz", - "integrity": "sha512-dZrEP1PBJvodNWYPOYiLWf6XZergdksKQaT6i1KSROLdjf5Ai0brLOv5/P+CPxBeoj3vBxK4Ax8H1Pg9t7sHIQ==", - "dev": true, - "requires": { - "find-up": "^5.0.0" - } - }, - "@commitlint/types": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-17.0.0.tgz", - "integrity": "sha512-hBAw6U+SkAT5h47zDMeOu3HSiD0SODw4Aq7rRNh1ceUmL7GyLKYhPbUvlRWqZ65XjBLPHZhFyQlRaPNz8qvUyQ==", - "dev": true, - "requires": { - "chalk": "^4.1.0" - } - }, - "@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "0.3.9" - } - }, - "@eslint/eslintrc": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.2.tgz", - "integrity": "sha512-AXYd23w1S/bv3fTs3Lz0vjiYemS08jWkI3hYyS9I1ry+0f+Yjs1wm+sU0BS8qDOPrBIkp4qHYC16I8uVtpLajQ==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.4.0", - "globals": "^13.15.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": { - "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" - } - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "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 - } - } - }, - "@financial-times/origami-service-makefile": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@financial-times/origami-service-makefile/-/origami-service-makefile-7.0.3.tgz", - "integrity": "sha512-aKe65sZ3XgZ/0Sm0MDLbGrcO3G4DRv/bVW4Gpmw68cRZV9IBE7h/pwfR3Rs7njNSZMFkjS4rPG/YySv9brQByA==", - "dev": true - }, - "@humanwhocodes/config-array": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", - "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - } - }, - "@humanwhocodes/gitignore-to-minimatch": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", - "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", - "dev": true - }, - "@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": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "@japa/assert": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/@japa/assert/-/assert-1.3.6.tgz", - "integrity": "sha512-aFyCRdLAgYR4P45CayMY7MlzHKLp+oKr2fGj34jObWqmNZOWgFJuEcwBGoqbr+ApL/9Qhkcq0hoFL2FyfFJ7Jw==", - "dev": true, - "requires": { - "@types/chai": "^4.3.3", - "api-contract-validator": "^2.2.8", - "chai": "^4.3.6", - "macroable": "^7.0.1" - } - }, - "@japa/base-reporter": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@japa/base-reporter/-/base-reporter-1.0.2.tgz", - "integrity": "sha512-ONuLhtQ2UKAqooxm0VjILtZ+r3FvIuIjIh66qyMrfZZUE9Ht+dVxjmnMKRo1MgLnP9D6Rh98JUJEVaiJfgEEKQ==", - "dev": true, - "requires": { - "@japa/errors-printer": "^1.3.10", - "@poppinss/cliui": "^3.0.2", - "ms": "^2.1.3" - }, - "dependencies": { - "@japa/errors-printer": { - "version": "1.3.10", - "resolved": "https://registry.npmjs.org/@japa/errors-printer/-/errors-printer-1.3.10.tgz", - "integrity": "sha512-tUTHnDiGXnhKHZry63sSb4wS3bs2wxvrUOofDzYKilmAY0nUGCIQwpkpSaqVmC3l0xqk29EhBZJewmDCrUBIPw==", - "dev": true, - "requires": { - "@poppinss/cliui": "^3.0.2", - "jest-diff": "^29.0.1", - "youch": "^3.2.1", - "youch-terminal": "^2.1.5" - } - } - } - }, - "@japa/core": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@japa/core/-/core-7.2.0.tgz", - "integrity": "sha512-CnF1NoNgQWH0UALJQ+YNJjXMXdFYb+wlGdppFptsvn2FmjejWFtXeuPCACl4hX4vQahfPKEojSIRKL4iTML6FQ==", - "dev": true, - "requires": { - "@poppinss/hooks": "^6.0.2-0", - "async-retry": "^1.3.3", - "emittery": "^0.13.1", - "macroable": "^7.0.1", - "time-span": "^4.0.0" - } - }, - "@japa/errors-printer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@japa/errors-printer/-/errors-printer-2.0.1.tgz", - "integrity": "sha512-6ngqHgvgDzVVz2zMd+vCziAfVoAyDxOXvgvHNNVAddAtbmd62eyFexG0hfTUZnkY8EthVG7o8lv6XpcsJL1kxA==", - "dev": true, - "requires": { - "@poppinss/cliui": "^3.0.2", - "jest-diff": "^29.0.2", - "youch": "^3.2.2", - "youch-terminal": "^2.1.5" - } - }, - "@japa/run-failed-tests": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@japa/run-failed-tests/-/run-failed-tests-1.1.0.tgz", - "integrity": "sha512-kwD/esM3Mc+4eslhAN31e5r/fCMHi9kNlg4FvetgdmS6bR9XTlTR3Cy2fJ4LwMYhNcLFRcBEw9x8d0Nobq9ryg==", - "dev": true, - "requires": { - "@poppinss/cliui": "^3.0.2", - "find-cache-dir": "^3.3.2", - "fs-extra": "^10.1.0" - } - }, - "@japa/runner": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@japa/runner/-/runner-2.2.1.tgz", - "integrity": "sha512-jP7soKxHm791YzVelwQOZQ1WItgQvbFo0hR0iwULcPqYs/Vh2p70ojPwjYgQ0HbfxyKAEUOjGJXTePRxF2JapQ==", - "dev": true, - "requires": { - "@japa/core": "^7.2.0", - "@japa/errors-printer": "^2.0.1", - "@poppinss/cliui": "^3.0.2", - "@poppinss/hooks": "^6.0.2-0", - "fast-glob": "^3.2.12", - "getopts": "^2.3.0", - "inclusion": "^1.0.1" - } - }, - "@japa/spec-reporter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@japa/spec-reporter/-/spec-reporter-1.3.0.tgz", - "integrity": "sha512-YTl51H0zAHLJTpTajbRjplRaXqSWUpQaJvtWWrjVGPYVPEfB3RrRHFsRXwpTZI/IZN+/eaZ+ZX/ucZfmFrzY+g==", - "dev": true, - "requires": { - "@japa/base-reporter": "^1.0.2", - "@japa/errors-printer": "^2.0.1", - "@poppinss/cliui": "^3.0.2", - "ms": "^2.1.3" - } - }, - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "@jest/types": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", - "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" - }, - "dependencies": { - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@jsdevtools/ono": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", - "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", - "dev": true - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@poppinss/cliui": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@poppinss/cliui/-/cliui-3.0.2.tgz", - "integrity": "sha512-nrAosoQy0ex3wSw3VuigLs3XCsxDsnNvx4ZL4ZvdZlygrChMUKPKnlxctQk13IyUHaH4F/wvaHnfWg/inhA36w==", - "dev": true, - "requires": { - "@poppinss/colors": "^3.0.2", - "cli-boxes": "^3.0.0", - "cli-table3": "^0.6.1", - "color-support": "^1.1.3", - "log-update": "^4.0.0", - "pretty-hrtime": "^1.0.3", - "string-width": "^4.2.2" - } - }, - "@poppinss/colors": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@poppinss/colors/-/colors-3.0.2.tgz", - "integrity": "sha512-kgIiDPKUV0IaNtzLKricxd3mMWepqCbgh2Mb0M8C5zyS1bJ0K86s6dMu9xEKtF2XksqyE0qV4ANtMnTCMjQgvA==", - "dev": true, - "requires": { - "color-support": "^1.1.3", - "kleur": "^4.1.4" - } - }, - "@poppinss/hooks": { - "version": "6.0.2-0", - "resolved": "https://registry.npmjs.org/@poppinss/hooks/-/hooks-6.0.2-0.tgz", - "integrity": "sha512-mG0hnQlxgflvxyM6t/XO8z/FwotsYRXPhtLZ3cz3iyk4t8xaNtOihSANBcvqdkxZCtGBvotNIf/GnES9hvlfSQ==", - "dev": true - }, - "@samverschueren/stream-to-observable": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.1.tgz", - "integrity": "sha512-c/qwwcHyafOQuVQJj0IlBjf5yYgBI7YPJ77k4fOJYesb41jio65eaJODRUmfYKhTOFBrIZ66kgvGPlNbjuoRdQ==", - "dev": true, - "requires": { - "any-observable": "^0.3.0" - }, - "dependencies": { - "any-observable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.3.0.tgz", - "integrity": "sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==", - "dev": true - } - } - }, - "@sinclair/typebox": { - "version": "0.24.41", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.41.tgz", - "integrity": "sha512-TJCgQurls4FipFvHeC+gfAzb+GGstL0TDwYJKQVtTeSvJIznWzP7g3bAd5gEBlr8+bIxqnWS9VGVWREDhmE8jA==", - "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 - }, - "@swc/core": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.1.tgz", - "integrity": "sha512-ztB5N63UGLIOM60Vg+deHVigEnDAEAttiTQk4T91/i11SoOO65P9z8Bey01XFTxF0Alc2OJxkt8TBcq+n5mMYQ==", - "dev": true, - "requires": { - "@swc/core-android-arm-eabi": "1.3.1", - "@swc/core-android-arm64": "1.3.1", - "@swc/core-darwin-arm64": "1.3.1", - "@swc/core-darwin-x64": "1.3.1", - "@swc/core-freebsd-x64": "1.3.1", - "@swc/core-linux-arm-gnueabihf": "1.3.1", - "@swc/core-linux-arm64-gnu": "1.3.1", - "@swc/core-linux-arm64-musl": "1.3.1", - "@swc/core-linux-x64-gnu": "1.3.1", - "@swc/core-linux-x64-musl": "1.3.1", - "@swc/core-win32-arm64-msvc": "1.3.1", - "@swc/core-win32-ia32-msvc": "1.3.1", - "@swc/core-win32-x64-msvc": "1.3.1" - } - }, - "@swc/core-android-arm-eabi": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@swc/core-android-arm-eabi/-/core-android-arm-eabi-1.3.1.tgz", - "integrity": "sha512-fZ6nTalHWYn1OHfU87yF8s24edgQ4COHydLlPcpU/pwSH90hCwy/fgna5PpUBw0rfzGBttX0/0yMorC7ZSar4Q==", - "dev": true, - "optional": true, - "requires": { - "@swc/wasm": "1.2.122" - } - }, - "@swc/core-android-arm64": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@swc/core-android-arm64/-/core-android-arm64-1.3.1.tgz", - "integrity": "sha512-aDrV22ajQ4NYOwxEWvipPpdhHaLqU5W1rxRap5N1KSetzwGIk6NMd31o6Jotoxf7tB8qtLlo5VyNok4adJRVYg==", - "dev": true, - "optional": true, - "requires": { - "@swc/wasm": "1.2.130" - }, - "dependencies": { - "@swc/wasm": { - "version": "1.2.130", - "resolved": "https://registry.npmjs.org/@swc/wasm/-/wasm-1.2.130.tgz", - "integrity": "sha512-rNcJsBxS70+pv8YUWwf5fRlWX6JoY/HJc25HD/F8m6Kv7XhJdqPPMhyX6TKkUBPAG7TWlZYoxa+rHAjPy4Cj3Q==", - "dev": true, - "optional": true - } - } - }, - "@swc/core-darwin-arm64": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.1.tgz", - "integrity": "sha512-yom8pqaDhsncQaqp+NdXk1YEtWoqPrfsyKJP3RriTbUjXS/20q/WNfkkJjxUuaFZC6PH/MuvrLzD6Z6ZuZvLaA==", - "dev": true, - "optional": true - }, - "@swc/core-darwin-x64": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.1.tgz", - "integrity": "sha512-Q2kH2i5pS0dvauOiRR4s7atH+Qrhe1LmiCv1D2U+AghZMfDcxi3DBTxrae/YqmDYm3GxHH3ZSAFHR3E0SeiSSg==", - "dev": true, - "optional": true - }, - "@swc/core-freebsd-x64": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@swc/core-freebsd-x64/-/core-freebsd-x64-1.3.1.tgz", - "integrity": "sha512-f2a+rPGrhAICF+Du/nHWZlYzltX1/fWyt+v0IP+r0Zh4drgTrt5G3sMYrQVTjsKvI8R6tV2Q7BfYvDIQXwE1pw==", - "dev": true, - "optional": true, - "requires": { - "@swc/wasm": "1.2.130" - }, - "dependencies": { - "@swc/wasm": { - "version": "1.2.130", - "resolved": "https://registry.npmjs.org/@swc/wasm/-/wasm-1.2.130.tgz", - "integrity": "sha512-rNcJsBxS70+pv8YUWwf5fRlWX6JoY/HJc25HD/F8m6Kv7XhJdqPPMhyX6TKkUBPAG7TWlZYoxa+rHAjPy4Cj3Q==", - "dev": true, - "optional": true - } - } - }, - "@swc/core-linux-arm-gnueabihf": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.1.tgz", - "integrity": "sha512-Q1zGHJMvAEkFdW7A2dthFrswf/HezhC2kOSoOmitz+KxWBZ0YSj8k9ImLYGFf7S8Vi0KVzLUaE1jCGK2oePx/A==", - "dev": true, - "optional": true, - "requires": { - "@swc/wasm": "1.2.130" - }, - "dependencies": { - "@swc/wasm": { - "version": "1.2.130", - "resolved": "https://registry.npmjs.org/@swc/wasm/-/wasm-1.2.130.tgz", - "integrity": "sha512-rNcJsBxS70+pv8YUWwf5fRlWX6JoY/HJc25HD/F8m6Kv7XhJdqPPMhyX6TKkUBPAG7TWlZYoxa+rHAjPy4Cj3Q==", - "dev": true, - "optional": true - } - } - }, - "@swc/core-linux-arm64-gnu": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.1.tgz", - "integrity": "sha512-5OPkiU2A4Ijt2cRzi2FCGPkAC+wRvAb0TmUkL4Lj2PXPzM5RtEd2AoYmpQhV+YEOXO4XdnKwgBmdeiQV5K8eXA==", - "dev": true, - "optional": true - }, - "@swc/core-linux-arm64-musl": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.1.tgz", - "integrity": "sha512-oTIeS7kEKSUrTxavYBEfqjqoIiHtbwSdgp/rrn2hz7CDG1B1imRHnsjwdh4YaYLsm8RcCH9+GABnHxJd3Nd6qg==", - "dev": true, - "optional": true - }, - "@swc/core-linux-x64-gnu": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.1.tgz", - "integrity": "sha512-gNojY1qIKksK9kNdY4pqrlUILTxfqSWtXjX0qV2mlxgwRpnOATJnMx585q09cOZnkN2/QB+33pXnT8z/wxuGzQ==", - "dev": true, - "optional": true - }, - "@swc/core-linux-x64-musl": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.1.tgz", - "integrity": "sha512-WXNagCsjul7U9uYYP1JkUUVtvqXRDDWjvdegqrtQ99/De+HoWr+fCPgvENgOsSwb0clPTBuiGm2PTnK6kDQ0Sw==", - "dev": true, - "optional": true - }, - "@swc/core-win32-arm64-msvc": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.1.tgz", - "integrity": "sha512-3LSDJtpYNgN4N/pd/YzHAWKaF2Y/1P9t83vHfPos77hQ+KzFaiyT7YIG1qfYy1AD8MGC28l2bJNH2gia3bcERA==", - "dev": true, - "optional": true, - "requires": { - "@swc/wasm": "1.2.130" - }, - "dependencies": { - "@swc/wasm": { - "version": "1.2.130", - "resolved": "https://registry.npmjs.org/@swc/wasm/-/wasm-1.2.130.tgz", - "integrity": "sha512-rNcJsBxS70+pv8YUWwf5fRlWX6JoY/HJc25HD/F8m6Kv7XhJdqPPMhyX6TKkUBPAG7TWlZYoxa+rHAjPy4Cj3Q==", - "dev": true, - "optional": true - } - } - }, - "@swc/core-win32-ia32-msvc": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.1.tgz", - "integrity": "sha512-0VfPVkQx7jV7k71tTQY5HchDrALWjrHF8AcaaCojXQpb9ftktLxaCUdTWlQ+Y958GkgG7QX+HEo95ImZ+cYRHQ==", - "dev": true, - "optional": true, - "requires": { - "@swc/wasm": "1.2.130" - }, - "dependencies": { - "@swc/wasm": { - "version": "1.2.130", - "resolved": "https://registry.npmjs.org/@swc/wasm/-/wasm-1.2.130.tgz", - "integrity": "sha512-rNcJsBxS70+pv8YUWwf5fRlWX6JoY/HJc25HD/F8m6Kv7XhJdqPPMhyX6TKkUBPAG7TWlZYoxa+rHAjPy4Cj3Q==", - "dev": true, - "optional": true - } - } - }, - "@swc/core-win32-x64-msvc": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.1.tgz", - "integrity": "sha512-jSeqI8+1PGp+lHtyQCieDQxSszOF6UlA3bC2cmC9LAD84xcvsqpt0hsg3GFaw6RR7FsVjMNl/St6y1EEW0mm6Q==", - "dev": true, - "optional": true - }, - "@swc/wasm": { - "version": "1.2.122", - "resolved": "https://registry.npmjs.org/@swc/wasm/-/wasm-1.2.122.tgz", - "integrity": "sha512-sM1VCWQxmNhFtdxME+8UXNyPNhxNu7zdb6ikWpz0YKAQQFRGT5ThZgJrubEpah335SUToNg8pkdDF7ibVCjxbQ==", - "dev": true, - "optional": 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" - } - }, - "@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", - "dev": true - }, - "@types/cacheable-request": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", - "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==", - "dev": true, - "requires": { - "@types/http-cache-semantics": "*", - "@types/keyv": "*", - "@types/node": "*", - "@types/responselike": "*" - } - }, - "@types/chai": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.3.tgz", - "integrity": "sha512-hC7OMnszpxhZPduX+m+nrx+uFoLkWOMiR4oa/AZF3MuSETYTZmFfJAHqZEM8MVlvfG7BEUcgvtwoCTxBp6hm3g==", - "dev": true - }, - "@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.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true - }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", - "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*", - "@types/istanbul-lib-report": "*" - } - }, - "@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/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/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", - "dev": true - }, - "@types/node": { - "version": "18.7.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.18.tgz", - "integrity": "sha512-m+6nTEOadJZuTPkKR/SYK3A2d7FZrgElol9UP1Kae90VVU4a6mxnPuLiIW1m4Cq4gZ/nWb9GrdVXJCoCazDAbg==", - "dev": true - }, - "@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", - "dev": true - }, - "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true - }, - "@types/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/yargs": { - "version": "15.0.14", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.14.tgz", - "integrity": "sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", - "dev": true - }, - "@typescript-eslint/eslint-plugin": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.37.0.tgz", - "integrity": "sha512-Fde6W0IafXktz1UlnhGkrrmnnGpAo1kyX7dnyHHVrmwJOn72Oqm3eYtddrpOwwel2W8PAK9F3pIL5S+lfoM0og==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.37.0", - "@typescript-eslint/type-utils": "5.37.0", - "@typescript-eslint/utils": "5.37.0", - "debug": "^4.3.4", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.2.0", - "regexpp": "^3.2.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/parser": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.37.0.tgz", - "integrity": "sha512-01VzI/ipYKuaG5PkE5+qyJ6m02fVALmMPY3Qq5BHflDx3y4VobbLdHQkSMg9VPRS4KdNt4oYTMaomFoHonBGAw==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.37.0", - "@typescript-eslint/types": "5.37.0", - "@typescript-eslint/typescript-estree": "5.37.0", - "debug": "^4.3.4" - } - }, - "@typescript-eslint/scope-manager": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.37.0.tgz", - "integrity": "sha512-F67MqrmSXGd/eZnujjtkPgBQzgespu/iCZ+54Ok9X5tALb9L2v3G+QBSoWkXG0p3lcTJsL+iXz5eLUEdSiJU9Q==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.37.0", - "@typescript-eslint/visitor-keys": "5.37.0" - } - }, - "@typescript-eslint/type-utils": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.37.0.tgz", - "integrity": "sha512-BSx/O0Z0SXOF5tY0bNTBcDEKz2Ec20GVYvq/H/XNKiUorUFilH7NPbFUuiiyzWaSdN3PA8JV0OvYx0gH/5aFAQ==", - "dev": true, - "requires": { - "@typescript-eslint/typescript-estree": "5.37.0", - "@typescript-eslint/utils": "5.37.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/types": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.37.0.tgz", - "integrity": "sha512-3frIJiTa5+tCb2iqR/bf7XwU20lnU05r/sgPJnRpwvfZaqCJBrl8Q/mw9vr3NrNdB/XtVyMA0eppRMMBqdJ1bA==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.37.0.tgz", - "integrity": "sha512-JkFoFIt/cx59iqEDSgIGnQpCTRv96MQnXCYvJi7QhBC24uyuzbD8wVbajMB1b9x4I0octYFJ3OwjAwNqk1AjDA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.37.0", - "@typescript-eslint/visitor-keys": "5.37.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/utils": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.37.0.tgz", - "integrity": "sha512-jUEJoQrWbZhmikbcWSMDuUSxEE7ID2W/QCV/uz10WtQqfOuKZUqFGjqLJ+qhDd17rjgp+QJPqTdPIBWwoob2NQ==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.37.0", - "@typescript-eslint/types": "5.37.0", - "@typescript-eslint/typescript-estree": "5.37.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - }, - "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 - } - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.37.0.tgz", - "integrity": "sha512-Hp7rT4cENBPIzMwrlehLW/28EVCOcE9U1Z1BQTc8EA8v5qpr7GRGuG+U58V5tTY48zvUOA3KHvw3rA8tY9fbdA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.37.0", - "eslint-visitor-keys": "^3.3.0" - } - }, - "acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", - "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": {} - }, - "acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true - }, - "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": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dev": true, - "requires": { - "string-width": "^4.1.0" - } - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - }, - "dependencies": { - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - } - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "any-observable": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.5.1.tgz", - "integrity": "sha512-8zv01bgDOp9PTmRTNCAHTw64TFP2rvlX4LvtNJLachaXY+AjmIvLT47fABNPCiIe89hKiSCo2n5zmPqI9CElPA==", - "dev": true - }, - "api-contract-validator": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/api-contract-validator/-/api-contract-validator-2.2.8.tgz", - "integrity": "sha512-YM3rMcrIp8Thf/WWbVBXBGX793Mm3Phw2pn3VbJpiZkpeTCTtF10huKPrzQ2gSIaK5GjAhTRJMAOyf+rsS7MAw==", - "dev": true, - "requires": { - "api-schema-builder": "^2.0.10", - "chalk": "^3.0.0", - "columnify": "^1.5.4", - "jest-diff": "^25.5.0", - "jest-matcher-utils": "^25.5.0", - "lodash.flatten": "^4.4.0", - "lodash.get": "^4.4.2", - "lodash.set": "^4.3.2", - "uri-js": "^4.4.1" - }, - "dependencies": { - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "diff-sequences": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", - "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==", - "dev": true - }, - "jest-diff": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.5.0.tgz", - "integrity": "sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A==", - "dev": true, - "requires": { - "chalk": "^3.0.0", - "diff-sequences": "^25.2.6", - "jest-get-type": "^25.2.6", - "pretty-format": "^25.5.0" - } - }, - "jest-get-type": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", - "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", - "dev": true - }, - "pretty-format": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", - "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", - "dev": true, - "requires": { - "@jest/types": "^25.5.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - } - } - }, - "api-schema-builder": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/api-schema-builder/-/api-schema-builder-2.0.11.tgz", - "integrity": "sha512-85zbwf8MtPWodhfnmQRW5YD/fuGR12FP+8TbcYai5wbRnoUmPYLftLSbp7NB6zQMPb61Gjz+ApPUSyTdcCos7g==", - "dev": true, - "requires": { - "ajv": "^6.12.6", - "clone-deep": "^4.0.1", - "decimal.js": "^10.3.1", - "js-yaml": "^3.14.1", - "json-schema-deref-sync": "^0.14.0", - "lodash.get": "^4.4.2", - "openapi-schema-validator": "^3.0.3", - "swagger-parser": "^10.0.3" - }, - "dependencies": { - "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" - } - }, - "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 - } - } - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "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-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-uniq": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.2.tgz", - "integrity": "sha512-GVYjmpL05al4dNlKJm53mKE4w9OOLiuVHWorsIA3YVz+Hu0hcn6PtE3Ydl0EqU7v+7ABC4mjjWsnLUxbpno+CA==", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "dev": true - }, - "as-table": { - "version": "1.0.55", - "resolved": "https://registry.npmjs.org/as-table/-/as-table-1.0.55.tgz", - "integrity": "sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==", - "dev": true, - "requires": { - "printable-characters": "^1.0.42" - } - }, - "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 - }, - "assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, - "async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", - "dev": true - }, - "async-exit-hook": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", - "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", - "dev": true - }, - "async-retry": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", - "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", - "dev": true, - "requires": { - "retry": "0.13.1" - } - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "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.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", - "dev": true - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "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" - } - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "boxen": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", - "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", - "dev": true, - "requires": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.2", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - }, - "cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", - "dev": true - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - } - } - }, - "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" - } - }, - "builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", - "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" - }, - "dependencies": { - "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" - } - } - } - }, - "call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha512-wCyFsDQkKPwwF8BDwOiWNx/9K45L/hvggQiDbve+viMNMQnWhrlYIuBk09offfwCRtCO9P6XwUttufzU11WCVw==", - "dev": true - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - }, - "dependencies": { - "quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true - } - } - }, - "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.3.6", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz", - "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==", - "dev": true, - "requires": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^3.0.1", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", - "pathval": "^1.1.1", - "type-detect": "^4.0.5" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "charenc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", - "dev": true - }, - "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", - "dev": true - }, - "ci-info": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.4.0.tgz", - "integrity": "sha512-t5QdPT5jq3o262DOQ8zA6E1tlH2upmUc4Hlvrbx1pGYJuiiHl7O7rvVNI+l8HTVhd/q3Qc9vqimkNk5yiXsAug==", - "dev": true - }, - "clean-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", - "integrity": "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - }, - "dependencies": { - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "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-boxes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", - "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", - "dev": true - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-table3": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.2.tgz", - "integrity": "sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw==", - "dev": true, - "requires": { - "@colors/colors": "1.5.0", - "string-width": "^4.2.0" - } - }, - "cli-truncate": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", - "integrity": "sha512-f4r4yJnbT++qUPI9NR4XLDLq41gQ+uqnPItWG0F5ZkehuNiTTa3EY0S4AqTSUOeJ7/zU41oWPQSNkW5BqPL9bg==", - "dev": true, - "requires": { - "slice-ansi": "0.0.4", - "string-width": "^1.0.1" - }, - "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 - }, - "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, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "slice-ansi": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", - "integrity": "sha512-up04hB2hR92PgjpyU3y/eg91yIBILyjVY26NvvciY3EVVPjybkMszMpXQ9QAkcS3I5rtJBDLoTxxg+qvW8c7rw==", - "dev": true - }, - "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, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "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, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "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" - } - } - } - }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", - "dev": true - }, - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - } - }, - "clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", - "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 - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true - }, - "columnify": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.6.0.tgz", - "integrity": "sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==", - "dev": true, - "requires": { - "strip-ansi": "^6.0.1", - "wcwidth": "^1.0.0" - } - }, - "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" - } - }, - "commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true - }, - "compare-func": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", - "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", - "dev": true, - "requires": { - "array-ify": "^1.0.0", - "dot-prop": "^5.1.0" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - } - }, - "conventional-changelog-angular": { - "version": "5.0.13", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", - "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", - "dev": true, - "requires": { - "compare-func": "^2.0.0", - "q": "^1.5.1" - } - }, - "conventional-changelog-conventionalcommits": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-5.0.0.tgz", - "integrity": "sha512-lCDbA+ZqVFQGUj7h9QBKoIpLhl8iihkO0nCTyRNzuXtcd7ubODpYB04IFy31JloiJgG0Uovu8ot8oxRzn7Nwtw==", - "dev": true, - "requires": { - "compare-func": "^2.0.0", - "lodash": "^4.17.15", - "q": "^1.5.1" - } - }, - "conventional-commits-parser": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", - "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", - "dev": true, - "requires": { - "is-text-path": "^1.0.1", - "JSONStream": "^1.0.4", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - } - }, - "convert-hrtime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/convert-hrtime/-/convert-hrtime-3.0.0.tgz", - "integrity": "sha512-7V+KqSvMiHp8yWDuwfww06XleMWVVB9b9tURBx+G7UTADuo5hYPuowKloz4OzOqbPezxgo+fdQ1522WzPG4OeA==", - "dev": true - }, - "cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "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": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "dev": true - }, - "cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - } - }, - "cosmiconfig-typescript-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.0.0.tgz", - "integrity": "sha512-cVpucSc2Tf+VPwCCR7SZzmQTQkPbkk4O01yXsYqXBIbjE1bhwqSyAgYQkRK1un4i0OPziTleqFhdkmOc4RQ/9g==", - "dev": true, - "requires": {} - }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "crypt": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", - "dev": true - }, - "crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "dev": true - }, - "dag-map": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/dag-map/-/dag-map-1.0.2.tgz", - "integrity": "sha512-+LSAiGFwQ9dRnRdOeaj7g47ZFJcOUPukAP8J3A3fuZ1g9Y44BG+P1sgApjLXTQPOzC4+7S9Wr8kXsfpINM4jpw==", - "dev": true - }, - "dargs": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", - "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", - "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" - } - }, - "data-uri-to-buffer": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-2.0.2.tgz", - "integrity": "sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==", - "dev": true - }, - "date-fns": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", - "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==", - "dev": true - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "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 - } - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true - }, - "decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg==", - "dev": true, - "requires": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", - "dev": true - } - } - }, - "decimal.js": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.0.tgz", - "integrity": "sha512-Nv6ENEzyPQ6AItkGwLE2PGKinZZ9g59vSh2BeH6NqPu0OTKZ5ruJsVqh/orbAnqXc9pBbgXAIrc2EyaCj8NpGg==", - "dev": true - }, - "decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "requires": { - "mimic-response": "^3.1.0" - }, - "dependencies": { - "mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true - } - } - }, - "deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", - "dev": true, - "requires": { - "type-detect": "^4.0.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA==", - "dev": true, - "requires": { - "clone": "^1.0.2" - }, - "dependencies": { - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true - } - } - }, - "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 - }, - "del": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", - "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", - "dev": true, - "requires": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" - } - }, - "del-cli": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/del-cli/-/del-cli-4.0.1.tgz", - "integrity": "sha512-KtR/6cBfZkGDAP2NA7z+bP4p1OMob3wjN9mq13+SWvExx6jT9gFWfLgXEeX8J2B47OKeNCq9yTONmtryQ+m+6g==", - "dev": true, - "requires": { - "del": "^6.0.0", - "meow": "^10.1.0" - }, - "dependencies": { - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - }, - "camelcase-keys": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-7.0.2.tgz", - "integrity": "sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==", - "dev": true, - "requires": { - "camelcase": "^6.3.0", - "map-obj": "^4.1.0", - "quick-lru": "^5.1.1", - "type-fest": "^1.2.1" - } - }, - "decamelize": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-5.0.1.tgz", - "integrity": "sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==", - "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 - }, - "meow": { - "version": "10.1.3", - "resolved": "https://registry.npmjs.org/meow/-/meow-10.1.3.tgz", - "integrity": "sha512-0WL7RMCPPdUTE00+GxJjL4d5Dm6eUbmAzxlzywJWiRUKCW093owmZ7/q74tH9VI91vxw9KJJNxAcvdpxb2G4iA==", - "dev": true, - "requires": { - "@types/minimist": "^1.2.2", - "camelcase-keys": "^7.0.0", - "decamelize": "^5.0.0", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.2", - "read-pkg-up": "^8.0.0", - "redent": "^4.0.0", - "trim-newlines": "^4.0.2", - "type-fest": "^1.2.2", - "yargs-parser": "^20.2.9" - } - }, - "read-pkg": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-6.0.0.tgz", - "integrity": "sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^3.0.2", - "parse-json": "^5.2.0", - "type-fest": "^1.0.1" - } - }, - "read-pkg-up": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-8.0.0.tgz", - "integrity": "sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==", - "dev": true, - "requires": { - "find-up": "^5.0.0", - "read-pkg": "^6.0.0", - "type-fest": "^1.0.1" - } - }, - "redent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz", - "integrity": "sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==", - "dev": true, - "requires": { - "indent-string": "^5.0.0", - "strip-indent": "^4.0.0" - } - }, - "strip-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", - "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", - "dev": true, - "requires": { - "min-indent": "^1.0.1" - } - }, - "trim-newlines": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.0.2.tgz", - "integrity": "sha512-GJtWyq9InR/2HRiLZgpIKv+ufIKrVrvjQWEj7PxAXNc5dwbNJkqhAUoAGgzRmULAnoOM5EIpveYd3J2VeSAIew==", - "dev": true - }, - "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 - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "diff-sequences": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.0.0.tgz", - "integrity": "sha512-7Qe/zd1wxSDL4D/X/FPjOMB+ZMDt71W94KYaq05I2l0oQqgXgs7s4ftYYmV38gBSrPz2vcygxfs1xn0FT+rKNA==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "requires": { - "is-obj": "^2.0.0" - } - }, - "duplexer3": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", - "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==", - "dev": true - }, - "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" - } - }, - "ejs": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz", - "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==", - "dev": true, - "requires": { - "jake": "^10.8.5" - } - }, - "elegant-spinner": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", - "integrity": "sha512-B+ZM+RXvRqQaAmkMlO/oSe5nMUOaUnyfGYCEHoR8wrXsZR2mA0XVibsxV1bvTwxdRWah1PkQqso2EzhILGHtEQ==", - "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 - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-goat": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-3.0.0.tgz", - "integrity": "sha512-w3PwNZJwRxlp47QGzhuEBldEqVHHhh8/tIPcl6ecf2Bou99cdAt0knihBV0Ecc7CGxYduXVBDheH1K2oADRlvw==", - "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.23.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.23.1.tgz", - "integrity": "sha512-w7C1IXCc6fNqjpuYd0yPlcTKKmHlHHktRkzmBPZ+7cvNBQuiNjx0xaMTjAJGCafJhQkrFJooREv0CtrVzmHwqg==", - "dev": true, - "requires": { - "@eslint/eslintrc": "^1.3.2", - "@humanwhocodes/config-array": "^0.10.4", - "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", - "@humanwhocodes/module-importer": "^1.0.1", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", - "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.1", - "globals": "^13.15.0", - "globby": "^11.1.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-sdsl": "^4.1.4", - "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.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" - }, - "dependencies": { - "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" - } - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "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 - } - } - }, - "eslint-config-prettier": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", - "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", - "dev": true, - "requires": {} - }, - "eslint-plugin-adonis": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-adonis/-/eslint-plugin-adonis-3.0.2.tgz", - "integrity": "sha512-tS9GuhyZlPHzpAslXhCto7JEbB21UBoLQLgMXCaeqrOWX9Mg6Rc6r51CZ/9RdWwRXpj3sl/JzpFWqc9JvGObmA==", - "dev": true, - "requires": { - "@typescript-eslint/eslint-plugin": "^5.28.0", - "@typescript-eslint/parser": "^5.28.0", - "eslint-plugin-unicorn": "^42.0.0" - } - }, - "eslint-plugin-prettier": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", - "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", - "dev": true, - "requires": { - "prettier-linter-helpers": "^1.0.0" - } - }, - "eslint-plugin-unicorn": { - "version": "42.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-42.0.0.tgz", - "integrity": "sha512-ixBsbhgWuxVaNlPTT8AyfJMlhyC5flCJFjyK3oKE8TRrwBnaHvUbuIkCM1lqg8ryYrFStL/T557zfKzX4GKSlg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.15.7", - "ci-info": "^3.3.0", - "clean-regexp": "^1.0.0", - "eslint-utils": "^3.0.0", - "esquery": "^1.4.0", - "indent-string": "^4.0.0", - "is-builtin-module": "^3.1.0", - "lodash": "^4.17.21", - "pluralize": "^8.0.0", - "read-pkg-up": "^7.0.1", - "regexp-tree": "^0.1.24", - "safe-regex": "^2.1.1", - "semver": "^7.3.5", - "strip-indent": "^3.0.0" - } - }, - "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "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.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true - }, - "espree": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", - "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", - "dev": true, - "requires": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "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-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true - }, - "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "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" - } - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - }, - "dependencies": { - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "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" - } - }, - "filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "dev": true, - "requires": { - "minimatch": "^5.0.1" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-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": "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" - } - }, - "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.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "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": "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" - } - }, - "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", - "dev": true - }, - "get-source": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/get-source/-/get-source-2.0.12.tgz", - "integrity": "sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==", - "dev": true, - "requires": { - "data-uri-to-buffer": "^2.0.0", - "source-map": "^0.6.1" - } - }, - "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 - }, - "getopts": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/getopts/-/getopts-2.3.0.tgz", - "integrity": "sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA==", - "dev": true - }, - "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-raw-commits": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz", - "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==", - "dev": true, - "requires": { - "dargs": "^7.0.0", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - } - }, - "github-label-sync": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/github-label-sync/-/github-label-sync-2.2.0.tgz", - "integrity": "sha512-4FBcwA/6XhQtFWZ/+xkwIAJKn7XJlkLBXA+eA3kjJJ6YTFbTynU6Cg9oUN3RXUCBoV2B7fhyEhqN6IwWO/hf3g==", - "dev": true, - "requires": { - "@financial-times/origami-service-makefile": "^7.0.3", - "ajv": "^8.6.3", - "chalk": "^4.1.2", - "commander": "^6.2.1", - "got": "^11.8.2", - "js-yaml": "^3.14.1", - "node.extend": "^2.0.2", - "octonode": "^0.10.2" - } - }, - "github-url-from-git": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/github-url-from-git/-/github-url-from-git-1.5.0.tgz", - "integrity": "sha512-WWOec4aRI7YAykQ9+BHmzjyNlkfJFG8QLXnDTsLz/kZefq7qkzdfo4p6fkYYMIq1aj+gZcQs/1HQhQh3DPPxlQ==", - "dev": true - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "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" - } - }, - "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" - } - }, - "global-dirs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz", - "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==", - "dev": true, - "requires": { - "ini": "1.3.7" - } - }, - "globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "got": { - "version": "11.8.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 - }, - "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" - }, - "dependencies": { - "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" - } - }, - "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 - } - } - }, - "hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", - "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": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "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-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", - "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" - } - }, - "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", - "dev": true - }, - "http-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" - } - }, - "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 - }, - "husky": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.1.tgz", - "integrity": "sha512-xs7/chUH/CKdOCs7Zy0Aev9e/dKOMZf3K1Az1nar3tzlv0jfqnYtu235bstsWTmXOR0EfINrPa97yy4Lz6RiKw==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true - }, - "ignore-walk": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz", - "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==", - "dev": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - } - } - }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==", - "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": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "inclusion": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/inclusion/-/inclusion-1.0.1.tgz", - "integrity": "sha512-TRicJXpIfJN+a47xxjs5nfy2V5l413e4aAtsLYRG+OsDM3A3uloBd/+fDmj23RVuIL9VQfwtb37iIc0rtMw9KA==", - "dev": true, - "requires": { - "parent-module": "^2.0.0" - }, - "dependencies": { - "parent-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-2.0.0.tgz", - "integrity": "sha512-uo0Z9JJeWzv8BG+tRcapBKNJ0dro9cLyczGzulS6EfeyAdeC9sbojtW6XwvYxJkEne9En+J2XEl4zyglVeIwFg==", - "dev": true, - "requires": { - "callsites": "^3.1.0" - } - } - } - }, - "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": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "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.7", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", - "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==", - "dev": true - }, - "inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.19", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.6.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - } - }, - "inquirer-autosubmit-prompt": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/inquirer-autosubmit-prompt/-/inquirer-autosubmit-prompt-0.2.0.tgz", - "integrity": "sha512-mzNrusCk5L6kSzlN0Ioddn8yzrhYNLli+Sn2ZxMuLechMYAzakiFCIULxsxlQb5YKzthLGfrFACcWoAvM7p04Q==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "inquirer": "^6.2.1", - "rxjs": "^6.3.3" - }, - "dependencies": { - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true - }, - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "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" - } - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", - "dev": true, - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "cli-width": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", - "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", - "dev": true - }, - "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 - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", - "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": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "inquirer": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", - "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", - "dev": true, - "requires": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==", - "dev": true - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", - "dev": true, - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "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" - } - } - } - }, - "is": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/is/-/is-3.3.0.tgz", - "integrity": "sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg==", - "dev": true - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-builtin-module": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.0.tgz", - "integrity": "sha512-phDA4oSGt7vl1n5tJvTWooWWAsXLY+2xCnxNqvKhGEzujg+A43wPlPOyDg3C8XQHN+6k/JTQWJ/j0dQh/qr+Hw==", - "dev": true, - "requires": { - "builtin-modules": "^3.3.0" - } - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "requires": { - "ci-info": "^2.0.0" - }, - "dependencies": { - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - } - } - }, - "is-core-module": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-glob": { - "version": "4.0.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-installed-globally": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", - "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", - "dev": true, - "requires": { - "global-dirs": "^2.0.1", - "is-path-inside": "^3.0.1" - } - }, - "is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true - }, - "is-invalid-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-invalid-path/-/is-invalid-path-0.1.0.tgz", - "integrity": "sha512-aZMG0T3F34mTg4eTdszcGXx54oiZ4NtHSft3hWNJMGJXUUqdIj3cOZuHcU0nCWWcY3jd7yRe/3AEm3vSNTpBGQ==", - "dev": true, - "requires": { - "is-glob": "^2.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, - "is-npm": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", - "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", - "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-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-observable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-1.1.0.tgz", - "integrity": "sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA==", - "dev": true, - "requires": { - "symbol-observable": "^1.1.0" - }, - "dependencies": { - "symbol-observable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", - "dev": true - } - } - }, - "is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-promise": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", - "dev": true - }, - "is-scoped": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-scoped/-/is-scoped-2.1.0.tgz", - "integrity": "sha512-Cv4OpPTHAK9kHYzkzCrof3VJh7H/PrG2MBUMvvJebaaUMbqhm0YAtXnvh0I3Hnj2tMZWwrRROWLSgfJrKqWmlQ==", - "dev": true, - "requires": { - "scoped-regex": "^2.0.0" - } - }, - "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-text-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", - "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", - "dev": true, - "requires": { - "text-extensions": "^1.0.0" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "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-url-superb": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-url-superb/-/is-url-superb-4.0.0.tgz", - "integrity": "sha512-GI+WjezhPPcbM+tqE9LnmsY5qqjwHzTvjJ36wxYX5ujNXefSUJ/T17r5bqDV8yLhcgB59KTPNOc9O9cmHTPWsA==", - "dev": true - }, - "is-valid-path": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-valid-path/-/is-valid-path-0.1.1.tgz", - "integrity": "sha512-+kwPrVDu9Ms03L90Qaml+79+6DZHqHyRoANI6IsZJ/g8frhnfchDOBCa0RbQ6/kdHt5CS5OeIEyrYznNuVN+8A==", - "dev": true, - "requires": { - "is-invalid-path": "^0.1.0" - } - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "requires": { - "is-docker": "^2.0.0" - } - }, - "is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "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-regex": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/issue-regex/-/issue-regex-3.1.0.tgz", - "integrity": "sha512-0RHjbtw9QXeSYnIEY5Yrp2QZrdtz21xBDV9C/GIlY2POmgoS6a7qjkYS5siRKXScnuAj5/SPv1C3YForNCHTJA==", - "dev": true - }, - "jake": { - "version": "10.8.5", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", - "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", - "dev": true, - "requires": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.1", - "minimatch": "^3.0.4" - } - }, - "jest-diff": { - "version": "29.0.3", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.0.3.tgz", - "integrity": "sha512-+X/AIF5G/vX9fWK+Db9bi9BQas7M9oBME7egU7psbn4jlszLFCu0dW63UgeE6cs/GANq4fLaT+8sGHQQ0eCUfg==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^29.0.0", - "jest-get-type": "^29.0.0", - "pretty-format": "^29.0.3" - } - }, - "jest-get-type": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.0.0.tgz", - "integrity": "sha512-83X19z/HuLKYXYHskZlBAShO7UfLFXu/vWajw9ZNJASN32li8yHMaVGAQqxFW1RCFOkB7cubaL6FaJVQqqJLSw==", - "dev": true - }, - "jest-matcher-utils": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.5.0.tgz", - "integrity": "sha512-VWI269+9JS5cpndnpCwm7dy7JtGQT30UHfrnM3mXl22gHGt/b7NkjBqXfbhZ8V4B7ANUsjK18PlSBmG0YH7gjw==", - "dev": true, - "requires": { - "chalk": "^3.0.0", - "jest-diff": "^25.5.0", - "jest-get-type": "^25.2.6", - "pretty-format": "^25.5.0" - }, - "dependencies": { - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "diff-sequences": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", - "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==", - "dev": true - }, - "jest-diff": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.5.0.tgz", - "integrity": "sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A==", - "dev": true, - "requires": { - "chalk": "^3.0.0", - "diff-sequences": "^25.2.6", - "jest-get-type": "^25.2.6", - "pretty-format": "^25.5.0" - } - }, - "jest-get-type": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", - "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", - "dev": true - }, - "pretty-format": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", - "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", - "dev": true, - "requires": { - "@jest/types": "^25.5.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - } - } - }, - "js-sdsl": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.4.tgz", - "integrity": "sha512-Y2/yD55y5jteOAmY50JbUZYwk3CP3wnLPEZnlR1w9oKhITrBEtAxwuWKebFf8hMrPMgbYwFoWK/lH2sBkErELw==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "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-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-deref-sync": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/json-schema-deref-sync/-/json-schema-deref-sync-0.14.0.tgz", - "integrity": "sha512-yGR1xmhdiD6R0MSrwWcFxQzAj5b3i5Gb/mt5tvQKgFMMeNe0KZYNEN/jWr7G+xn39Azqgcvk4ZKMs8dQl8e4wA==", - "dev": true, - "requires": { - "clone": "^2.1.2", - "dag-map": "~1.0.0", - "is-valid-path": "^0.1.1", - "lodash": "^4.17.13", - "md5": "~2.2.0", - "memory-cache": "~0.2.0", - "traverse": "~0.6.6", - "valid-url": "~1.0.9" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "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": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "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": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "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" - } - }, - "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" - } - }, - "keyv": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.0.tgz", - "integrity": "sha512-2YvuMsA+jnFGtBareKqgANOEKe1mk3HKiXu2fRmAfyxG0MJAywNhi5ttWA3PMjl4NmpyjZNbFifR2vNjW1znfA==", - "dev": true, - "requires": { - "json-buffer": "3.0.1" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "dev": true - }, - "latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "dev": true, - "requires": { - "package-json": "^6.3.0" - } - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "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 - }, - "listr": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/listr/-/listr-0.14.3.tgz", - "integrity": "sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA==", - "dev": true, - "requires": { - "@samverschueren/stream-to-observable": "^0.3.0", - "is-observable": "^1.1.0", - "is-promise": "^2.1.0", - "is-stream": "^1.1.0", - "listr-silent-renderer": "^1.1.1", - "listr-update-renderer": "^0.5.0", - "listr-verbose-renderer": "^0.5.0", - "p-map": "^2.0.0", - "rxjs": "^6.3.3" - }, - "dependencies": { - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "dev": true - }, - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true - } - } - }, - "listr-input": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/listr-input/-/listr-input-0.2.1.tgz", - "integrity": "sha512-oa8iVG870qJq+OuuMK3DjGqFcwsK1SDu+kULp9kEq09TY231aideIZenr3lFOQdASpAr6asuyJBbX62/a3IIhg==", - "dev": true, - "requires": { - "inquirer": "^7.0.0", - "inquirer-autosubmit-prompt": "^0.2.0", - "rxjs": "^6.5.3", - "through": "^2.3.8" - } - }, - "listr-silent-renderer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz", - "integrity": "sha512-L26cIFm7/oZeSNVhWB6faeorXhMg4HNlb/dS/7jHhr708jxlXrtrBWo4YUxZQkc6dGoxEAe6J/D3juTRBUzjtA==", - "dev": true - }, - "listr-update-renderer": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz", - "integrity": "sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "cli-truncate": "^0.2.1", - "elegant-spinner": "^1.0.1", - "figures": "^1.7.0", - "indent-string": "^3.0.0", - "log-symbols": "^1.0.2", - "log-update": "^2.3.0", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true - }, - "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 - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", - "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" - } - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", - "dev": true, - "requires": { - "restore-cursor": "^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": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" - } - }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha512-BYqTHXTGUIvg7t1r4sJNKcbDZkL92nkXA8YtRpbjFHRHGDL/NtUeiBJMeE60kIFN/Mg8ESaWQvftaYMGJzQZCQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true - }, - "log-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", - "integrity": "sha512-mmPrW0Fh2fxOzdBbFv4g1m6pR72haFLPJ2G5SJEELf1y+iaQrDG6cWCPjy54RHYbZAt7X+ls690Kw62AdWXBzQ==", - "dev": true, - "requires": { - "chalk": "^1.0.0" - } - }, - "log-update": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-2.3.0.tgz", - "integrity": "sha512-vlP11XfFGyeNQlmEn9tJ66rEW1coA/79m5z6BCkudjbAGE83uhAcGYrBFwfs3AdLiLzGRusRPAbSPK9xZteCmg==", - "dev": true, - "requires": { - "ansi-escapes": "^3.0.0", - "cli-cursor": "^2.0.0", - "wrap-ansi": "^3.0.1" - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", - "dev": true, - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "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, - "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": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", - "dev": true - }, - "wrap-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-3.0.1.tgz", - "integrity": "sha512-iXR3tDXpbnTpzjKSylUJRkLuOrEC7hwEB221cgn6wtF8wpmz28puFXAEfPT5zrjM3wahygB//VuWEr1vTkDcNQ==", - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - } - } - }, - "listr-verbose-renderer": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz", - "integrity": "sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "cli-cursor": "^2.1.0", - "date-fns": "^1.27.2", - "figures": "^2.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" - } - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", - "dev": true, - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "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 - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", - "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": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", - "dev": true, - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "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" - } - } - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", - "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.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", - "dev": true - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "lodash.set": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", - "integrity": "sha512-4hNPN5jlm/N/HLMCO43v8BXKq9Z7QdAGc/VGrRD61w8gN9g/6jF9A4L1pbUgBLCffi0w9VsXfTOij5x8iTyFvg==", - "dev": true - }, - "lodash.zip": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz", - "integrity": "sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==", - "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" - } - }, - "log-update": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", - "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", - "dev": true, - "requires": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "loupe": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz", - "integrity": "sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==", - "dev": true, - "requires": { - "get-func-name": "^2.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "macroable": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/macroable/-/macroable-7.0.1.tgz", - "integrity": "sha512-8bbZLq2JoGI7FdvmDIxed41opR2cqgUUrRN4fVEsajARzfHkZDAzbCg0RW+jIY93YhWuBsMOeLcIyYz5WU4HNQ==", - "dev": true - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, - "map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "dev": true - }, - "md5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz", - "integrity": "sha512-PlGG4z5mBANDGCKsYQe0CaUYHdZYZt8ZPZLmEt+Urf0W4GlpTX4HescwHU+dc9+Z/G/vZKYZYFrwgm9VxK6QOQ==", - "dev": true, - "requires": { - "charenc": "~0.0.1", - "crypt": "~0.0.1", - "is-buffer": "~1.1.1" - } - }, - "memory-cache": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/memory-cache/-/memory-cache-0.2.0.tgz", - "integrity": "sha512-OcjA+jzjOYzKmKS6IQVALHLVz+rNTMPoJvCztFaZxwG14wtAW7VRZjwTQu06vKCYOxh4jVnik7ya0SXTB0W+xA==", - "dev": true - }, - "meow": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", - "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", - "dev": true, - "requires": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "dependencies": { - "type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true - } - } - }, - "merge-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-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": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true - }, - "min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true - }, - "minimatch": { - "version": "3.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 - }, - "minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - } - }, - "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 - }, - "mustache": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", - "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", - "dev": true - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "new-github-release-url": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/new-github-release-url/-/new-github-release-url-1.0.0.tgz", - "integrity": "sha512-dle7yf655IMjyFUqn6Nxkb18r4AOAkzRcgcZv6WZ0IqrOH4QCEZ8Sm6I7XX21zvHdBeeMeTkhR9qT2Z0EJDx6A==", - "dev": true, - "requires": { - "type-fest": "^0.4.1" - }, - "dependencies": { - "type-fest": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.4.1.tgz", - "integrity": "sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==", - "dev": true - } - } - }, - "node.extend": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node.extend/-/node.extend-2.0.2.tgz", - "integrity": "sha512-pDT4Dchl94/+kkgdwyS2PauDFjZG0Hk0IcHIB+LkW27HLDtdoeMxHTxZh39DYbPP8UflWXWj9JcdDozF+YDOpQ==", - "dev": true, - "requires": { - "has": "^1.0.3", - "is": "^3.2.1" - } - }, - "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" - } - }, - "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 - }, - "np": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/np/-/np-7.6.2.tgz", - "integrity": "sha512-gExmKGKixh7ITc4Q+Lv7nfCby0CVKvzri9zN8970oKD8976T4L5dw8QWUtMcXcIjhFF6h5lbvztao/NurDbmxQ==", - "dev": true, - "requires": { - "@samverschueren/stream-to-observable": "^0.3.1", - "any-observable": "^0.5.1", - "async-exit-hook": "^2.0.1", - "chalk": "^4.1.0", - "cosmiconfig": "^7.0.0", - "del": "^6.0.0", - "escape-goat": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "execa": "^5.0.0", - "github-url-from-git": "^1.5.0", - "has-yarn": "^2.1.0", - "hosted-git-info": "^3.0.7", - "ignore-walk": "^3.0.3", - "import-local": "^3.0.2", - "inquirer": "^7.3.3", - "is-installed-globally": "^0.3.2", - "is-interactive": "^1.0.0", - "is-scoped": "^2.1.0", - "issue-regex": "^3.1.0", - "listr": "^0.14.3", - "listr-input": "^0.2.1", - "log-symbols": "^4.0.0", - "meow": "^8.1.0", - "minimatch": "^3.0.4", - "new-github-release-url": "^1.0.0", - "npm-name": "^6.0.1", - "onetime": "^5.1.2", - "open": "^7.3.0", - "ow": "^0.21.0", - "p-memoize": "^4.0.1", - "p-timeout": "^4.1.0", - "pkg-dir": "^5.0.0", - "read-pkg-up": "^7.0.1", - "rxjs": "^6.6.3", - "semver": "^7.3.4", - "split": "^1.0.1", - "symbol-observable": "^3.0.0", - "terminal-link": "^2.1.1", - "update-notifier": "^5.0.1" - }, - "dependencies": { - "hosted-git-info": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.8.tgz", - "integrity": "sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "pkg-dir": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", - "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", - "dev": true, - "requires": { - "find-up": "^5.0.0" - } - } - } - }, - "npm-name": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/npm-name/-/npm-name-6.0.1.tgz", - "integrity": "sha512-fhKRvUAxaYzMEUZim4mXWyfFbVS+M1CbrCLdAo3txWzrctxKka/h+KaBW0O9Cz5uOM00Nldn2JLWhuwnyW3SUw==", - "dev": true, - "requires": { - "got": "^10.6.0", - "is-scoped": "^2.1.0", - "is-url-superb": "^4.0.0", - "lodash.zip": "^4.2.0", - "org-regex": "^1.0.0", - "p-map": "^3.0.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.1.0", - "validate-npm-package-name": "^3.0.0" - }, - "dependencies": { - "@sindresorhus/is": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-2.1.1.tgz", - "integrity": "sha512-/aPsuoj/1Dw/kzhkgz+ES6TxG0zfTMGLwuK2ZG00k/iJzYHTLCE8mVU8EPqEOp/lmxPoq1C1C9RYToRKb2KEfg==", - "dev": true - }, - "cacheable-lookup": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-2.0.1.tgz", - "integrity": "sha512-EMMbsiOTcdngM/K6gV/OxF2x0t07+vMOWxZNSCRQMjO2MY2nhZQ6OYhOOpyQrbhqsgtvKGI7hcq6xjnA92USjg==", - "dev": true, - "requires": { - "@types/keyv": "^3.1.1", - "keyv": "^4.0.0" - } - }, - "decompress-response": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-5.0.0.tgz", - "integrity": "sha512-TLZWWybuxWgoW7Lykv+gq9xvzOsUjQ9tF09Tj6NSTYGMTCHNXzrPnD6Hi+TgZq19PyTAGH4Ll/NIM/eTGglnMw==", - "dev": true, - "requires": { - "mimic-response": "^2.0.0" - } - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "got": { - "version": "10.7.0", - "resolved": "https://registry.npmjs.org/got/-/got-10.7.0.tgz", - "integrity": "sha512-aWTDeNw9g+XqEZNcTjMMZSy7B7yE9toWOFYip7ofFTLleJhvZwUxxTxkTpKvF+p1SAA4VHmuEy7PiHTHyq8tJg==", - "dev": true, - "requires": { - "@sindresorhus/is": "^2.0.0", - "@szmarczak/http-timer": "^4.0.0", - "@types/cacheable-request": "^6.0.1", - "cacheable-lookup": "^2.0.0", - "cacheable-request": "^7.0.1", - "decompress-response": "^5.0.0", - "duplexer3": "^0.1.4", - "get-stream": "^5.0.0", - "lowercase-keys": "^2.0.0", - "mimic-response": "^2.1.0", - "p-cancelable": "^2.0.0", - "p-event": "^4.0.0", - "responselike": "^2.0.0", - "to-readable-stream": "^2.0.0", - "type-fest": "^0.10.0" - } - }, - "mimic-response": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", - "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", - "dev": true - }, - "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "type-fest": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.10.0.tgz", - "integrity": "sha512-EUV9jo4sffrwlg8s0zDhP0T2WD3pru5Xi0+HTE3zTUmBaZNhfkite9PdSJwdXLwPVW0jnAHT56pZHIOYckPEiw==", - "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" - } - }, - "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 - }, - "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 - }, - "octonode": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/octonode/-/octonode-0.10.2.tgz", - "integrity": "sha512-lxKJxAvrw3BuM0Wu3A/TRyFkYxMFWbMm8p7fDO3EoG9KDgOy53d91bjlGR1mmNk1EoF5LjGBx7BmIB+PfmMKLQ==", - "dev": true, - "requires": { - "bluebird": "^3.5.0", - "deep-extend": "^0.6.0", - "randomstring": "^1.1.5", - "request": "^2.72.0" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", - "dev": true, - "requires": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - } - }, - "openapi-schema-validator": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/openapi-schema-validator/-/openapi-schema-validator-3.0.3.tgz", - "integrity": "sha512-KKpeNEvAmpy6B2JCfyrM4yWjL6vggDCVbBoR8Yfkj0Jltc6PCW+dBbcg+1yrTCuDv80qBQJ6w0ejA71DlOFegA==", - "dev": true, - "requires": { - "ajv": "^6.5.2", - "lodash.merge": "^4.6.1", - "openapi-types": "1.3.4", - "swagger-schema-official": "2.0.0-bab6bed" - }, - "dependencies": { - "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" - } - }, - "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 - } - } - }, - "openapi-types": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-1.3.4.tgz", - "integrity": "sha512-h8rADpW3k/wepLdERKF0VKMAPdoFYNQCLGPmc/f8sgQ2dxUy+7sY4WAX2XDUDjhKTjbJVbxxofLkzy7f1/tE4g==", - "dev": true - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "org-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/org-regex/-/org-regex-1.0.0.tgz", - "integrity": "sha512-7bqkxkEJwzJQUAlyYniqEZ3Ilzjh0yoa62c7gL6Ijxj5bEpPL+8IE1Z0PFj0ywjjXQcdrwR51g9MIcLezR0hKQ==", - "dev": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true - }, - "ow": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/ow/-/ow-0.21.0.tgz", - "integrity": "sha512-dlsoDe39g7mhdsdrC1R/YwjT7yjVqE3svWwOlMGvN690waBkgEZBmKBdkmKvSt5/wZ6E0Jn/nIesPqMZOpPKqw==", - "dev": true, - "requires": { - "@sindresorhus/is": "^4.0.0", - "callsites": "^3.1.0", - "dot-prop": "^6.0.1", - "lodash.isequal": "^4.5.0", - "type-fest": "^0.20.2", - "vali-date": "^1.0.0" - }, - "dependencies": { - "dot-prop": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", - "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", - "dev": true, - "requires": { - "is-obj": "^2.0.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-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==", - "dev": true - }, - "p-event": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz", - "integrity": "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==", - "dev": true, - "requires": { - "p-timeout": "^3.1.0" - }, - "dependencies": { - "p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", - "dev": true, - "requires": { - "p-finally": "^1.0.0" - } - } - } - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "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" - } - }, - "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "p-memoize": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/p-memoize/-/p-memoize-4.0.4.tgz", - "integrity": "sha512-ijdh0DP4Mk6J4FXlOM6vPPoCjPytcEseW8p/k5SDTSSfGV3E9bpt9Yzfifvzp6iohIieoLTkXRb32OWV0fB2Lw==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.3", - "mimic-fn": "^3.0.0", - "p-settle": "^4.1.1" - }, - "dependencies": { - "mimic-fn": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", - "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", - "dev": true - } - } - }, - "p-reflect": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-reflect/-/p-reflect-2.1.0.tgz", - "integrity": "sha512-paHV8NUz8zDHu5lhr/ngGWQiW067DK/+IbJ+RfZ4k+s8y4EKyYCz8pGYWjxCg35eHztpJAt+NUgvN4L+GCbPlg==", - "dev": true - }, - "p-settle": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/p-settle/-/p-settle-4.1.1.tgz", - "integrity": "sha512-6THGh13mt3gypcNMm0ADqVNCcYa3BK6DWsuJWFCuEKP1rpY+OKGp7gaZwVmLspmic01+fsg/fN57MfvDzZ/PuQ==", - "dev": true, - "requires": { - "p-limit": "^2.2.2", - "p-reflect": "^2.1.0" - }, - "dependencies": { - "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-timeout": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-4.1.0.tgz", - "integrity": "sha512-+/wmHtzJuWii1sXn3HCuH/FTwGhrp4tmJTxSKJbfS+vkipci6osxXM5mY0jUiRzWKMTgUT8l7HFbeSwZAynqHw==", - "dev": true - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "dev": true, - "requires": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, - "dependencies": { - "@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "dev": true - }, - "@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dev": true, - "requires": { - "defer-to-connect": "^1.0.1" - } - }, - "cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dev": true, - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "dependencies": { - "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" - } - } - } - }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", - "dev": true - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dev": true, - "requires": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - }, - "dependencies": { - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true - } - } - }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==", - "dev": true - }, - "keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dev": true, - "requires": { - "json-buffer": "3.0.0" - } - }, - "normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", - "dev": true - }, - "p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "dev": true - }, - "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", - "dev": true, - "requires": { - "lowercase-keys": "^1.0.0" - }, - "dependencies": { - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true - } - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "dev": true - } - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "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-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true - }, - "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 - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - }, - "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" - } - } - } - }, - "pluralize": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", - "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 - }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", - "dev": true - }, - "prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", - "dev": true - }, - "prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "requires": { - "fast-diff": "^1.1.2" - } - }, - "pretty-format": { - "version": "29.0.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.0.3.tgz", - "integrity": "sha512-cHudsvQr1K5vNVLbvYF/nv3Qy/F/BcEKxGuIeMiVMRHxPOO1RxXooP8g/ZrwAp7Dx+KdMZoOc7NxLHhMrP2f9Q==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "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 - } - } - }, - "pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==", - "dev": true - }, - "printable-characters": { - "version": "1.0.42", - "resolved": "https://registry.npmjs.org/printable-characters/-/printable-characters-1.0.42.tgz", - "integrity": "sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==", - "dev": true - }, - "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 - }, - "pupa": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", - "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", - "dev": true, - "requires": { - "escape-goat": "^2.0.0" - }, - "dependencies": { - "escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", - "dev": true - } - } - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", - "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 - }, - "randombytes": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.3.tgz", - "integrity": "sha512-lDVjxQQFoCG1jcrP06LNo2lbWp4QTShEXnhActFBwYuHprllQV6VUpwreApsYqCgD+N1mHoqJ/BI/4eV4R2GYg==", - "dev": true - }, - "randomstring": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/randomstring/-/randomstring-1.2.2.tgz", - "integrity": "sha512-9FByiB8guWZLbE+akdQiWE3I1I6w7Vn5El4o4y7o5bWQ6DWPcEOp+aLG7Jezc8BVRKKpgJd2ppRX0jnKu1YCfg==", - "dev": true, - "requires": { - "array-uniq": "1.0.2", - "randombytes": "2.0.3" - } - }, - "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" - }, - "dependencies": { - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true - } - } - }, - "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": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "hosted-git-info": { - "version": "2.8.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 - }, - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "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" - } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "requires": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - } - }, - "regexp-tree": { - "version": "0.1.24", - "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.24.tgz", - "integrity": "sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw==", - "dev": true - }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, - "registry-auth-token": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz", - "integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==", - "dev": true, - "requires": { - "rc": "1.2.8" - } - }, - "registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "dev": true, - "requires": { - "rc": "^1.2.8" - } - }, - "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" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "requires": { - "is-core-module": "^2.9.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" - } - }, - "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-global": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", - "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", - "dev": true, - "requires": { - "global-dirs": "^0.1.1" - }, - "dependencies": { - "global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", - "dev": true, - "requires": { - "ini": "^1.3.4" - } - } - } - }, - "responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", - "dev": true, - "requires": { - "lowercase-keys": "^2.0.0" - } - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "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-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true - }, - "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" - } - }, - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "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": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", - "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==", - "dev": true, - "requires": { - "regexp-tree": "~0.1.1" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "scoped-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/scoped-regex/-/scoped-regex-2.1.0.tgz", - "integrity": "sha512-g3WxHrqSWCZHGHlSrF51VXFdjImhwvH8ZO/pryFH56Qi0cDsZfylQa/t0jCzVQFNbNvM00HfHjkDPEuarKDSWQ==", - "dev": true - }, - "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, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "dev": true, - "requires": { - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - } - }, - "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 - }, - "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 - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - }, - "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 - }, - "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.12", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", - "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", - "dev": true - }, - "split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "dev": true, - "requires": { - "through": "2" - } - }, - "split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", - "dev": true, - "requires": { - "readable-stream": "^3.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "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" - } - }, - "stacktracey": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/stacktracey/-/stacktracey-2.1.8.tgz", - "integrity": "sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==", - "dev": true, - "requires": { - "as-table": "^1.0.36", - "get-source": "^2.0.12" - } - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "string-width": { - "version": "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-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-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, - "strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "requires": { - "min-indent": "^1.0.0" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "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 - }, - "swagger-parser": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/swagger-parser/-/swagger-parser-10.0.3.tgz", - "integrity": "sha512-nF7oMeL4KypldrQhac8RyHerJeGPD1p2xDh900GPvc+Nk7nWP6jX2FcC7WmkinMoAmoO774+AFXcWsW8gMWEIg==", - "dev": true, - "requires": { - "@apidevtools/swagger-parser": "10.0.3" - }, - "dependencies": { - "@apidevtools/swagger-parser": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/@apidevtools/swagger-parser/-/swagger-parser-10.0.3.tgz", - "integrity": "sha512-sNiLY51vZOmSPFZA5TF35KZ2HbgYklQnTSDnkghamzLb3EkNtcQnrBQEj5AOCxHpTtXpqMCRM1CrmV2rG6nw4g==", - "dev": true, - "requires": { - "@apidevtools/json-schema-ref-parser": "^9.0.6", - "@apidevtools/openapi-schemas": "^2.0.4", - "@apidevtools/swagger-methods": "^3.0.2", - "@jsdevtools/ono": "^7.1.3", - "call-me-maybe": "^1.0.1", - "z-schema": "^5.0.1" - } - }, - "openapi-types": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.0.2.tgz", - "integrity": "sha512-GuTo7FyZjOIWVhIhQSWJVaws6A82sWIGyQogxxYBYKZ0NBdyP2CYSIgOwFfSB+UVoPExk/YzFpyYitHS8KVZtA==", - "dev": true, - "peer": true - } - } - }, - "swagger-schema-official": { - "version": "2.0.0-bab6bed", - "resolved": "https://registry.npmjs.org/swagger-schema-official/-/swagger-schema-official-2.0.0-bab6bed.tgz", - "integrity": "sha512-rCC0NWGKr/IJhtRuPq/t37qvZHI/mH4I4sxflVM+qgVe5Z2uOCivzWaVbuioJaB61kvm5UvB7b49E+oBY0M8jA==", - "dev": true - }, - "symbol-observable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-3.0.0.tgz", - "integrity": "sha512-6tDOXSHiVjuCaasQSWTmHUWn4PuG7qa3+1WT031yTc/swT7+rLiw3GOrFxaH1E3lLP09dH3bVuVDf2gK5rxG3Q==", - "dev": true - }, - "terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - } - }, - "text-extensions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", - "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", - "dev": true - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "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 - }, - "through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "dev": true, - "requires": { - "readable-stream": "3" - } - }, - "time-span": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/time-span/-/time-span-4.0.0.tgz", - "integrity": "sha512-MyqZCTGLDZ77u4k+jqg4UlrzPTPZ49NDlaekU6uuFaJLzPIN1woaRXCbGeqOfxwc3Y37ZROGAJ614Rdv7Olt+g==", - "dev": true, - "requires": { - "convert-hrtime": "^3.0.0" - } - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "to-readable-stream": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-2.1.0.tgz", - "integrity": "sha512-o3Qa6DGg1CEXshSdvWNX2sN4QHqg03SPq7U6jPXRahlQdl5dK8oXjkU/2/sGrnOZKeGV1zLSO8qPwyKklPPE7w==", - "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" - } - }, - "traverse": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", - "integrity": "sha512-kdf4JKs8lbARxWdp7RKdNzoJBhGUcIalSYibuGyHJbmk40pOysQ0+QPvlkCOICOivDWU2IJo2rkrxyTK2AH4fw==", - "dev": true - }, - "trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "dev": true - }, - "ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "requires": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - }, - "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 - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typescript": { - "version": "4.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.3.tgz", - "integrity": "sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==", - "dev": true - }, - "unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dev": true, - "requires": { - "crypto-random-string": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - }, - "update-notifier": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", - "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", - "dev": true, - "requires": { - "boxen": "^5.0.0", - "chalk": "^4.1.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.4.0", - "is-npm": "^5.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.1.0", - "pupa": "^2.1.1", - "semver": "^7.3.4", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" - }, - "dependencies": { - "global-dirs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", - "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", - "dev": true, - "requires": { - "ini": "2.0.0" - } - }, - "ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true - }, - "is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dev": true, - "requires": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - } - } - } - }, - "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-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", - "dev": true, - "requires": { - "prepend-http": "^2.0.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - }, - "v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "vali-date": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", - "integrity": "sha512-sgECfZthyaCKW10N0fm27cg8HYTFK5qMWgypqkXMQ4Wbl/zZKx7xZICgcoxIIE+WFAP/MBL2EFwC/YvLxw3Zeg==", - "dev": true - }, - "valid-url": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz", - "integrity": "sha512-QQDsV8OnSf5Uc30CKSwG9lnhMPe6exHtTXLRYX8uMwKENy640pU+2BgBL0LRbDh/eYRahNCS7aewCx0wf3NYVA==", - "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" - } - }, - "validator": { - "version": "13.7.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", - "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", - "dev": true - }, - "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" - } - }, - "wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, - "requires": { - "defaults": "^1.0.3" - } - }, - "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" - } - }, - "widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "dev": true, - "requires": { - "string-width": "^4.0.0" - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "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" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "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" - } - }, - "xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", - "dev": true - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true - }, - "yargs": { - "version": "17.5.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", - "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", - "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.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" - }, - "dependencies": { - "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 - } - } - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - }, - "youch": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/youch/-/youch-3.2.2.tgz", - "integrity": "sha512-+xhTK8sY9qV3nLbWVaOUFZPdlQ3wrMKiu3dKqKkAkLaYzzkYmpWY+v+eQIAfbPu7TZhS1G5FhEV++sl8fhuT4w==", - "dev": true, - "requires": { - "cookie": "^0.5.0", - "mustache": "^4.2.0", - "stacktracey": "^2.1.8" - } - }, - "youch-terminal": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/youch-terminal/-/youch-terminal-2.1.5.tgz", - "integrity": "sha512-ObQ2GeG0LnIGiOAq0rLaEdCC8Z+fHlMFcJqsQcLBWo36zlj2GViS7pOKjRGdJ4pJl4ofZmU77O7gwd6lId67PA==", - "dev": true, - "requires": { - "kleur": "^4.1.5" - } - }, - "z-schema": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.4.tgz", - "integrity": "sha512-gm/lx3hDzJNcLwseIeQVm1UcwhWIKpSB4NqH89pTBtFns4k/HDHudsICtvG05Bvw/Mv3jMyk700y5dadueLHdA==", - "dev": true, - "requires": { - "commander": "^2.20.3", - "lodash.get": "^4.4.2", - "lodash.isequal": "^4.5.0", - "validator": "^13.7.0" - }, - "dependencies": { - "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, - "optional": true - } - } - } - } -} diff --git a/package.json b/package.json index 904aa87..1c4a1c5 100644 --- a/package.json +++ b/package.json @@ -2,14 +2,15 @@ "name": "@adonisjs/fold", "version": "8.2.0", "description": "Simplest and straight forward implementation for IoC container in JavaScript", + "main": "index.js", "files": [ "src", "index.js" ], - "type": "module", "exports": { ".": "./index.js" }, + "type": "module", "scripts": { "pretest": "npm run lint", "test": "node --loader=ts-node/esm bin/test.ts", @@ -27,7 +28,10 @@ "access": "public", "tag": "latest" }, - "keywords": ["ioc", "container"], + "keywords": [ + "ioc", + "container" + ], "author": "virk,adonisjs", "license": "MIT", "devDependencies": { @@ -40,7 +44,6 @@ "@swc/core": "^1.2.203", "@types/node": "^18.0.0", "del-cli": "^4.0.1", - "ejs": "^3.1.8", "eslint": "^8.17.0", "eslint-config-prettier": "^8.5.0", "eslint-plugin-adonis": "^3.0.2", @@ -92,5 +95,16 @@ "tag": "latest", "branch": "main", "anyBranch": false - } + }, + "directories": { + "test": "tests" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/adonisjs/fold.git" + }, + "bugs": { + "url": "https://github.com/adonisjs/fold/issues" + }, + "homepage": "https://github.com/adonisjs/fold#readme" } From 73bb3f17f0669d82cdb7df397cbf863604ab1613 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Fri, 16 Sep 2022 14:44:45 +0530 Subject: [PATCH 005/145] docs(README): document container goals and usage --- README.md | 396 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 394 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f84aedf..87f3906 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,394 @@ -@adonisjs/fold -> Simplest and straight forward implementation for IoC container in JavaScript +AdonisJS Fold +> Simplest, straightforward implementation for IoC container in JavaScript + +## Why this project exists? +Many existing implementations of IoC containers take the concept too far and start to feel more like Java. JavaScript inherently does not have all the bells and whistles; you need to have similar IoC container benefits as PHP or Java. + +Therefore, with this project, I live to the ethos of JavaScript and yet build a container that can help you create loosely coupled systems. + +I have explained the [reasons for using an IoC container](https://github.com/thetutlage/meta/discussions/4) in this post. It might be a great idea to read the post first ✌️. + +## Goals of the project + +- **Keep the code visually pleasing**. If you have used any other implementation of an IoC container, you will automatically find `@adonisjs/fold` easy to read and follow. +- **Keep it simple**. JavaScript projects have a few reasons for using an IoC container, so do not build features that no one will ever use or understand. +- **Build it for JavaScript and improve with TypeScript** - The implementation of `@adonisjs/fold` works with vanilla JavaScript. It's just you have to write less code when using TypeScript. Thanks to its decorators metadata API. + +## Usage +Install the package from the npm packages registry. + +```sh +npm i @adonisjs/fold + +# yarn lovers +yarn add @adonisjs/fold + +# pnpm followers +pnpm add @adonisjs/fold +``` + +Once done, you can import the `Container` class from the package and create an instance. For the most part, you will use a single instance of the container. + +```ts +import { Container } from '@adonisjs/fold' + +const container = new Container() +``` + +## Making classes +You can construct an instance of a class by calling the `container.make` method. The method is asynchronous since it allows for lazy load dependencies in factory functions (More on factory functions later). + +```ts +class UserService {} + +const service = await container.make(UserService) +assert(service instanceof UserService) +``` + +In the previous example, the `UserService` did not have any dependencies; therefore, it was straightforward for the container to make an instance of it. + +Now, let's look at an example where the `UserService` needs an instance of the Database class. + +```ts +class Database {} + +class UserService { + static containerInjections = { + constructor: [Database] + } + + constructor (db) { + this.db = db + } +} + +const service = await container.make(UserService) +assert(service.db instanceof Database) +``` + +The `static containerInjections` property is required by the container to know which values to inject when creating an instance of the class. + +This property can define the dependencies for the class methods (including the constructor). The values are defined as an array of class constructors or literal values. + +> **Do you remember?** I said that JavaScript is not as powerful as Java or PHP. This is a classic example of that. In other languages, you can use reflection to look up the classes to inject, whereas, in JavaScript, you have to tell the container explicitly. + +### TypeScript to the rescue +Wait, you can still use reflection with TypeScript decorators. So yes, decorators exist in JavaScript too, but they cannot inspect the types of parameters. TypeScript decorators can. + +Also, TypeScript decorators are not as powerful as the reflection in other languages. For example, in PHP, you can use interfaces for reflection. Whereas in TypeScript, you cannot. + +With that said, let's look at the previous example, but in TypeScript this time. + +```ts +import { inject } from '@adonisjs/fold' + +class Database {} + +@inject() +class UserService { + constructor (db: Database) { + this.db = db + } +} + +const service = await container.make(UserService) +assert(service.db instanceof Database) +``` + +The `@inject` decorator looks at the types of all the constructor parameters and defines the `static containerInjections` property behind the scenes. + +> **Note**: The decorator-based reflection can only work with concrete values, not interfaces or types since they are removed during runtime. + +## Making class with runtime values +When calling the `container.make` method, you can pass runtime values that take precedence over the `containerInjections` array. + +In the following example, the `UserService` accepts an instance of the ongoing HTTP request as the 2nd param. Now, when making an instance of this class, you can pass that instance manually. + +```ts +import { inject } from '@adonisjs/fold' +import { Request } from '@adonisjs/core/src/Request' + +class Database {} + +@inject() +class UserService { + constructor (db: Database, request: Request) { + this.db = db + this.request = request + } +} +``` + +```ts +createServer((req) => { + const runtimeValues = [undefined, req] + + const service = await container.make(UserService, runtimeValues) + assert(service.request === req) +}) +``` + +In the above example: + +- The container will create an instance of the `Database` class since it is set to `undefined` inside the runtime values array. +The container will use the `req` value for the `Request` class. + +## Making class with runtime bindings +The runtime values are positional. This means that the caller of `container.make` needs to know the position of arguments to inject runtime values. + +On the other hand, the runtime bindings provide value for a concrete class constructor. + +Let's look at the previous example but use runtime bindings this time. + +```ts +createServer((req) => { + const runtimeBindings = new Map() + runtimeBindings.set(Request, req) + + const service = await container.make(UserService, [], runtimeBindings) + assert(service.request === req) +}) +``` + +Here we are telling the container that when someone asks for the `Request` class, give them this pre-defined value. The logic is applied to the entire resolution chain. For example, if `UserService` injects another service that needs a request, the same request will be passed. + +```ts +@inject() +class TeamService { + constructor (db: Database, request: Request) {} +} + +@inject() +class UserService { + constructor (db: Database, request: Request, team: TeamService) { + } +} + +const runtimeBindings = new Map() +runtimeBindings.set(Request, req) + +// Both the UserService and the TeamService get the same request +await container.make(UserService, [], runtimeBindings) +``` + +## Calling methods +You can also call class methods to look up/inject dependencies automatically. + +In the following example, the `UserService.find` method needs an instance of the Database class, and the `container.call` method will look at the `containerInjections` property to find the values to inject. + +```ts +class Database {} + +class UserService { + static containerInjections = { + find: [Database] + } + + async find(db) { + await db.select('*').from('users') + } +} + +const service = await container.make(UserService) +await container.call(service, 'find') +``` + +The TypeScript projects can re-use the same `@inject` decorator. + +```ts +class Database {} + +class UserService { + @inject() + async find(db: Database) { + await db.select('*').from('users') + } +} + +const service = await container.make(UserService) +await container.call(service, 'find') +``` + +The **runtime values** and **runtime bindings** are also supported with the `container.call` method. + +## Container bindings +Alongside making class instances, you can also register bindings inside the container. + +Bindings are simple key-value pairs. The value is a factory function invoked when someone resolves the binding from the container. + +```ts +const container = new Container() + +container.bind('db', () => { + return new Database() +}) + +const db = await container.make('db') +assert(db instanceof Database) +``` + +I used a string-based key for the binding name in the previous example. However, you can also bind `Symbols` or maybe the `class constructor` directly. + +```ts +container.bind(Database, () => { + return new Database() +}) +``` + +Now, when someone calls `container.make(Database)`, the container will invoke the factory function and uses its return value. So basically, you have taken over the construction of a class from the container. + +### Factory function arguments +The factory receives the following three arguments. + +- The `container` reference. +- An optional array of runtime values defined during the `container.make` call. +- An optional map of runtime bindings defined during the `container.make` call. + +```ts +container.bind(Database, (self, runtimeValues, runtimeBindings) => { + return new Database() +}) +``` + +### When to use the factory functions? +I am answering this question from a framework creator perspective. I never use the `@inject` decorator on my classes shipped as packages. Instead, I define their construction logic using factory functions and keep classes free from any knowledge of the container. + +So, if you create packages for AdonisJS, I highly recommend using factory functions. Leave the `@inject` decorator for the end user. + +## Binding singletons +You can bind a singleton to the container using the `container.singleton` method. It is the same as the `container.bind` method, except the factory function is called only once, and the return value is cached forever. + +```ts +container.singleton(Database, () => { + return new Database() +}) +``` + +## Observing container +You can pass an instance of the [EventEmitter](https://nodejs.org/dist/latest-v18.x/docs/api/events.html#class-eventemitter) or [emittery](https://github.com/sindresorhus/emittery) to listen for events as container resolves dependencies. + +```ts +import { EventEmitter } from 'node:events' +const emitter = new EventEmitter() + +emitter.on('container:make', ({ value, binding }) => { + // value is the resolved value + // binding name can be a mix of string, class constructors, and symbols. +}) + +const container = new Container({ emitter }) +``` + +> **Note**: Events are not emitted for the runtime values since the container does not resolve them. However, they are emitted by the runtime bindings. + +## Debugging container +You can define a function to log the lookup calls as the container attempts to resolve dependencies. + +The logs are individual objects with the parent id and the resolution status. + +```ts +const container = new Container({ + log: function (data) { + logger.trace(data) + } +}) +``` + +```ts +// Resolved +{ + id: 2, + parentId: 1, + binding: Database, + value: new Database(), + method: "constructor", + position: 0 + status: 'resolved' + error: null, +} + +// Error +{ + id: 2, + parentId: 1, + binding: Database, + value: null, + method: "constructor", + position: 0 + status: 'error' + error: new Error('Unable to resolve Database binding'), +} +``` + +- `id` is the unique id for the resolution. They are only generated when a logger is attached. +- `parentId` is the unique id of the parent for which the dependency is getting resolved. +- `binding` is the binding to resolve. +- `value` is the resolved value. +- `method` is the method name in which we will inject the resolved value. +- `position` is the argument position in which we will inject the value. +- `status` is the resolution status. +- `error` exists only when the status is an error. + +## Container providers +Container providers are static functions that can live on a class to resolve the injections for a given method. + +```ts +class UsersController { + static containerProvider( + self, + originalProvider, + property, + runtimeValues, + runtimeBindings, + ) { + if (property === 'constructor') { + return originalProvider.resolve(self, property, runtimeValues, runtimeBindings) + } + + // otherwise self, handle it + } +} +``` + +### Why would I use custom providers? +Custom providers can be handy when creating an instance of the class is not enough to construct it properly. + +Let's take an example of [AdonisJS route model binding](https://github.com/adonisjs/route-model-binding). With route model binding, you can query the database using models based on the value of a route parameter and inject the model instance inside the controller. + +```ts +import User from '#models/User' +import { bind } from '@adonisjs/route-model-binding' + +class UsersController { + @bind() + public show(_, user: User) {} +} +``` + +Now, if you use the `@inject` decorator to resolve the `User` model, then the container will only create an instance of User and give it back to you. + +However, in this case, we want more than just creating an instance of the model. We want to look up the database and create an instance with the row values. + +This is where the `@bind` decorator comes into the picture. To perform database lookups, it registers a custom provider on the `UsersController` class. + +
+ +
+ +[![gh-workflow-image]][gh-workflow-url] [![npm-image]][npm-url] ![][typescript-image] [![license-image]][license-url] [![snyk-image]][snyk-url] + +
+ +[gh-workflow-image]: https://img.shields.io/github/workflow/status/adonisjs/fold/test?style=for-the-badge +[gh-workflow-url]: https://github.com/adonisjs/fold/actions/workflows/test.yml "Github action" + +[npm-image]: https://img.shields.io/npm/v/@adonisjs/fold/latest.svg?style=for-the-badge&logo=npm +[npm-url]: https://www.npmjs.com/package/@adonisjs/fold/v/latest "npm" + +[typescript-image]: https://img.shields.io/badge/Typescript-294E80.svg?style=for-the-badge&logo=typescript + +[license-url]: LICENSE.md +[license-image]: https://img.shields.io/github/license/adonisjs/fold?style=for-the-badge + +[snyk-image]: https://img.shields.io/snyk/vulnerabilities/github/adonisjs/fold?label=Snyk%20Vulnerabilities&style=for-the-badge +[snyk-url]: https://snyk.io/test/github/adonisjs/fold?targetFile=package.json "snyk" From ba07afe23c9cd3753d35972ed40bd6bd9e3c045f Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Fri, 16 Sep 2022 14:46:27 +0530 Subject: [PATCH 006/145] docs(README): move badges to the top --- README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 87f3906..8ff6b0b 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,14 @@ AdonisJS Fold > Simplest, straightforward implementation for IoC container in JavaScript +
+ +
+ +[![gh-workflow-image]][gh-workflow-url] [![npm-image]][npm-url] ![][typescript-image] [![license-image]][license-url] [![snyk-image]][snyk-url] + +
+ ## Why this project exists? Many existing implementations of IoC containers take the concept too far and start to feel more like Java. JavaScript inherently does not have all the bells and whistles; you need to have similar IoC container benefits as PHP or Java. @@ -371,14 +379,6 @@ However, in this case, we want more than just creating an instance of the model. This is where the `@bind` decorator comes into the picture. To perform database lookups, it registers a custom provider on the `UsersController` class. -
- -
- -[![gh-workflow-image]][gh-workflow-url] [![npm-image]][npm-url] ![][typescript-image] [![license-image]][license-url] [![snyk-image]][snyk-url] - -
- [gh-workflow-image]: https://img.shields.io/github/workflow/status/adonisjs/fold/test?style=for-the-badge [gh-workflow-url]: https://github.com/adonisjs/fold/actions/workflows/test.yml "Github action" From 920a7351f2b961f6453cbb7bc6d8b6bf8b6e601e Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Fri, 16 Sep 2022 15:05:55 +0530 Subject: [PATCH 007/145] docs(README): small improvements --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 8ff6b0b..4c91b5b 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ Many existing implementations of IoC containers take the concept too far and sta Therefore, with this project, I live to the ethos of JavaScript and yet build a container that can help you create loosely coupled systems. -I have explained the [reasons for using an IoC container](https://github.com/thetutlage/meta/discussions/4) in this post. It might be a great idea to read the post first ✌️. +I have explained the [reasons for using an IoC container](https://github.com/thetutlage/meta/discussions/4) in this post. It might be a great idea to read the post first ✌️ ## Goals of the project @@ -81,9 +81,9 @@ This property can define the dependencies for the class methods (including the c > **Do you remember?** I said that JavaScript is not as powerful as Java or PHP. This is a classic example of that. In other languages, you can use reflection to look up the classes to inject, whereas, in JavaScript, you have to tell the container explicitly. ### TypeScript to the rescue -Wait, you can still use reflection with TypeScript decorators. So yes, decorators exist in JavaScript too, but they cannot inspect the types of parameters. TypeScript decorators can. +Wait, you can use decorators with combination of TypeScript's [emitDecoratorMetaData](https://www.typescriptlang.org/tsconfig#emitDecoratorMetadata) option to perform reflection. -Also, TypeScript decorators are not as powerful as the reflection in other languages. For example, in PHP, you can use interfaces for reflection. Whereas in TypeScript, you cannot. +It is worth noting, TypeScript decorators are not as powerful as the reflection API in other languages. For example, in PHP, you can use interfaces for reflection. Whereas in TypeScript, you cannot. With that said, let's look at the previous example, but in TypeScript this time. @@ -139,12 +139,12 @@ createServer((req) => { In the above example: - The container will create an instance of the `Database` class since it is set to `undefined` inside the runtime values array. -The container will use the `req` value for the `Request` class. +- However, for the second position (ie `request`), the container will use the `req` value. ## Making class with runtime bindings The runtime values are positional. This means that the caller of `container.make` needs to know the position of arguments to inject runtime values. -On the other hand, the runtime bindings provide value for a concrete class constructor. +On the other hand, the runtime bindings can provide value for a concrete class constructor. Let's look at the previous example but use runtime bindings this time. @@ -182,7 +182,7 @@ await container.make(UserService, [], runtimeBindings) ## Calling methods You can also call class methods to look up/inject dependencies automatically. -In the following example, the `UserService.find` method needs an instance of the Database class, and the `container.call` method will look at the `containerInjections` property to find the values to inject. +In the following example, the `UserService.find` method needs an instance of the Database class. The `container.call` method will look at the `containerInjections` property to find the values to inject. ```ts class Database {} From 749a60741ca5e1dc3af0c0e9aa353b021661d992 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Sat, 17 Sep 2022 14:01:20 +0530 Subject: [PATCH 008/145] feat: finish initial implementation --- README.md | 84 +++---- index.ts | 3 - package.json | 7 +- src/container.ts | 177 ++++++++++++++ src/provider.ts | 67 ++++++ src/resolver.ts | 153 ++++++++++++ src/types.ts | 45 ++++ src/user.ts | 13 - tests/container/bindings.spec.ts | 293 +++++++++++++++++++++++ tests/container/call_method.spec.ts | 136 +++++++++++ tests/container/known_bindings.spec.ts | 200 ++++++++++++++++ tests/container/known_make_class.spec.ts | 156 ++++++++++++ tests/container/make_class.spec.ts | 156 ++++++++++++ tests/maths.spec.ts | 8 - tests/provider.spec.ts | 102 ++++++++ tests/resolver.spec.ts | 29 +++ 16 files changed, 1551 insertions(+), 78 deletions(-) delete mode 100644 index.ts create mode 100644 src/container.ts create mode 100644 src/provider.ts create mode 100644 src/resolver.ts create mode 100644 src/types.ts delete mode 100644 src/user.ts create mode 100644 tests/container/bindings.spec.ts create mode 100644 tests/container/call_method.spec.ts create mode 100644 tests/container/known_bindings.spec.ts create mode 100644 tests/container/known_make_class.spec.ts create mode 100644 tests/container/make_class.spec.ts delete mode 100644 tests/maths.spec.ts create mode 100644 tests/provider.spec.ts create mode 100644 tests/resolver.spec.ts diff --git a/README.md b/README.md index 4c91b5b..40963bb 100644 --- a/README.md +++ b/README.md @@ -76,7 +76,7 @@ assert(service.db instanceof Database) The `static containerInjections` property is required by the container to know which values to inject when creating an instance of the class. -This property can define the dependencies for the class methods (including the constructor). The values are defined as an array of class constructors or literal values. +This property can define the dependencies for the class methods (including the constructor). The dependencies are defined as an array. The first item from the array will be injected as the first argument and so on. > **Do you remember?** I said that JavaScript is not as powerful as Java or PHP. This is a classic example of that. In other languages, you can use reflection to look up the classes to inject, whereas, in JavaScript, you have to tell the container explicitly. @@ -141,44 +141,6 @@ In the above example: - The container will create an instance of the `Database` class since it is set to `undefined` inside the runtime values array. - However, for the second position (ie `request`), the container will use the `req` value. -## Making class with runtime bindings -The runtime values are positional. This means that the caller of `container.make` needs to know the position of arguments to inject runtime values. - -On the other hand, the runtime bindings can provide value for a concrete class constructor. - -Let's look at the previous example but use runtime bindings this time. - -```ts -createServer((req) => { - const runtimeBindings = new Map() - runtimeBindings.set(Request, req) - - const service = await container.make(UserService, [], runtimeBindings) - assert(service.request === req) -}) -``` - -Here we are telling the container that when someone asks for the `Request` class, give them this pre-defined value. The logic is applied to the entire resolution chain. For example, if `UserService` injects another service that needs a request, the same request will be passed. - -```ts -@inject() -class TeamService { - constructor (db: Database, request: Request) {} -} - -@inject() -class UserService { - constructor (db: Database, request: Request, team: TeamService) { - } -} - -const runtimeBindings = new Map() -runtimeBindings.set(Request, req) - -// Both the UserService and the TeamService get the same request -await container.make(UserService, [], runtimeBindings) -``` - ## Calling methods You can also call class methods to look up/inject dependencies automatically. @@ -217,7 +179,7 @@ const service = await container.make(UserService) await container.call(service, 'find') ``` -The **runtime values** and **runtime bindings** are also supported with the `container.call` method. +The **runtime values** are also supported with the `container.call` method. ## Container bindings Alongside making class instances, you can also register bindings inside the container. @@ -237,6 +199,8 @@ assert(db instanceof Database) I used a string-based key for the binding name in the previous example. However, you can also bind `Symbols` or maybe the `class constructor` directly. +> **Warning**: The container binding can either be a `string`, a `symbol` or a `class constructor`. + ```ts container.bind(Database, () => { return new Database() @@ -248,12 +212,11 @@ Now, when someone calls `container.make(Database)`, the container will invoke th ### Factory function arguments The factory receives the following three arguments. -- The `container` reference. +- The `resolver` reference. Resolver is something container uses under the hood to resolve dependencies. The same instance is passed to the factory, so that you can resolve dependencies to construct the class. - An optional array of runtime values defined during the `container.make` call. -- An optional map of runtime bindings defined during the `container.make` call. ```ts -container.bind(Database, (self, runtimeValues, runtimeBindings) => { +container.bind(Database, (resolver, runtimeValues) => { return new Database() }) ``` @@ -272,6 +235,24 @@ container.singleton(Database, () => { }) ``` +## Binding values +Along side the factory functions, you can also bind direct values to the container. + +```ts +container.bindValue('router', router) +``` + +The values are given priority over the factory functions. So, if you register a value with the same name as the factory function binding, the value will be resolved from the container. + +The values can also be registered at the resolver level. In the following example, the `Request` binding only exists for an isolated instance of the resolver and not for the entire container. + +```ts +const resolver = container.createResolver() +resolver.bindValue(Request, req) + +await resolve.make(SomeClass) +``` + ## Observing container You can pass an instance of the [EventEmitter](https://nodejs.org/dist/latest-v18.x/docs/api/events.html#class-eventemitter) or [emittery](https://github.com/sindresorhus/emittery) to listen for events as container resolves dependencies. @@ -341,19 +322,16 @@ const container = new Container({ Container providers are static functions that can live on a class to resolve the injections for a given method. ```ts +import { ContainerResolver } from '@adonisjs/fold' +import { InspectableConstructor } from '@adonisjs/fold/types' + class UsersController { static containerProvider( - self, - originalProvider, - property, - runtimeValues, - runtimeBindings, + binding: InspectableConstructor, + property: string | symbol | number, + resolver: ContainerResolver, + runtimeValues?: any[] ) { - if (property === 'constructor') { - return originalProvider.resolve(self, property, runtimeValues, runtimeBindings) - } - - // otherwise self, handle it } } ``` diff --git a/index.ts b/index.ts deleted file mode 100644 index 65f4a70..0000000 --- a/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { User } from './src/user.js' - -console.log(new User('Harminder', 'Virk').fullName) diff --git a/package.json b/package.json index 1c4a1c5..32702d2 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "type": "module", "scripts": { "pretest": "npm run lint", + "vscode:test": "node --loader=ts-node/esm bin/test.ts", "test": "node --loader=ts-node/esm bin/test.ts", "clean": "del-cli build", "compile": "npm run lint && npm run clean && tsc", @@ -48,6 +49,7 @@ "eslint-config-prettier": "^8.5.0", "eslint-plugin-adonis": "^3.0.2", "eslint-plugin-prettier": "^4.0.0", + "expect-type": "^0.14.2", "github-label-sync": "^2.2.0", "husky": "^8.0.1", "np": "^7.6.1", @@ -106,5 +108,8 @@ "bugs": { "url": "https://github.com/adonisjs/fold/issues" }, - "homepage": "https://github.com/adonisjs/fold#readme" + "homepage": "https://github.com/adonisjs/fold#readme", + "dependencies": { + "@sindresorhus/is": "^5.3.0" + } } diff --git a/src/container.ts b/src/container.ts new file mode 100644 index 0000000..de84630 --- /dev/null +++ b/src/container.ts @@ -0,0 +1,177 @@ +import { + BindingResolver, + Bindings, + BindingValues, + Constructor, + ExtractFunctions, + Make, +} from './types.js' +import { ContainerResolver } from './resolver.js' + +const toString = Function.prototype.toString +function isClass(value: any): value is Constructor { + return typeof value === 'function' && /^class\s/.test(toString.call(value)) +} + +/** + * The container class exposes the API to register bindings, values + * and resolve them. + * + * Known bindings types can be defined at the time of the constructing + * the container. + * + * ```ts + * new Container<{ 'route': Route, encryption: Encryption }>() + * ``` + */ +export class Container> { + /** + * Registered bindings. Singleton and normal bindings, both are + * registered inside the bindings map + */ + #bindings: Bindings = new Map() + + /** + * Registered bindings as values. The values are preferred over the bindings. + */ + #bindingValues: BindingValues = new Map() + + /** + * Create a container resolver to resolve bindings, or make classes. + */ + createResolver() { + return new ContainerResolver(this.#bindings, this.#bindingValues) + } + + /** + * Resolve the binding as follows. + * + * - Resolve the binding from the values (if registered) + * - Resolve the binding from the bindings (if registered) + * - If binding is a class, then create a instance of it. The constructor + * dependencies are further resolved as well. + * - All other values are returned as it is. + */ + make( + binding: Binding, + runtimeValues?: any[] + ): Promise> + make(binding: Binding, runtimeValues?: any[]): Promise> + make(binding: Binding, runtimeValues?: any[]): Promise> { + return this.createResolver().make(binding, runtimeValues) + } + + /** + * Call a method on an object by injecting its dependencies + */ + async call, Method extends ExtractFunctions>( + value: Value, + method: Method, + runtimeValues?: any[] + ): Promise> { + return this.createResolver().call(value, method, runtimeValues) + } + + /** + * Register a binding with the resolver factory function. + * + * ```ts + * container.bind(Route, () => new Route()) + * ``` + */ + bind( + /** + * Need to narrow down the "Binding" for the case where "KnownBindings" are + */ + binding: Binding extends string | symbol ? Binding : never, + resolver: BindingResolver + ): void + bind>( + binding: Binding, + resolver: BindingResolver> + ): void + bind( + binding: Binding, + resolver: BindingResolver< + KnownBindings, + Binding extends Constructor + ? A + : Binding extends keyof KnownBindings + ? KnownBindings[Binding] + : never + > + ): void { + if (typeof binding !== 'string' && typeof binding !== 'symbol' && !isClass(binding)) { + throw new Error(`A binding name either be a string, symbol or class constructor`) + } + + this.#bindings.set(binding, { resolver, isSingleton: false }) + } + + /** + * Register a binding as a value + * + * ```ts + * container.bindValue(Route, new Route()) + * ``` + */ + bindValue( + /** + * Need to narrow down the "Binding" for the case where "KnownBindings" are + */ + binding: Binding extends string | symbol ? Binding : never, + value: KnownBindings[Binding] + ): void + bindValue>(binding: Binding, value: InstanceType): void + bindValue( + binding: Binding, + value: Binding extends Constructor + ? A + : Binding extends keyof KnownBindings + ? KnownBindings[Binding] + : never + ): void { + if (typeof binding !== 'string' && typeof binding !== 'symbol' && !isClass(binding)) { + throw new Error(`A binding name either be a string, symbol or class constructor`) + } + + this.#bindingValues.set(binding, value) + } + + /** + * Register a binding as a singleton with + * the resolver factory function. + * + * ```ts + * container.singleton(Route, () => new Route()) + * ``` + */ + singleton( + /** + * Need to narrow down the "Binding" for the case where "KnownBindings" are + */ + binding: Binding extends string | symbol ? Binding : never, + resolver: BindingResolver + ): void + singleton>( + binding: Binding, + resolver: BindingResolver> + ): void + singleton( + binding: Binding, + resolver: BindingResolver< + KnownBindings, + Binding extends Constructor + ? A + : Binding extends keyof KnownBindings + ? KnownBindings[Binding] + : never + > + ): void { + if (typeof binding !== 'string' && typeof binding !== 'symbol' && !isClass(binding)) { + throw new Error(`A binding name either be a string, symbol or class constructor`) + } + + this.#bindings.set(binding, { resolver, isSingleton: true }) + } +} diff --git a/src/provider.ts b/src/provider.ts new file mode 100644 index 0000000..8ee964f --- /dev/null +++ b/src/provider.ts @@ -0,0 +1,67 @@ +import { ContainerResolver } from './resolver.js' +import { InspectableConstructor } from './types.js' + +const primitiveConstructors = [String, Function, Object, Date, Number, Boolean] + +/** + * The default provider for resolving dependencies. It uses the resolver + * to resolve all the values. + */ +export async function containerProvider( + binding: InspectableConstructor, + property: string | symbol | number, + resolver: ContainerResolver, + runtimeValues?: any[] +) { + const values = runtimeValues || [] + + /** + * Return early when the class does not have static "containerInjections" + * property or if there are no injections for the given property + */ + if (!binding.containerInjections || !binding.containerInjections[property]) { + return values + } + + const injections = binding.containerInjections[property] + + /** + * If the length of runtime values is more than the injections + * length, then we make sure to return all the runtime + * values and fill undefined slots with container lookup + */ + if (values.length > injections.length) { + return Promise.all( + values.map((value, index) => { + if (value !== undefined) { + return value + } + + const injection = injections[index] + if (primitiveConstructors.includes(injection)) { + throw new Error(`Cannot inject "${injection.name}"`) + } + + return resolver.make(injection) + }) + ) + } + + /** + * Otherwise, we go through the injections, giving + * priority to the runtime values for a given index. + */ + return Promise.all( + injections.map((injection, index) => { + if (values[index] !== undefined) { + return values[index] + } + + if (primitiveConstructors.includes(injection)) { + throw new Error(`Cannot inject "${injection.name}"`) + } + + return resolver.make(injection) + }) + ) +} diff --git a/src/resolver.ts b/src/resolver.ts new file mode 100644 index 0000000..7b6eb94 --- /dev/null +++ b/src/resolver.ts @@ -0,0 +1,153 @@ +import { containerProvider } from './provider.js' +import type { Bindings, BindingValues, Constructor, ExtractFunctions, Make } from './types.js' + +const toString = Function.prototype.toString +function isClass(value: any): value is Constructor { + return typeof value === 'function' && /^class\s/.test(toString.call(value)) +} + +/** + * Container resolver exposes the APIs to resolve bindings. + */ +export class ContainerResolver> { + /** + * Pre-registered bindings. They are shared between the container + * and resolver. + * + * We do not mutate this property within the resolver + */ + #containerBindings: Bindings + + /** + * Pre-registered bindings. They are shared between the container + * and resolver. + * + * We mutate this property within the resolver to set singleton + * cached values + */ + #containerBindingValues: BindingValues + + /** + * Binding values local to the resolver + */ + #bindingValues: BindingValues = new Map() + + constructor(bindings: Bindings, bindingValues: BindingValues) { + this.#containerBindings = bindings + this.#containerBindingValues = bindingValues + } + + /** + * Resolve the binding as follows. + * + * - Resolve the binding from the values (if registered) + * - Resolve the binding from the bindings (if registered) + * - If binding is a class, then create a instance of it. The constructor + * dependencies are further resolved as well. + * - All other values are returned as it is. + */ + make( + binding: Binding, + runtimeValues?: any[] + ): Promise + make(binding: Binding, runtimeValues?: any[]): Promise> + async make(binding: Binding, runtimeValues?: any[]): Promise> { + const isAClass = isClass(binding) + + /** + * Return binding as it is, when the binding type is not a string, symbol + * or a class constructor. + */ + if (typeof binding !== 'string' && typeof binding !== 'symbol' && !isAClass) { + return binding as Promise> + } + + /** + * First priority is given to the RESOLVER binding values + */ + if (this.#bindingValues.has(binding)) { + return this.#bindingValues.get(binding) + } + + /** + * Next priority is given to the CONTAINER binding values + */ + if (this.#containerBindingValues.has(binding)) { + return this.#containerBindingValues.get(binding) + } + + /** + * Followed by the CONTAINER bindings + */ + if (this.#containerBindings.has(binding)) { + const { resolver, isSingleton } = this.#containerBindings.get(binding)! + const value = await resolver(this) + + /** + * Caching singletons + */ + if (isSingleton) { + this.#containerBindingValues.set(binding, value) + } + + return value + } + + /** + * Create an instance of the class with its constructor + * dependencies. + */ + if (isAClass) { + const dependencies = await containerProvider(binding, 'constructor', this, runtimeValues) + return new binding(...dependencies) as Promise> + } + + return binding as unknown as Promise> + } + + /** + * Call a method on an object by injecting its dependencies + */ + async call, Method extends ExtractFunctions>( + value: Value, + method: Method, + runtimeValues?: any[] + ): Promise> { + if (typeof value[method] !== 'function') { + throw new Error(`method "${String(method)}" does not exists on "${value.constructor.name}"`) + } + + const dependencies = await containerProvider(value.constructor, method, this, runtimeValues) + return value[method](...dependencies) + } + + /** + * Register a binding as a value + * + * ```ts + * container.bindValue(Route, new Route()) + * ``` + */ + bindValue( + /** + * Need to narrow down the "Binding" for the case where "KnownBindings" are + */ + binding: Binding extends string | symbol ? Binding : never, + value: KnownBindings[Binding] + ): void + bindValue>(binding: Binding, value: InstanceType): void + bindValue( + binding: Binding, + value: Binding extends Constructor + ? A + : Binding extends keyof KnownBindings + ? KnownBindings[Binding] + : never + ): void { + if (typeof binding !== 'string' && typeof binding !== 'symbol' && !isClass(binding)) { + throw new Error(`A binding name either be a string, symbol or class constructor`) + } + + this.#bindingValues.set(binding, value) + } +} diff --git a/src/types.ts b/src/types.ts new file mode 100644 index 0000000..ba85280 --- /dev/null +++ b/src/types.ts @@ -0,0 +1,45 @@ +import { ContainerResolver } from './resolver.js' + +/** + * Extract functions from a type + */ +export type ExtractFunctions = { + [P in keyof T]: T[P] extends (...args: any[]) => any ? P : never +}[keyof T] + +/** + * Shape of a class constructor + */ +export type Constructor = new (...args: any[]) => T + +/** + * Shape of a class constructor with injections + */ +export type InspectableConstructor = Function & { + containerInjections?: Record +} + +/** + * Returns the inferred value for the make method + */ +export type Make = T extends Constructor ? A : T + +/** + * Shape of the binding resolver + */ +export type BindingResolver, Value> = ( + resolver: ContainerResolver +) => Value | Promise + +/** + * Shape of the registered bindings + */ +export type Bindings = Map< + string | symbol | Constructor, + { resolver: BindingResolver, any>; isSingleton: boolean } +> + +/** + * Shape of the registered binding values + */ +export type BindingValues = Map, any> diff --git a/src/user.ts b/src/user.ts deleted file mode 100644 index d4e20bc..0000000 --- a/src/user.ts +++ /dev/null @@ -1,13 +0,0 @@ -export class User { - #firstname: string - #lastname: string - - constructor(firstname: string, lastname: string) { - this.#firstname = firstname - this.#lastname = lastname - } - - get fullName() { - return `${this.#firstname} ${this.#lastname}` - } -} diff --git a/tests/container/bindings.spec.ts b/tests/container/bindings.spec.ts new file mode 100644 index 0000000..19aa491 --- /dev/null +++ b/tests/container/bindings.spec.ts @@ -0,0 +1,293 @@ +import { test } from '@japa/runner' +import { expectTypeOf } from 'expect-type' +import { Container } from '../../src/container.js' + +test.group('Container | Bindings', () => { + test('register a binding to the container', async ({ assert }) => { + const container = new Container() + class Route {} + + container.bind('route', () => { + return new Route() + }) + + const route = await container.make('route') + expectTypeOf(route).toBeAny() + assert.instanceOf(route, Route) + }) + + test('use symbol for the binding name', async ({ assert }) => { + const container = new Container() + class Route {} + + const routeSymbol = Symbol('route') + container.bind(routeSymbol, () => { + return new Route() + }) + + const route = await container.make(routeSymbol) + expectTypeOf(route).toBeAny() + assert.instanceOf(route, Route) + }) + + test('use class constructor for the binding name', async ({ assert }) => { + const container = new Container() + class Route { + booted = false + boot() { + this.booted = true + } + } + + container.bind(Route, () => { + const route = new Route() + route.boot() + + return route + }) + + const route = await container.make(Route) + expectTypeOf(route).toEqualTypeOf() + assert.instanceOf(route, Route) + assert.isTrue(route.booted) + }) + + test('disallow binding names other than string symbol or class constructor', async ({ + assert, + }) => { + const container = new Container() + + assert.throws( + // @ts-expect-error + () => container.bind(1, () => {}), + 'A binding name either be a string, symbol or class constructor' + ) + + assert.throws( + // @ts-expect-error + () => container.bind([], () => {}), + 'A binding name either be a string, symbol or class constructor' + ) + + assert.throws( + // @ts-expect-error + () => container.bind({}, () => {}), + 'A binding name either be a string, symbol or class constructor' + ) + }) + + test('return fresh value everytime from the factory function', async ({ assert }) => { + const container = new Container() + class Route {} + + container.bind('route', () => { + return new Route() + }) + + const route = await container.make('route') + const route1 = await container.make('route') + + expectTypeOf(route).toBeAny() + expectTypeOf(route1).toBeAny() + assert.instanceOf(route, Route) + assert.instanceOf(route1, Route) + assert.notStrictEqual(route, route1) + }) +}) + +test.group('Container | Bindings Singleton', () => { + test('register a singleton to the container', async ({ assert }) => { + const container = new Container() + class Route {} + + container.singleton('route', () => { + return new Route() + }) + + const route = await container.make('route') + expectTypeOf(route).toBeAny() + assert.instanceOf(route, Route) + }) + + test('use symbol for the singleton name', async ({ assert }) => { + const container = new Container() + class Route {} + + const routeSymbol = Symbol('route') + container.singleton(routeSymbol, () => { + return new Route() + }) + + const route = await container.make(routeSymbol) + expectTypeOf(route).toBeAny() + assert.instanceOf(route, Route) + }) + + test('use class constructor for the singleton name', async ({ assert }) => { + const container = new Container() + class Route { + booted = false + boot() { + this.booted = true + } + } + + container.singleton(Route, () => { + const route = new Route() + route.boot() + + return route + }) + + const route = await container.make(Route) + expectTypeOf(route).toEqualTypeOf() + assert.instanceOf(route, Route) + assert.isTrue(route.booted) + }) + + test('disallow binding names other than string symbol or class constructor', async ({ + assert, + }) => { + const container = new Container() + + assert.throws( + // @ts-expect-error + () => container.singleton(1, () => {}), + 'A binding name either be a string, symbol or class constructor' + ) + + assert.throws( + // @ts-expect-error + () => container.singleton([], () => {}), + 'A binding name either be a string, symbol or class constructor' + ) + + assert.throws( + // @ts-expect-error + () => container.singleton({}, () => {}), + 'A binding name either be a string, symbol or class constructor' + ) + }) + + test('return cached value everytime from the factory function', async ({ assert }) => { + const container = new Container() + class Route {} + + container.singleton('route', () => { + return new Route() + }) + + const route = await container.make('route') + const route1 = await container.make('route') + + expectTypeOf(route).toBeAny() + expectTypeOf(route1).toBeAny() + assert.instanceOf(route, Route) + assert.instanceOf(route1, Route) + assert.strictEqual(route, route1) + }) +}) + +test.group('Container | Binding values', () => { + test('register a value to the container', async ({ assert }) => { + const container = new Container() + class Route {} + + container.bindValue('route', new Route()) + + const route = await container.make('route') + expectTypeOf(route).toBeAny() + assert.instanceOf(route, Route) + }) + + test('use symbol for the value name', async ({ assert }) => { + const container = new Container() + class Route {} + + const routeSymbol = Symbol('route') + container.bindValue(routeSymbol, new Route()) + + const route = await container.make(routeSymbol) + expectTypeOf(route).toBeAny() + assert.instanceOf(route, Route) + }) + + test('use class constructor for the value name', async ({ assert }) => { + const container = new Container() + class Route { + booted = false + boot() { + this.booted = true + } + } + + const routeInstance = new Route() + routeInstance.boot() + + container.bindValue(Route, routeInstance) + + const route = await container.make(Route) + expectTypeOf(route).toEqualTypeOf() + assert.instanceOf(route, Route) + assert.isTrue(route.booted) + }) + + test('return same value every time', async ({ assert }) => { + const container = new Container() + class Route {} + + container.bindValue('route', new Route()) + + const route = await container.make('route') + const route1 = await container.make('route') + + expectTypeOf(route).toBeAny() + expectTypeOf(route1).toBeAny() + assert.instanceOf(route, Route) + assert.instanceOf(route1, Route) + assert.strictEqual(route, route1) + }) + + test('give priority to values over bindings', async ({ assert }) => { + const container = new Container() + class Route {} + + container.bindValue('route', new Route()) + container.bind('route', () => { + return { foo: 'bar' } + }) + + const route = await container.make('route') + const route1 = await container.make('route') + + expectTypeOf(route).toBeAny() + expectTypeOf(route1).toBeAny() + assert.instanceOf(route, Route) + assert.instanceOf(route1, Route) + assert.strictEqual(route, route1) + }) + + test('disallow binding names other than string symbol or class constructor', async ({ + assert, + }) => { + const container = new Container() + + assert.throws( + // @ts-expect-error + () => container.bindValue(1, 1), + 'A binding name either be a string, symbol or class constructor' + ) + + assert.throws( + // @ts-expect-error + () => container.bindValue([], 1), + 'A binding name either be a string, symbol or class constructor' + ) + + assert.throws( + // @ts-expect-error + () => container.bindValue({}, 1), + 'A binding name either be a string, symbol or class constructor' + ) + }) +}) diff --git a/tests/container/call_method.spec.ts b/tests/container/call_method.spec.ts new file mode 100644 index 0000000..f43be3e --- /dev/null +++ b/tests/container/call_method.spec.ts @@ -0,0 +1,136 @@ +import { test } from '@japa/runner' +import { expectTypeOf } from 'expect-type' +import { Container } from '../../src/container.js' + +test.group('Container | Call method', () => { + test('dis-allow method call on values other than an object', async ({ assert }) => { + const container = new Container() + + // @ts-expect-error + await assert.rejects(() => container.call(1, 'foo'), 'method "foo" does not exists on "Number"') + + await assert.rejects( + // @ts-expect-error + () => container.call(false, 'foo'), + 'method "foo" does not exists on "Boolean"' + ) + + await assert.rejects( + // @ts-expect-error + () => container.call(undefined, 'foo'), + `Cannot read properties of undefined (reading 'foo')` + ) + + await assert.rejects( + // @ts-expect-error + () => container.call(null, 'foo'), + `Cannot read properties of null (reading 'foo')` + ) + + await assert.rejects( + // @ts-expect-error + () => container.call(new Map([[1, 1]]), 'foo'), + 'method "foo" does not exists on "Map"' + ) + + await assert.rejects( + // @ts-expect-error + () => container.call(new Set([1]), 'foo'), + 'method "foo" does not exists on "Set"' + ) + + await assert.rejects( + // @ts-expect-error + () => container.call(['foo'], 'foo'), + 'method "foo" does not exists on "Array"' + ) + + await assert.rejects( + // @ts-expect-error + () => container.call(function foo() {}, 'foo'), + 'method "foo" does not exists on "Function"' + ) + }) + + test('invoke plain object methods without any DI', async ({ assert }) => { + const container = new Container() + const fooResult = await container.call({ foo: () => 'bar' }, 'foo') + + expectTypeOf(fooResult).toEqualTypeOf() + assert.equal(fooResult, 'bar') + }) + + test('invoke method on class instance', async ({ assert }) => { + class UserService { + foo() { + return 'bar' + } + } + + const container = new Container() + const fooResult = await container.call(new UserService(), 'foo') + + expectTypeOf(fooResult).toEqualTypeOf() + assert.equal(fooResult, 'bar') + }) + + test('inject dependencies to class method', async ({ assert }) => { + class Database {} + + class UserService { + static containerInjections = { + foo: [Database], + } + + foo(db: Database) { + return db + } + } + + const container = new Container() + const fooResult = await container.call(new UserService(), 'foo') + + expectTypeOf(fooResult).toEqualTypeOf() + assert.instanceOf(fooResult, Database) + }) + + test('inject non class dependencies to class method', async ({ assert }) => { + class Database {} + + class UserService { + static containerInjections = { + foo: [Database, { foo: 'bar' }, 1], + } + + foo(_: any, __: any, id: number) { + return id + } + } + + const container = new Container() + const fooResult = await container.call(new UserService(), 'foo') + + expectTypeOf(fooResult).toEqualTypeOf() + assert.equal(fooResult, 1) + }) + + test('merge runtime values with container dependencies', async ({ assert }) => { + class Database {} + + class UserService { + static containerInjections = { + foo: [Database, String, Number], + } + + foo(db: Database, name: string, id: number) { + return { db, name, id } + } + } + + const container = new Container() + const fooResult = await container.call(new UserService(), 'foo', [undefined, 'foo', 1]) + + expectTypeOf(fooResult).toEqualTypeOf<{ db: Database; name: string; id: number }>() + assert.deepEqual(fooResult, { db: new Database(), id: 1, name: 'foo' }) + }) +}) diff --git a/tests/container/known_bindings.spec.ts b/tests/container/known_bindings.spec.ts new file mode 100644 index 0000000..66ca586 --- /dev/null +++ b/tests/container/known_bindings.spec.ts @@ -0,0 +1,200 @@ +import { test } from '@japa/runner' +import { expectTypeOf } from 'expect-type' +import { Container } from '../../src/container.js' + +test.group('Container | Bindings', () => { + test('register a binding to the container', async ({ assert }) => { + const container = new Container<{ route: Route }>() + class Route {} + + container.bind('route', () => { + return new Route() + }) + + const route = await container.make('route') + expectTypeOf(route).toEqualTypeOf() + assert.instanceOf(route, Route) + }) + + test('use symbol for the binding name', async ({ assert }) => { + class Route {} + const routeSymbol = Symbol('route') + + const container = new Container<{ [routeSymbol]: Route }>() + container.bind(routeSymbol, () => { + return new Route() + }) + + const route = await container.make(routeSymbol) + expectTypeOf(route).toEqualTypeOf() + assert.instanceOf(route, Route) + }) + + test('use class constructor for the binding name', async ({ assert }) => { + class Route {} + + const container = new Container() + container.bind(Route, () => { + return new Route() + }) + + const route = await container.make(Route) + expectTypeOf(route).toEqualTypeOf() + assert.instanceOf(route, Route) + }) + + test('return fresh value everytime from the factory function', async ({ assert }) => { + class Route {} + const container = new Container<{ route: Route }>() + + container.bind('route', () => { + return new Route() + }) + + const route = await container.make('route') + const route1 = await container.make('route') + + expectTypeOf(route).toEqualTypeOf() + expectTypeOf(route1).toEqualTypeOf() + assert.instanceOf(route, Route) + assert.instanceOf(route1, Route) + assert.notStrictEqual(route, route1) + }) +}) + +test.group('Container | Bindings Singleton', () => { + test('register a singleton to the container', async ({ assert }) => { + class Route {} + const container = new Container<{ route: Route }>() + + container.singleton('route', () => { + return new Route() + }) + + const route = await container.make('route') + + expectTypeOf(route).toEqualTypeOf() + assert.instanceOf(route, Route) + }) + + test('use symbol for the singleton name', async ({ assert }) => { + class Route {} + const routeSymbol = Symbol('route') + const container = new Container<{ [routeSymbol]: Route }>() + + container.singleton(routeSymbol, () => { + return new Route() + }) + + const route = await container.make(routeSymbol) + + expectTypeOf(route).toEqualTypeOf() + assert.instanceOf(route, Route) + }) + + test('use class constructor for the singleton name', async ({ assert }) => { + const container = new Container() + class Route {} + + container.singleton(Route, () => { + return new Route() + }) + + const route = await container.make(Route) + + expectTypeOf(route).toEqualTypeOf() + assert.instanceOf(route, Route) + }) + + test('return cached value everytime from the factory function', async ({ assert }) => { + class Route {} + const container = new Container<{ route: Route }>() + + container.singleton('route', () => { + return new Route() + }) + + const route = await container.make('route') + const route1 = await container.make('route') + + expectTypeOf(route).toEqualTypeOf() + expectTypeOf(route1).toEqualTypeOf() + assert.instanceOf(route, Route) + assert.instanceOf(route1, Route) + assert.strictEqual(route, route1) + }) +}) + +test.group('Container | Binding values', () => { + test('register a value to the container', async ({ assert }) => { + class Route {} + const container = new Container<{ route: Route }>() + + container.bindValue('route', new Route()) + + const route = await container.make('route') + + expectTypeOf(route).toEqualTypeOf() + assert.instanceOf(route, Route) + }) + + test('use symbol for the value name', async ({ assert }) => { + class Route {} + const routeSymbol = Symbol('route') + const container = new Container<{ [routeSymbol]: Route }>() + + container.bindValue(routeSymbol, new Route()) + + const route = await container.make(routeSymbol) + + expectTypeOf(route).toEqualTypeOf() + assert.instanceOf(route, Route) + }) + + test('use class constructor for the value name', async ({ assert }) => { + const container = new Container() + class Route {} + + container.bindValue(Route, new Route()) + + const route = await container.make(Route) + + expectTypeOf(route).toEqualTypeOf() + assert.instanceOf(route, Route) + }) + + test('return same value every time', async ({ assert }) => { + const container = new Container<{ route: Route }>() + class Route {} + + container.bindValue('route', new Route()) + + const route = await container.make('route') + const route1 = await container.make('route') + + expectTypeOf(route).toEqualTypeOf() + expectTypeOf(route1).toEqualTypeOf() + assert.instanceOf(route, Route) + assert.instanceOf(route1, Route) + assert.strictEqual(route, route1) + }) + + test('give priority to values over bindings', async ({ assert }) => { + class Route {} + const container = new Container<{ route: Route }>() + + container.bindValue('route', new Route()) + container.bind('route', () => { + return { foo: 'bar' } + }) + + const route = await container.make('route') + const route1 = await container.make('route') + + expectTypeOf(route).toEqualTypeOf() + expectTypeOf(route1).toEqualTypeOf() + assert.instanceOf(route, Route) + assert.instanceOf(route1, Route) + assert.strictEqual(route, route1) + }) +}) diff --git a/tests/container/known_make_class.spec.ts b/tests/container/known_make_class.spec.ts new file mode 100644 index 0000000..54d260d --- /dev/null +++ b/tests/container/known_make_class.spec.ts @@ -0,0 +1,156 @@ +import { test } from '@japa/runner' +import { expectTypeOf } from 'expect-type' +import { Container } from '../../src/container.js' + +test.group('Container | Make class | Known bindings', () => { + test('create a fresh instance of the container', ({ assert }) => { + assert.instanceOf(new Container(), Container) + }) + + test('return non classes values as it is', async ({ assert }) => { + const container = new Container<{ foo: 'bar' }>() + + const obj = await container.make({ foo: 'bar' }) + expectTypeOf(obj).toEqualTypeOf<{ foo: string }>() + assert.deepEqual(obj, { foo: 'bar' }) + + const numeric = await container.make(1) + expectTypeOf(numeric).toEqualTypeOf() + assert.deepEqual(numeric, 1) + + const bool = await container.make(false) + expectTypeOf(bool).toEqualTypeOf() + assert.deepEqual(bool, false) + + const notDefined = await container.make(undefined) + expectTypeOf(notDefined).toEqualTypeOf() + assert.deepEqual(notDefined, undefined) + + const nullValue = await container.make(null) + expectTypeOf(nullValue).toEqualTypeOf() + assert.deepEqual(nullValue, null) + + const mapValue = await container.make(new Map([[1, 1]])) + expectTypeOf(mapValue).toEqualTypeOf>() + assert.deepEqual(mapValue, new Map([[1, 1]])) + + const setValue = await container.make(new Set([1])) + expectTypeOf(setValue).toEqualTypeOf>() + assert.deepEqual(setValue, new Set([1])) + + const arrayValue = await container.make(['foo']) + expectTypeOf(arrayValue).toEqualTypeOf() + assert.deepEqual(arrayValue, ['foo']) + + function foo() {} + const func = await container.make(foo) + expectTypeOf(func).toEqualTypeOf<() => void>() + assert.deepEqual(func, foo) + }) + + test('make instance of a class using the container', async ({ assert }) => { + class UserService { + foo = 'bar' + } + const container = new Container<{ foo: 'bar' }>() + const service = await container.make(UserService) + + expectTypeOf(service).toEqualTypeOf() + assert.instanceOf(service, UserService) + assert.equal(service.foo, 'bar') + }) + + test('multiple calls to make should return a fresh instance', async ({ assert }) => { + class UserService { + foo = 'bar' + } + const container = new Container<{ foo: 'bar' }>() + const service = await container.make(UserService) + const service1 = await container.make(UserService) + + expectTypeOf(service).toEqualTypeOf() + expectTypeOf(service1).toEqualTypeOf() + assert.instanceOf(service, UserService) + assert.instanceOf(service1, UserService) + assert.notStrictEqual(service1, service) + assert.equal(service.foo, 'bar') + }) + + test('inject constructor dependencies as defined in containerInjections', async ({ assert }) => { + class Database {} + + class UserService { + static containerInjections = { + constructor: [Database], + } + constructor(public db: Database) {} + } + + const container = new Container<{ foo: 'bar' }>() + const service = await container.make(UserService) + + expectTypeOf(service).toEqualTypeOf() + assert.instanceOf(service, UserService) + assert.instanceOf(service.db, Database) + }) + + test('inject non class dependencies as it is', async ({ assert }) => { + class UserService { + args: any[] + + static containerInjections = { + constructor: [{ foo: 'bar' }, 1, ['foo'], false, undefined, null, false], + } + constructor(...args: any[]) { + this.args = args + } + } + + const container = new Container<{ foo: 'bar' }>() + const service = await container.make(UserService) + + assert.instanceOf(service, UserService) + expectTypeOf(service).toEqualTypeOf() + assert.deepEqual(service.args, [{ foo: 'bar' }, 1, ['foo'], false, undefined, null, false]) + }) + + test('do not inject constructor dependencies when containerInjections are empty', async ({ + assert, + }) => { + class UserService { + static containerInjections = { + constructor: [], + } + constructor(public name: string) {} + } + + const container = new Container<{ foo: 'bar' }>() + const service = await container.make(UserService) + + assert.instanceOf(service, UserService) + expectTypeOf(service).toEqualTypeOf() + assert.isUndefined(service.name) + }) + + test('raise error when injecting is a primitive class', async ({ assert }) => { + class UserService { + args: any[] + + static containerInjections = { + constructor: [String], + } + constructor() {} + } + + const container = new Container<{ foo: 'bar' }>() + await assert.rejects(() => container.make(UserService), 'Cannot inject "String"') + }) + + test('return primitive constructor as it is', async ({ assert }) => { + const container = new Container<{ foo: 'bar' }>() + + const stringPrimitive = await container.make(String) + expectTypeOf(stringPrimitive).toEqualTypeOf() + assert.deepEqual(stringPrimitive, String) + }) +}) diff --git a/tests/container/make_class.spec.ts b/tests/container/make_class.spec.ts new file mode 100644 index 0000000..033b901 --- /dev/null +++ b/tests/container/make_class.spec.ts @@ -0,0 +1,156 @@ +import { test } from '@japa/runner' +import { expectTypeOf } from 'expect-type' +import { Container } from '../../src/container.js' + +test.group('Container | Make class', () => { + test('create a fresh instance of the container', ({ assert }) => { + assert.instanceOf(new Container(), Container) + }) + + test('return non classes values as it is', async ({ assert }) => { + const container = new Container() + + const obj = await container.make({ foo: 'bar' }) + expectTypeOf(obj).toEqualTypeOf<{ foo: string }>() + assert.deepEqual(obj, { foo: 'bar' }) + + const numeric = await container.make(1) + expectTypeOf(numeric).toEqualTypeOf() + assert.deepEqual(numeric, 1) + + const bool = await container.make(false) + expectTypeOf(bool).toEqualTypeOf() + assert.deepEqual(bool, false) + + const notDefined = await container.make(undefined) + expectTypeOf(notDefined).toEqualTypeOf() + assert.deepEqual(notDefined, undefined) + + const nullValue = await container.make(null) + expectTypeOf(nullValue).toEqualTypeOf() + assert.deepEqual(nullValue, null) + + const mapValue = await container.make(new Map([[1, 1]])) + expectTypeOf(mapValue).toEqualTypeOf>() + assert.deepEqual(mapValue, new Map([[1, 1]])) + + const setValue = await container.make(new Set([1])) + expectTypeOf(setValue).toEqualTypeOf>() + assert.deepEqual(setValue, new Set([1])) + + const arrayValue = await container.make(['foo']) + expectTypeOf(arrayValue).toEqualTypeOf() + assert.deepEqual(arrayValue, ['foo']) + + function foo() {} + const func = await container.make(foo) + expectTypeOf(func).toEqualTypeOf<() => void>() + assert.deepEqual(func, foo) + }) + + test('make instance of a class using the container', async ({ assert }) => { + class UserService { + foo = 'bar' + } + const container = new Container() + const service = await container.make(UserService) + + expectTypeOf(service).toEqualTypeOf() + assert.instanceOf(service, UserService) + assert.equal(service.foo, 'bar') + }) + + test('multiple calls to make should return a fresh instance', async ({ assert }) => { + class UserService { + foo = 'bar' + } + const container = new Container() + const service = await container.make(UserService) + const service1 = await container.make(UserService) + + expectTypeOf(service).toEqualTypeOf() + expectTypeOf(service1).toEqualTypeOf() + assert.instanceOf(service, UserService) + assert.instanceOf(service1, UserService) + assert.notStrictEqual(service1, service) + assert.equal(service.foo, 'bar') + }) + + test('inject constructor dependencies as defined in containerInjections', async ({ assert }) => { + class Database {} + + class UserService { + static containerInjections = { + constructor: [Database], + } + constructor(public db: Database) {} + } + + const container = new Container() + const service = await container.make(UserService) + + expectTypeOf(service).toEqualTypeOf() + assert.instanceOf(service, UserService) + assert.instanceOf(service.db, Database) + }) + + test('inject non class dependencies as it is', async ({ assert }) => { + class UserService { + args: any[] + + static containerInjections = { + constructor: [{ foo: 'bar' }, 1, ['foo'], false, undefined, null, false], + } + constructor(...args: any[]) { + this.args = args + } + } + + const container = new Container() + const service = await container.make(UserService) + + assert.instanceOf(service, UserService) + expectTypeOf(service).toEqualTypeOf() + assert.deepEqual(service.args, [{ foo: 'bar' }, 1, ['foo'], false, undefined, null, false]) + }) + + test('do not inject constructor dependencies when containerInjections are empty', async ({ + assert, + }) => { + class UserService { + static containerInjections = { + constructor: [], + } + constructor(public name: string) {} + } + + const container = new Container() + const service = await container.make(UserService) + + assert.instanceOf(service, UserService) + expectTypeOf(service).toEqualTypeOf() + assert.isUndefined(service.name) + }) + + test('raise error when injecting is a primitive class', async ({ assert }) => { + class UserService { + args: any[] + + static containerInjections = { + constructor: [String], + } + constructor() {} + } + + const container = new Container() + await assert.rejects(() => container.make(UserService), 'Cannot inject "String"') + }) + + test('return primitive constructor as it is', async ({ assert }) => { + const container = new Container() + + const stringPrimitive = await container.make(String) + expectTypeOf(stringPrimitive).toEqualTypeOf() + assert.deepEqual(stringPrimitive, String) + }) +}) diff --git a/tests/maths.spec.ts b/tests/maths.spec.ts deleted file mode 100644 index aed2d70..0000000 --- a/tests/maths.spec.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { test } from '@japa/runner' - -test.group('Maths.add', () => { - test('add two numbers', ({ assert }) => { - // Test logic goes here - assert.equal(2 + 2, 4) - }) -}) diff --git a/tests/provider.spec.ts b/tests/provider.spec.ts new file mode 100644 index 0000000..00fda95 --- /dev/null +++ b/tests/provider.spec.ts @@ -0,0 +1,102 @@ +import { test } from '@japa/runner' +import { expectTypeOf } from 'expect-type' +import { Container } from '../src/container.js' +import { containerProvider } from '../src/provider.js' + +test.group('Provider', () => { + test('return empty array when class has no dependencies', async ({ assert }) => { + class UserService {} + const container = new Container() + const resolver = container.createResolver() + + const dependencies = await containerProvider(UserService, 'constructor', resolver) + + assert.deepEqual(dependencies, []) + expectTypeOf(dependencies).toEqualTypeOf() + }) + + test('use runtime values when class has no dependencies', async ({ assert }) => { + class UserService {} + const container = new Container() + const resolver = container.createResolver() + + const dependencies = await containerProvider(UserService, 'constructor', resolver, [ + 'foo', + { foo: 'bar' }, + ]) + + assert.deepEqual(dependencies, ['foo', { foo: 'bar' }]) + expectTypeOf(dependencies).toEqualTypeOf() + }) + + test('make class dependencies using the resolver', async ({ assert }) => { + class Database {} + class UserService { + static containerInjections = { + constructor: [Database], + } + } + + const container = new Container() + const resolver = container.createResolver() + + const dependencies = await containerProvider(UserService, 'constructor', resolver) + + assert.deepEqual(dependencies, [new Database()]) + expectTypeOf(dependencies).toEqualTypeOf() + }) + + test('give priority to runtime values over defined dependencies', async ({ assert }) => { + class Database {} + class UserService { + static containerInjections = { + constructor: [Database], + } + } + + const container = new Container() + const resolver = container.createResolver() + + const dependencies = await containerProvider(UserService, 'constructor', resolver, [ + { foo: 'bar' }, + ]) + + assert.deepEqual(dependencies, [{ foo: 'bar' }]) + expectTypeOf(dependencies).toEqualTypeOf() + }) + + test('use all runtime values regardless of the dependencies length', async ({ assert }) => { + class Database {} + class UserService { + static containerInjections = { + constructor: [Database], + } + } + + const container = new Container() + const resolver = container.createResolver() + + const dependencies = await containerProvider(UserService, 'constructor', resolver, [ + undefined, + { foo: 'bar' }, + ]) + + assert.deepEqual(dependencies, [new Database(), { foo: 'bar' }]) + expectTypeOf(dependencies).toEqualTypeOf() + }) + + test('dis-allow primitive constructors', async ({ assert }) => { + class UserService { + static containerInjections = { + constructor: [String], + } + } + + const container = new Container() + const resolver = container.createResolver() + + await assert.rejects(async () => { + await containerProvider(UserService, 'constructor', resolver, [undefined, { foo: 'bar' }]) + }, 'Cannot inject "String"') + }) +}) diff --git a/tests/resolver.spec.ts b/tests/resolver.spec.ts new file mode 100644 index 0000000..5725490 --- /dev/null +++ b/tests/resolver.spec.ts @@ -0,0 +1,29 @@ +import { test } from '@japa/runner' +import { expectTypeOf } from 'expect-type' +import { Container } from '../src/container.js' + +test.group('Resolver', () => { + test('give priority to resolver values over binding values', async ({ assert }) => { + class UserService { + name: string + } + + const container = new Container() + const resolver = container.createResolver() + + const service = new UserService() + service.name = 'container_service' + + const service1 = new UserService() + service1.name = 'resolver_service' + + container.bindValue(UserService, service) + resolver.bindValue(UserService, service1) + + const resolvedService = await resolver.make(UserService) + + expectTypeOf(resolvedService).toEqualTypeOf() + assert.strictEqual(resolvedService, service1) + assert.strictEqual(resolvedService.name, 'resolver_service') + }) +}) From 22908abf876c2ba4d2c60d23357292417184340b Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Sun, 18 Sep 2022 07:43:34 +0530 Subject: [PATCH 009/145] feat: add hooks and events support --- src/container.ts | 61 ++++++++++++++++++++++++++++++++++++---- src/provider.ts | 2 +- src/resolver.ts | 73 ++++++++++++++++++++++++++++++++++++++++++++---- src/types.ts | 42 +++++++++++++++++++++++++++- 4 files changed, 165 insertions(+), 13 deletions(-) diff --git a/src/container.ts b/src/container.ts index de84630..52adec8 100644 --- a/src/container.ts +++ b/src/container.ts @@ -1,10 +1,13 @@ -import { - BindingResolver, +import type { + Make, + Hooks, Bindings, - BindingValues, Constructor, + HookCallback, + BindingValues, + BindingResolver, ExtractFunctions, - Make, + ContainerOptions, } from './types.js' import { ContainerResolver } from './resolver.js' @@ -36,11 +39,22 @@ export class Container> { */ #bindingValues: BindingValues = new Map() + #hooks: Hooks = new Map() + + /** + * Container options + */ + #options: ContainerOptions + + constructor(options?: ContainerOptions) { + this.#options = options || {} + } + /** * Create a container resolver to resolve bindings, or make classes. */ createResolver() { - return new ContainerResolver(this.#bindings, this.#bindingValues) + return new ContainerResolver(this.#bindings, this.#bindingValues, this.#hooks, this.#options) } /** @@ -174,4 +188,41 @@ export class Container> { this.#bindings.set(binding, { resolver, isSingleton: true }) } + + /** + * Define hooks to be executed after a binding has been resolved + * from the container. + * + * The hooks are executed for + * + * - Bindings + * - Only once for singletons + * - And class constructor + * + * In other words, the hooks are not executed for direct values registered + * with the container + */ + resolved( + binding: Binding extends string | symbol ? Binding : never, + callback: HookCallback + ): void + resolved>( + binding: Binding, + callback: HookCallback> + ): void + resolved>( + binding: Binding, + callback: Binding extends Constructor + ? HookCallback + : Binding extends keyof KnownBindings + ? HookCallback + : never + ): void { + if (!this.#hooks.has(binding)) { + this.#hooks.set(binding, new Set()) + } + + const callbacks = this.#hooks.get(binding)! + callbacks.add(callback) + } } diff --git a/src/provider.ts b/src/provider.ts index 8ee964f..d3a57b4 100644 --- a/src/provider.ts +++ b/src/provider.ts @@ -1,5 +1,5 @@ import { ContainerResolver } from './resolver.js' -import { InspectableConstructor } from './types.js' +import type { InspectableConstructor } from './types.js' const primitiveConstructors = [String, Function, Object, Date, Number, Boolean] diff --git a/src/resolver.ts b/src/resolver.ts index 7b6eb94..a0e18d2 100644 --- a/src/resolver.ts +++ b/src/resolver.ts @@ -1,5 +1,13 @@ import { containerProvider } from './provider.js' -import type { Bindings, BindingValues, Constructor, ExtractFunctions, Make } from './types.js' +import type { + Make, + Hooks, + Bindings, + Constructor, + BindingValues, + ExtractFunctions, + ContainerOptions, +} from './types.js' const toString = Function.prototype.toString function isClass(value: any): value is Constructor { @@ -27,14 +35,56 @@ export class ContainerResolver> { */ #containerBindingValues: BindingValues + /** + * Reference to the container hooks + */ + #containerHooks: Hooks = new Map() + /** * Binding values local to the resolver */ #bindingValues: BindingValues = new Map() - constructor(bindings: Bindings, bindingValues: BindingValues) { + /** + * Container options + */ + #options: ContainerOptions + + constructor( + bindings: Bindings, + bindingValues: BindingValues, + hooks: Hooks, + options: ContainerOptions + ) { this.#containerBindings = bindings this.#containerBindingValues = bindingValues + this.#containerHooks = hooks + this.#options = options + } + + /** + * Notify emitter + */ + #emit(binding: string | symbol | Constructor, value: any) { + if (!this.#options.emitter) { + return + } + + this.#options.emitter.emit('container:resolve', { binding, value }) + } + + /** + * Execute hooks for a given binding + */ + async #execHooks(binding: string | symbol | Constructor, value: any) { + const callbacks = this.#containerHooks.get(binding) + if (!callbacks || callbacks.size === 0) { + return + } + + for (let callback of callbacks) { + await callback(value, this) + } } /** @@ -66,14 +116,18 @@ export class ContainerResolver> { * First priority is given to the RESOLVER binding values */ if (this.#bindingValues.has(binding)) { - return this.#bindingValues.get(binding) + const value = this.#bindingValues.get(binding) + this.#emit(binding, value) + return value } /** * Next priority is given to the CONTAINER binding values */ if (this.#containerBindingValues.has(binding)) { - return this.#containerBindingValues.get(binding) + const value = this.#containerBindingValues.get(binding) + this.#emit(binding, value) + return value } /** @@ -81,7 +135,7 @@ export class ContainerResolver> { */ if (this.#containerBindings.has(binding)) { const { resolver, isSingleton } = this.#containerBindings.get(binding)! - const value = await resolver(this) + const value = await resolver(this, runtimeValues) /** * Caching singletons @@ -90,6 +144,8 @@ export class ContainerResolver> { this.#containerBindingValues.set(binding, value) } + await this.#execHooks(binding, value) + this.#emit(binding, value) return value } @@ -99,7 +155,12 @@ export class ContainerResolver> { */ if (isAClass) { const dependencies = await containerProvider(binding, 'constructor', this, runtimeValues) - return new binding(...dependencies) as Promise> + const value = new binding(...dependencies) as Promise> + + await this.#execHooks(binding, value) + this.#emit(binding, value) + + return value } return binding as unknown as Promise> diff --git a/src/types.ts b/src/types.ts index ba85280..9a367e9 100644 --- a/src/types.ts +++ b/src/types.ts @@ -28,7 +28,8 @@ export type Make = T extends Constructor ? A : T * Shape of the binding resolver */ export type BindingResolver, Value> = ( - resolver: ContainerResolver + resolver: ContainerResolver, + runtimeValues?: any[] ) => Value | Promise /** @@ -43,3 +44,42 @@ export type Bindings = Map< * Shape of the registered binding values */ export type BindingValues = Map, any> + +/** + * The data emitted using the `container:resolve` event. If known bindings + * are defined, then the bindings and values will be correctly + * inferred. + */ +export type ContainerResolveEventData = + | { + binding: Constructor + value: unknown + } + | { + [K in keyof KnownBindings]: { + binding: K + value: KnownBindings[K] + } + }[keyof KnownBindings] + +/** + * Shape of the hooks callback + */ +export type HookCallback, Value> = ( + value: Value, + resolver: ContainerResolver +) => void | Promise + +/** + * Hooks can be registered for all the supported binding datatypes. + */ +export type Hooks = Map, Set>> + +/** + * Options accepted by the container class + */ +export type ContainerOptions = { + emitter?: { + emit(event: string | symbol, ...values: any[]): any + } +} From c4e9087ea0a6ee7631cce17edaa6864dd961f82a Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Sun, 18 Sep 2022 07:43:46 +0530 Subject: [PATCH 010/145] chore: add public api exports --- index.ts | 2 + package.json | 16 ++-- tests/container/events.spec.ts | 164 +++++++++++++++++++++++++++++++++ tests/container/hooks.spec.ts | 105 +++++++++++++++++++++ 4 files changed, 279 insertions(+), 8 deletions(-) create mode 100644 index.ts create mode 100644 tests/container/events.spec.ts create mode 100644 tests/container/hooks.spec.ts diff --git a/index.ts b/index.ts new file mode 100644 index 0000000..ca3846c --- /dev/null +++ b/index.ts @@ -0,0 +1,2 @@ +export { Container } from './src/container.js' +export { ContainerResolver } from './src/resolver.js' diff --git a/package.json b/package.json index 32702d2..c2e074d 100644 --- a/package.json +++ b/package.json @@ -2,13 +2,15 @@ "name": "@adonisjs/fold", "version": "8.2.0", "description": "Simplest and straight forward implementation for IoC container in JavaScript", - "main": "index.js", + "main": "build/index.js", "files": [ - "src", - "index.js" + "build/src", + "build/index.d.ts", + "build/index.js" ], "exports": { - ".": "./index.js" + ".": "./build/index.js", + "./types": "./build/src/types.js" }, "type": "module", "scripts": { @@ -53,6 +55,7 @@ "github-label-sync": "^2.2.0", "husky": "^8.0.1", "np": "^7.6.1", + "p-event": "^5.0.1", "prettier": "^2.7.1", "ts-node": "^10.8.1", "typescript": "^4.7.3" @@ -108,8 +111,5 @@ "bugs": { "url": "https://github.com/adonisjs/fold/issues" }, - "homepage": "https://github.com/adonisjs/fold#readme", - "dependencies": { - "@sindresorhus/is": "^5.3.0" - } + "homepage": "https://github.com/adonisjs/fold#readme" } diff --git a/tests/container/events.spec.ts b/tests/container/events.spec.ts new file mode 100644 index 0000000..796f6ae --- /dev/null +++ b/tests/container/events.spec.ts @@ -0,0 +1,164 @@ +import { test } from '@japa/runner' +import { EventEmitter } from 'node:events' +import { expectTypeOf } from 'expect-type' +import { pEvent, pEventMultiple } from 'p-event' + +import { Container } from '../../src/container.js' + +test.group('Container | Events', () => { + test('emit event when a binding is resolved', async ({ assert }) => { + const emitter = new EventEmitter() + const container = new Container({ emitter }) + class Route {} + + container.bind('route', () => { + return new Route() + }) + + const [event, route] = await Promise.all([ + pEvent(emitter, 'container:resolve'), + container.make('route'), + ]) + + expectTypeOf(route).toBeAny() + assert.instanceOf(route, Route) + assert.deepEqual(event, { binding: 'route', value: route }) + }) + + test('emit event when a singleton is resolved', async ({ assert }) => { + const emitter = new EventEmitter() + const container = new Container({ emitter }) + class Route {} + + container.singleton('route', () => { + return new Route() + }) + + const [event, route] = await Promise.all([ + pEvent(emitter, 'container:resolve'), + container.make('route'), + ]) + + expectTypeOf(route).toBeAny() + assert.instanceOf(route, Route) + assert.deepEqual(event, { binding: 'route', value: route }) + }) + + test('emit event when a singleton is resolved multiple times', async ({ assert }) => { + const emitter = new EventEmitter() + const container = new Container({ emitter }) + class Route {} + + container.singleton('route', () => { + return new Route() + }) + + const [event, route] = await Promise.all([ + pEvent(emitter, 'container:resolve'), + container.make('route'), + ]) + const [event1, route1] = await Promise.all([ + pEvent(emitter, 'container:resolve'), + container.make('route'), + ]) + + expectTypeOf(route).toBeAny() + assert.instanceOf(route, Route) + assert.deepEqual(event, { binding: 'route', value: route }) + assert.deepEqual(event1, { binding: 'route', value: route1 }) + }) + + test('emit event when a value is resolved', async ({ assert }) => { + const emitter = new EventEmitter() + const container = new Container({ emitter }) + class Route {} + + container.bindValue('route', new Route()) + + const [event, route] = await Promise.all([ + pEvent(emitter, 'container:resolve'), + container.make('route'), + ]) + + expectTypeOf(route).toBeAny() + assert.instanceOf(route, Route) + assert.deepEqual(event, { binding: 'route', value: route }) + }) + + test('do not emit when non class value is resolved', async ({ assert }) => { + const emitter = new EventEmitter() + const container = new Container({ emitter }) + + await assert.rejects( + async () => + await Promise.all([ + pEvent(emitter, 'container:resolve', { timeout: 100 }), + container.make('route'), + ]), + 'Promise timed out after 100 milliseconds' + ) + + await assert.rejects( + async () => + await Promise.all([ + pEvent(emitter, 'container:resolve', { timeout: 100 }), + container.make({ foo: 'bar' }), + ]), + 'Promise timed out after 100 milliseconds' + ) + + await assert.rejects( + async () => + await Promise.all([ + pEvent(emitter, 'container:resolve', { timeout: 100 }), + container.make([]), + ]), + 'Promise timed out after 100 milliseconds' + ) + }) + + test('emit event when class is constructed', async ({ assert }) => { + const emitter = new EventEmitter() + const container = new Container({ emitter }) + class Route {} + + const [event, route] = await Promise.all([ + pEvent(emitter, 'container:resolve'), + container.make(Route), + ]) + + expectTypeOf(route).toEqualTypeOf() + assert.instanceOf(route, Route) + assert.deepEqual(event, { binding: Route, value: route }) + }) + + test('emit event for nested dependencies', async ({ assert }) => { + const emitter = new EventEmitter() + const container = new Container({ emitter }) + + class Config {} + class Encryption { + static containerInjections = { + constructor: [Config], + } + } + class Route { + static containerInjections = { + constructor: [Encryption], + } + } + + const [events, route] = await Promise.all([ + pEventMultiple(emitter, 'container:resolve', { count: 3 }), + container.make(Route), + ]) + + expectTypeOf(route).toEqualTypeOf() + assert.instanceOf(route, Route) + assert.lengthOf(events, 3) + + assert.deepEqual(events[0], { binding: Config, value: new Config() }) + assert.deepEqual(events[1], { binding: Encryption, value: new Encryption() }) + assert.deepEqual(events[2], { binding: Route, value: route }) + }) +}) diff --git a/tests/container/hooks.spec.ts b/tests/container/hooks.spec.ts new file mode 100644 index 0000000..bf953b6 --- /dev/null +++ b/tests/container/hooks.spec.ts @@ -0,0 +1,105 @@ +import { test } from '@japa/runner' +import { EventEmitter } from 'node:events' +import { expectTypeOf } from 'expect-type' + +import { Container } from '../../src/container.js' + +test.group('Container | Hooks', () => { + test('run hook when a binding a resolved', async ({ assert }) => { + const emitter = new EventEmitter() + const container = new Container<{ route: Route }>({ emitter }) + class Route { + pattern: string + } + + container.bind('route', () => { + return new Route() + }) + + container.resolved('route', (route) => { + expectTypeOf(route).toEqualTypeOf() + route.pattern = '/' + }) + + const route = await container.make('route') + expectTypeOf(route).toEqualTypeOf() + + assert.instanceOf(route, Route) + assert.equal(route.pattern, '/') + }) + + test('run hook only once when a singleton resolved', async ({ assert }) => { + const emitter = new EventEmitter() + const container = new Container<{ route: Route }>({ emitter }) + class Route { + invocations: number = 0 + } + + container.bind('route', () => { + return new Route() + }) + + container.resolved('route', (route) => { + expectTypeOf(route).toEqualTypeOf() + route.invocations++ + }) + + await container.make('route') + await container.make('route') + await container.make('route') + + const route = await container.make('route') + expectTypeOf(route).toEqualTypeOf() + + assert.instanceOf(route, Route) + assert.equal(route.invocations, 1) + }) + + test('do not run hooks when values are resolved', async ({ assert }) => { + const emitter = new EventEmitter() + const container = new Container<{ route: Route }>({ emitter }) + class Route { + invocations: number = 0 + } + + container.bindValue('route', new Route()) + + container.resolved('route', (route) => { + expectTypeOf(route).toEqualTypeOf() + route.invocations++ + }) + + await container.make('route') + await container.make('route') + await container.make('route') + + const route = await container.make('route') + expectTypeOf(route).toEqualTypeOf() + + assert.instanceOf(route, Route) + assert.equal(route.invocations, 0) + }) + + test('run hooks when classes are constructed', async ({ assert }) => { + const emitter = new EventEmitter() + const container = new Container({ emitter }) + class Route { + invocations: number = 0 + } + + container.resolved(Route, (route) => { + expectTypeOf(route).toEqualTypeOf() + route.invocations++ + }) + + await container.make('route') + await container.make('route') + await container.make('route') + + const route = await container.make(Route) + expectTypeOf(route).toEqualTypeOf() + + assert.instanceOf(route, Route) + assert.equal(route.invocations, 1) + }) +}) From 7d904f4691fd006404c5ed4b4397a6ef92883b17 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Sun, 18 Sep 2022 11:54:58 +0530 Subject: [PATCH 011/145] refactor: code cleanup --- README.md | 118 +++++++++++++++---------------- index.ts | 9 +++ package.json | 1 + src/container.ts | 101 +++++++++++++++++++++----- src/helpers.ts | 20 ++++++ src/provider.ts | 9 +++ src/resolver.ts | 72 ++++++++++++++++--- src/types.ts | 44 +++++++++++- tests/container/bindings.spec.ts | 18 ++--- tests/container/hooks.spec.ts | 8 +-- tests/resolver.spec.ts | 29 ++++++++ 11 files changed, 323 insertions(+), 106 deletions(-) create mode 100644 src/helpers.ts diff --git a/README.md b/README.md index 40963bb..7339d1e 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,8 @@ Therefore, with this project, I live to the ethos of JavaScript and yet build a I have explained the [reasons for using an IoC container](https://github.com/thetutlage/meta/discussions/4) in this post. It might be a great idea to read the post first ✌️ +> **Note**: AdonisJS fold is highly inspired by the Laravel IoC container. Thanks to Taylor for imaginging such a simple, yet powerful API. + ## Goals of the project - **Keep the code visually pleasing**. If you have used any other implementation of an IoC container, you will automatically find `@adonisjs/fold` easy to read and follow. @@ -35,7 +37,7 @@ yarn add @adonisjs/fold pnpm add @adonisjs/fold ``` -Once done, you can import the `Container` class from the package and create an instance. For the most part, you will use a single instance of the container. +Once done, you can import the `Container` class from the package and create an instance of it. For the most part, you will use a single instance of the container. ```ts import { Container } from '@adonisjs/fold' @@ -44,7 +46,7 @@ const container = new Container() ``` ## Making classes -You can construct an instance of a class by calling the `container.make` method. The method is asynchronous since it allows for lazy load dependencies in factory functions (More on factory functions later). +You can construct an instance of a class by calling the `container.make` method. The method is asynchronous since it allows for lazy loading dependencies via factory functions (More on factory functions later). ```ts class UserService {} @@ -182,9 +184,10 @@ await container.call(service, 'find') The **runtime values** are also supported with the `container.call` method. ## Container bindings -Alongside making class instances, you can also register bindings inside the container. +Alongside making class instances, you can also register bindings inside the container. Bindings are simple key-value pairs. -Bindings are simple key-value pairs. The value is a factory function invoked when someone resolves the binding from the container. +- The key can either be a `string`, a `symbol` or a `class constructor`. +- The value is a factory function invoked when someone resolves the binding from the container. ```ts const container = new Container() @@ -197,9 +200,7 @@ const db = await container.make('db') assert(db instanceof Database) ``` -I used a string-based key for the binding name in the previous example. However, you can also bind `Symbols` or maybe the `class constructor` directly. - -> **Warning**: The container binding can either be a `string`, a `symbol` or a `class constructor`. +Following is an example of binding the class constructor to the container and self constructing an instance of it using the factory function. ```ts container.bind(Database, () => { @@ -207,8 +208,6 @@ container.bind(Database, () => { }) ``` -Now, when someone calls `container.make(Database)`, the container will invoke the factory function and uses its return value. So basically, you have taken over the construction of a class from the container. - ### Factory function arguments The factory receives the following three arguments. @@ -260,78 +259,49 @@ You can pass an instance of the [EventEmitter](https://nodejs.org/dist/latest-v1 import { EventEmitter } from 'node:events' const emitter = new EventEmitter() -emitter.on('container:make', ({ value, binding }) => { +emitter.on('container:resolve', ({ value, binding }) => { // value is the resolved value - // binding name can be a mix of string, class constructors, and symbols. + // binding name can be a mix of string, class constructor, or a symbol. }) const container = new Container({ emitter }) ``` -> **Note**: Events are not emitted for the runtime values since the container does not resolve them. However, they are emitted by the runtime bindings. +## Container hooks +You can use container hooks when you want to modify a resolved value before it is returned from the `make` method. -## Debugging container -You can define a function to log the lookup calls as the container attempts to resolve dependencies. +- The hook is called everytime a binding is resolved from the container. +- It is called only once for the singleton bindings. +- The hook gets called everytime you construct an instance of a class by passing the class constructor directly. -The logs are individual objects with the parent id and the resolution status. +> **Note**: The hook callback can also be an async function ```ts -const container = new Container({ - log: function (data) { - logger.trace(data) - } +container.resolving(Validator, (validator) => { + validate.rule('email', function () {}) }) ``` -```ts -// Resolved -{ - id: 2, - parentId: 1, - binding: Database, - value: new Database(), - method: "constructor", - position: 0 - status: 'resolved' - error: null, -} - -// Error -{ - id: 2, - parentId: 1, - binding: Database, - value: null, - method: "constructor", - position: 0 - status: 'error' - error: new Error('Unable to resolve Database binding'), -} -``` - -- `id` is the unique id for the resolution. They are only generated when a logger is attached. -- `parentId` is the unique id of the parent for which the dependency is getting resolved. -- `binding` is the binding to resolve. -- `value` is the resolved value. -- `method` is the method name in which we will inject the resolved value. -- `position` is the argument position in which we will inject the value. -- `status` is the resolution status. -- `error` exists only when the status is an error. - ## Container providers -Container providers are static functions that can live on a class to resolve the injections for a given method. +Container providers are static functions that can live on a class to resolve the dependencies for the class constructor or a given class method. + +Once, you define the `containerProvider` on the class, the IoC container will rely on it for resolving dependencies and will not use the default provider. ```ts import { ContainerResolver } from '@adonisjs/fold' -import { InspectableConstructor } from '@adonisjs/fold/types' +import { ContainerProvider } from '@adonisjs/fold/types' class UsersController { - static containerProvider( - binding: InspectableConstructor, - property: string | symbol | number, - resolver: ContainerResolver, - runtimeValues?: any[] - ) { + static containerProvider: ContainerProvider = ( + binding, + property, + resolver, + defaultProvider, + runtimeValues + ) => { + console.log(binding === UserService) + console.log(this === UserService) + return defaultProvider(binding, property, resolver, runtimeValues) } } ``` @@ -357,6 +327,30 @@ However, in this case, we want more than just creating an instance of the model. This is where the `@bind` decorator comes into the picture. To perform database lookups, it registers a custom provider on the `UsersController` class. +## Binding types +If you are using the container inside a TypeScript project, then you can define the types for all the bindings in advance at the time of creating the container instance. + +Defining types will ensure the `bind`, `singleton` and `bindValue` method accepts only the known bindings and assert their types as well. + +```ts +class Route {} +class Databse {} + +type ContainerBindings = { + route: Route + db: Database +} + +const container = new Container() + +// Fully typed +container.bind('route', () => new Route()) +container.bind('db', () => new Database()) + +// Fully typed - db: Database +const db = await container.make('db') +``` + [gh-workflow-image]: https://img.shields.io/github/workflow/status/adonisjs/fold/test?style=for-the-badge [gh-workflow-url]: https://github.com/adonisjs/fold/actions/workflows/test.yml "Github action" diff --git a/index.ts b/index.ts index ca3846c..b495f7d 100644 --- a/index.ts +++ b/index.ts @@ -1,2 +1,11 @@ +/* + * @adonisjs/fold + * + * (c) AdonisJS + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + export { Container } from './src/container.js' export { ContainerResolver } from './src/resolver.js' diff --git a/package.json b/package.json index c2e074d..98c2590 100644 --- a/package.json +++ b/package.json @@ -60,6 +60,7 @@ "ts-node": "^10.8.1", "typescript": "^4.7.3" }, + "dependencies": {}, "eslintConfig": { "extends": [ "plugin:adonis/typescriptPackage", diff --git a/src/container.ts b/src/container.ts index 52adec8..e3ae237 100644 --- a/src/container.ts +++ b/src/container.ts @@ -1,7 +1,17 @@ +/* + * @adonisjs/fold + * + * (c) AdonisJS + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + import type { Make, Hooks, Bindings, + BindingKey, Constructor, HookCallback, BindingValues, @@ -9,13 +19,9 @@ import type { ExtractFunctions, ContainerOptions, } from './types.js' +import { isClass } from './helpers.js' import { ContainerResolver } from './resolver.js' -const toString = Function.prototype.toString -function isClass(value: any): value is Constructor { - return typeof value === 'function' && /^class\s/.test(toString.call(value)) -} - /** * The container class exposes the API to register bindings, values * and resolve them. @@ -26,6 +32,13 @@ function isClass(value: any): value is Constructor { * ```ts * new Container<{ 'route': Route, encryption: Encryption }>() * ``` + * + * You can resolve bindings and construct classes as follows + * + * ```ts + * await container.make(BINDING_NAME) + * await container.make(CLASS_CONSTRUCTOR) + * ``` */ export class Container> { /** @@ -39,6 +52,9 @@ export class Container> { */ #bindingValues: BindingValues = new Map() + /** + * Registered hooks. + */ #hooks: Hooks = new Map() /** @@ -52,19 +68,37 @@ export class Container> { /** * Create a container resolver to resolve bindings, or make classes. + * + * ```ts + * const resolver = container.createResolver() + * await resolver.make(CLASS_CONSTRUCTOR) + * ``` + * + * Bind values with the resolver. Resolver values are isolated from the + * container. + * + * ```ts + * resolver.bindValue(HttpContext, new HttpContext()) + * await resolver.make(UsersController) + * ``` */ createResolver() { return new ContainerResolver(this.#bindings, this.#bindingValues, this.#hooks, this.#options) } /** - * Resolve the binding as follows. + * Resolves the binding or constructor a class instance as follows. * * - Resolve the binding from the values (if registered) * - Resolve the binding from the bindings (if registered) * - If binding is a class, then create a instance of it. The constructor * dependencies are further resolved as well. * - All other values are returned as it is. + * + * ```ts + * await container.make('route') + * await container.make(Database) + * ``` */ make( binding: Binding, @@ -76,9 +110,15 @@ export class Container> { } /** - * Call a method on an object by injecting its dependencies + * Call a method on an object by injecting its dependencies. The method + * dependencies are resolved in the same manner as a class constructor + * dependencies. + * + * ```ts + * await container.call(await container.make(UsersController), 'index') + * ``` */ - async call, Method extends ExtractFunctions>( + call, Method extends ExtractFunctions>( value: Value, method: Method, runtimeValues?: any[] @@ -87,10 +127,22 @@ export class Container> { } /** - * Register a binding with the resolver factory function. + * Register a binding inside the container. The method receives a + * key-value pair. + * + * - Key can be a string, symbol or a constructor. + * - The value is always a factory function to construct the dependency. * * ```ts + * container.bind('route', () => new Route()) + * await container.make('route') + * * container.bind(Route, () => new Route()) + * await container.make(Route) + * + * const routeSymbol = Symbol('route') + * container.bind(routeSymbol, () => new Route()) + * await container.make(routeSymbol) * ``` */ bind( @@ -116,7 +168,9 @@ export class Container> { > ): void { if (typeof binding !== 'string' && typeof binding !== 'symbol' && !isClass(binding)) { - throw new Error(`A binding name either be a string, symbol or class constructor`) + throw new Error( + `Invalid binding key type. Only "string", "symbol" and "class constructor" is accepted` + ) } this.#bindings.set(binding, { resolver, isSingleton: false }) @@ -146,18 +200,29 @@ export class Container> { : never ): void { if (typeof binding !== 'string' && typeof binding !== 'symbol' && !isClass(binding)) { - throw new Error(`A binding name either be a string, symbol or class constructor`) + throw new Error( + `Invalid binding key type. Only "string", "symbol" and "class constructor" is accepted` + ) } this.#bindingValues.set(binding, value) } /** - * Register a binding as a singleton with - * the resolver factory function. + * Register a binding as a single. The singleton method is same + * as the bind method, but the factory function is invoked + * only once. * * ```ts + * container.singleton('route', () => new Route()) + * await container.make('route') + * * container.singleton(Route, () => new Route()) + * await container.make(Route) + * + * const routeSymbol = Symbol('route') + * container.singleton(routeSymbol, () => new Route()) + * await container.make(routeSymbol) * ``` */ singleton( @@ -183,7 +248,9 @@ export class Container> { > ): void { if (typeof binding !== 'string' && typeof binding !== 'symbol' && !isClass(binding)) { - throw new Error(`A binding name either be a string, symbol or class constructor`) + throw new Error( + `Invalid binding key type. Only "string", "symbol" and "class constructor" is accepted` + ) } this.#bindings.set(binding, { resolver, isSingleton: true }) @@ -202,15 +269,15 @@ export class Container> { * In other words, the hooks are not executed for direct values registered * with the container */ - resolved( + resolving( binding: Binding extends string | symbol ? Binding : never, callback: HookCallback ): void - resolved>( + resolving>( binding: Binding, callback: HookCallback> ): void - resolved>( + resolving( binding: Binding, callback: Binding extends Constructor ? HookCallback diff --git a/src/helpers.ts b/src/helpers.ts new file mode 100644 index 0000000..2b0b5d9 --- /dev/null +++ b/src/helpers.ts @@ -0,0 +1,20 @@ +/* + * @adonisjs/fold + * + * (c) AdonisJS + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import type { Constructor } from './types.js' + +const toString = Function.prototype.toString + +/** + * Type guard and check if value is a class constructor. Plain old + * functions are not considered as class constructor. + */ +export function isClass(value: any): value is Constructor { + return typeof value === 'function' && /^class\s/.test(toString.call(value)) +} diff --git a/src/provider.ts b/src/provider.ts index d3a57b4..70b04fd 100644 --- a/src/provider.ts +++ b/src/provider.ts @@ -1,3 +1,12 @@ +/* + * @adonisjs/fold + * + * (c) AdonisJS + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + import { ContainerResolver } from './resolver.js' import type { InspectableConstructor } from './types.js' diff --git a/src/resolver.ts b/src/resolver.ts index a0e18d2..e22dff7 100644 --- a/src/resolver.ts +++ b/src/resolver.ts @@ -1,4 +1,12 @@ -import { containerProvider } from './provider.js' +/* + * @adonisjs/fold + * + * (c) AdonisJS + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + import type { Make, Hooks, @@ -7,15 +15,23 @@ import type { BindingValues, ExtractFunctions, ContainerOptions, + InspectableConstructor, } from './types.js' - -const toString = Function.prototype.toString -function isClass(value: any): value is Constructor { - return typeof value === 'function' && /^class\s/.test(toString.call(value)) -} +import { isClass } from './helpers.js' +import { containerProvider } from './provider.js' /** - * Container resolver exposes the APIs to resolve bindings. + * Container resolver exposes the APIs to resolve bindings. You can think + * of resolver as an isolated container instance, with only the APIs + * to resolve bindings. + * + * ```ts + * const container = new Container() + * const resolver = container.createResolver() + * + * await resolver.make(BINDING_NAME) + * await resolver.make(CLASS_CONSTRUCTOR) + * ``` */ export class ContainerResolver> { /** @@ -62,6 +78,13 @@ export class ContainerResolver> { this.#options = options } + /** + * Returns the provider for the class constructor + */ + #getBindingProvider(binding: InspectableConstructor) { + return binding.containerProvider + } + /** * Notify emitter */ @@ -88,13 +111,18 @@ export class ContainerResolver> { } /** - * Resolve the binding as follows. + * Resolves the binding or constructor a class instance as follows. * * - Resolve the binding from the values (if registered) * - Resolve the binding from the bindings (if registered) * - If binding is a class, then create a instance of it. The constructor * dependencies are further resolved as well. * - All other values are returned as it is. + * + * ```ts + * await resolver.make('route') + * await resolver.make(Database) + * ``` */ make( binding: Binding, @@ -154,7 +182,21 @@ export class ContainerResolver> { * dependencies. */ if (isAClass) { - const dependencies = await containerProvider(binding, 'constructor', this, runtimeValues) + let dependencies: any[] = [] + + const bindingProvider = this.#getBindingProvider(binding) + if (bindingProvider) { + dependencies = await bindingProvider( + binding, + 'constructor', + this, + containerProvider, + runtimeValues + ) + } else { + dependencies = await containerProvider(binding, 'constructor', this, runtimeValues) + } + const value = new binding(...dependencies) as Promise> await this.#execHooks(binding, value) @@ -167,7 +209,13 @@ export class ContainerResolver> { } /** - * Call a method on an object by injecting its dependencies + * Call a method on an object by injecting its dependencies. The method + * dependencies are resolved in the same manner as a class constructor + * dependencies. + * + * ```ts + * await resolver.call(await resolver.make(UsersController), 'index') + * ``` */ async call, Method extends ExtractFunctions>( value: Value, @@ -206,7 +254,9 @@ export class ContainerResolver> { : never ): void { if (typeof binding !== 'string' && typeof binding !== 'symbol' && !isClass(binding)) { - throw new Error(`A binding name either be a string, symbol or class constructor`) + throw new Error( + `Invalid binding key type. Only "string", "symbol" and "class constructor" is accepted` + ) } this.#bindingValues.set(binding, value) diff --git a/src/types.ts b/src/types.ts index 9a367e9..8dbf103 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,3 +1,12 @@ +/* + * @adonisjs/fold + * + * (c) AdonisJS + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + import { ContainerResolver } from './resolver.js' /** @@ -17,6 +26,7 @@ export type Constructor = new (...args: any[]) => T */ export type InspectableConstructor = Function & { containerInjections?: Record + containerProvider?: ContainerProvider } /** @@ -24,6 +34,11 @@ export type InspectableConstructor = Function & { */ export type Make = T extends Constructor ? A : T +/** + * Accepted values for the binding key + */ +export type BindingKey = string | symbol | Constructor + /** * Shape of the binding resolver */ @@ -36,14 +51,14 @@ export type BindingResolver, Value> = ( * Shape of the registered bindings */ export type Bindings = Map< - string | symbol | Constructor, + BindingKey, { resolver: BindingResolver, any>; isSingleton: boolean } > /** * Shape of the registered binding values */ -export type BindingValues = Map, any> +export type BindingValues = Map /** * The data emitted using the `container:resolve` event. If known bindings @@ -73,7 +88,30 @@ export type HookCallback, Value> = ( /** * Hooks can be registered for all the supported binding datatypes. */ -export type Hooks = Map, Set>> +export type Hooks = Map>> + +/** + * The default implementation of the container + * provider. + */ +export type DefaultContainerProvider = ( + binding: InspectableConstructor, + property: string | symbol | number, + resolver: ContainerResolver, + runtimeValues?: any[] +) => Promise + +/** + * The container provider to discover and build dependencies + * for the constructor or the class method. + */ +export type ContainerProvider = ( + binding: InspectableConstructor, + property: string | symbol | number, + resolver: ContainerResolver, + defaultProvider: DefaultContainerProvider, + runtimeValues?: any[] +) => Promise /** * Options accepted by the container class diff --git a/tests/container/bindings.spec.ts b/tests/container/bindings.spec.ts index 19aa491..357e5a5 100644 --- a/tests/container/bindings.spec.ts +++ b/tests/container/bindings.spec.ts @@ -60,19 +60,19 @@ test.group('Container | Bindings', () => { assert.throws( // @ts-expect-error () => container.bind(1, () => {}), - 'A binding name either be a string, symbol or class constructor' + 'Invalid binding key type. Only "string", "symbol" and "class constructor" is accepted' ) assert.throws( // @ts-expect-error () => container.bind([], () => {}), - 'A binding name either be a string, symbol or class constructor' + 'Invalid binding key type. Only "string", "symbol" and "class constructor" is accepted' ) assert.throws( // @ts-expect-error () => container.bind({}, () => {}), - 'A binding name either be a string, symbol or class constructor' + 'Invalid binding key type. Only "string", "symbol" and "class constructor" is accepted' ) }) @@ -153,19 +153,19 @@ test.group('Container | Bindings Singleton', () => { assert.throws( // @ts-expect-error () => container.singleton(1, () => {}), - 'A binding name either be a string, symbol or class constructor' + 'Invalid binding key type. Only "string", "symbol" and "class constructor" is accepted' ) assert.throws( // @ts-expect-error () => container.singleton([], () => {}), - 'A binding name either be a string, symbol or class constructor' + 'Invalid binding key type. Only "string", "symbol" and "class constructor" is accepted' ) assert.throws( // @ts-expect-error () => container.singleton({}, () => {}), - 'A binding name either be a string, symbol or class constructor' + 'Invalid binding key type. Only "string", "symbol" and "class constructor" is accepted' ) }) @@ -275,19 +275,19 @@ test.group('Container | Binding values', () => { assert.throws( // @ts-expect-error () => container.bindValue(1, 1), - 'A binding name either be a string, symbol or class constructor' + 'Invalid binding key type. Only "string", "symbol" and "class constructor" is accepted' ) assert.throws( // @ts-expect-error () => container.bindValue([], 1), - 'A binding name either be a string, symbol or class constructor' + 'Invalid binding key type. Only "string", "symbol" and "class constructor" is accepted' ) assert.throws( // @ts-expect-error () => container.bindValue({}, 1), - 'A binding name either be a string, symbol or class constructor' + 'Invalid binding key type. Only "string", "symbol" and "class constructor" is accepted' ) }) }) diff --git a/tests/container/hooks.spec.ts b/tests/container/hooks.spec.ts index bf953b6..ee395b2 100644 --- a/tests/container/hooks.spec.ts +++ b/tests/container/hooks.spec.ts @@ -16,7 +16,7 @@ test.group('Container | Hooks', () => { return new Route() }) - container.resolved('route', (route) => { + container.resolving('route', (route) => { expectTypeOf(route).toEqualTypeOf() route.pattern = '/' }) @@ -39,7 +39,7 @@ test.group('Container | Hooks', () => { return new Route() }) - container.resolved('route', (route) => { + container.resolving('route', (route) => { expectTypeOf(route).toEqualTypeOf() route.invocations++ }) @@ -64,7 +64,7 @@ test.group('Container | Hooks', () => { container.bindValue('route', new Route()) - container.resolved('route', (route) => { + container.resolving('route', (route) => { expectTypeOf(route).toEqualTypeOf() route.invocations++ }) @@ -87,7 +87,7 @@ test.group('Container | Hooks', () => { invocations: number = 0 } - container.resolved(Route, (route) => { + container.resolving(Route, (route) => { expectTypeOf(route).toEqualTypeOf() route.invocations++ }) diff --git a/tests/resolver.spec.ts b/tests/resolver.spec.ts index 5725490..ad30241 100644 --- a/tests/resolver.spec.ts +++ b/tests/resolver.spec.ts @@ -1,6 +1,7 @@ import { test } from '@japa/runner' import { expectTypeOf } from 'expect-type' import { Container } from '../src/container.js' +import { ContainerProvider } from '../src/types.js' test.group('Resolver', () => { test('give priority to resolver values over binding values', async ({ assert }) => { @@ -26,4 +27,32 @@ test.group('Resolver', () => { assert.strictEqual(resolvedService, service1) assert.strictEqual(resolvedService.name, 'resolver_service') }) + + test('use custom containerProvider from the class constructor', async ({ assert }) => { + assert.plan(4) + + class UserService { + static containerProvider: ContainerProvider = ( + binding, + property, + resolver, + defaultProvider, + runtimeValues + ) => { + assert.deepEqual(binding, UserService) + assert.deepEqual(this, UserService) + assert.equal(property, 'constructor') + return defaultProvider(binding, property, resolver, runtimeValues) + } + name: string + } + + const container = new Container() + const resolver = container.createResolver() + + const resolvedService = await resolver.make(UserService) + + expectTypeOf(resolvedService).toEqualTypeOf() + assert.instanceOf(resolvedService, UserService) + }) }) From f9f458235e92c00047d9a92b8dc87ccaa77d2657 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Sun, 18 Sep 2022 12:55:52 +0530 Subject: [PATCH 012/145] feat: add inject decorator --- index.ts | 1 + package.json | 2 +- src/decorators/inject.ts | 69 ++++++++++++++ src/resolver.ts | 4 +- tests/container/events.spec.ts | 4 +- tests/container/known_make_class.spec.ts | 8 +- tests/container/make_class.spec.ts | 8 +- tests/container/make_class_via_inject.spec.ts | 92 +++++++++++++++++++ tests/resolver.spec.ts | 2 +- tsconfig.json | 2 + 10 files changed, 178 insertions(+), 14 deletions(-) create mode 100644 src/decorators/inject.ts create mode 100644 tests/container/make_class_via_inject.spec.ts diff --git a/index.ts b/index.ts index b495f7d..36d8164 100644 --- a/index.ts +++ b/index.ts @@ -8,4 +8,5 @@ */ export { Container } from './src/container.js' +export { inject } from './src/decorators/inject.js' export { ContainerResolver } from './src/resolver.js' diff --git a/package.json b/package.json index 98c2590..8363181 100644 --- a/package.json +++ b/package.json @@ -57,10 +57,10 @@ "np": "^7.6.1", "p-event": "^5.0.1", "prettier": "^2.7.1", + "reflect-metadata": "^0.1.13", "ts-node": "^10.8.1", "typescript": "^4.7.3" }, - "dependencies": {}, "eslintConfig": { "extends": [ "plugin:adonis/typescriptPackage", diff --git a/src/decorators/inject.ts b/src/decorators/inject.ts new file mode 100644 index 0000000..255b67b --- /dev/null +++ b/src/decorators/inject.ts @@ -0,0 +1,69 @@ +/* + * @adonisjs/fold + * + * (c) AdonisJS + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Initiating the "containerInjections" property on the target, which is assumed + * to be the class constructor. + */ +function initiateContainerInjections(target: any, method: string | symbol) { + if (!target.hasOwnProperty('containerInjections')) { + Object.defineProperty(target, 'containerInjections', { + value: {}, + }) + } + + target.containerInjections[method] = target.containerInjections[method] || [] +} + +/** + * Defining the injections for the constructor of the class using + * reflection + */ +function defineConstructorInjections(target: any) { + const params = Reflect.getMetadata('design:paramtypes', target) + if (!params) { + return + } + + initiateContainerInjections(target, '_constructor') + for (const param of params) { + target.containerInjections._constructor.push(param) + } +} + +/** + * Defining the injections for the class instance method + */ +function defineMethodInjections(target: any, method: string | symbol) { + const constructor = target.constructor + const params = Reflect.getMetadata('design:paramtypes', target, method) + if (!params) { + return + } + + initiateContainerInjections(constructor, method) + for (const param of params) { + constructor.containerInjections[method].push(param) + } +} + +export function inject() { + function injectDecorator(target: C): void + function injectDecorator(target: any, propertyKey: string | symbol): void + function injectDecorator(target: any, propertyKey?: string | symbol): void { + if (!propertyKey) { + defineConstructorInjections(target) + return + } + + defineMethodInjections(target, propertyKey) + } + + return injectDecorator +} diff --git a/src/resolver.ts b/src/resolver.ts index e22dff7..ac3d616 100644 --- a/src/resolver.ts +++ b/src/resolver.ts @@ -188,13 +188,13 @@ export class ContainerResolver> { if (bindingProvider) { dependencies = await bindingProvider( binding, - 'constructor', + '_constructor', this, containerProvider, runtimeValues ) } else { - dependencies = await containerProvider(binding, 'constructor', this, runtimeValues) + dependencies = await containerProvider(binding, '_constructor', this, runtimeValues) } const value = new binding(...dependencies) as Promise> diff --git a/tests/container/events.spec.ts b/tests/container/events.spec.ts index 796f6ae..9dbc8f4 100644 --- a/tests/container/events.spec.ts +++ b/tests/container/events.spec.ts @@ -139,12 +139,12 @@ test.group('Container | Events', () => { class Config {} class Encryption { static containerInjections = { - constructor: [Config], + _constructor: [Config], } } class Route { static containerInjections = { - constructor: [Encryption], + _constructor: [Encryption], } } diff --git a/tests/container/known_make_class.spec.ts b/tests/container/known_make_class.spec.ts index 54d260d..ff5c2a3 100644 --- a/tests/container/known_make_class.spec.ts +++ b/tests/container/known_make_class.spec.ts @@ -81,7 +81,7 @@ test.group('Container | Make class | Known bindings', () => { class UserService { static containerInjections = { - constructor: [Database], + _constructor: [Database], } constructor(public db: Database) {} } @@ -99,7 +99,7 @@ test.group('Container | Make class | Known bindings', () => { args: any[] static containerInjections = { - constructor: [{ foo: 'bar' }, 1, ['foo'], false, undefined, null, false], + _constructor: [{ foo: 'bar' }, 1, ['foo'], false, undefined, null, false], } constructor(...args: any[]) { this.args = args @@ -119,7 +119,7 @@ test.group('Container | Make class | Known bindings', () => { }) => { class UserService { static containerInjections = { - constructor: [], + _constructor: [], } constructor(public name: string) {} } @@ -137,7 +137,7 @@ test.group('Container | Make class | Known bindings', () => { args: any[] static containerInjections = { - constructor: [String], + _constructor: [String], } constructor() {} } diff --git a/tests/container/make_class.spec.ts b/tests/container/make_class.spec.ts index 033b901..5afdbb6 100644 --- a/tests/container/make_class.spec.ts +++ b/tests/container/make_class.spec.ts @@ -81,7 +81,7 @@ test.group('Container | Make class', () => { class UserService { static containerInjections = { - constructor: [Database], + _constructor: [Database], } constructor(public db: Database) {} } @@ -99,7 +99,7 @@ test.group('Container | Make class', () => { args: any[] static containerInjections = { - constructor: [{ foo: 'bar' }, 1, ['foo'], false, undefined, null, false], + _constructor: [{ foo: 'bar' }, 1, ['foo'], false, undefined, null, false], } constructor(...args: any[]) { this.args = args @@ -119,7 +119,7 @@ test.group('Container | Make class', () => { }) => { class UserService { static containerInjections = { - constructor: [], + _constructor: [], } constructor(public name: string) {} } @@ -137,7 +137,7 @@ test.group('Container | Make class', () => { args: any[] static containerInjections = { - constructor: [String], + _constructor: [String], } constructor() {} } diff --git a/tests/container/make_class_via_inject.spec.ts b/tests/container/make_class_via_inject.spec.ts new file mode 100644 index 0000000..c4df3ef --- /dev/null +++ b/tests/container/make_class_via_inject.spec.ts @@ -0,0 +1,92 @@ +import 'reflect-metadata' +import { test } from '@japa/runner' +import { expectTypeOf } from 'expect-type' +import { Container } from '../../src/container.js' +import { inject } from '../../src/decorators/inject.js' + +test.group('Container | Make class via inject', () => { + test('inject constructor dependencies using @inject', async ({ assert }) => { + class Database {} + + @inject() + class UserService { + constructor(public db: Database) {} + } + + const container = new Container() + const service = await container.make(UserService) + + expectTypeOf(service).toEqualTypeOf() + assert.instanceOf(service, UserService) + assert.instanceOf(service.db, Database) + }) + + test('inject primitive values as it is', async ({ assert }) => { + @inject() + class UserService { + args: any[] + + constructor(...args: any[]) { + this.args = args + } + } + + const container = new Container() + const service = await container.make(UserService) + + assert.instanceOf(service, UserService) + expectTypeOf(service).toEqualTypeOf() + assert.deepEqual(service.args, [Array]) + }) + + test('construct nested dependencies', async ({ assert }) => { + class Config {} + + @inject() + class Encryption { + constructor(public config: Config) {} + } + + @inject() + class UserService { + constructor(public encryption: Encryption) {} + } + + const container = new Container() + const service = await container.make(UserService) + + assert.instanceOf(service, UserService) + expectTypeOf(service).toEqualTypeOf() + + assert.instanceOf(service.encryption, Encryption) + expectTypeOf(service.encryption).toEqualTypeOf() + + assert.instanceOf(service.encryption.config, Config) + expectTypeOf(service.encryption.config).toEqualTypeOf() + }) + + test('construct method dependencies', async ({ assert }) => { + class Config {} + + @inject() + class Encryption { + constructor(public config: Config) {} + } + + class UserService { + @inject() + find(encryption: Encryption) { + return encryption + } + } + + const container = new Container() + const encryption = await container.call(await container.make(UserService), 'find') + + assert.instanceOf(encryption, Encryption) + expectTypeOf(encryption).toEqualTypeOf() + + assert.instanceOf(encryption.config, Config) + expectTypeOf(encryption.config).toEqualTypeOf() + }) +}) diff --git a/tests/resolver.spec.ts b/tests/resolver.spec.ts index ad30241..63473cc 100644 --- a/tests/resolver.spec.ts +++ b/tests/resolver.spec.ts @@ -41,7 +41,7 @@ test.group('Resolver', () => { ) => { assert.deepEqual(binding, UserService) assert.deepEqual(this, UserService) - assert.equal(property, 'constructor') + assert.equal(property, '_constructor') return defaultProvider(binding, property, resolver, runtimeValues) } name: string diff --git a/tsconfig.json b/tsconfig.json index a09dfa7..5729388 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -9,6 +9,8 @@ "removeComments": true, "declaration": true, "rootDir": "./", + "experimentalDecorators": true, + "emitDecoratorMetadata": true, "outDir": "./build", "strictNullChecks": true, "allowSyntheticDefaultImports": true, From 11290126e026887c333a7467967b3ade7a3081d5 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Sun, 18 Sep 2022 12:57:31 +0530 Subject: [PATCH 013/145] chore: publish under next tag --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 8363181..f3ed5a8 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ }, "publishConfig": { "access": "public", - "tag": "latest" + "tag": "next" }, "keywords": [ "ioc", @@ -98,7 +98,7 @@ }, "np": { "message": "chore(release): %s", - "tag": "latest", + "tag": "next", "branch": "main", "anyBranch": false }, From d2a51cabab44b443f7f233d3d30bb81ab01ce91d Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Sun, 18 Sep 2022 14:06:02 +0530 Subject: [PATCH 014/145] feat: add hasBinding and hasAllBindings methods --- src/container.ts | 18 ++++++++++++ src/resolver.ts | 20 +++++++++++++ tests/container/bindings.spec.ts | 48 ++++++++++++++++++++++++++++++++ tests/resolver.spec.ts | 18 +++++++++++- 4 files changed, 103 insertions(+), 1 deletion(-) diff --git a/src/container.ts b/src/container.ts index e3ae237..58ffb5a 100644 --- a/src/container.ts +++ b/src/container.ts @@ -86,6 +86,24 @@ export class Container> { return new ContainerResolver(this.#bindings, this.#bindingValues, this.#hooks, this.#options) } + /** + * Find if the container has a binding registered using the + * "bind", the "singleton", or the "bindValue" methods. + */ + hasBinding(binding: Binding): boolean + hasBinding(binding: string | symbol | Constructor): boolean { + return this.#bindingValues.has(binding) || this.#bindings.has(binding) + } + + /** + * Find if the container has all the bindings registered using the + * "bind", the "singleton", or the "bindValue" methods. + */ + hasAllBindings(bindings: Binding[]): boolean + hasAllBindings(bindings: (string | symbol | Constructor)[]): boolean { + return bindings.every((binding) => this.hasBinding(binding)) + } + /** * Resolves the binding or constructor a class instance as follows. * diff --git a/src/resolver.ts b/src/resolver.ts index ac3d616..962e0b4 100644 --- a/src/resolver.ts +++ b/src/resolver.ts @@ -111,6 +111,26 @@ export class ContainerResolver> { } /** + * Find if the resolver has a binding registered using the + * "bind", the "singleton", or the "bindValue" methods. + */ + hasBinding(binding: Binding): boolean + hasBinding(binding: string | symbol | Constructor): boolean { + return this.#bindingValues.has(binding) + || this.#containerBindingValues.has(binding) + || this.#containerBindings.has(binding) + } + + /** + * Find if the resolver has all the bindings registered using the + * "bind", the "singleton", or the "bindValue" methods. + */ + hasAllBindings(bindings: Binding[]): boolean + hasAllBindings(bindings: (string | symbol | Constructor)[]): boolean { + return bindings.every((binding) => this.hasBinding(binding)) + } + + /** * Resolves the binding or constructor a class instance as follows. * * - Resolve the binding from the values (if registered) diff --git a/tests/container/bindings.spec.ts b/tests/container/bindings.spec.ts index 357e5a5..eab0cc9 100644 --- a/tests/container/bindings.spec.ts +++ b/tests/container/bindings.spec.ts @@ -93,6 +93,22 @@ test.group('Container | Bindings', () => { assert.instanceOf(route1, Route) assert.notStrictEqual(route, route1) }) + + test('find if a binding exists', async ({ assert }) => { + const container = new Container() + class Route {} + + const routeSymbol = Symbol('route') + + container.bind(Route, () => new Route()) + container.bind('route', () => new Route()) + container.bind(routeSymbol, () => new Route()) + + assert.isTrue(container.hasBinding(Route)) + assert.isTrue(container.hasBinding('route')) + assert.isTrue(container.hasBinding(routeSymbol)) + assert.isFalse(container.hasBinding('db')) + }) }) test.group('Container | Bindings Singleton', () => { @@ -186,6 +202,22 @@ test.group('Container | Bindings Singleton', () => { assert.instanceOf(route1, Route) assert.strictEqual(route, route1) }) + + test('find if a binding exists', async ({ assert }) => { + const container = new Container() + class Route {} + + const routeSymbol = Symbol('route') + + container.singleton(Route, () => new Route()) + container.singleton('route', () => new Route()) + container.singleton(routeSymbol, () => new Route()) + + assert.isTrue(container.hasBinding(Route)) + assert.isTrue(container.hasBinding('route')) + assert.isTrue(container.hasBinding(routeSymbol)) + assert.isFalse(container.hasBinding('db')) + }) }) test.group('Container | Binding values', () => { @@ -290,4 +322,20 @@ test.group('Container | Binding values', () => { 'Invalid binding key type. Only "string", "symbol" and "class constructor" is accepted' ) }) + + test('find if a binding exists', async ({ assert }) => { + const container = new Container() + class Route {} + + const routeSymbol = Symbol('route') + + container.bindValue(Route, new Route()) + container.bindValue('route', new Route()) + container.bindValue(routeSymbol, new Route()) + + assert.isTrue(container.hasBinding(Route)) + assert.isTrue(container.hasBinding('route')) + assert.isTrue(container.hasBinding(routeSymbol)) + assert.isFalse(container.hasBinding('db')) + }) }) diff --git a/tests/resolver.spec.ts b/tests/resolver.spec.ts index 63473cc..cce59f8 100644 --- a/tests/resolver.spec.ts +++ b/tests/resolver.spec.ts @@ -27,7 +27,6 @@ test.group('Resolver', () => { assert.strictEqual(resolvedService, service1) assert.strictEqual(resolvedService.name, 'resolver_service') }) - test('use custom containerProvider from the class constructor', async ({ assert }) => { assert.plan(4) @@ -55,4 +54,21 @@ test.group('Resolver', () => { expectTypeOf(resolvedService).toEqualTypeOf() assert.instanceOf(resolvedService, UserService) }) + + test('find if a binding exists', async ({ assert }) => { + const container = new Container() + const resolver = container.createResolver() + class Route {} + + const routeSymbol = Symbol('route') + + container.bind(Route, () => new Route()) + resolver.bindValue('route', new Route()) + container.bindValue(routeSymbol, new Route()) + + assert.isTrue(resolver.hasBinding(Route)) + assert.isTrue(resolver.hasBinding('route')) + assert.isTrue(resolver.hasBinding(routeSymbol)) + assert.isFalse(resolver.hasBinding('db')) + }) }) From 70b11d0060813b6e6f1d1b0d965817f273005e03 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Sun, 18 Sep 2022 14:08:26 +0530 Subject: [PATCH 015/145] style: format code --- README.md | 47 ++++++++++++++++++++++++++++++----------------- src/resolver.ts | 32 +++++++++++++++++--------------- 2 files changed, 47 insertions(+), 32 deletions(-) diff --git a/README.md b/README.md index 7339d1e..5b87623 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ AdonisJS Fold + > Simplest, straightforward implementation for IoC container in JavaScript
@@ -10,6 +11,7 @@ AdonisJS Fold ## Why this project exists? + Many existing implementations of IoC containers take the concept too far and start to feel more like Java. JavaScript inherently does not have all the bells and whistles; you need to have similar IoC container benefits as PHP or Java. Therefore, with this project, I live to the ethos of JavaScript and yet build a container that can help you create loosely coupled systems. @@ -25,6 +27,7 @@ I have explained the [reasons for using an IoC container](https://github.com/the - **Build it for JavaScript and improve with TypeScript** - The implementation of `@adonisjs/fold` works with vanilla JavaScript. It's just you have to write less code when using TypeScript. Thanks to its decorators metadata API. ## Usage + Install the package from the npm packages registry. ```sh @@ -46,6 +49,7 @@ const container = new Container() ``` ## Making classes + You can construct an instance of a class by calling the `container.make` method. The method is asynchronous since it allows for lazy loading dependencies via factory functions (More on factory functions later). ```ts @@ -64,10 +68,10 @@ class Database {} class UserService { static containerInjections = { - constructor: [Database] + constructor: [Database], } - constructor (db) { + constructor(db) { this.db = db } } @@ -83,6 +87,7 @@ This property can define the dependencies for the class methods (including the c > **Do you remember?** I said that JavaScript is not as powerful as Java or PHP. This is a classic example of that. In other languages, you can use reflection to look up the classes to inject, whereas, in JavaScript, you have to tell the container explicitly. ### TypeScript to the rescue + Wait, you can use decorators with combination of TypeScript's [emitDecoratorMetaData](https://www.typescriptlang.org/tsconfig#emitDecoratorMetadata) option to perform reflection. It is worth noting, TypeScript decorators are not as powerful as the reflection API in other languages. For example, in PHP, you can use interfaces for reflection. Whereas in TypeScript, you cannot. @@ -96,7 +101,7 @@ class Database {} @inject() class UserService { - constructor (db: Database) { + constructor(db: Database) { this.db = db } } @@ -105,12 +110,13 @@ const service = await container.make(UserService) assert(service.db instanceof Database) ``` -The `@inject` decorator looks at the types of all the constructor parameters and defines the `static containerInjections` property behind the scenes. +The `@inject` decorator looks at the types of all the constructor parameters and defines the `static containerInjections` property behind the scenes. > **Note**: The decorator-based reflection can only work with concrete values, not interfaces or types since they are removed during runtime. ## Making class with runtime values -When calling the `container.make` method, you can pass runtime values that take precedence over the `containerInjections` array. + +When calling the `container.make` method, you can pass runtime values that take precedence over the `containerInjections` array. In the following example, the `UserService` accepts an instance of the ongoing HTTP request as the 2nd param. Now, when making an instance of this class, you can pass that instance manually. @@ -122,7 +128,7 @@ class Database {} @inject() class UserService { - constructor (db: Database, request: Request) { + constructor(db: Database, request: Request) { this.db = db this.request = request } @@ -132,7 +138,7 @@ class UserService { ```ts createServer((req) => { const runtimeValues = [undefined, req] - + const service = await container.make(UserService, runtimeValues) assert(service.request === req) }) @@ -144,7 +150,8 @@ In the above example: - However, for the second position (ie `request`), the container will use the `req` value. ## Calling methods -You can also call class methods to look up/inject dependencies automatically. + +You can also call class methods to look up/inject dependencies automatically. In the following example, the `UserService.find` method needs an instance of the Database class. The `container.call` method will look at the `containerInjections` property to find the values to inject. @@ -153,7 +160,7 @@ class Database {} class UserService { static containerInjections = { - find: [Database] + find: [Database], } async find(db) { @@ -184,7 +191,8 @@ await container.call(service, 'find') The **runtime values** are also supported with the `container.call` method. ## Container bindings -Alongside making class instances, you can also register bindings inside the container. Bindings are simple key-value pairs. + +Alongside making class instances, you can also register bindings inside the container. Bindings are simple key-value pairs. - The key can either be a `string`, a `symbol` or a `class constructor`. - The value is a factory function invoked when someone resolves the binding from the container. @@ -209,6 +217,7 @@ container.bind(Database, () => { ``` ### Factory function arguments + The factory receives the following three arguments. - The `resolver` reference. Resolver is something container uses under the hood to resolve dependencies. The same instance is passed to the factory, so that you can resolve dependencies to construct the class. @@ -221,11 +230,13 @@ container.bind(Database, (resolver, runtimeValues) => { ``` ### When to use the factory functions? + I am answering this question from a framework creator perspective. I never use the `@inject` decorator on my classes shipped as packages. Instead, I define their construction logic using factory functions and keep classes free from any knowledge of the container. So, if you create packages for AdonisJS, I highly recommend using factory functions. Leave the `@inject` decorator for the end user. ## Binding singletons + You can bind a singleton to the container using the `container.singleton` method. It is the same as the `container.bind` method, except the factory function is called only once, and the return value is cached forever. ```ts @@ -235,6 +246,7 @@ container.singleton(Database, () => { ``` ## Binding values + Along side the factory functions, you can also bind direct values to the container. ```ts @@ -253,6 +265,7 @@ await resolve.make(SomeClass) ``` ## Observing container + You can pass an instance of the [EventEmitter](https://nodejs.org/dist/latest-v18.x/docs/api/events.html#class-eventemitter) or [emittery](https://github.com/sindresorhus/emittery) to listen for events as container resolves dependencies. ```ts @@ -268,6 +281,7 @@ const container = new Container({ emitter }) ``` ## Container hooks + You can use container hooks when you want to modify a resolved value before it is returned from the `make` method. - The hook is called everytime a binding is resolved from the container. @@ -283,6 +297,7 @@ container.resolving(Validator, (validator) => { ``` ## Container providers + Container providers are static functions that can live on a class to resolve the dependencies for the class constructor or a given class method. Once, you define the `containerProvider` on the class, the IoC container will rely on it for resolving dependencies and will not use the default provider. @@ -307,6 +322,7 @@ class UsersController { ``` ### Why would I use custom providers? + Custom providers can be handy when creating an instance of the class is not enough to construct it properly. Let's take an example of [AdonisJS route model binding](https://github.com/adonisjs/route-model-binding). With route model binding, you can query the database using models based on the value of a route parameter and inject the model instance inside the controller. @@ -328,6 +344,7 @@ However, in this case, we want more than just creating an instance of the model. This is where the `@bind` decorator comes into the picture. To perform database lookups, it registers a custom provider on the `UsersController` class. ## Binding types + If you are using the container inside a TypeScript project, then you can define the types for all the bindings in advance at the time of creating the container instance. Defining types will ensure the `bind`, `singleton` and `bindValue` method accepts only the known bindings and assert their types as well. @@ -352,15 +369,11 @@ const db = await container.make('db') ``` [gh-workflow-image]: https://img.shields.io/github/workflow/status/adonisjs/fold/test?style=for-the-badge -[gh-workflow-url]: https://github.com/adonisjs/fold/actions/workflows/test.yml "Github action" - +[gh-workflow-url]: https://github.com/adonisjs/fold/actions/workflows/test.yml 'Github action' [npm-image]: https://img.shields.io/npm/v/@adonisjs/fold/latest.svg?style=for-the-badge&logo=npm -[npm-url]: https://www.npmjs.com/package/@adonisjs/fold/v/latest "npm" - +[npm-url]: https://www.npmjs.com/package/@adonisjs/fold/v/latest 'npm' [typescript-image]: https://img.shields.io/badge/Typescript-294E80.svg?style=for-the-badge&logo=typescript - [license-url]: LICENSE.md [license-image]: https://img.shields.io/github/license/adonisjs/fold?style=for-the-badge - [snyk-image]: https://img.shields.io/snyk/vulnerabilities/github/adonisjs/fold?label=Snyk%20Vulnerabilities&style=for-the-badge -[snyk-url]: https://snyk.io/test/github/adonisjs/fold?targetFile=package.json "snyk" +[snyk-url]: https://snyk.io/test/github/adonisjs/fold?targetFile=package.json 'snyk' diff --git a/src/resolver.ts b/src/resolver.ts index 962e0b4..ef6a37b 100644 --- a/src/resolver.ts +++ b/src/resolver.ts @@ -114,23 +114,25 @@ export class ContainerResolver> { * Find if the resolver has a binding registered using the * "bind", the "singleton", or the "bindValue" methods. */ - hasBinding(binding: Binding): boolean - hasBinding(binding: string | symbol | Constructor): boolean { - return this.#bindingValues.has(binding) - || this.#containerBindingValues.has(binding) - || this.#containerBindings.has(binding) - } + hasBinding(binding: Binding): boolean + hasBinding(binding: string | symbol | Constructor): boolean { + return ( + this.#bindingValues.has(binding) || + this.#containerBindingValues.has(binding) || + this.#containerBindings.has(binding) + ) + } - /** - * Find if the resolver has all the bindings registered using the - * "bind", the "singleton", or the "bindValue" methods. - */ - hasAllBindings(bindings: Binding[]): boolean - hasAllBindings(bindings: (string | symbol | Constructor)[]): boolean { - return bindings.every((binding) => this.hasBinding(binding)) - } + /** + * Find if the resolver has all the bindings registered using the + * "bind", the "singleton", or the "bindValue" methods. + */ + hasAllBindings(bindings: Binding[]): boolean + hasAllBindings(bindings: (string | symbol | Constructor)[]): boolean { + return bindings.every((binding) => this.hasBinding(binding)) + } - /** + /** * Resolves the binding or constructor a class instance as follows. * * - Resolve the binding from the values (if registered) From 11d1cef88a100b1000e07688fecb3f475f6c3eb6 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Sun, 18 Sep 2022 14:08:58 +0530 Subject: [PATCH 016/145] chore(release): 9.0.0-0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f3ed5a8..1ac08b9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@adonisjs/fold", - "version": "8.2.0", + "version": "9.0.0-0", "description": "Simplest and straight forward implementation for IoC container in JavaScript", "main": "build/index.js", "files": [ From be5e23eca9b88aee1962101d31323d877b2178c3 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Sat, 24 Sep 2022 15:35:41 +0530 Subject: [PATCH 017/145] feat: add support for swaps --- README.md | 37 ++++++++ src/container.ts | 72 ++++++++++++++- src/resolver.ts | 23 +++++ src/types.ts | 5 ++ tests/container/events.spec.ts | 19 ++++ tests/container/hooks.spec.ts | 29 +++++++ tests/container/swap.spec.ts | 154 +++++++++++++++++++++++++++++++++ 7 files changed, 338 insertions(+), 1 deletion(-) create mode 100644 tests/container/swap.spec.ts diff --git a/README.md b/README.md index 5b87623..91b9a56 100644 --- a/README.md +++ b/README.md @@ -264,6 +264,43 @@ resolver.bindValue(Request, req) await resolve.make(SomeClass) ``` +## Swapping implementations +When using the container to resolve a tree of dependencies, quite often you will have no control over the construction of a class and therefore you will be not able to swap/fake its dependencies when writing tests. + +In the following example, the `UsersController` needs an instance of the `UserService` class. + +```ts +@inject() +class UsersController { + constructor (service: UserService) {} +} +``` + +In the following test, we are making an HTTP request that will be handled by the `UsersController`. However, within the test, we have no control over the construction of the controller class. + +```ts +test('get all users', async ({ client }) => { + // I WANTED TO FAKE USER SERVICE FIRST? + const response = await client.get('users') +}) +``` + +To make things simpler, you can tell the container to use a swapped implementation for a given class constructor as follows. + +```ts +test('get all users', async ({ client }) => { + class MyFakedService extends UserService {} + + /** + * From now on, the container will return an instance + * of `MyFakedService`. + */ + container.swap(UserService, () => new MyFakedService()) + + const response = await client.get('users') +}) +``` + ## Observing container You can pass an instance of the [EventEmitter](https://nodejs.org/dist/latest-v18.x/docs/api/events.html#class-eventemitter) or [emittery](https://github.com/sindresorhus/emittery) to listen for events as container resolves dependencies. diff --git a/src/container.ts b/src/container.ts index 58ffb5a..e3fb137 100644 --- a/src/container.ts +++ b/src/container.ts @@ -10,6 +10,7 @@ import type { Make, Hooks, + Swaps, Bindings, BindingKey, Constructor, @@ -41,6 +42,11 @@ import { ContainerResolver } from './resolver.js' * ``` */ export class Container> { + /** + * A collection of bindings with registered swapped implementations + */ + #swaps: Swaps = new Map() + /** * Registered bindings. Singleton and normal bindings, both are * registered inside the bindings map @@ -83,7 +89,13 @@ export class Container> { * ``` */ createResolver() { - return new ContainerResolver(this.#bindings, this.#bindingValues, this.#hooks, this.#options) + return new ContainerResolver( + this.#bindings, + this.#bindingValues, + this.#swaps, + this.#hooks, + this.#options + ) } /** @@ -274,6 +286,64 @@ export class Container> { this.#bindings.set(binding, { resolver, isSingleton: true }) } + swap( + /** + * Need to narrow down the "Binding" for the case where "KnownBindings" are + */ + binding: Binding extends string | symbol ? Binding : never, + resolver: BindingResolver + ): void + swap>( + binding: Binding, + resolver: BindingResolver> + ): void + swap( + binding: Binding, + resolver: BindingResolver< + KnownBindings, + Binding extends Constructor + ? A + : Binding extends keyof KnownBindings + ? KnownBindings[Binding] + : never + > + ): void { + if (typeof binding !== 'string' && typeof binding !== 'symbol' && !isClass(binding)) { + throw new Error( + `Invalid binding key type. Only "string", "symbol" and "class constructor" is accepted` + ) + } + + this.#swaps.set(binding, resolver) + } + + /** + * Restore binding by removing its swap + */ + restore(binding: keyof KnownBindings | Constructor) { + if (typeof binding !== 'string' && typeof binding !== 'symbol' && !isClass(binding)) { + throw new Error( + `Invalid binding key type. Only "string", "symbol" and "class constructor" is accepted` + ) + } + this.#swaps.delete(binding) + } + + /** + * Restore mentioned or all bindings by removing + * their swaps + */ + restoreAll(bindings?: (keyof KnownBindings | Constructor)[]) { + if (!bindings) { + this.#swaps.clear() + return + } + + for (let binding of bindings) { + this.restore(binding) + } + } + /** * Define hooks to be executed after a binding has been resolved * from the container. diff --git a/src/resolver.ts b/src/resolver.ts index ef6a37b..f972752 100644 --- a/src/resolver.ts +++ b/src/resolver.ts @@ -10,6 +10,7 @@ import type { Make, Hooks, + Swaps, Bindings, Constructor, BindingValues, @@ -51,6 +52,14 @@ export class ContainerResolver> { */ #containerBindingValues: BindingValues + /** + * Pre-registered swaps for bindings. They are shared between + * the container and resolver. + * + * We do not mutate this property within the resolver + */ + #containerSwaps: Swaps + /** * Reference to the container hooks */ @@ -69,11 +78,13 @@ export class ContainerResolver> { constructor( bindings: Bindings, bindingValues: BindingValues, + swaps: Swaps, hooks: Hooks, options: ContainerOptions ) { this.#containerBindings = bindings this.#containerBindingValues = bindingValues + this.#containerSwaps = swaps this.#containerHooks = hooks this.#options = options } @@ -162,6 +173,18 @@ export class ContainerResolver> { return binding as Promise> } + /** + * Entertain swaps when registered + */ + if (this.#containerSwaps.has(binding)) { + const resolver = this.#containerSwaps.get(binding)! + const value = await resolver(this, runtimeValues) + + await this.#execHooks(binding, value) + this.#emit(binding, value) + return value + } + /** * First priority is given to the RESOLVER binding values */ diff --git a/src/types.ts b/src/types.ts index 8dbf103..71893d2 100644 --- a/src/types.ts +++ b/src/types.ts @@ -55,6 +55,11 @@ export type Bindings = Map< { resolver: BindingResolver, any>; isSingleton: boolean } > +/** + * Shape of the registered swaps + */ +export type Swaps = Map, any>> + /** * Shape of the registered binding values */ diff --git a/tests/container/events.spec.ts b/tests/container/events.spec.ts index 9dbc8f4..040c620 100644 --- a/tests/container/events.spec.ts +++ b/tests/container/events.spec.ts @@ -161,4 +161,23 @@ test.group('Container | Events', () => { assert.deepEqual(events[1], { binding: Encryption, value: new Encryption() }) assert.deepEqual(events[2], { binding: Route, value: route }) }) + + test('emit event when swaps are resolved', async ({ assert }) => { + const emitter = new EventEmitter() + const container = new Container({ emitter }) + class Route {} + class FakedRoute extends Route {} + + container.swap(Route, () => new FakedRoute()) + + const [event, route] = await Promise.all([ + pEvent(emitter, 'container:resolve'), + container.make(Route), + ]) + + expectTypeOf(route).toEqualTypeOf() + assert.instanceOf(route, Route) + assert.instanceOf(route, FakedRoute) + assert.deepEqual(event, { binding: Route, value: route }) + }) }) diff --git a/tests/container/hooks.spec.ts b/tests/container/hooks.spec.ts index ee395b2..7da7ffd 100644 --- a/tests/container/hooks.spec.ts +++ b/tests/container/hooks.spec.ts @@ -102,4 +102,33 @@ test.group('Container | Hooks', () => { assert.instanceOf(route, Route) assert.equal(route.invocations, 1) }) + + test('run hooks when a swap is resolved', async ({ assert }) => { + const emitter = new EventEmitter() + const container = new Container({ emitter }) + class Route { + invocations: number = 0 + } + class FakedRoute extends Route {} + + container.resolving(Route, (route) => { + expectTypeOf(route).toEqualTypeOf() + route.invocations++ + }) + + container.swap(Route, () => { + return new FakedRoute() + }) + + await container.make('route') + await container.make('route') + await container.make('route') + + const route = await container.make(Route) + expectTypeOf(route).toEqualTypeOf() + + assert.instanceOf(route, Route) + assert.instanceOf(route, FakedRoute) + assert.equal(route.invocations, 1) + }) }) diff --git a/tests/container/swap.spec.ts b/tests/container/swap.spec.ts new file mode 100644 index 0000000..fdc664b --- /dev/null +++ b/tests/container/swap.spec.ts @@ -0,0 +1,154 @@ +/* + * @adonisjs/fold + * + * (c) AdonisJS + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import 'reflect-metadata' +import { test } from '@japa/runner' +import { expectTypeOf } from 'expect-type' + +import { inject } from '../../index.js' +import { Container } from '../../src/container.js' + +test.group('Container | swap', () => { + test('swap a class implementation', async ({ assert }) => { + class UserService { + get() { + return { + id: 1, + username: 'virk', + } + } + } + + class UsersController { + constructor() {} + + @inject() + show(user: UserService) { + return user.get() + } + } + + class FakedUserService extends UserService { + get() { + return { + id: 1, + username: 'faked-virk', + } + } + } + + const container = new Container() + container.swap(UserService, () => { + return new FakedUserService() + }) + + const controller = await container.make(UsersController) + expectTypeOf(controller).toEqualTypeOf() + + const user = await container.call(controller, 'show') + expectTypeOf(user).toEqualTypeOf<{ id: number; username: string }>() + + assert.deepEqual(user, { id: 1, username: 'faked-virk' }) + }) + + test('restore class implementation', async ({ assert }) => { + class UserService { + get() { + return { + id: 1, + username: 'virk', + } + } + } + + class UsersController { + constructor() {} + + @inject() + show(user: UserService) { + return user.get() + } + } + + class FakedUserService extends UserService { + get() { + return { + id: 1, + username: 'faked-virk', + } + } + } + + const container = new Container() + container.swap(UserService, () => { + return new FakedUserService() + }) + + const controller = await container.make(UsersController) + expectTypeOf(controller).toEqualTypeOf() + + const user = await container.call(controller, 'show') + expectTypeOf(user).toEqualTypeOf<{ id: number; username: string }>() + assert.deepEqual(user, { id: 1, username: 'faked-virk' }) + + container.restore(UserService) + + const user1 = await container.call(controller, 'show') + expectTypeOf(user1).toEqualTypeOf<{ id: number; username: string }>() + assert.deepEqual(user1, { id: 1, username: 'virk' }) + }) + + test('swap a binding', async ({ assert }) => { + const container = new Container<{ route: Route }>() + class Route {} + class FakedRoute extends Route {} + + container.bind('route', () => { + return new Route() + }) + + container.swap('route', () => { + return new FakedRoute() + }) + + const route = await container.make('route') + expectTypeOf(route).toEqualTypeOf() + + assert.instanceOf(route, Route) + assert.instanceOf(route, FakedRoute) + }) + + test('restore swapped binding', async ({ assert }) => { + const container = new Container<{ route: Route }>() + class Route {} + class FakedRoute extends Route {} + + container.bind('route', () => { + return new Route() + }) + + container.swap('route', () => { + return new FakedRoute() + }) + + const route = await container.make('route') + expectTypeOf(route).toEqualTypeOf() + + assert.instanceOf(route, Route) + assert.instanceOf(route, FakedRoute) + + container.restoreAll() + + const route1 = await container.make('route') + expectTypeOf(route1).toEqualTypeOf() + + assert.instanceOf(route1, Route) + assert.notInstanceOf(route1, FakedRoute) + }) +}) From b6eae24cda5e31345486e36c11445af690dd0667 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Sat, 24 Sep 2022 15:45:13 +0530 Subject: [PATCH 018/145] chore(release): 9.0.1-0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1ac08b9..d9c31b8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@adonisjs/fold", - "version": "9.0.0-0", + "version": "9.0.1-0", "description": "Simplest and straight forward implementation for IoC container in JavaScript", "main": "build/index.js", "files": [ From 6d75fc6dcf8f1696f254d7260ffd6af9b419bd4a Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Mon, 3 Oct 2022 15:44:20 +0530 Subject: [PATCH 019/145] refactor: simplify isClass helper --- src/helpers.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/helpers.ts b/src/helpers.ts index 2b0b5d9..cb81b14 100644 --- a/src/helpers.ts +++ b/src/helpers.ts @@ -9,12 +9,10 @@ import type { Constructor } from './types.js' -const toString = Function.prototype.toString - /** * Type guard and check if value is a class constructor. Plain old * functions are not considered as class constructor. */ -export function isClass(value: any): value is Constructor { - return typeof value === 'function' && /^class\s/.test(toString.call(value)) +export function isClass(value: unknown): value is Constructor { + return typeof value === 'function' && value.toString().startsWith('class ') } From 7198ef9df96b60aca2d5fbef3e39b4f36f643a27 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Wed, 5 Oct 2022 12:22:59 +0530 Subject: [PATCH 020/145] fix: the "@inject" decorator meta-data generation in case of inheritance --- src/decorators/inject.ts | 16 ++-- tests/container/make_class_via_inject.spec.ts | 87 +++++++++++++++++++ 2 files changed, 96 insertions(+), 7 deletions(-) diff --git a/src/decorators/inject.ts b/src/decorators/inject.ts index 255b67b..7b7aef4 100644 --- a/src/decorators/inject.ts +++ b/src/decorators/inject.ts @@ -7,18 +7,15 @@ * file that was distributed with this source code. */ +import { defineStaticProperty } from '@poppinss/utils' + /** * Initiating the "containerInjections" property on the target, which is assumed * to be the class constructor. */ function initiateContainerInjections(target: any, method: string | symbol) { - if (!target.hasOwnProperty('containerInjections')) { - Object.defineProperty(target, 'containerInjections', { - value: {}, - }) - } - - target.containerInjections[method] = target.containerInjections[method] || [] + defineStaticProperty(target, 'containerInjections', { initialValue: {}, strategy: 'inherit' }) + target.containerInjections[method] = [] } /** @@ -53,6 +50,11 @@ function defineMethodInjections(target: any, method: string | symbol) { } } +/** + * The "@inject" decorator uses Reflection to inspect the dependencies of a class + * or a method and defines them as metaData on the class for the container to + * discover them. + */ export function inject() { function injectDecorator(target: C): void function injectDecorator(target: any, propertyKey: string | symbol): void diff --git a/tests/container/make_class_via_inject.spec.ts b/tests/container/make_class_via_inject.spec.ts index c4df3ef..25fe11a 100644 --- a/tests/container/make_class_via_inject.spec.ts +++ b/tests/container/make_class_via_inject.spec.ts @@ -1,5 +1,6 @@ import 'reflect-metadata' import { test } from '@japa/runner' +import { EventEmitter } from 'node:events' import { expectTypeOf } from 'expect-type' import { Container } from '../../src/container.js' import { inject } from '../../src/decorators/inject.js' @@ -89,4 +90,90 @@ test.group('Container | Make class via inject', () => { assert.instanceOf(encryption.config, Config) expectTypeOf(encryption.config).toEqualTypeOf() }) + + test('inject constructor dependencies inside a sub-class', async ({ assert }) => { + class Database {} + + @inject() + class BaseService { + constructor(public db: Database) {} + } + + @inject() + class UserService extends BaseService {} + + // @ts-expect-error + assert.notStrictEqual(UserService.containerInjections, BaseService.containerInjections) + + const container = new Container() + const service = await container.make(UserService) + + expectTypeOf(service).toEqualTypeOf() + assert.instanceOf(service, UserService) + assert.instanceOf(service, BaseService) + assert.instanceOf(service.db, Database) + }) + + test('inject sub-class constructor own dependencies', async ({ assert }) => { + class Database {} + class Emitter extends EventEmitter {} + + @inject() + class BaseService { + constructor(public db: Database) {} + } + + @inject() + class UserService extends BaseService { + constructor(db: Database, public emitter: Emitter) { + super(db) + } + } + + const container = new Container() + const service = await container.make(UserService) + + // @ts-expect-error + assert.notStrictEqual(UserService.containerInjections, BaseService.containerInjections) + + expectTypeOf(service).toEqualTypeOf() + assert.instanceOf(service, UserService) + assert.instanceOf(service, BaseService) + assert.instanceOf(service.db, Database) + assert.instanceOf(service.emitter, Emitter) + }) + + test('inject method dependencies inside a sub-class', async ({ assert }) => { + class Database {} + class Emitter extends EventEmitter {} + + class BaseService { + @inject() + foo(db: Database) { + return db + } + } + + class UserService extends BaseService { + @inject() + bar(emitter: Emitter) { + return emitter + } + } + + const container = new Container() + const service = await container.make(UserService) + const fooResult = await container.call(service, 'foo') + const barResult = await container.call(service, 'bar') + + // @ts-expect-error + assert.notStrictEqual(UserService.containerInjections, BaseService.containerInjections) + + expectTypeOf(service).toEqualTypeOf() + expectTypeOf(fooResult).toEqualTypeOf() + expectTypeOf(barResult).toEqualTypeOf() + + assert.instanceOf(fooResult, Database) + assert.instanceOf(barResult, Emitter) + }) }) From 1294b1aed19e60dd6b87545d18c934f57fd8ca10 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Wed, 5 Oct 2022 12:23:56 +0530 Subject: [PATCH 021/145] refactor: move exceptions to their own files --- package.json | 5 ++++- src/container.ts | 21 ++++++------------- .../invalid_binding_key_exception.ts | 17 +++++++++++++++ .../invalid_dependency_exception.ts | 16 ++++++++++++++ src/exceptions/method_not_found_exception.ts | 16 ++++++++++++++ src/provider.ts | 10 +++++++-- src/resolver.ts | 13 ++++++++---- 7 files changed, 76 insertions(+), 22 deletions(-) create mode 100644 src/exceptions/invalid_binding_key_exception.ts create mode 100644 src/exceptions/invalid_dependency_exception.ts create mode 100644 src/exceptions/method_not_found_exception.ts diff --git a/package.json b/package.json index d9c31b8..998fa13 100644 --- a/package.json +++ b/package.json @@ -112,5 +112,8 @@ "bugs": { "url": "https://github.com/adonisjs/fold/issues" }, - "homepage": "https://github.com/adonisjs/fold#readme" + "homepage": "https://github.com/adonisjs/fold#readme", + "dependencies": { + "@poppinss/utils": ">=6.0.0-0" + } } diff --git a/src/container.ts b/src/container.ts index e3fb137..b1e1f07 100644 --- a/src/container.ts +++ b/src/container.ts @@ -22,6 +22,7 @@ import type { } from './types.js' import { isClass } from './helpers.js' import { ContainerResolver } from './resolver.js' +import { InvalidBindingKeyException } from './exceptions/invalid_binding_key_exception.js' /** * The container class exposes the API to register bindings, values @@ -198,9 +199,7 @@ export class Container> { > ): void { if (typeof binding !== 'string' && typeof binding !== 'symbol' && !isClass(binding)) { - throw new Error( - `Invalid binding key type. Only "string", "symbol" and "class constructor" is accepted` - ) + throw new InvalidBindingKeyException() } this.#bindings.set(binding, { resolver, isSingleton: false }) @@ -230,9 +229,7 @@ export class Container> { : never ): void { if (typeof binding !== 'string' && typeof binding !== 'symbol' && !isClass(binding)) { - throw new Error( - `Invalid binding key type. Only "string", "symbol" and "class constructor" is accepted` - ) + throw new InvalidBindingKeyException() } this.#bindingValues.set(binding, value) @@ -278,9 +275,7 @@ export class Container> { > ): void { if (typeof binding !== 'string' && typeof binding !== 'symbol' && !isClass(binding)) { - throw new Error( - `Invalid binding key type. Only "string", "symbol" and "class constructor" is accepted` - ) + throw new InvalidBindingKeyException() } this.#bindings.set(binding, { resolver, isSingleton: true }) @@ -309,9 +304,7 @@ export class Container> { > ): void { if (typeof binding !== 'string' && typeof binding !== 'symbol' && !isClass(binding)) { - throw new Error( - `Invalid binding key type. Only "string", "symbol" and "class constructor" is accepted` - ) + throw new InvalidBindingKeyException() } this.#swaps.set(binding, resolver) @@ -322,9 +315,7 @@ export class Container> { */ restore(binding: keyof KnownBindings | Constructor) { if (typeof binding !== 'string' && typeof binding !== 'symbol' && !isClass(binding)) { - throw new Error( - `Invalid binding key type. Only "string", "symbol" and "class constructor" is accepted` - ) + throw new InvalidBindingKeyException() } this.#swaps.delete(binding) } diff --git a/src/exceptions/invalid_binding_key_exception.ts b/src/exceptions/invalid_binding_key_exception.ts new file mode 100644 index 0000000..2e96295 --- /dev/null +++ b/src/exceptions/invalid_binding_key_exception.ts @@ -0,0 +1,17 @@ +/* + * @adonisjs/fold + * + * (c) AdonisJS + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import { Exception } from '@poppinss/utils' + +export class InvalidBindingKeyException extends Exception { + static code = 'E_INVALID_BINDING_KEY' + static status = 500 + static message = + 'The container binding key must be of type "string", "symbol", or a "class constructor"' +} diff --git a/src/exceptions/invalid_dependency_exception.ts b/src/exceptions/invalid_dependency_exception.ts new file mode 100644 index 0000000..1d67a86 --- /dev/null +++ b/src/exceptions/invalid_dependency_exception.ts @@ -0,0 +1,16 @@ +/* + * @adonisjs/fold + * + * (c) AdonisJS + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import { Exception } from '@poppinss/utils' + +export class InvalidDependencyException extends Exception { + static code = 'E_INVALID_CONTAINER_DEPENDENCY' + static status = 500 + static message = 'Cannot inject "{{ value }}". The value cannot be constructed' +} diff --git a/src/exceptions/method_not_found_exception.ts b/src/exceptions/method_not_found_exception.ts new file mode 100644 index 0000000..8371bf0 --- /dev/null +++ b/src/exceptions/method_not_found_exception.ts @@ -0,0 +1,16 @@ +/* + * @adonisjs/fold + * + * (c) AdonisJS + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import { Exception } from '@poppinss/utils' + +export class MethodNotFoundException extends Exception { + static code = 'E_METHOD_NOT_FOUND' + static status = 500 + static message = 'Missing method "{{ method }}" on object "{{ object }}"' +} diff --git a/src/provider.ts b/src/provider.ts index 70b04fd..2e5d671 100644 --- a/src/provider.ts +++ b/src/provider.ts @@ -7,8 +7,10 @@ * file that was distributed with this source code. */ +import string from '@poppinss/utils/string' import { ContainerResolver } from './resolver.js' import type { InspectableConstructor } from './types.js' +import { InvalidDependencyException } from './exceptions/invalid_dependency_exception.js' const primitiveConstructors = [String, Function, Object, Date, Number, Boolean] @@ -48,7 +50,9 @@ export async function containerProvider( const injection = injections[index] if (primitiveConstructors.includes(injection)) { - throw new Error(`Cannot inject "${injection.name}"`) + throw new InvalidDependencyException( + string.interpolate(InvalidDependencyException.message, { value: injection }) + ) } return resolver.make(injection) @@ -67,7 +71,9 @@ export async function containerProvider( } if (primitiveConstructors.includes(injection)) { - throw new Error(`Cannot inject "${injection.name}"`) + throw new InvalidDependencyException( + string.interpolate(InvalidDependencyException.message, { value: injection }) + ) } return resolver.make(injection) diff --git a/src/resolver.ts b/src/resolver.ts index f972752..13295b9 100644 --- a/src/resolver.ts +++ b/src/resolver.ts @@ -7,6 +7,9 @@ * file that was distributed with this source code. */ +import { inspect } from 'node:util' +import string from '@poppinss/utils/string' + import type { Make, Hooks, @@ -20,6 +23,8 @@ import type { } from './types.js' import { isClass } from './helpers.js' import { containerProvider } from './provider.js' +import { MethodNotFoundException } from './exceptions/method_not_found_exception.js' +import { InvalidBindingKeyException } from './exceptions/invalid_binding_key_exception.js' /** * Container resolver exposes the APIs to resolve bindings. You can think @@ -268,7 +273,9 @@ export class ContainerResolver> { runtimeValues?: any[] ): Promise> { if (typeof value[method] !== 'function') { - throw new Error(`method "${String(method)}" does not exists on "${value.constructor.name}"`) + throw new MethodNotFoundException( + string.interpolate(MethodNotFoundException.message, { method, object: inspect(value) }) + ) } const dependencies = await containerProvider(value.constructor, method, this, runtimeValues) @@ -299,9 +306,7 @@ export class ContainerResolver> { : never ): void { if (typeof binding !== 'string' && typeof binding !== 'symbol' && !isClass(binding)) { - throw new Error( - `Invalid binding key type. Only "string", "symbol" and "class constructor" is accepted` - ) + throw new InvalidBindingKeyException() } this.#bindingValues.set(binding, value) From ee9f625ceaac1883de7b59179eb5544d2d3ec4ca Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Wed, 5 Oct 2022 12:24:27 +0530 Subject: [PATCH 022/145] docs(README): small improvements to the docs --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 91b9a56..5bb0c30 100644 --- a/README.md +++ b/README.md @@ -68,7 +68,7 @@ class Database {} class UserService { static containerInjections = { - constructor: [Database], + _constructor: [Database], } constructor(db) { @@ -82,7 +82,7 @@ assert(service.db instanceof Database) The `static containerInjections` property is required by the container to know which values to inject when creating an instance of the class. -This property can define the dependencies for the class methods (including the constructor). The dependencies are defined as an array. The first item from the array will be injected as the first argument and so on. +This property can define the dependencies for the class methods (including the constructor). The dependencies are defined as an array. The dependencies are injected in the same order as they are defined inside the array. > **Do you remember?** I said that JavaScript is not as powerful as Java or PHP. This is a classic example of that. In other languages, you can use reflection to look up the classes to inject, whereas, in JavaScript, you have to tell the container explicitly. @@ -112,7 +112,7 @@ assert(service.db instanceof Database) The `@inject` decorator looks at the types of all the constructor parameters and defines the `static containerInjections` property behind the scenes. -> **Note**: The decorator-based reflection can only work with concrete values, not interfaces or types since they are removed during runtime. +> **Note**: The decorator-based reflection can only work with concrete values, not with interfaces or types since they are removed during the runtime. ## Making class with runtime values From a6179625a9154e8c4a3151b83e67b69bd8cd0df0 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Wed, 5 Oct 2022 12:37:20 +0530 Subject: [PATCH 023/145] refactor: document exceptions and add tests for them --- README.md | 48 +++++++++++++++++++ src/exceptions/method_not_found_exception.ts | 2 +- src/provider.ts | 5 +- tests/container/bindings.spec.ts | 18 +++---- tests/container/call_method.spec.ts | 11 +++++ tests/container/make_class_via_inject.spec.ts | 43 +++++++++++++++++ 6 files changed, 115 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 5bb0c30..56ea2a7 100644 --- a/README.md +++ b/README.md @@ -405,6 +405,54 @@ container.bind('db', () => new Database()) const db = await container.make('db') ``` +## Exceptions +The following known exceptions are raised by the container. + +### E_INVALID_BINDING_KEY +The exception is raised, when you try to bind a value/factory function to the container and the binding key is not a `string`, a `symbol` or a `class constructor`. + +For example: + +```ts +// Exception will raised +container.bind(123, () => { }) + +// Works fine +container.bind('123', () => { }) +``` + +### E_INVALID_CONTAINER_DEPENDENCY +The exception is raised, when you are trying to inject a value that cannot be constructed. A common source of issue is within TypeScript project, when using an `interface` or a `type` for dependency injection. + +In the following example, the `User` is a TypeScript type and there is no way for the container to construct a runtime value from this type (types are removed after transpiling the TypeScript code). + +Therefore, the container will raise an exception saying `Cannot inject "[Function: Object]". The value cannot be constructed`. + +```ts +type User = { + username: string + age: number + email: string +} + +@inject() +class UsersController { + constructor (user: User) +} +``` + +### E_METHOD_NOT_FOUND +The exception is raised when you are trying to invoke a method on a class instance and the method does not exist. For example: + +```ts +class UserService {} + +const service = await container.make(UserService) + +// Exception raised. Missing method "find" on "UserService {}" +await container.call(service, 'find') +``` + [gh-workflow-image]: https://img.shields.io/github/workflow/status/adonisjs/fold/test?style=for-the-badge [gh-workflow-url]: https://github.com/adonisjs/fold/actions/workflows/test.yml 'Github action' [npm-image]: https://img.shields.io/npm/v/@adonisjs/fold/latest.svg?style=for-the-badge&logo=npm diff --git a/src/exceptions/method_not_found_exception.ts b/src/exceptions/method_not_found_exception.ts index 8371bf0..58b550e 100644 --- a/src/exceptions/method_not_found_exception.ts +++ b/src/exceptions/method_not_found_exception.ts @@ -12,5 +12,5 @@ import { Exception } from '@poppinss/utils' export class MethodNotFoundException extends Exception { static code = 'E_METHOD_NOT_FOUND' static status = 500 - static message = 'Missing method "{{ method }}" on object "{{ object }}"' + static message = 'Missing method "{{ method }}" on "{{ object }}"' } diff --git a/src/provider.ts b/src/provider.ts index 2e5d671..e539aac 100644 --- a/src/provider.ts +++ b/src/provider.ts @@ -7,6 +7,7 @@ * file that was distributed with this source code. */ +import { inspect } from 'node:util' import string from '@poppinss/utils/string' import { ContainerResolver } from './resolver.js' import type { InspectableConstructor } from './types.js' @@ -51,7 +52,7 @@ export async function containerProvider( const injection = injections[index] if (primitiveConstructors.includes(injection)) { throw new InvalidDependencyException( - string.interpolate(InvalidDependencyException.message, { value: injection }) + string.interpolate(InvalidDependencyException.message, { value: inspect(injection) }) ) } @@ -72,7 +73,7 @@ export async function containerProvider( if (primitiveConstructors.includes(injection)) { throw new InvalidDependencyException( - string.interpolate(InvalidDependencyException.message, { value: injection }) + string.interpolate(InvalidDependencyException.message, { value: inspect(injection) }) ) } diff --git a/tests/container/bindings.spec.ts b/tests/container/bindings.spec.ts index eab0cc9..39a3448 100644 --- a/tests/container/bindings.spec.ts +++ b/tests/container/bindings.spec.ts @@ -60,19 +60,19 @@ test.group('Container | Bindings', () => { assert.throws( // @ts-expect-error () => container.bind(1, () => {}), - 'Invalid binding key type. Only "string", "symbol" and "class constructor" is accepted' + 'The container binding key must be of type "string", "symbol", or a "class constructor"' ) assert.throws( // @ts-expect-error () => container.bind([], () => {}), - 'Invalid binding key type. Only "string", "symbol" and "class constructor" is accepted' + 'The container binding key must be of type "string", "symbol", or a "class constructor"' ) assert.throws( // @ts-expect-error () => container.bind({}, () => {}), - 'Invalid binding key type. Only "string", "symbol" and "class constructor" is accepted' + 'The container binding key must be of type "string", "symbol", or a "class constructor"' ) }) @@ -169,19 +169,19 @@ test.group('Container | Bindings Singleton', () => { assert.throws( // @ts-expect-error () => container.singleton(1, () => {}), - 'Invalid binding key type. Only "string", "symbol" and "class constructor" is accepted' + 'The container binding key must be of type "string", "symbol", or a "class constructor"' ) assert.throws( // @ts-expect-error () => container.singleton([], () => {}), - 'Invalid binding key type. Only "string", "symbol" and "class constructor" is accepted' + 'The container binding key must be of type "string", "symbol", or a "class constructor"' ) assert.throws( // @ts-expect-error () => container.singleton({}, () => {}), - 'Invalid binding key type. Only "string", "symbol" and "class constructor" is accepted' + 'The container binding key must be of type "string", "symbol", or a "class constructor"' ) }) @@ -307,19 +307,19 @@ test.group('Container | Binding values', () => { assert.throws( // @ts-expect-error () => container.bindValue(1, 1), - 'Invalid binding key type. Only "string", "symbol" and "class constructor" is accepted' + 'The container binding key must be of type "string", "symbol", or a "class constructor"' ) assert.throws( // @ts-expect-error () => container.bindValue([], 1), - 'Invalid binding key type. Only "string", "symbol" and "class constructor" is accepted' + 'The container binding key must be of type "string", "symbol", or a "class constructor"' ) assert.throws( // @ts-expect-error () => container.bindValue({}, 1), - 'Invalid binding key type. Only "string", "symbol" and "class constructor" is accepted' + 'The container binding key must be of type "string", "symbol", or a "class constructor"' ) }) diff --git a/tests/container/call_method.spec.ts b/tests/container/call_method.spec.ts index f43be3e..d846266 100644 --- a/tests/container/call_method.spec.ts +++ b/tests/container/call_method.spec.ts @@ -133,4 +133,15 @@ test.group('Container | Call method', () => { expectTypeOf(fooResult).toEqualTypeOf<{ db: Database; name: string; id: number }>() assert.deepEqual(fooResult, { db: new Database(), id: 1, name: 'foo' }) }) + + test('raise exception when method does not exist', async ({ assert }) => { + class UserService {} + + const container = new Container() + await assert.rejects( + // @ts-expect-error + () => container.call(new UserService(), 'foo'), + 'Missing method "foo" on "UserService {}"' + ) + }) }) diff --git a/tests/container/make_class_via_inject.spec.ts b/tests/container/make_class_via_inject.spec.ts index 25fe11a..544f4b8 100644 --- a/tests/container/make_class_via_inject.spec.ts +++ b/tests/container/make_class_via_inject.spec.ts @@ -176,4 +176,47 @@ test.group('Container | Make class via inject', () => { assert.instanceOf(fooResult, Database) assert.instanceOf(barResult, Emitter) }) + + test('raise exception when injecting primitive classes', async ({ assert }) => { + @inject() + class UserService { + constructor(public db: string) {} + } + + const container = new Container() + await assert.rejects( + () => container.make(UserService), + 'Cannot inject "[Function: String]". The value cannot be constructed' + ) + }) + + test('raise exception when injecting a typescript type', async ({ assert }) => { + type Db = {} + + @inject() + class UserService { + constructor(public db: Db) {} + } + + const container = new Container() + await assert.rejects( + () => container.make(UserService), + 'Cannot inject "[Function: Object]". The value cannot be constructed' + ) + }) + + test('raise exception when injecting a typescript interface', async ({ assert }) => { + interface Db {} + + @inject() + class UserService { + constructor(public db: Db) {} + } + + const container = new Container() + await assert.rejects( + () => container.make(UserService), + 'Cannot inject "[Function: Object]". The value cannot be constructed' + ) + }) }) From d0b8ebb698040d6c5755b540e85a7cbbcf2bac59 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Wed, 5 Oct 2022 13:07:08 +0530 Subject: [PATCH 024/145] test: refactor failing tests --- tests/container/call_method.spec.ts | 12 ++++++------ tests/container/known_make_class.spec.ts | 5 ++++- tests/container/make_class.spec.ts | 5 ++++- tests/provider.spec.ts | 2 +- 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/tests/container/call_method.spec.ts b/tests/container/call_method.spec.ts index d846266..e668c37 100644 --- a/tests/container/call_method.spec.ts +++ b/tests/container/call_method.spec.ts @@ -7,12 +7,12 @@ test.group('Container | Call method', () => { const container = new Container() // @ts-expect-error - await assert.rejects(() => container.call(1, 'foo'), 'method "foo" does not exists on "Number"') + await assert.rejects(() => container.call(1, 'foo'), 'Missing method "foo" on "1"') await assert.rejects( // @ts-expect-error () => container.call(false, 'foo'), - 'method "foo" does not exists on "Boolean"' + 'Missing method "foo" on "false"' ) await assert.rejects( @@ -30,25 +30,25 @@ test.group('Container | Call method', () => { await assert.rejects( // @ts-expect-error () => container.call(new Map([[1, 1]]), 'foo'), - 'method "foo" does not exists on "Map"' + 'Missing method "foo" on "Map(1) { 1 => 1 }"' ) await assert.rejects( // @ts-expect-error () => container.call(new Set([1]), 'foo'), - 'method "foo" does not exists on "Set"' + 'Missing method "foo" on "Set(1) { 1 }"' ) await assert.rejects( // @ts-expect-error () => container.call(['foo'], 'foo'), - 'method "foo" does not exists on "Array"' + 'Missing method "foo" on "[ \'foo\' ]"' ) await assert.rejects( // @ts-expect-error () => container.call(function foo() {}, 'foo'), - 'method "foo" does not exists on "Function"' + 'Missing method "foo" on "[Function: foo]"' ) }) diff --git a/tests/container/known_make_class.spec.ts b/tests/container/known_make_class.spec.ts index ff5c2a3..4ebf4e4 100644 --- a/tests/container/known_make_class.spec.ts +++ b/tests/container/known_make_class.spec.ts @@ -143,7 +143,10 @@ test.group('Container | Make class | Known bindings', () => { } const container = new Container<{ foo: 'bar' }>() - await assert.rejects(() => container.make(UserService), 'Cannot inject "String"') + await assert.rejects( + () => container.make(UserService), + 'Cannot inject "[Function: String]". The value cannot be constructed' + ) }) test('return primitive constructor as it is', async ({ assert }) => { diff --git a/tests/container/make_class.spec.ts b/tests/container/make_class.spec.ts index 5afdbb6..6d85cb2 100644 --- a/tests/container/make_class.spec.ts +++ b/tests/container/make_class.spec.ts @@ -143,7 +143,10 @@ test.group('Container | Make class', () => { } const container = new Container() - await assert.rejects(() => container.make(UserService), 'Cannot inject "String"') + await assert.rejects( + () => container.make(UserService), + 'Cannot inject "[Function: String]". The value cannot be constructed' + ) }) test('return primitive constructor as it is', async ({ assert }) => { diff --git a/tests/provider.spec.ts b/tests/provider.spec.ts index 00fda95..8c90f8f 100644 --- a/tests/provider.spec.ts +++ b/tests/provider.spec.ts @@ -97,6 +97,6 @@ test.group('Provider', () => { await assert.rejects(async () => { await containerProvider(UserService, 'constructor', resolver, [undefined, { foo: 'bar' }]) - }, 'Cannot inject "String"') + }, 'Cannot inject "[Function: String]". The value cannot be constructed') }) }) From c6a1908c43200a468188a23ed9ddda502b461ced Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Wed, 5 Oct 2022 13:08:32 +0530 Subject: [PATCH 025/145] chore(release): 9.0.1-1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 998fa13..03cf3d5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@adonisjs/fold", - "version": "9.0.1-0", + "version": "9.0.1-1", "description": "Simplest and straight forward implementation for IoC container in JavaScript", "main": "build/index.js", "files": [ From 10eb8471e0bc82cad62ac67a35ce722fcc6f4360 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Wed, 5 Oct 2022 13:10:05 +0530 Subject: [PATCH 026/145] docs(README): make the package name an h1 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 56ea2a7..adc37b7 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -AdonisJS Fold +# AdonisJS Fold > Simplest, straightforward implementation for IoC container in JavaScript From aa39a986e02cec2d4f72db414371746f2857e7b8 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Sat, 5 Nov 2022 16:19:15 +0530 Subject: [PATCH 027/145] chore: update dependencies --- .github/workflows/test.yml | 34 ++-------------------------------- package.json | 20 ++++++++++---------- 2 files changed, 12 insertions(+), 42 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 5dcb10b..2d9bc9e 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -3,35 +3,5 @@ on: - push - pull_request jobs: - linux: - runs-on: ubuntu-latest - strategy: - matrix: - node-version: - - 18.x - steps: - - uses: actions/checkout@v2 - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v1 - with: - node-version: ${{ matrix.node-version }} - - name: Install - run: npm install - - name: Run tests - run: npm test - windows: - runs-on: windows-latest - strategy: - matrix: - node-version: - - 18.x - steps: - - uses: actions/checkout@v2 - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v1 - with: - node-version: ${{ matrix.node-version }} - - name: Install - run: npm install - - name: Run tests - run: npm test + test: + uses: adonisjs/.github/.github/workflows/test.yml@main diff --git a/package.json b/package.json index 03cf3d5..cd6b548 100644 --- a/package.json +++ b/package.json @@ -38,20 +38,20 @@ "author": "virk,adonisjs", "license": "MIT", "devDependencies": { - "@commitlint/cli": "^17.0.2", - "@commitlint/config-conventional": "^17.0.2", + "@commitlint/cli": "^17.2.0", + "@commitlint/config-conventional": "^17.2.0", "@japa/assert": "^1.3.4", "@japa/run-failed-tests": "^1.0.7", - "@japa/runner": "^2.0.9", - "@japa/spec-reporter": "^1.1.12", - "@swc/core": "^1.2.203", - "@types/node": "^18.0.0", - "del-cli": "^4.0.1", - "eslint": "^8.17.0", + "@japa/runner": "^2.2.2", + "@japa/spec-reporter": "^1.3.2", + "@swc/core": "^1.3.14", + "@types/node": "^18.11.9", + "del-cli": "^5.0.0", + "eslint": "^8.26.0", "eslint-config-prettier": "^8.5.0", - "eslint-plugin-adonis": "^3.0.2", + "eslint-plugin-adonis": "^3.0.3", "eslint-plugin-prettier": "^4.0.0", - "expect-type": "^0.14.2", + "expect-type": "^0.15.0", "github-label-sync": "^2.2.0", "husky": "^8.0.1", "np": "^7.6.1", From 41a2b5342305b60a48f8635112b677e2f190d96b Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Sat, 5 Nov 2022 16:22:33 +0530 Subject: [PATCH 028/145] chore: make tsconfig strict --- tests/container/hooks.spec.ts | 2 +- tests/container/known_make_class.spec.ts | 4 +--- tests/container/make_class.spec.ts | 2 -- tests/resolver.spec.ts | 4 ++-- tsconfig.json | 4 +++- 5 files changed, 7 insertions(+), 9 deletions(-) diff --git a/tests/container/hooks.spec.ts b/tests/container/hooks.spec.ts index 7da7ffd..dbf8204 100644 --- a/tests/container/hooks.spec.ts +++ b/tests/container/hooks.spec.ts @@ -9,7 +9,7 @@ test.group('Container | Hooks', () => { const emitter = new EventEmitter() const container = new Container<{ route: Route }>({ emitter }) class Route { - pattern: string + pattern!: string } container.bind('route', () => { diff --git a/tests/container/known_make_class.spec.ts b/tests/container/known_make_class.spec.ts index 4ebf4e4..434c02b 100644 --- a/tests/container/known_make_class.spec.ts +++ b/tests/container/known_make_class.spec.ts @@ -132,10 +132,8 @@ test.group('Container | Make class | Known bindings', () => { assert.isUndefined(service.name) }) - test('raise error when injecting is a primitive class', async ({ assert }) => { + test('raise error when injecting a primitive class', async ({ assert }) => { class UserService { - args: any[] - static containerInjections = { _constructor: [String], } diff --git a/tests/container/make_class.spec.ts b/tests/container/make_class.spec.ts index 6d85cb2..d77b5bc 100644 --- a/tests/container/make_class.spec.ts +++ b/tests/container/make_class.spec.ts @@ -134,8 +134,6 @@ test.group('Container | Make class', () => { test('raise error when injecting is a primitive class', async ({ assert }) => { class UserService { - args: any[] - static containerInjections = { _constructor: [String], } diff --git a/tests/resolver.spec.ts b/tests/resolver.spec.ts index cce59f8..279dc20 100644 --- a/tests/resolver.spec.ts +++ b/tests/resolver.spec.ts @@ -6,7 +6,7 @@ import { ContainerProvider } from '../src/types.js' test.group('Resolver', () => { test('give priority to resolver values over binding values', async ({ assert }) => { class UserService { - name: string + name?: string } const container = new Container() @@ -43,7 +43,7 @@ test.group('Resolver', () => { assert.equal(property, '_constructor') return defaultProvider(binding, property, resolver, runtimeValues) } - name: string + name?: string } const container = new Container() diff --git a/tsconfig.json b/tsconfig.json index 5729388..e7a8514 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -12,11 +12,13 @@ "experimentalDecorators": true, "emitDecoratorMetadata": true, "outDir": "./build", + "esModuleInterop": true, "strictNullChecks": true, "allowSyntheticDefaultImports": true, "forceConsistentCasingInFileNames": true, - "esModuleInterop": true, + "strictPropertyInitialization": true, "noImplicitAny": true, + "strictBindCallApply": true, "strictFunctionTypes": true, "noImplicitThis": true, "skipLibCheck": true, From 0d9acae23257845efceebf26a2fbfe057eed0133 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Sat, 5 Nov 2022 16:49:24 +0530 Subject: [PATCH 029/145] chore(release): 9.0.2-0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index cd6b548..b8186b4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@adonisjs/fold", - "version": "9.0.1-1", + "version": "9.0.2-0", "description": "Simplest and straight forward implementation for IoC container in JavaScript", "main": "build/index.js", "files": [ From 3c43252a6efa2c45e9d636e035788e213d4b3dcc Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Fri, 11 Nov 2022 15:07:12 +0530 Subject: [PATCH 030/145] chore: update dependencies --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index b8186b4..4bff7b9 100644 --- a/package.json +++ b/package.json @@ -47,13 +47,13 @@ "@swc/core": "^1.3.14", "@types/node": "^18.11.9", "del-cli": "^5.0.0", - "eslint": "^8.26.0", + "eslint": "^8.27.0", "eslint-config-prettier": "^8.5.0", "eslint-plugin-adonis": "^3.0.3", "eslint-plugin-prettier": "^4.0.0", "expect-type": "^0.15.0", "github-label-sync": "^2.2.0", - "husky": "^8.0.1", + "husky": "^8.0.2", "np": "^7.6.1", "p-event": "^5.0.1", "prettier": "^2.7.1", From 354ab481b5e37ad934ecb8251165cf1922db7d01 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Thu, 17 Nov 2022 14:42:02 +0530 Subject: [PATCH 031/145] feat: add parseImportExpression and makeImportProvider helpers --- README.md | 37 +++++++++ index.ts | 1 + package.json | 5 ++ .../missing_default_export_exception.ts | 15 ++++ src/helpers.ts | 65 +++++++++++++++- src/types.ts | 11 +++ tests/make_import_provider.spec.ts | 78 +++++++++++++++++++ tests/parse_import_expression.spec.ts | 34 ++++++++ 8 files changed, 245 insertions(+), 1 deletion(-) create mode 100644 src/exceptions/missing_default_export_exception.ts create mode 100644 tests/make_import_provider.spec.ts create mode 100644 tests/parse_import_expression.spec.ts diff --git a/README.md b/README.md index adc37b7..27c5b56 100644 --- a/README.md +++ b/README.md @@ -453,6 +453,43 @@ const service = await container.make(UserService) await container.call(service, 'find') ``` +## Helpers +Following are some of the helpers we use extensively within the AdonisJS ecosystem to lazy import modules and construct classes using the container. + +### parseImportExpression +The `parseImportExpression` method accepts a string based import expression (widely used by AdonisJS framework) and parses the module path and method from it. + +In the following expression, the last segment after the `dot(.)` is the method a class exported by `users_controller` module. + +```ts +parseImportExpression('#controllers/users_controller.index') +// output: ['#controllers/users_controller', 'index'] +``` + +### makeImportProvider +The `makeImportProvider` method accepts a string based import expression and returns an object with a `handle` method. The `handle` internally encapsulates lazily importing the module and constructing an instance of it using the container. + +```ts +const container = new Container() +const resolver = container.createResolver() + +const provider = makeImportProvider('#controllers/users_controller.index') +await provider.handle(resolver) +``` + +This is how the handle method works under the hood + +- It will parse the expression using the `parseImportExpression` method. +- It will import the `#controllers/users_controller` using the dynamic import method. +- Next, it will look for a default export. An exception is raised, if the default export is missing. +- Finally, it will use the container to create an instance of the class and runs the method defined inside the expression. + +The method is invoked using `resolver.call` method and you can pass additional arguments to it as follows. + +```ts +await provider.handle(resolver, [methodArg1, methodArg2]) +``` + [gh-workflow-image]: https://img.shields.io/github/workflow/status/adonisjs/fold/test?style=for-the-badge [gh-workflow-url]: https://github.com/adonisjs/fold/actions/workflows/test.yml 'Github action' [npm-image]: https://img.shields.io/npm/v/@adonisjs/fold/latest.svg?style=for-the-badge&logo=npm diff --git a/index.ts b/index.ts index 36d8164..33c72b2 100644 --- a/index.ts +++ b/index.ts @@ -10,3 +10,4 @@ export { Container } from './src/container.js' export { inject } from './src/decorators/inject.js' export { ContainerResolver } from './src/resolver.js' +export { parseImportExpression, makeImportProvider } from './src/helpers.js' diff --git a/package.json b/package.json index 4bff7b9..8769dce 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,9 @@ "build/index.d.ts", "build/index.js" ], + "imports": { + "#controllers/*": "./tests/app/controllers/*.js" + }, "exports": { ".": "./build/index.js", "./types": "./build/src/types.js" @@ -45,6 +48,7 @@ "@japa/runner": "^2.2.2", "@japa/spec-reporter": "^1.3.2", "@swc/core": "^1.3.14", + "@types/fs-extra": "^9.0.13", "@types/node": "^18.11.9", "del-cli": "^5.0.0", "eslint": "^8.27.0", @@ -52,6 +56,7 @@ "eslint-plugin-adonis": "^3.0.3", "eslint-plugin-prettier": "^4.0.0", "expect-type": "^0.15.0", + "fs-extra": "^10.1.0", "github-label-sync": "^2.2.0", "husky": "^8.0.2", "np": "^7.6.1", diff --git a/src/exceptions/missing_default_export_exception.ts b/src/exceptions/missing_default_export_exception.ts new file mode 100644 index 0000000..cff953b --- /dev/null +++ b/src/exceptions/missing_default_export_exception.ts @@ -0,0 +1,15 @@ +/* + * @adonisjs/fold + * + * (c) AdonisJS + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import { Exception } from '@poppinss/utils' + +export class MissingDefaultExportException extends Exception { + static code = 'E_MISSING_DEFAULT_EXPORT' + static status = 500 +} diff --git a/src/helpers.ts b/src/helpers.ts index cb81b14..c756a7d 100644 --- a/src/helpers.ts +++ b/src/helpers.ts @@ -7,7 +7,9 @@ * file that was distributed with this source code. */ -import type { Constructor } from './types.js' +import type { Constructor, ImportProvider } from './types.js' +import { ContainerResolver } from './resolver.js' +import { MissingDefaultExportException } from './exceptions/missing_default_export_exception.js' /** * Type guard and check if value is a class constructor. Plain old @@ -16,3 +18,64 @@ import type { Constructor } from './types.js' export function isClass(value: unknown): value is Constructor { return typeof value === 'function' && value.toString().startsWith('class ') } + +/** + * Parses an import expression to module path and its method. + * + * ```ts + * parseImportExpression('#controllers/users_controller') + * // ['#controllers/users_controller', 'handle'] + * ``` + * + * With method + * ```ts + * parseImportExpression('#controllers/users_controller.index') + * // ['#controllers/users_controller', 'index'] + * ``` + */ +export function parseImportExpression(importExpression: string): [string, string] { + const parts = importExpression.split('.') + if (parts.length === 1) { + return [importExpression, 'handle'] + } + + const method = parts.pop()! + return [parts.join('.'), method] +} + +/** + * Import provider allows lazy loading import expressions, alongside + * constructing the class constructor and calling methods via container. + * + * ```ts + * const provider = makeImportProvider('#controllers/users_controller.index') + * await provider.handle(resolver, ...values) + * ``` + */ +export function makeImportProvider(importExpression: string): ImportProvider { + const [importPath, method] = parseImportExpression(importExpression) + + return { + importPath, + method, + defaultExport: null, + async handle(resolver: ContainerResolver, runtimeValues?: any[]) { + if (!this.defaultExport) { + const moduleExports = await import(importPath) + + /** + * Make sure a default export exists + */ + if (!moduleExports.default) { + throw new MissingDefaultExportException( + `Missing export default from "${this.importPath}" module` + ) + } + + this.defaultExport = moduleExports.default + } + + return resolver.call(await resolver.make(this.defaultExport), this.method, runtimeValues) + }, + } +} diff --git a/src/types.ts b/src/types.ts index 71893d2..2c4e010 100644 --- a/src/types.ts +++ b/src/types.ts @@ -126,3 +126,14 @@ export type ContainerOptions = { emit(event: string | symbol, ...values: any[]): any } } + +/** + * Import provider allows lazy loading import expressions, alongside + * constructing the class constructor and calling methods via container. + */ +export type ImportProvider = { + importPath: string + method: string + defaultExport: any + handle(resolver: ContainerResolver, ...args: any): Promise +} diff --git a/tests/make_import_provider.spec.ts b/tests/make_import_provider.spec.ts new file mode 100644 index 0000000..935a4a5 --- /dev/null +++ b/tests/make_import_provider.spec.ts @@ -0,0 +1,78 @@ +/* + * @adonisjs/fold + * + * (c) AdonisJS + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import { join } from 'node:path' +import { test } from '@japa/runner' +import { fileURLToPath } from 'node:url' +import { outputFile, remove } from 'fs-extra' +import { Container, makeImportProvider } from '../index.js' + +const BASE_URL = new URL('./app/', import.meta.url) +const BASE_PATH = fileURLToPath(BASE_URL) + +test.group('Make import provider', (group) => { + group.each.setup(() => { + return () => { + remove(BASE_PATH) + } + }) + + test('make provider from import expression', async ({ assert }) => { + assert.containsSubset(makeImportProvider('#controllers/users_controller'), { + importPath: '#controllers/users_controller', + method: 'handle', + defaultExport: null, + }) + }) + + test('invoke method on import expression', async ({ assert }) => { + await outputFile( + join(BASE_PATH, 'controllers/users_controller.ts'), + ` + export default class UsersController { + handle(args) { + args.push('invoked') + } + } + ` + ) + + const args: string[] = [] + const container = new Container() + const resolver = container.createResolver() + const provider = makeImportProvider('#controllers/users_controller') + + await provider.handle(resolver, args) + assert.deepEqual(args, ['invoked']) + assert.isDefined(provider.defaultExport) + }) + + test('raise exception when module is missing default export', async ({ assert }) => { + await outputFile( + join(BASE_PATH, 'controllers/posts_controller.ts'), + ` + export class PostsController { + handle(args) { + args.push('invoked') + } + } + ` + ) + + const args: string[] = [] + const container = new Container() + const resolver = container.createResolver() + const provider = makeImportProvider('#controllers/posts_controller') + + await assert.rejects( + () => provider.handle(resolver, args), + 'Missing export default from "#controllers/posts_controller" module' + ) + }) +}) diff --git a/tests/parse_import_expression.spec.ts b/tests/parse_import_expression.spec.ts new file mode 100644 index 0000000..3a327a4 --- /dev/null +++ b/tests/parse_import_expression.spec.ts @@ -0,0 +1,34 @@ +/* + * @adonisjs/fold + * + * (c) AdonisJS + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import { test } from '@japa/runner' +import { parseImportExpression } from '../index.js' + +test.group('Parse import expression', () => { + test('parse import expression with no methods', async ({ assert }) => { + assert.deepEqual(parseImportExpression('#controllers/users_controller'), [ + '#controllers/users_controller', + 'handle', + ]) + }) + + test('parse import expression with method name', async ({ assert }) => { + assert.deepEqual(parseImportExpression('#controllers/users_controller.index'), [ + '#controllers/users_controller', + 'index', + ]) + }) + + test('parse import expression with multiple dot separators inside it', async ({ assert }) => { + assert.deepEqual(parseImportExpression('#controllers/users.controller.index'), [ + '#controllers/users.controller', + 'index', + ]) + }) +}) From 00dc83e434e23f0020fc3d45f42f27a4db27f461 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Thu, 17 Nov 2022 14:43:46 +0530 Subject: [PATCH 032/145] docs(README): document E_MISSING_DEFAULT_EXPORT exception --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 27c5b56..8a7937a 100644 --- a/README.md +++ b/README.md @@ -453,6 +453,9 @@ const service = await container.make(UserService) await container.call(service, 'find') ``` +### E_MISSING_DEFAULT_EXPORT +The exception is raised when a dynamically imported module using `makeImportProvider` method is missing `export default`. + ## Helpers Following are some of the helpers we use extensively within the AdonisJS ecosystem to lazy import modules and construct classes using the container. From 398e77ff7bff47f31a129ef8ea2340c0fbef21fd Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Thu, 17 Nov 2022 14:44:40 +0530 Subject: [PATCH 033/145] test: fix breaking test --- tests/make_import_provider.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/make_import_provider.spec.ts b/tests/make_import_provider.spec.ts index 935a4a5..0d79642 100644 --- a/tests/make_import_provider.spec.ts +++ b/tests/make_import_provider.spec.ts @@ -48,7 +48,7 @@ test.group('Make import provider', (group) => { const resolver = container.createResolver() const provider = makeImportProvider('#controllers/users_controller') - await provider.handle(resolver, args) + await provider.handle(resolver, [args]) assert.deepEqual(args, ['invoked']) assert.isDefined(provider.defaultExport) }) From 739dd657c357a1b53decbfac01a5bf5d656390c1 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Thu, 17 Nov 2022 14:54:17 +0530 Subject: [PATCH 034/145] test: fix breaking test --- tests/container/call_method.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/container/call_method.spec.ts b/tests/container/call_method.spec.ts index e668c37..43a466d 100644 --- a/tests/container/call_method.spec.ts +++ b/tests/container/call_method.spec.ts @@ -56,7 +56,7 @@ test.group('Container | Call method', () => { const container = new Container() const fooResult = await container.call({ foo: () => 'bar' }, 'foo') - expectTypeOf(fooResult).toEqualTypeOf() + expectTypeOf(fooResult).toEqualTypeOf<'bar'>() assert.equal(fooResult, 'bar') }) From ea4ffd15fe073847cf95d376cf21496a9c110223 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Thu, 17 Nov 2022 14:54:52 +0530 Subject: [PATCH 035/145] chore(release): 9.1.0-0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8769dce..94d6b7e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@adonisjs/fold", - "version": "9.0.2-0", + "version": "9.1.0-0", "description": "Simplest and straight forward implementation for IoC container in JavaScript", "main": "build/index.js", "files": [ From 6f3b7a4850e500e14556a6fb5bba985e91b7abab Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Fri, 18 Nov 2022 13:03:02 +0530 Subject: [PATCH 036/145] feat: add "moduleExpression" module The existing "parseImports" and "moduleProvider" helpers have been removed in favor of the "moduleExpression" module --- README.md | 108 +++++++++-- benchmark/module_expression.ts | 79 ++++++++ benchmark/services/comments.ts | 3 + benchmark/services/posts.ts | 3 + benchmark/services/thread.ts | 3 + benchmark/services/users.ts | 3 + benchmarks.png | Bin 0 -> 326187 bytes index.ts | 2 +- package.json | 7 +- src/helpers.ts | 73 ++------ src/module_expression.ts | 176 ++++++++++++++++++ src/types.ts | 24 +-- tests/make_import_provider.spec.ts | 78 -------- tests/module_expression/parse.spec.ts | 34 ++++ tests/module_expression/to_callable.spec.ts | 97 ++++++++++ .../to_handle_method.spec.ts | 109 +++++++++++ tests/parse_import_expression.spec.ts | 34 ---- 17 files changed, 632 insertions(+), 201 deletions(-) create mode 100644 benchmark/module_expression.ts create mode 100644 benchmark/services/comments.ts create mode 100644 benchmark/services/posts.ts create mode 100644 benchmark/services/thread.ts create mode 100644 benchmark/services/users.ts create mode 100644 benchmarks.png create mode 100644 src/module_expression.ts delete mode 100644 tests/make_import_provider.spec.ts create mode 100644 tests/module_expression/parse.spec.ts create mode 100644 tests/module_expression/to_callable.spec.ts create mode 100644 tests/module_expression/to_handle_method.spec.ts delete mode 100644 tests/parse_import_expression.spec.ts diff --git a/README.md b/README.md index 8a7937a..b79acfb 100644 --- a/README.md +++ b/README.md @@ -456,43 +456,115 @@ await container.call(service, 'find') ### E_MISSING_DEFAULT_EXPORT The exception is raised when a dynamically imported module using `makeImportProvider` method is missing `export default`. -## Helpers -Following are some of the helpers we use extensively within the AdonisJS ecosystem to lazy import modules and construct classes using the container. +## Module expressions +In AdonisJS, we allow binding methods in form of string based module expression. For example: -### parseImportExpression -The `parseImportExpression` method accepts a string based import expression (widely used by AdonisJS framework) and parses the module path and method from it. +**Instead of importing and using a controller as follows** +```ts +import UsersController from '#controllers/users' + +Route.get('users', (ctx) => { + return new UsersController().index(ctx) +}) +``` + +**You can bind the controller method as follows** +```ts +Route.get('users', '#controllers/users.index') +``` + +**Why do we do this?** +There are a couple of reasons for using module expressions. -In the following expression, the last segment after the `dot(.)` is the method a class exported by `users_controller` module. +- Performance: Lazy loading controllers ensures that we keep the application boot process quick. Otherwise, we will pull all the controllers and their imports within a single routes file and that will surely impact the boot time of the application. +- Visual clutter: Imagine importing all the controllers within a single routes file (or maybe 2-3 different route files) and then instantiating them manually. This surely brings some visual clutter in your codebase (agree visual clutter is subjective). + +So given we use **module expressions** widely in the AdonisJS ecosystem. We have abstracted the logic of parsing string based expressions into dedicated helpers to re-use and ease. + +### Assumptions +There is a strong assumption that every module references using module expression will have a `export default` exporting a class. ```ts -parseImportExpression('#controllers/users_controller.index') -// output: ['#controllers/users_controller', 'index'] +// Valid module for module expression +export default class UsersController {} ``` -### makeImportProvider -The `makeImportProvider` method accepts a string based import expression and returns an object with a `handle` method. The `handle` internally encapsulates lazily importing the module and constructing an instance of it using the container. +### toCallable +The `toCallable` method returns a function that internally parses the module string expression and returns a function that you can invoke like any other JavaScript function. ```ts +import { moduleExpression } from '@adonisjs/fold' + +const fn = moduleExpression( + '#controllers/users.index', + import.meta.url +).toCallable() + +// Later call it const container = new Container() const resolver = container.createResolver() +await fn(resolver, ctx) +``` + +You can also pass the container instance at the time of creating the callable function. -const provider = makeImportProvider('#controllers/users_controller.index') -await provider.handle(resolver) +```ts +const container = new Container() +const fn = moduleExpression( + '#controllers/users.index', + import.meta.url +).toCallable(container) + +// Later call it +await fn(ctx) ``` -This is how the handle method works under the hood +### toHandleMethod +The `toHandleMethod` method returns an object with the `handle` method. To the main difference between `toCallable` and `toHandleMethod` is their return output + +- `toHandleMethod` returns `{ handle: fn }` +- `toCallable` returns `fn` + +```ts +import { moduleExpression } from '@adonisjs/fold' + +const handler = moduleExpression( + '#controllers/users.index', + import.meta.url +).toHandleMethod() -- It will parse the expression using the `parseImportExpression` method. -- It will import the `#controllers/users_controller` using the dynamic import method. -- Next, it will look for a default export. An exception is raised, if the default export is missing. -- Finally, it will use the container to create an instance of the class and runs the method defined inside the expression. +// Later call it +const container = new Container() +const resolver = container.createResolver() +await handler.handle(resolver, ctx) +``` -The method is invoked using `resolver.call` method and you can pass additional arguments to it as follows. +You can also pass the container instance at the time of creating the handle method. ```ts -await provider.handle(resolver, [methodArg1, methodArg2]) +const container = new Container() + +const handler = moduleExpression( + '#controllers/users.index', + import.meta.url +).toHandleMethod(container) + +// Later call it +await handler.handle(ctx) ``` +### Bechmarks +Following are benchmarks to see the performance loss that happens when using module expressions. + +**Benchmarks were performed on Apple M1 iMac, 16GB** + +![](./benchmarks.png) + +- `handler`: Calling the handle method on the output of `toHandleMethod`. +- `callable`: Calling the function returned by the `toCallable` method. +- `native`: Using dynamic imports to lazily import the module. This variation does not use any helpers from this package. +- `inline`: When no lazy loading was performed. The module was importing inline using the `import` keyword. + [gh-workflow-image]: https://img.shields.io/github/workflow/status/adonisjs/fold/test?style=for-the-badge [gh-workflow-url]: https://github.com/adonisjs/fold/actions/workflows/test.yml 'Github action' [npm-image]: https://img.shields.io/npm/v/@adonisjs/fold/latest.svg?style=for-the-badge&logo=npm diff --git a/benchmark/module_expression.ts b/benchmark/module_expression.ts new file mode 100644 index 0000000..8f9e7af --- /dev/null +++ b/benchmark/module_expression.ts @@ -0,0 +1,79 @@ +/* + * @adonisjs/fold + * + * (c) AdonisJS + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +// @ts-expect-error +import benchmark from 'benchmark' +import { Container } from '../index.js' +import { importDefault } from '../src/helpers.js' +import { moduleExpression } from '../src/module_expression.js' +import Thread from '#services/thread' + +const suite = new benchmark.Suite() + +/** + * Our implementation that returns a callable function + */ +const fn = moduleExpression('#services/users.find', import.meta.url).toCallable() + +/** + * Our implementation that returns an object with handle method. + */ +const handler = moduleExpression('#services/posts.find', import.meta.url).toHandleMethod() + +/** + * If we decided not to have cached version and rely on dynamic imports + * all the time + */ +const native = async (resolver: Container) => { + const defaultExport = await importDefault('#services/comments', import.meta.url) + return resolver.call(await resolver.make(defaultExport), 'find') +} + +/** + * What if there was were dynamic imports in first place and we were + * just importing everything inline in one place. + */ +const inline = async (resolver: Container) => { + return resolver.call(await resolver.make(Thread), 'find') +} + +const container = new Container() + +suite + .add('handler', { + defer: true, + fn: (deferred: any) => { + handler.handle(container).then(() => deferred.resolve()) + }, + }) + .add('callable', { + defer: true, + fn: (deferred: any) => { + fn(container).then(() => deferred.resolve()) + }, + }) + .add('native dynamic', { + defer: true, + fn: (deferred: any) => { + native(container).then(() => deferred.resolve()) + }, + }) + .add('inline', { + defer: true, + fn: (deferred: any) => { + inline(container).then(() => deferred.resolve()) + }, + }) + .on('cycle', function (event: any) { + console.log(String(event.target)) + }) + .on('complete', function (this: any) { + console.log('Fastest is ' + this.filter('fastest').map('name')) + }) + .run({ async: true }) diff --git a/benchmark/services/comments.ts b/benchmark/services/comments.ts new file mode 100644 index 0000000..10a31b1 --- /dev/null +++ b/benchmark/services/comments.ts @@ -0,0 +1,3 @@ +export default class CommentsService { + async find() {} +} diff --git a/benchmark/services/posts.ts b/benchmark/services/posts.ts new file mode 100644 index 0000000..83b4329 --- /dev/null +++ b/benchmark/services/posts.ts @@ -0,0 +1,3 @@ +export default class PostsService { + async find() {} +} diff --git a/benchmark/services/thread.ts b/benchmark/services/thread.ts new file mode 100644 index 0000000..2cd28fc --- /dev/null +++ b/benchmark/services/thread.ts @@ -0,0 +1,3 @@ +export default class ThreadService { + async find() {} +} diff --git a/benchmark/services/users.ts b/benchmark/services/users.ts new file mode 100644 index 0000000..b24391d --- /dev/null +++ b/benchmark/services/users.ts @@ -0,0 +1,3 @@ +export default class UsersService { + async find() {} +} diff --git a/benchmarks.png b/benchmarks.png new file mode 100644 index 0000000000000000000000000000000000000000..e5b6c2ae9166cf068deff1aaf66e5e3d8f6ad5bc GIT binary patch literal 326187 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 yZbZt8*<_x27*35K*N7B&nGcL-&8^$;j4^h z3++l-uULoxg5sKn4`P^(fP0ngZ|@SPoUei6X%M?rv;odlr#Br;R|ehNaxNJmr<8R zs>UN8!|@2!JFe+BV8}L55H~Uc19wJ7NekXH_sY|szD`oR2j0%IG(rD19TZ!)dr*cJ z#oTe%_FH3%?UN}&QdfMUkJh&49WodRFNdiLuE2?6I<}^pe`}viAz;yc4oa%~%{}m&y ze|W(ZOPjVW@Y(FE1q{WibNR|Q*?`lN?JxKF;oKO?CU%^nKM5h- zmPzG-%>;RMQFQTMK|nNu&PqsU7bg*ekJ%mY*aTOZJ#eZZa3};K`}g)L|5lnP&VYc5A@X^huD#LBt7;Qstu-bkLHNw3h)SD65pP05@6mK~s zPaJbM=o~Ls^P0t=a?g4oW~{Z0D2f&%E6P3O%{+y86?d>d@zhaYVGEydr6K5!)TNWB z`SuqpeE3uLlzYS<#2GjA86606|Mh@Kh&H+m_;<{ySwr`sx@dYqEasN(6`8xpW&o5g zu@b2A8I)e3^}){NC^SAL|A%Kul2IV`y+yX1BUP8NMw5IQ6qG}2tL)$LvMZ%M&OVs2 zjCCEm5gozu`75s>@VAPkC;n*Hs|`qF*c*Dy2cqLAhKky}{{8ynM26{~=tUWZ1dN1a zbGHTQp{G0H^p@)fH6^stID)vkCv7R`#~5F=%YYu`=zg$VR-#61Nm?Mu*A>wdQNUm# zCeqjcIM{cg)qu7O?dckYmS7B=Y$uWKAeSF$>q^zYrb!M>BBO5leusM|neaqeO)Gc8 z-})??MyQgPJk6lES;4DWwMn={tH!z?r~F&CUHHhUnUHI>^5?zAaNJeNH~EZ4KniFM z>u0#u^-^Y26mY=&S5E%3g#?0BnQX*>Ye%#rrX>??G&Gy^SwO;zh05^p+b}V@D|ba2 z?sM}=*GB`T&7e}aMcsOoNu!C3btX(9kc}0NX-A)IYX@Q?fx=D-;~pp)bz1=R&D%-g z<}d!;1It-Zv{1K_^Yu)(J+=XJqC{OTyp9uMZI|bDyP-l}-yr&DT}Hmi1x0Sgb};v5J5++nFd@ zo!(QboCxJ$K12CFJk~!a4-~DaAiC(nK(>FcNxV^oghKiSuYNJS7SkhC_OAM@$?7bc zHP@ze3Y3VjrJoU6Bh}@yB2b}$eNPAyJ&U4o9616K$i)}C1v5{+{rMR^>pb3|B8r@; z2Vpvlfh1V*$GO|cF*E_P#AgUX6t8@RBc7fTVqkyGzf?&qp0NqU&>_b_;aU)9QY^7Fj%2h?EXVQCKhqflw6>}_$yodAsBvAezpD| z6pZ1Am8ox4syFEksE~6XCGr1CdsLLCT`PA+U$0b3Pa)@xD*ig$_Fpcmu!Cs@GY6J(qD|CIc9~i#dAMqR&6G z)ThMxPy2QMsWA8NGT|ZrZcPN3gy@lP$)1(@ujtirA2Nb)2?m6Tp#pvhT+Lb(g*6~A z8f4i2;Q}yFJ%Y0JMOKnx^=grIt>wDWVqo`9rCow@SxnhAmCC$iaWu?{Laa30-95Rt z>&e3H-ZU;*t&1O3lG1ByXIuu{Y#vW0I4ZIs17z_;9jx@NfkJk&VTkxf1Mfe)@FU3~ zN2g-@F!_-cAc;3oxun$=kjx~|NkgqL_v(fq1@)ab!wi2#6m4pkRn>ew0)e8#upp9? zjGAeNx!32SlQ)1tbeM8d9GL%+CP|PXilvP{JsUqH@gRJGNSa02P-a+LO-}H*pdopW zM50DCe0B`~g=Y^|a2Ts0yTCeJqK;72HGOc1%#B@1v_wPcA@+7`=Z2|AqaZh$jTqS# zv7e{-4w31N(srcmzxid;NbhYeLT(p8bPtjhuX%Ok>A4VZl5$;wRKHi6X0H#kzwWOo zq{~CchcTr#1g`4#nP)q|@lW8m2dlmcJP0c8wi)#F;7RTXQf>t8^Y7DU-NS6v zG6?^(l>>Xv{yp$4O}ma|c;#uBB_#Wj*_~LH_egx|r;6)cKUgBwoYgtTGX$bkkC#7X z566;?6kecDHn+Q$^$kWgi5wiVEY9)DRie`r>D;_!GrGbztQ25#NnOX+|5Jo5 z^-XFs=rz9r)I3_&U;$K=>&I`uCD&Lvp%A%3onnvl^E9<6WJZz)Y>2$c#7+wZ5 z>iQ0OAr0n|4$bcbFM;UvCQTCefB8lIeXs{e%B%E%7z^Wv+cS)r(N=DE!H=pm>!v*m zFvAJ1AGa0X2MBrAOX>x zWB5h?ySsX~Ku(jtct$ne4>H^uEL)_RFV{)(`<)u^0+U$>Hf?Y(xJ|-Sy zbXiJcYg7c^774Aq@c4uWbMvAU3)uYc89Z;uoSE(uL+ z=9j1wtTLj1-RpZ)*>bP2Hf9FVQ4=f^+tkJJd!-uU;%`X2Ms*}ZvlTzI)&uY*Xt?16 zin(F2yPAgXWGOiMBLp_GppwyrA|Ot#*9mcMtP8Z>EX|+h>+$=3joE&=Y!jX73GDw; zx8EUgtj7F^0nd;$0}lR2n|K}6ZuN8(GNqcJ{~5lS{9iGwnlN*HAsi(&c;Ykzj_q0>s#@1&E^ehi5t({9Q9A!2VuAir%(H zFG8s$oxC{7a4R0RVT062Iud!ie0FM>X;6dO z{pQy(vuL9SE7pH76a?Oc%|2J+|8{v=!YnC3fVbN2%s~7*d=aVtXgtY5&R2CUin?EW zVuA|C;OHQ7OB=RNNsby4T#WJZJElOKC9|LBLpjrxAO=|vLP)Pz+UZHMnc>TBb|`N& zd{M>Z2TrAwW{*WOps*Q83uZM+={Iz$&V$+{SiYmC*14lz|B+?xHpmDw`J2z6sTPk! zgxC>z=X(S~5d5m;;!|Xrq|aXGwY@BS7egJAC0=aVGC)QUJSX88L?wwu$CO0y2u)aE zkZcn>45)3hvuF(LSlsQ8VGQY3xzRxOgBWp~87sTkU=0~VbsX=|NB^Lrm^NSp$0I0E zh$iO$IhCq{obG#Gpm9yLQO6kI4p`2`(x-N62LaB zcntJLJU(65eX(2k#&%*|=tRl1Wp;QwFBz~9AJfj^Ze(491`1)+6M&VK!7-z^AMCPT z9WCl;MfFNY8!<9l8%3KDeeQYj)#N*&y}Um)>ywp$Z}rk%zSPm{xw^e3$%mh}pf_PS zf{U`37zb&$_{O9zSy25;vm!41@k&*kv=#~XlY^%-xQ-IpzqbiUfN$RIMQukf_6KPN zgJj7{G&kK#V)W*BlM}oh!1=i)}j1 zCX+)kRNPC#x%cA3;6yp+m0kd>aDn7-W$Sr17$ZSZ^(M6YeZ3`bFWO_BukL<;ITe?X&Q%Gs3Kkk~_NS4(R5}BNWYkaTU49VrN#xMPSFYTS)r3X=pnvnI z$?#Jtq-|{%B)w${QLv^9d2}~@Y32UqO&JbE9_w`$r}{h42Eo9+fdpiHw}MW(1iIC=t%CY?+Gjt%X4 zMby|ZCV8ruDRV-~3=Vya$!Adt6-7sz3@Qa3KrRxxgqKbXc7K$|@xT)IZiLF!pg2=e z#SGRm*jaCBC>8t<)o zzmRWNcPL-Pi057@#6d_>-^Ua^N%+4cZI%1Oc4`&#iq6p`^Fa@i_0Wn^8wKjuSe#;6 zOpS4wASTmumXeHN7B9)aW`Q{>vJ@@{6G(GSF1IiBz`=-7ZUb?Y?%zgm86TASJHTq5 z1uAskWDf4AHiAU;4uY}TF1zXX(iY-)w={6n8!wUR4Wc6m&-Of<>iGMkU&E%>AZJ08 z3fiKXJ~;GW*Z~x(i!prv2CqnvD&11ht?;fdOTk6*6lL2U=ut^DBy_-`cn;hWD)~B# zmqz*)c=|!0nVOj*{B4*}D1HO$HJlo(e9Q#~I~P`IJtnR7X9b0ML+}U|dBh!}l-oSD zU3$eVtfE*)x|{^j`AP>!{#)E4ANy(a__k{k0(Gw~oE&t@@EsPeaT z&f+U#fktE5OTX0_OdwSTG#$);2Y7q{*sk}%_ptVDxl(#VJcX>!z3vMFb?r1aq?jn# z$_g^2It4*UiPTMo&P8GGf>C2NIb|JR=Qv5$x+c>t)V-~Vd7AKVt%?^U0ZRs^1{Z-GOp{OhrzsTW>Z<|RmT_(oUwlm8&NL5^xSYTyrVnOw7 zGBmB&`Itn4i7d>Pu{072RrrEKY;5$0$X-Jvch9w0pGRwwlu?rZ)n+05&&I!Vx(-^$ zip?ZYDi%PnK^bj?bX7lTLTRa$*!f}!Unw6j z?}7T&7S7E7=%?Wl=dVVRf#yc~AZ^ zKfDx({IBl-gsNo`^(92<(9lH0rd3SW=?f~9IX$=SPiAxMyQLG5!e$K(sI%_2gZKm> zE*|W^^$^i|APldDHxsn)KG~tl6)niy0=`T2U`J|3_2!V>D?X7cP*sQTmmF4Ir*Ou_ z7XBElAT77<)|AO#Ih4+4L^0#y7!A-rj1*h;jAUg5C$cf=Vm=3!$Yq10=pwfAIMNhx z#QWN5NHD;DPZ)SloR}0OW?&dqJ|zPRa(hIaSgG&1zuxV6+f(0oiT}Jg(ns=q_s_jw zVIWB?AQN)W^CCn{7G`m0`?utV`eMxgQR!GNEr*AQmV^de_)!OD5QBlGPZFEdHkRmn zK88fD>Hwl`A<2wf{fq>=WW-eD?idjmY%#FchWqMUR^4a))8L8C7ygTLK%1tqB+ZhL z$;+Fl`}iE0^l%8*0Vk|1CVig$L`XPB4VAKW6XbCJp6iqD z$$F4+%K?jUiMj88a{#pkUTuMmjN@SMfWw!ab!Y#L$;QMYFc>~;nsDU;PIn}^12 zwyn|1^WKZeWGDTe*DS_xtyo`H?e%c_8ZMS$-&a8MFX*oT5hD;xrOF2g(Qvbd-i6)U zm^F_OX>`!pL$T|xwPzB zK8e0(K398riqWT^Eq_=t?#Iyw)rUMp1jK(9Or;h=ZbAm!NacHY6OWsq*5`!W`DTYR zmk@%exLiI*Xe97DQiI^qcB~PV$bH4RMm?3hYpY__1!VABtdjg^x@A$M{G*j4Kgdva zC?!Ykt7M;st$8 z6xRBr!3vtci&l^;7O7N)FnMs|Xypfx%7PQ=j^UEf1zy=hC7nQy=U~psqfs4`t zi@3^M7VVk_clO-@EJOutnuv$(=@L( zN5qiuk(JzgjzH(%O0?XD3|QcsrEc8BOK1UxSx7+Y`m2!WM>&JU%bP~T0OZB1+wCHM zB$KG_+zXw>yR#DYfE#7=obF&*y!y&sccnABy6E%kBF)M7%!n>%4crvoL$EEWck*JVH8sj zN6oDJBi1lHTi$KnUtYQUAq{@s%^@m7G zeLA>wg@Zw0)R(YAIWD^F*{DZ2WrY1g9RjXcj!W3+Gi)osPLT7q(nvGwbYm1|dfeMr z_&%I{w-|GImk)VGOZB8E;gGue@Q0+82P@)3h07+dYg=ckE9>!vN4~w^KA9jm@A7My zKI$Z=iQ*+Nv;{$6BDIg*=tb%1h((a13zw|Prc}O;nkR&?i9k=Ivojmmi3p+G9|-Tu zqQg!~99IQqa@Wlxp-gBDL{NU?A(kQ>;em84e33)e;y1GSU;1W%ALUu*IAki=B*2;5&W;+|?_7b5Hw_PjG*o#9*fzlmW60*uN!C3W zbQ&NB69FWP(UJ#wDuq%kY;Raem_^fULl?)=!~LjsZ)nbH?e8>z%?#z-+;={cY)yF}|!ddvs4$ES`D zbMAGWXqZIB7vXGeL&leD1S%z@(FO zXq8Q-7z?J7;Il{tar5O%VuKV@<68w1s6ioVl;n1j5kI`mo0R$ZXh24&bz4mu51sxt zaV}bRnsRiY8uXqf0tIEo+=%p#!E#g}duq+u9nbrpmTrl0?+VIu=5!3KL|K^py^t-Y z=2Egd7f`oLk+77fZ-&L-d+t}oCS6My9u6f4si5VN4xZmua)_k0NGC#q-HnkIvd#L1 zKhW{{Dz5V6#!%X0qv)Yv-avaZ7^tmtlUs&`eYx$b8Xeyu_gIXSoc2D?iwO8Pg9ZR& zi5GhFy07LFq--b=+cv{RR{$$yB$`4Cf6xqa>#$-MrD6}Qa6-V;s?iui&df}B-Oa&a za(@T6ub)V=HT-pnC!EqV%%K;b;)lHVPEuwd^O{LKiuxS(~FZ5g#XQk=r!kgQ$| z0wmh4)Y!pD&jk-ocJ9l}gZ*x3eB>dH&cWU4^@6fzpI`-cG0A7@ZWEQEXG4FzE7us>yaGon=&RH=nMWO9YhF7 zVhqJllP6URmZspSIU$_HiM8A+!)0VrA?(hs71F?$?12SeF(zF_X)smKV{&p!dVHpm z_OD78dY>PNQ>l~Uny?uZl4se|rUTh`vtm-1XE6~)4q~%VHe>Y_3gFF)k#Ei72Xg2~ zR{x6m04Ko9?zFRWXsb z`vi~@pGF#`a!0z5Gv&a1t1MQj9XKLOb9DfNUFsVRDW*aJEW$I$VJNE1T*h&Pbv_(V zUtm?UgbI_6hi17|SCdifPK-cv@^2mpqZM=cQfdkD zVXT@nkxf&6RIKxWoXbRBHN{Mf8DRJV3p@jzs6VNq5TeTnq>Ij@Zi2G*tdRi-&o(N@@*f3pvkg4DK*mS>apsp6K z_(M8*dpvdHQ)CSl6hxlCOTvwd%SY7kb7aP^1qZ1#mi_GI28#1-hmB(42ZGfd*mL^m zTe$8&LIj+>;C{6SL404ZdLUu%)89KGl)2SSS779f41XcDs?mFlcl*34-oIgHFAR?( zl(&fXo8S+ZCTKVdG^VfE#8UMjN_Qoj&sPB@>`5hZ^C9Z;bpeRFosS6Ti>jI;q>u^-M!0=ig`VB3La9!A zPVpdRVxt;)*#9Sd zc2Zs>;tLrYdWp;AANF7<#eD`3Nan^_|0PKC;#o@3TZ8EFhbZo zK_88!B0QHk1*qodz$IG>su4GIQIJFV3=v5n7&V5PPtREyVxY1V{ZeeljVClJlb^m4 z`m46QiR%N9&z^v0UsR~Kz}B%SA_ngt?eIYgHY`rqls$=gyeu6tImXh3DFNKoLPR^S zCzgtlBTfpQ4LQvE3z-?;t-KY2n7lC2fB!EFAtCmMX7kF&byQACt+rW??xkxX0bhC~ zCrFm>b^$4gXI#46BhV9BVQb_AwmfM;=zqKbGmr{jY)lFBiAX9rCvzl(p7e8iw$NvD zSLN)_Ld6H$FwX0&zNw^<%r zP8^UWAB9EXl*m)9*Pu$ESi&@YGVFhkE2rpzX@29^zay{(;L;%VqTBtSlLBNdD^oEa}S zHaOVU-OBvTPRR%Yn~Ql6BzPLOldAOvtB&xdN1LkI)I9WbPteLDrqT7$V9#(!z{<-& zTJrdTNE4;<2{5zhU}bpCCD%H?MNm>O;7fs^Lp-qONZjMNwbCuOH1%-i&Be9CFKQF7 zi6xx)l9H1Ya(JOH=84z^K(hlyhbxD=Vnnnr?y-`Wl96AhBE}#>EM!<=ApF?df`HC{ zY7POg|4+2#LV01h`Qmzvm17fiqgeG}Ot0EypHiuc;L;)a{kr_;sgPx_j1?vaory3$V z60|Q{&8bxxGC`q;^=LYYpcmZ&g?h-it@lY!KUpzEb)O@iPu&+mxR{UdkP;;TA=bx! z5{qk0mW{3m06Q>jyhyr3GQy$m_1E^<+YVL$%{zsjgbE8ak%~G^C}LgoCz8OvfvDf2 zluiTj!0gDVRi~ne=N6E%j!Q1Jnw=h-LIIuYJ`8&Kr>?g=H^Y3o|ClZRv{K}6RzZ4& zXU#V)`h|O~p1<-oEe{;=$3>AJ(*8dKQdEz-|Mg-ywv66l@aPBmWhqQLk@W>N4C{g> z)mX($=6iQ4@#s+GI)Y>u2vNKGq3J}!8`Bz$h?{rCh!fu;z)12%+`?6!b(Gu+fqdxdT>yM;7d}W_89XNBc4?LFH`Lc_lpl(-)V5zhHkQ8TIGh?~!K79aBFOfDulWgFTOk*i=Gx z$Xts|?}MtOC8m~DeA>X;?%$a-3+!({MXqPe!|~%vyPa&!seUr@41x5Al)D|tXgEG?bLMRFd6+y5*}gd%pVz4A z%JdO+-j5dW7XfX!WN4%rRj}}TayT6Z9ptITi98W}c>my#&f0mS?s`N+OK)31Hs|XT z8yh>{kazq2xc%e@#0T(Z?t0#NUwPko?tAR(zP7xcGgqooS!(QF?KQ;tHNWj)gxYHU zulvULv-T6R+lQSv^cC+}$cINz`>tYbI4T0y3gd)-h&=S7yWQ7leKfn=oh#KJ{A}p+ z678KUvsR7H`_7gMPOItWim9j0u3;n3y_92nzk#sI$~>L1-Dy}e=+*5#-FZ(I_1rzQr%UdIvM#~Wz3t@s?u-7b^RRjK93!sK$hoHLn8EdW zlDDF=rb}M~}JsLrOhC{^#Bc3HwyMEVm20E$BThb*{ zYlJUR%y?9WfMwAnB0ob9+U5|jKm5+5mbu}-o{_JT=GKN54=I#U%w$PZw=Irc zD7u@3zSR!jC_0_JSSiCDw^p?TC4t8s1ozhr@8b+cK4+_jqxfFFH@M@OXltz#8waZw zT*;NWxJOc~Q?CE#4+~HI8x;kzY^kg~{T}N3LCX}s`&6g%`2=Y?;jj1g%^ie^>?Nxl z-#Zbj&J*8F6Je#~EpYluB{+S23)-TtndNmK?hhF4 z&V+^Uq6Q74pWi_mP<1c7GdMjLxI9Z30LiuL2x#GxMjPXKfAQ`-zyk^nT9&9{$sR{h z{P!~Xbbt#YPn=pLC~OhD6FXnTBDGhaR)O89mdJqd&A9XNLkD=(?SWY4z44UP4o|1i zmY??{-=q}YEi~rG-O~od?^NpLPEwWjZjKu2&6kneJdWz;pv=0iV>PP{)UNg)Cyow= z{obUsf9TTszc}vf3I18-oTtWk4ni;ba##Gfv9jO7}oScU?DN6dyqZ_^m9c%s1lN?1Vj5#X^=%}KQ zF)nxKqI6NIEcYH459Izp8U>uBZ2o$Ms{2iRF^t5*ft{u4VT;LjC8x)$JqqlS0UF)e zBK0PDDY-n6>iAzWX*cJ?aeFTzDD@U6Zu~EEGrTPP+r9&vYs_*hMM^p9pjdKdbn;i4 zoS%2`DEK)CYrHM@?=iWK=vXw0bleqMsnLXU#Mklz;gHGh*lj+0k#-wTAtXXKX06fh z1ndP0gI5+b#v5x_-S4j|D7a-FUT>!vFSqxbPEQlM%XfpyzRf|<9}|JfKnr<)mgRc$ zRQJu8a%YxnAkqLiI(b4$<>Dwg?^jrP0%+yMa$P0l-D$>|0x1o6cIWG}^SfiA$?Pxo zb!Nk<$65?>nOx=Ok7K{Lrt;-eINHo7Gj)}-`Dljy`7uue6muAgHGgP+oGp=~nJJXQ z?x7O9?|y&NzdL(2(ym#hxIbG*x#Ft>ce28v>?ZYvAj_`tIqrUm#C|dU4E;Ef(NOPs z;`aFXz)A^S6ZE&$9>y4UBLGp-^ZCnY4rA$jwPAlbZyJkn0vd74NZn3%2UI8OA+)nj zlw}N!!hUqU>5k>{?eCVreYR%5gBXdd$yBcx z60A%5BQ0&fAorIVTCVGd6{!0$b@*NEU)}KvUY-FcBr>id1;p_3hye6OwG*fSM_Ge5 z+LBf%F#{-c_qZ_PqLCr7x^&tP@R2eEgVO}C`_?JB-24ER-pz~2MMl0;y&Qlz*LEfkMtHrXpiWOSrz&7WD8ckJbr0BRH!h4WaE$*(a4VY`#WcW0T$E z6L^ht-)dTy;`u{sUQ%D7{n=D+_DZ)3I$Y7gq%p8^@oT*I*GSijPnArQM7;5gpMH!6 ze3aNLI2YV^UFX>J^o3mA|GC3&L6`*dKN4WX*pn;b4>|UJ0wkEwaWu9SCU^c`83iDh zq(yjTm8Bu4!-z$~<)_80L={`MNmO#I@I&{KUC)GauX-_E!!q%2tB5xQ~`lk;#71Ez(4-T zJr9gH+qGGr#H4?>qQc7u`2C!GhXqK}vqD`N#QG)|gVPrTJ5+D1-mdPG!nUTwE}`f? z!q5SUOukFTVHzfVaJBs%zdeXNt|Alr2uS8N@7*c9oI71E(i{a}$u(C!eOK@%1;}q2 ztwTBoieFvKNa%Kfn_eE~Fdt85jImgagy`d0czGGG`R@0rQu{}KqLP7orCW{=S>EGCP50aE^ZpMlx=(sU3pM}56s`Qd6Z`HY zV&1P~g6wAU%~csq9ND`=*`6reju#J?W~KcA#laZjPod~%tn?b7G>y{fk+PYcy}KO2 z?fbYq2#(YrOJ<Ia{JsZ8!c=Li*78@g?to!9us*gS}j>vtHhcS+7IU&G%L*eE^4|TD};0 zw!>ONX~TZyD&%zer*UA!!TSrfreCQ-mR^PCk1}<8HgU^oLyEK-1GM?PCs$j!+lrK? zS!4|J=?xgK?E4LWV<+=>Nt@qg46-T8*+PaNDHWRG@5X<9d{ z!F>D{w+_V+g`d(*{?1&fU6UjsN}}z_qcaTDvDL0Apcq@aOxhi<>2~!dWbcRyW$5GK8@Upz9GgrJWOpxiM2`wxWjModVJb` zCFhavhj(of+u20TzgXvWyJ7Q1mFc zhmnFpw{QtBtku$`ub72vHMQ%14uxjgZ^oqV6|a-?F5ks_ChXH8nd68KBLvs!kdQH! zaHTnEPM8rLuq*D}E=7hDoD!s%){Eg`^Ex6rW@ytv<$^+k(?Y8G&Pq~Pc%g9MoU=O= z?e@>`E((T`0+dfFB6l1A{0bgNZf5|@YXBJm$j0a#$^?n2 zZf_-n0ze>K>j@RebLB!)3qtz^NWu zmFg%CW5@nxP1IXS*a79GL%tKrFSKa!^*nA7Db4yD_e=SoxYvWw-L!hm7vqsa+Ix%B zS+^~L$_GGlJ`~Pk)=Y(zM!DwqY!czS26Qo`#f0NG^J0aRdEf^-=n9K+1`w1=0S0~Q zg?WCDR|cjrC1PgyNS2f_xs#S6v^#8 z&E|jolB42vPf90B`ns$J+c)k4!HmVW2Y1MNr>pOs(Rp0lislR%-I-h!HO}{Ik5T5U zcZSFwde?+CM)oqMu?)a3dfaKmy!K;N{MSt?ckunNL*%Q~I&IQ47cO1X$Vf z+>V#D588#j@8ve3BuEyCIV}}+`RqgeS{tob<$f6QzLd`vD^bHd-6m#1UYptkvy{i- z74>R)sdA0VPzZPq`o@pXVuXx81ZPWlPSRwnrJ*ZdByDOBw}(5Z$K`wFVIkg^yyxkC zaq;~wt+j)gv*hM{RU_~~DXV342`LFin5;^7FbX$eL%4ke0*)<)PCcEDTjtuOYvG}0 z(-`&j4(76W?Z<=VH1-BYHM)i;@B`oNVB_l~Vv`G^{5b>quCqkG5D^Mmw#q;E_Whk{ zh!gU}dm{6AU+(?$lkI;4)&GfhLXrRg+&;qj8axKrPfYgv!g=>`B6{5`;Rl(o*MwkfmqmaVm$9eWTQK=$h z62O+Dw^pgck#ZhvMV*QftaGaaSc&)HpAK0kt}{H{v4`uVes?yeaf+MTouTy)9J#eE zQ}#X4hemYJ0)P*g?}>nsaf1L2E9d}p?A}_^nI1!&gNu1#gg;nfJ&phhh8YVEi3w+c ziS65-l9mW=G1O|7IVGv}E!?y^)a^@VwUUVKkD$W>=_?*x)?s!#&=qo#&L0#GqwHVC zWFmJ^biHxozgGK*kysZSAYtxTl>cXva>J}t_2!#{t0_Tt&3^xx?P7+_5J{*+c*nSIZxt;mOV$z5K@%<_X%jczz2}1QH?N+b2Byt{1y^hx$ zZvK9~-}E=uX3D5RZDw9=9zU$Z&L%(|5yE9jHg0$STP1?8soT$>)9_WI%$Sb#giUaV z_Cbfmpp{M~m#^Wl3On(SRjiCiq?O}N3A3_qF9B%=gSp!iIuXd&zd%^KPSLW;BzTBVJxS{ zzb#TCfyntho%ZJWk>b)_Pk6`rXvURz3J$0#@420pDCCmqzH`~F$SdcG>;Q-H=+z}H zuDQ!T>1WW83b>=Yu$`gX3GJ`5x}7Gn?|_aoZR|bNnm(_{f(IjMBxIsf$^BmFfoTV; z3;2QlTCi`70OXGc!nLY_9ULAeqQ3W8oc0M!`gO;~uA)9UxBpjGrxe{ImU27j`T!VW36mBA(DfriZy${53T^Q(#x^kO_uHJEedznGu7g;~Cl? zdPH^Tq~G1MZ=Vt5RGsLY z*kSA`;4mx+P9qxCKgA`WgHJC2M58GN26BA0es;(~SYua}y-}ZuBjnM_1oD*$6@8mo z#XAT>2f7|7XCnIDEE+q#t-SQ?X%wg+m2j%kJrDq>Rd6smXVvSK-%9qZ1;F`%9<*vMmxO3U z_)xCe=DD>E2jO)hwc)&NP8Fb0+ZepBA;iho%}z#psYqZ1Hf<^neWF|k`p)QI{g%D3 z{;<6j?!pQlu2qCOuw3Ke%--^KsTX;!==<>Bt)0OLYI~`Og3umKj4ξ~$MhiV5N@ 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 - ## Why this project exists? Many existing implementations of IoC containers take the concept too far and start to feel more like Java. JavaScript inherently does not have all the bells and whistles; you need to have similar IoC container benefits as PHP or Java. From 4057c52e79691e3b907441623e579ce80b9f0183 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Thu, 26 Jan 2023 21:30:20 +0530 Subject: [PATCH 091/145] chore(release): 9.9.2-0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 28ef444..551c685 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@adonisjs/fold", - "version": "9.9.1-0", + "version": "9.9.2-0", "description": "A simple and straight forward implementation for IoC container in JavaScript", "main": "build/index.js", "files": [ From 3ce00ac92e84db316f08cbf9919625288d9a6ebe Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Thu, 2 Feb 2023 13:41:07 +0530 Subject: [PATCH 092/145] chore: update dependencies --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 551c685..43d312b 100644 --- a/package.json +++ b/package.json @@ -50,14 +50,14 @@ "@japa/run-failed-tests": "^1.0.7", "@japa/runner": "^2.2.2", "@japa/spec-reporter": "^1.3.2", - "@swc/core": "^1.3.29", + "@swc/core": "^1.3.32", "@types/fs-extra": "^11.0.1", "@types/node": "^18.11.18", "benchmark": "^2.1.4", "c8": "^7.12.0", "cross-env": "^7.0.3", "del-cli": "^5.0.0", - "eslint": "^8.32.0", + "eslint": "^8.33.0", "eslint-config-prettier": "^8.6.0", "eslint-plugin-adonis": "^3.0.3", "eslint-plugin-prettier": "^4.0.0", @@ -70,7 +70,7 @@ "prettier": "^2.8.3", "reflect-metadata": "^0.1.13", "ts-node": "^10.8.1", - "typescript": "^4.9.4" + "typescript": "^4.9.5" }, "eslintConfig": { "extends": [ From d4b33858f73dfa86c2c576ad5fe46aef99b4aa24 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Thu, 2 Feb 2023 14:10:57 +0530 Subject: [PATCH 093/145] style: add docblock for alias method --- src/container.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/container.ts b/src/container.ts index 143751e..5232fa0 100644 --- a/src/container.ts +++ b/src/container.ts @@ -190,6 +190,11 @@ export class Container> { return this.createResolver().call(value, method, runtimeValues) } + /** + * Register an alias for a binding. The value can be a reference + * to an existing binding or to a class constructor that will + * instantiate to the same value as the alias. + */ alias( /** * An alias must always be defined as a string or a symbol. Classes cannot be From 91a716b5302ed40a72d45b36350a7b2262577ae8 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Mon, 13 Feb 2023 12:59:37 +0530 Subject: [PATCH 094/145] chore: update dependencies --- package.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 43d312b..c89721b 100644 --- a/package.json +++ b/package.json @@ -46,18 +46,18 @@ "devDependencies": { "@commitlint/cli": "^17.4.2", "@commitlint/config-conventional": "^17.4.2", - "@japa/assert": "^1.3.4", - "@japa/run-failed-tests": "^1.0.7", - "@japa/runner": "^2.2.2", - "@japa/spec-reporter": "^1.3.2", - "@swc/core": "^1.3.32", + "@japa/assert": "^1.4.1", + "@japa/run-failed-tests": "^1.1.1", + "@japa/runner": "^2.3.0", + "@japa/spec-reporter": "^1.3.3", + "@swc/core": "^1.3.35", "@types/fs-extra": "^11.0.1", - "@types/node": "^18.11.18", + "@types/node": "^18.13.0", "benchmark": "^2.1.4", "c8": "^7.12.0", "cross-env": "^7.0.3", "del-cli": "^5.0.0", - "eslint": "^8.33.0", + "eslint": "^8.34.0", "eslint-config-prettier": "^8.6.0", "eslint-plugin-adonis": "^3.0.3", "eslint-plugin-prettier": "^4.0.0", @@ -67,7 +67,7 @@ "husky": "^8.0.3", "np": "^7.6.3", "p-event": "^5.0.1", - "prettier": "^2.8.3", + "prettier": "^2.8.4", "reflect-metadata": "^0.1.13", "ts-node": "^10.8.1", "typescript": "^4.9.5" From 637c2398d2afdd3cd728ea8b546fe4f5ee0756a7 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Mon, 13 Feb 2023 13:08:12 +0530 Subject: [PATCH 095/145] test: use filesystem plugin --- bin/test.ts | 3 ++- package.json | 3 +-- tests/module_expression/to_callable.spec.ts | 25 +++++++++---------- .../to_handle_method.spec.ts | 25 +++++++++---------- tests/module_importer/to_callable.spec.ts | 25 +++++++++---------- .../module_importer/to_handle_method.spec.ts | 25 +++++++++---------- 6 files changed, 51 insertions(+), 55 deletions(-) diff --git a/bin/test.ts b/bin/test.ts index cd696b8..be16c90 100644 --- a/bin/test.ts +++ b/bin/test.ts @@ -1,5 +1,6 @@ import { assert } from '@japa/assert' import { pathToFileURL } from 'node:url' +import { fileSystem } from '@japa/file-system' import { specReporter } from '@japa/spec-reporter' import { runFailedTests } from '@japa/run-failed-tests' import { processCliArgs, configure, run } from '@japa/runner' @@ -21,7 +22,7 @@ configure({ ...processCliArgs(process.argv.slice(2)), ...{ files: ['tests/**/*.spec.ts'], - plugins: [assert(), runFailedTests()], + plugins: [assert(), runFailedTests(), fileSystem()], reporters: [specReporter()], importer: (filePath) => import(pathToFileURL(filePath).href), }, diff --git a/package.json b/package.json index c89721b..cc55d69 100644 --- a/package.json +++ b/package.json @@ -47,11 +47,11 @@ "@commitlint/cli": "^17.4.2", "@commitlint/config-conventional": "^17.4.2", "@japa/assert": "^1.4.1", + "@japa/file-system": "^1.0.1", "@japa/run-failed-tests": "^1.1.1", "@japa/runner": "^2.3.0", "@japa/spec-reporter": "^1.3.3", "@swc/core": "^1.3.35", - "@types/fs-extra": "^11.0.1", "@types/node": "^18.13.0", "benchmark": "^2.1.4", "c8": "^7.12.0", @@ -62,7 +62,6 @@ "eslint-plugin-adonis": "^3.0.3", "eslint-plugin-prettier": "^4.0.0", "expect-type": "^0.15.0", - "fs-extra": "^11.1.0", "github-label-sync": "^2.2.0", "husky": "^8.0.3", "np": "^7.6.3", diff --git a/tests/module_expression/to_callable.spec.ts b/tests/module_expression/to_callable.spec.ts index ecce8df..0d03cca 100644 --- a/tests/module_expression/to_callable.spec.ts +++ b/tests/module_expression/to_callable.spec.ts @@ -7,10 +7,8 @@ * file that was distributed with this source code. */ -import { join } from 'node:path' import { test } from '@japa/runner' import { fileURLToPath } from 'node:url' -import { outputFile, remove } from 'fs-extra' import { Container } from '../../src/container.js' import { moduleExpression } from '../../src/module_expression.js' @@ -18,8 +16,9 @@ const BASE_URL = new URL('../app/', import.meta.url) const BASE_PATH = fileURLToPath(BASE_URL) test.group('moduleExpression | toCallable', (group) => { - group.each.setup(() => { - return () => remove(BASE_PATH) + group.each.setup(({ context }) => { + context.fs.baseUrl = BASE_URL + context.fs.basePath = BASE_PATH }) test('make callable from module expression', async ({ assert }) => { @@ -28,9 +27,9 @@ test.group('moduleExpression | toCallable', (group) => { ) }) - test('pass fixed container instance to the callable', async ({ assert }) => { - await outputFile( - join(BASE_PATH, 'controllers/auth/users_controller.ts'), + test('pass fixed container instance to the callable', async ({ assert, fs }) => { + await fs.create( + 'controllers/auth/users_controller.ts', ` export default class UsersController { handle(args) { @@ -50,9 +49,9 @@ test.group('moduleExpression | toCallable', (group) => { assert.deepEqual(args, ['invoked']) }) - test('pass runtime resolver to the callable', async ({ assert }) => { - await outputFile( - join(BASE_PATH, 'controllers/auth/admin_controller.ts'), + test('pass runtime resolver to the callable', async ({ assert, fs }) => { + await fs.create( + 'controllers/auth/admin_controller.ts', ` export default class AdminController { async handle(resolver) { @@ -72,9 +71,9 @@ test.group('moduleExpression | toCallable', (group) => { assert.deepEqual(await resolver.make('args'), ['invoked']) }) - test('raise exception when module is missing default export', async ({ assert }) => { - await outputFile( - join(BASE_PATH, 'controllers/auth/posts_controller.ts'), + test('raise exception when module is missing default export', async ({ assert, fs }) => { + await fs.create( + 'controllers/auth/posts_controller.ts', ` export class PostsController { handle(args) { diff --git a/tests/module_expression/to_handle_method.spec.ts b/tests/module_expression/to_handle_method.spec.ts index 75a9715..6b894a1 100644 --- a/tests/module_expression/to_handle_method.spec.ts +++ b/tests/module_expression/to_handle_method.spec.ts @@ -7,10 +7,8 @@ * file that was distributed with this source code. */ -import { join } from 'node:path' import { test } from '@japa/runner' import { fileURLToPath } from 'node:url' -import { outputFile, remove } from 'fs-extra' import { Container } from '../../src/container.js' import { moduleExpression } from '../../src/module_expression.js' @@ -18,8 +16,9 @@ const BASE_URL = new URL('../app/', import.meta.url) const BASE_PATH = fileURLToPath(BASE_URL) test.group('moduleExpression | toHandleMethod', (group) => { - group.each.setup(() => { - return () => remove(BASE_PATH) + group.each.setup(({ context }) => { + context.fs.baseUrl = BASE_URL + context.fs.basePath = BASE_PATH }) test('make handle method object from module expression', async ({ assert }) => { @@ -28,9 +27,9 @@ test.group('moduleExpression | toHandleMethod', (group) => { ) }) - test('pass fixed container instance to the handle method object', async ({ assert }) => { - await outputFile( - join(BASE_PATH, 'controllers/users_controller.ts'), + test('pass fixed container instance to the handle method object', async ({ assert, fs }) => { + await fs.create( + 'controllers/users_controller.ts', ` export default class UsersController { handle(args) { @@ -51,9 +50,9 @@ test.group('moduleExpression | toHandleMethod', (group) => { assert.deepEqual(args, ['invoked']) }) - test('pass runtime resolver to the handle method object', async ({ assert }) => { - await outputFile( - join(BASE_PATH, 'controllers/admin_controller.ts'), + test('pass runtime resolver to the handle method object', async ({ assert, fs }) => { + await fs.create( + 'controllers/admin_controller.ts', ` export default class AdminController { async handle(resolver) { @@ -76,9 +75,9 @@ test.group('moduleExpression | toHandleMethod', (group) => { assert.deepEqual(await resolver.make('args'), ['invoked']) }) - test('raise exception when module is missing default export', async ({ assert }) => { - await outputFile( - join(BASE_PATH, 'controllers/posts_controller.ts'), + test('raise exception when module is missing default export', async ({ assert, fs }) => { + await fs.create( + 'controllers/posts_controller.ts', ` export class PostsController { handle(args) { diff --git a/tests/module_importer/to_callable.spec.ts b/tests/module_importer/to_callable.spec.ts index afe9e31..a5960ae 100644 --- a/tests/module_importer/to_callable.spec.ts +++ b/tests/module_importer/to_callable.spec.ts @@ -7,10 +7,8 @@ * file that was distributed with this source code. */ -import { join } from 'node:path' import { test } from '@japa/runner' import { fileURLToPath } from 'node:url' -import { outputFile, remove } from 'fs-extra' import { Container } from '../../src/container.js' import { moduleImporter } from '../../src/module_importer.js' @@ -18,8 +16,9 @@ const BASE_URL = new URL('../app/', import.meta.url) const BASE_PATH = fileURLToPath(BASE_URL) test.group('moduleImporter | toCallable', (group) => { - group.each.setup(() => { - return () => remove(BASE_PATH) + group.each.setup(({ context }) => { + context.fs.baseUrl = BASE_URL + context.fs.basePath = BASE_PATH }) test('make callable from module importer', async ({ assert }) => { @@ -29,9 +28,9 @@ test.group('moduleImporter | toCallable', (group) => { ) }) - test('pass fixed container instance to the callable', async ({ assert }) => { - await outputFile( - join(BASE_PATH, 'middleware/silent_auth.ts'), + test('pass fixed container instance to the callable', async ({ assert, fs }) => { + await fs.create( + 'middleware/silent_auth.ts', ` export default class SilentAuthMiddleware { handle(args) { @@ -53,9 +52,9 @@ test.group('moduleImporter | toCallable', (group) => { assert.deepEqual(args, ['invoked']) }) - test('pass runtime resolver to the callable', async ({ assert }) => { - await outputFile( - join(BASE_PATH, 'middleware/silent_auth_v1.ts'), + test('pass runtime resolver to the callable', async ({ assert, fs }) => { + await fs.create( + 'middleware/silent_auth_v1.ts', ` export default class SilentAuthMiddleware { async handle(resolver) { @@ -77,9 +76,9 @@ test.group('moduleImporter | toCallable', (group) => { assert.deepEqual(await resolver.make('args'), ['invoked']) }) - test('raise exception when module is missing default export', async ({ assert }) => { - await outputFile( - join(BASE_PATH, 'middleware/silent_auth_v2.ts'), + test('raise exception when module is missing default export', async ({ assert, fs }) => { + await fs.create( + 'middleware/silent_auth_v2.ts', ` export class SilentAuthMiddleware { async handle(resolver) { diff --git a/tests/module_importer/to_handle_method.spec.ts b/tests/module_importer/to_handle_method.spec.ts index 1b69ea8..a969980 100644 --- a/tests/module_importer/to_handle_method.spec.ts +++ b/tests/module_importer/to_handle_method.spec.ts @@ -7,10 +7,8 @@ * file that was distributed with this source code. */ -import { join } from 'node:path' import { test } from '@japa/runner' import { fileURLToPath } from 'node:url' -import { outputFile, remove } from 'fs-extra' import { Container } from '../../src/container.js' import { moduleImporter } from '../../src/module_importer.js' @@ -18,8 +16,9 @@ const BASE_URL = new URL('../app/', import.meta.url) const BASE_PATH = fileURLToPath(BASE_URL) test.group('moduleImporter | toHandleMethod', (group) => { - group.each.setup(() => { - return () => remove(BASE_PATH) + group.each.setup(({ context }) => { + context.fs.baseUrl = BASE_URL + context.fs.basePath = BASE_PATH }) test('make handle method object from module importer', async ({ assert }) => { @@ -29,9 +28,9 @@ test.group('moduleImporter | toHandleMethod', (group) => { ) }) - test('pass fixed container instance to the handle method object', async ({ assert }) => { - await outputFile( - join(BASE_PATH, 'middleware/silent_auth_v3.ts'), + test('pass fixed container instance to the handle method object', async ({ assert, fs }) => { + await fs.create( + 'middleware/silent_auth_v3.ts', ` export default class SilentAuthMiddleware { handle(args) { @@ -54,9 +53,9 @@ test.group('moduleImporter | toHandleMethod', (group) => { assert.deepEqual(args, ['invoked']) }) - test('pass runtime resolver to the handle method object', async ({ assert }) => { - await outputFile( - join(BASE_PATH, 'middleware/silent_auth_v4.ts'), + test('pass runtime resolver to the handle method object', async ({ assert, fs }) => { + await fs.create( + 'middleware/silent_auth_v4.ts', ` export default class SilentAuthMiddleware { async handle(resolver) { @@ -81,9 +80,9 @@ test.group('moduleImporter | toHandleMethod', (group) => { assert.deepEqual(await resolver.make('args'), ['invoked']) }) - test('raise exception when module is missing default export', async ({ assert }) => { - await outputFile( - join(BASE_PATH, 'middleware/silent_auth_v5.ts'), + test('raise exception when module is missing default export', async ({ assert, fs }) => { + await fs.create( + 'middleware/silent_auth_v5.ts', ` export class SilentAuthMiddleware { async handle(resolver) { From 073c51cb40413200432c80c2d233c3eda6903bd7 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Mon, 20 Feb 2023 08:34:34 +0530 Subject: [PATCH 096/145] chore: update dependencies --- package.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index cc55d69..9227e40 100644 --- a/package.json +++ b/package.json @@ -44,17 +44,17 @@ "author": "virk,adonisjs", "license": "MIT", "devDependencies": { - "@commitlint/cli": "^17.4.2", - "@commitlint/config-conventional": "^17.4.2", + "@commitlint/cli": "^17.4.4", + "@commitlint/config-conventional": "^17.4.4", "@japa/assert": "^1.4.1", "@japa/file-system": "^1.0.1", "@japa/run-failed-tests": "^1.1.1", - "@japa/runner": "^2.3.0", + "@japa/runner": "^2.5.0", "@japa/spec-reporter": "^1.3.3", "@swc/core": "^1.3.35", - "@types/node": "^18.13.0", + "@types/node": "^18.14.0", "benchmark": "^2.1.4", - "c8": "^7.12.0", + "c8": "^7.13.0", "cross-env": "^7.0.3", "del-cli": "^5.0.0", "eslint": "^8.34.0", From dbe23e1d6638e66a9a5de189776d3407cd7015f6 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Mon, 20 Feb 2023 09:08:00 +0530 Subject: [PATCH 097/145] chore: use npm install strategy linked --- .npmrc | 1 + 1 file changed, 1 insertion(+) diff --git a/.npmrc b/.npmrc index 43c97e7..b6f8316 100644 --- a/.npmrc +++ b/.npmrc @@ -1 +1,2 @@ package-lock=false +install-strategy=linked From 64b16f172a74b0fe8ff916996ccddfbf6d712f64 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Mon, 20 Feb 2023 09:22:10 +0530 Subject: [PATCH 098/145] revert: (chore: use npm install strategy linked) --- .npmrc | 1 - 1 file changed, 1 deletion(-) diff --git a/.npmrc b/.npmrc index b6f8316..43c97e7 100644 --- a/.npmrc +++ b/.npmrc @@ -1,2 +1 @@ package-lock=false -install-strategy=linked From a31d927001c41d8c8634bfa1986e432a596325a5 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Sat, 4 Mar 2023 08:12:21 +0530 Subject: [PATCH 099/145] refactor: fail when container is not able to constructor class or call method --- README.md | 51 +++++++++++------------- src/resolver.ts | 24 ++++++++++- tests/container/call_method.spec.ts | 36 +++++++++++++++++ tests/container/known_make_class.spec.ts | 45 +++++++++++++++++---- tests/container/make_class.spec.ts | 43 +++++++++++++++++--- 5 files changed, 158 insertions(+), 41 deletions(-) diff --git a/README.md b/README.md index f89f7e5..9d352ea 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ - # AdonisJS Fold +# AdonisJS Fold > Simplest, straightforward implementation for IoC container in JavaScript @@ -261,6 +261,7 @@ await resolve.make(SomeClass) ``` ## Aliases + Container aliases allows defining aliases for an existing binding. The alias should be either a `string` or a `symbol`. ```ts @@ -278,6 +279,7 @@ assert.instanceOf(db, Database) ``` ## Contextual bindings + Contextual bindings allows you to register custom dependency resolvers on a given class for a specific dependency. You will be mostly using contextual bindings with driver based implementations. For example: You have a `UserService` and a `BlogService` and both of them needs an instance of the Drive disk to write and read files. You want the `UserService` to use the local disk driver and `BlogService` to use the s3 disk driver. @@ -316,6 +318,7 @@ container ``` ## Swapping implementations + When using the container to resolve a tree of dependencies, quite often you will have no control over the construction of a class and therefore you will be not able to swap/fake its dependencies when writing tests. In the following example, the `UsersController` needs an instance of the `UserService` class. @@ -323,7 +326,7 @@ In the following example, the `UsersController` needs an instance of the `UserSe ```ts @inject() class UsersController { - constructor (service: UserService) {} + constructor(service: UserService) {} } ``` @@ -459,6 +462,7 @@ const db = await container.make('db') ## Common errors ### Cannot inject "xxxxx" in "[class: xxxxx]". The value cannot be constructed + The error occurs, when you are trying to inject a value that cannot be constructed. A common source of issue is within TypeScript project, when using an `interface` or a `type` for dependency injection. In the following example, the `User` is a TypeScript type and there is no way for the container to construct a runtime value from this type (types are removed after transpiling the TypeScript code). @@ -474,14 +478,16 @@ type User = { @inject() class UsersController { - constructor (user: User) + constructor(user: User) } ``` ## Module expressions + In AdonisJS, we allow binding methods in form of string based module expression. For example: **Instead of importing and using a controller as follows** + ```ts import UsersController from '#controllers/users' @@ -491,6 +497,7 @@ Route.get('users', (ctx) => { ``` **You can bind the controller method as follows** + ```ts Route.get('users', '#controllers/users.index') ``` @@ -504,6 +511,7 @@ There are a couple of reasons for using module expressions. So given we use **module expressions** widely in the AdonisJS ecosystem. We have abstracted the logic of parsing string based expressions into dedicated helpers to re-use and ease. ### Assumptions + There is a strong assumption that every module references using module expression will have a `export default` exporting a class. ```ts @@ -512,15 +520,13 @@ export default class UsersController {} ``` ### toCallable + The `toCallable` method returns a function that internally parses the module string expression and returns a function that you can invoke like any other JavaScript function. ```ts import { moduleExpression } from '@adonisjs/fold' -const fn = moduleExpression( - '#controllers/users.index', - import.meta.url -).toCallable() +const fn = moduleExpression('#controllers/users.index', import.meta.url).toCallable() // Later call it const container = new Container() @@ -532,16 +538,14 @@ You can also pass the container instance at the time of creating the callable fu ```ts const container = new Container() -const fn = moduleExpression( - '#controllers/users.index', - import.meta.url -).toCallable(container) +const fn = moduleExpression('#controllers/users.index', import.meta.url).toCallable(container) // Later call it await fn([ctx]) ``` ### toHandleMethod + The `toHandleMethod` method returns an object with the `handle` method. To the main difference between `toCallable` and `toHandleMethod` is their return output - `toHandleMethod` returns `{ handle: fn }` @@ -550,10 +554,7 @@ The `toHandleMethod` method returns an object with the `handle` method. To the m ```ts import { moduleExpression } from '@adonisjs/fold' -const handler = moduleExpression( - '#controllers/users.index', - import.meta.url -).toHandleMethod() +const handler = moduleExpression('#controllers/users.index', import.meta.url).toHandleMethod() // Later call it const container = new Container() @@ -566,16 +567,16 @@ You can also pass the container instance at the time of creating the handle meth ```ts const container = new Container() -const handler = moduleExpression( - '#controllers/users.index', - import.meta.url -).toHandleMethod(container) +const handler = moduleExpression('#controllers/users.index', import.meta.url).toHandleMethod( + container +) // Later call it await handler.handle([ctx]) ``` ### Bechmarks + Following are benchmarks to see the performance loss that happens when using module expressions. **Benchmarks were performed on Apple M1 iMac, 16GB** @@ -588,6 +589,7 @@ Following are benchmarks to see the performance loss that happens when using mod - `inline`: When no lazy loading was performed. The module was importing inline using the `import` keyword. ## Module importer + The module importer is similar to module expression. However, instead of defining the import path as a string, you have to define a function that imports the module. ```ts @@ -621,6 +623,7 @@ await handler.handle(resolver, [ctx]) ``` ## Module caller + The module caller is similar to module importer. However, instead of lazy loading a class, you pass the class constructor to this method. ```ts @@ -630,10 +633,7 @@ class AuthMiddleware { handle() {} } -const fn = moduleCaller( - AuthMiddleware, - 'handle' -).toCallable() +const fn = moduleCaller(AuthMiddleware, 'handle').toCallable() // Later call it const container = new Container() @@ -650,10 +650,7 @@ class AuthMiddleware { handle() {} } -const handler = moduleImporter( - AuthMiddleware, - 'handle' -).toHandleMethod() +const handler = moduleImporter(AuthMiddleware, 'handle').toHandleMethod() // Later call it const container = new Container() diff --git a/src/resolver.ts b/src/resolver.ts index 04dbafa..974938c 100644 --- a/src/resolver.ts +++ b/src/resolver.ts @@ -8,7 +8,7 @@ */ import { inspect } from 'node:util' -import { InvalidArgumentsException } from '@poppinss/utils' +import { InvalidArgumentsException, RuntimeException } from '@poppinss/utils' import type { Make, @@ -356,6 +356,16 @@ export class ContainerResolver> { dependencies = await containerProvider(binding, '_constructor', this, runtimeValues) } + /** + * Class has dependencies for which we do not have runtime values and neither + * we have typehints. Therefore we throw an exception + */ + if (dependencies.length < binding.length) { + throw new RuntimeException( + `Cannot construct "${binding.name}" class. Container is not able to resolve its dependencies` + ) + } + const value = new binding(...dependencies) as Promise> if (debug.enabled) { @@ -437,6 +447,18 @@ export class ContainerResolver> { dependencies = await containerProvider(binding, method, this, runtimeValues) } + /** + * Method has dependencies for which we do not have runtime values and neither + * we have typehints. Therefore we throw an exception + */ + if (dependencies.length < value[method].length) { + throw new RuntimeException( + `Cannot call "${binding.name}.${String( + method + )}" method. Container is not able to resolve its dependencies` + ) + } + return value[method](...dependencies) } diff --git a/tests/container/call_method.spec.ts b/tests/container/call_method.spec.ts index dc1222f..14b83f4 100644 --- a/tests/container/call_method.spec.ts +++ b/tests/container/call_method.spec.ts @@ -144,4 +144,40 @@ test.group('Container | Call method', () => { 'Missing method "foo" on "UserService {}"' ) }) + + test('raise error when class method has dependencies but no hints', async ({ assert }) => { + class UserService { + foo(id: number) { + return id + } + } + + const container = new Container() + await assert.rejects( + () => container.call(new UserService(), 'foo'), + 'Cannot call "UserService.foo" method. Container is not able to resolve its dependencies' + ) + }) + + test('work fine when runtime values satisfies dependencies', async ({ assert }) => { + class UserService { + foo(id: number) { + return id + } + } + + const container = new Container() + assert.equal(await container.call(new UserService(), 'foo', [1]), 1) + }) + + test('work fine when method param has a default value', async ({ assert }) => { + class UserService { + foo(id: number = 2) { + return id + } + } + + const container = new Container() + assert.equal(await container.call(new UserService(), 'foo'), 2) + }) }) diff --git a/tests/container/known_make_class.spec.ts b/tests/container/known_make_class.spec.ts index 1385cf4..dbd863b 100644 --- a/tests/container/known_make_class.spec.ts +++ b/tests/container/known_make_class.spec.ts @@ -158,7 +158,7 @@ test.group('Container | Make class | Known bindings', () => { ) }) - test('do not inject constructor dependencies when containerInjections are empty', async ({ + test('fail when class has dependencies when containerInjections are empty', async ({ assert, }) => { class UserService { @@ -168,12 +168,11 @@ test.group('Container | Make class | Known bindings', () => { constructor(public name: string) {} } - const container = new Container<{ foo: 'bar' }>() - const service = await container.make(UserService) - - assert.instanceOf(service, UserService) - expectTypeOf(service).toEqualTypeOf() - assert.isUndefined(service.name) + const container = new Container() + assert.rejects( + () => container.make(UserService), + 'Cannot construct "UserService" class. Container is not able to resolve its dependencies' + ) }) test('raise error when injecting a primitive class', async ({ assert }) => { @@ -199,4 +198,36 @@ test.group('Container | Make class | Known bindings', () => { 'Cannot construct value "[Function: String]" using container' ) }) + + test('raise error when class has dependencies but no hints', async ({ assert }) => { + class UserService { + constructor(public config: { foo: string }) {} + } + + const container = new Container<{ foo: 'bar' }>() + await assert.rejects( + () => container.make(UserService), + 'Cannot construct "UserService" class. Container is not able to resolve its dependencies' + ) + }) + + test('work fine when runtime values satisfies dependencies', async ({ assert }) => { + class UserService { + constructor(public config: { foo: string }) {} + } + + const container = new Container<{ foo: 'bar' }>() + const service = await container.make(UserService, [{ foo: 'bar' }]) + assert.equal(service.config.foo, 'bar') + }) + + test('work fine when constructor parameter has a default value', async ({ assert }) => { + class UserService { + constructor(public config: { foo: string } = { foo: 'baz' }) {} + } + + const container = new Container<{ foo: 'bar' }>() + const service = await container.make(UserService) + assert.equal(service.config.foo, 'baz') + }) }) diff --git a/tests/container/make_class.spec.ts b/tests/container/make_class.spec.ts index bfdfba9..2091fc8 100644 --- a/tests/container/make_class.spec.ts +++ b/tests/container/make_class.spec.ts @@ -158,7 +158,7 @@ test.group('Container | Make class', () => { ) }) - test('do not inject constructor dependencies when containerInjections are empty', async ({ + test('fail when class has dependencies when containerInjections are empty', async ({ assert, }) => { class UserService { @@ -169,11 +169,10 @@ test.group('Container | Make class', () => { } const container = new Container() - const service = await container.make(UserService) - - assert.instanceOf(service, UserService) - expectTypeOf(service).toEqualTypeOf() - assert.isUndefined(service.name) + assert.rejects( + () => container.make(UserService), + 'Cannot construct "UserService" class. Container is not able to resolve its dependencies' + ) }) test('raise error when injecting is a primitive class', async ({ assert }) => { @@ -199,4 +198,36 @@ test.group('Container | Make class', () => { 'Cannot construct value "[Function: String]" using container' ) }) + + test('raise error when class has dependencies but no hints', async ({ assert }) => { + class UserService { + constructor(public config: { foo: string }) {} + } + + const container = new Container() + await assert.rejects( + () => container.make(UserService), + 'Cannot construct "UserService" class. Container is not able to resolve its dependencies' + ) + }) + + test('work fine when runtime values satisfies dependencies', async ({ assert }) => { + class UserService { + constructor(public config: { foo: string }) {} + } + + const container = new Container() + const service = await container.make(UserService, [{ foo: 'bar' }]) + assert.equal(service.config.foo, 'bar') + }) + + test('work fine when constructor parameter has a default value', async ({ assert }) => { + class UserService { + constructor(public config: { foo: string } = { foo: 'baz' }) {} + } + + const container = new Container() + const service = await container.make(UserService) + assert.equal(service.config.foo, 'baz') + }) }) From 41c6d9296bd449964671b8ae3ea3738dbe79d42e Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Sat, 4 Mar 2023 08:18:49 +0530 Subject: [PATCH 100/145] chore(release): 9.9.3-0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9227e40..348718b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@adonisjs/fold", - "version": "9.9.2-0", + "version": "9.9.3-0", "description": "A simple and straight forward implementation for IoC container in JavaScript", "main": "build/index.js", "files": [ From 9fd3a8c1f4f02eeec66dc5607fb089cdbd755962 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Sat, 4 Mar 2023 11:02:48 +0530 Subject: [PATCH 101/145] refactor: improve error reporting --- README.md | 8 ++- src/container.ts | 23 ++++++--- src/decorators/inject.ts | 54 ++++++++++++++----- src/provider.ts | 7 +-- src/resolver.ts | 66 +++++++++++++++--------- src/types.ts | 16 +++++- tests/container/call_method.spec.ts | 26 +++++++--- tests/container/events.spec.ts | 8 ++- tests/container/known_make_class.spec.ts | 50 +++++++++++++----- tests/container/make_class.spec.ts | 52 ++++++++++++++----- tests/provider.spec.ts | 21 ++++++-- 11 files changed, 242 insertions(+), 89 deletions(-) diff --git a/README.md b/README.md index 9d352ea..c061d75 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,9 @@ class Database {} class UserService { static containerInjections = { - _constructor: [Database], + _constructor: { + dependencies: [Database] + }, } constructor(db) { @@ -156,7 +158,9 @@ class Database {} class UserService { static containerInjections = { - find: [Database], + find: { + dependencies: [Database], + }, } async find(db) { diff --git a/src/container.ts b/src/container.ts index 5232fa0..1d62b84 100644 --- a/src/container.ts +++ b/src/container.ts @@ -17,6 +17,7 @@ import type { Bindings, BindingKey, Constructor, + ErrorCreator, HookCallback, BindingValues, BindingResolver, @@ -166,11 +167,20 @@ export class Container> { */ make( binding: Binding, - runtimeValues?: any[] + runtimeValues?: any[], + createError?: ErrorCreator ): Promise> - make(binding: Binding, runtimeValues?: any[]): Promise> - make(binding: Binding, runtimeValues?: any[]): Promise> { - return this.createResolver().make(binding, runtimeValues) + make( + binding: Binding, + runtimeValues?: any[], + createError?: ErrorCreator + ): Promise> + make( + binding: Binding, + runtimeValues?: any[], + createError?: ErrorCreator + ): Promise> { + return this.createResolver().make(binding, runtimeValues, createError) } /** @@ -185,9 +195,10 @@ export class Container> { call, Method extends ExtractFunctions>( value: Value, method: Method, - runtimeValues?: any[] + runtimeValues?: any[], + createError?: ErrorCreator ): Promise> { - return this.createResolver().call(value, method, runtimeValues) + return this.createResolver().call(value, method, runtimeValues, createError) } /** diff --git a/src/decorators/inject.ts b/src/decorators/inject.ts index 8b7b081..ca0533c 100644 --- a/src/decorators/inject.ts +++ b/src/decorators/inject.ts @@ -7,50 +7,72 @@ * file that was distributed with this source code. */ -import { defineStaticProperty } from '@poppinss/utils' +import { defineStaticProperty, RuntimeException } from '@poppinss/utils' + import debug from '../debug.js' +import { ErrorCreator, InspectableConstructor } from '../types.js' + +/** + * Creating a debugging error that points to the source + * using the @inject decorator + */ +function createDebuggingError(original: Error) { + return function createError(message: string) { + const error = new RuntimeException(message) + error.stack = original.stack + return error + } +} /** * Initiating the "containerInjections" property on the target, which is assumed * to be the class constructor. */ -function initiateContainerInjections(target: any, method: string | symbol) { +function initiateContainerInjections( + target: any, + method: string | symbol, + createError: ErrorCreator +) { defineStaticProperty(target, 'containerInjections', { initialValue: {}, strategy: 'inherit' }) - target.containerInjections[method] = [] + target.containerInjections[method] = { + createError, + dependencies: [], + } } /** * Defining the injections for the constructor of the class using * reflection */ -function defineConstructorInjections(target: any) { +function defineConstructorInjections(target: InspectableConstructor, createError: ErrorCreator) { const params = Reflect.getMetadata('design:paramtypes', target) /* c8 ignore next 3 */ if (!params) { return } - initiateContainerInjections(target, '_constructor') + initiateContainerInjections(target, '_constructor', createError) if (debug.enabled) { debug('defining constructor injections for %O, params %O', `[class: ${target.name}]`, params) } + for (const param of params) { - target.containerInjections._constructor.push(param) + target.containerInjections!._constructor.dependencies.push(param) } } /** * Defining the injections for the class instance method */ -function defineMethodInjections(target: any, method: string | symbol) { - const constructor = target.constructor +function defineMethodInjections(target: any, method: string | symbol, createError: ErrorCreator) { + const constructor = target.constructor as InspectableConstructor const params = Reflect.getMetadata('design:paramtypes', target, method) /* c8 ignore next 3 */ if (!params) { return } - initiateContainerInjections(constructor, method) + initiateContainerInjections(constructor, method, createError) if (debug.enabled) { debug( 'defining method injections for %O, method %O, params %O', @@ -59,8 +81,9 @@ function defineMethodInjections(target: any, method: string | symbol) { params ) } + for (const param of params) { - constructor.containerInjections[method].push(param) + constructor.containerInjections![method].dependencies.push(param) } } @@ -70,15 +93,22 @@ function defineMethodInjections(target: any, method: string | symbol) { * discover them. */ export function inject() { + /** + * Creating an error builder for the inject decorator, so that + * the stack trace can point back to the code that used + * the decorator + */ + const createError = createDebuggingError(new Error()) + function injectDecorator(target: C): void function injectDecorator(target: any, propertyKey: string | symbol): void function injectDecorator(target: any, propertyKey?: string | symbol): void { if (!propertyKey) { - defineConstructorInjections(target) + defineConstructorInjections(target, createError) return } - defineMethodInjections(target, propertyKey) + defineMethodInjections(target, propertyKey, createError) } return injectDecorator diff --git a/src/provider.ts b/src/provider.ts index df57052..0de9ae0 100644 --- a/src/provider.ts +++ b/src/provider.ts @@ -31,7 +31,8 @@ export async function containerProvider( return values } - const injections = binding.containerInjections[property] + const injections = binding.containerInjections[property].dependencies + const createError = binding.containerInjections[property].createError /** * If the length of runtime values is more than the injections @@ -61,7 +62,7 @@ export async function containerProvider( } const injection = injections[index] - return resolver.resolveFor(binding, injection) + return resolver.resolveFor(binding, injection, undefined, createError) }) ) } @@ -91,7 +92,7 @@ export async function containerProvider( return values[index] } - return resolver.resolveFor(binding, injection) + return resolver.resolveFor(binding, injection, undefined, createError) }) ) } diff --git a/src/resolver.ts b/src/resolver.ts index 974938c..286c038 100644 --- a/src/resolver.ts +++ b/src/resolver.ts @@ -17,6 +17,7 @@ import type { Bindings, BindingKey, Constructor, + ErrorCreator, BindingValues, BindingResolver, ExtractFunctions, @@ -125,18 +126,20 @@ export class ContainerResolver> { /** * Constructs exception for invalid binding value */ - #invalidBindingException(parent: any, binding: any): InvalidArgumentsException { + #invalidBindingException( + parent: any, + binding: any, + createError: ErrorCreator + ): InvalidArgumentsException { if (parent) { - return new InvalidArgumentsException( + return createError( `Cannot inject "${inspect(binding)}" in "[class: ${ parent.name }]". The value cannot be constructed` ) } - return new InvalidArgumentsException( - `Cannot construct value "${inspect(binding)}" using container` - ) + return createError(`Cannot construct value "${inspect(binding)}" using container`) } /** @@ -224,7 +227,8 @@ export class ContainerResolver> { async resolveFor( parent: unknown, binding: Binding, - runtimeValues?: any[] + runtimeValues?: any[], + createError: ErrorCreator = (message) => new RuntimeException(message) ): Promise> { const isAClass = isClass(binding) @@ -233,7 +237,7 @@ export class ContainerResolver> { * or a symbol. */ if (typeof binding !== 'string' && typeof binding !== 'symbol' && !isAClass) { - throw this.#invalidBindingException(parent, binding) + throw this.#invalidBindingException(parent, binding, createError) } /** @@ -342,26 +346,32 @@ export class ContainerResolver> { */ if (isAClass) { let dependencies: any[] = [] + const classConstructor: InspectableConstructor = binding - const bindingProvider = this.#getBindingProvider(binding) + const bindingProvider = this.#getBindingProvider(classConstructor) if (bindingProvider) { dependencies = await bindingProvider( - binding, + classConstructor, '_constructor', this, containerProvider, runtimeValues ) } else { - dependencies = await containerProvider(binding, '_constructor', this, runtimeValues) + dependencies = await containerProvider( + classConstructor, + '_constructor', + this, + runtimeValues + ) } /** * Class has dependencies for which we do not have runtime values and neither * we have typehints. Therefore we throw an exception */ - if (dependencies.length < binding.length) { - throw new RuntimeException( + if (dependencies.length < classConstructor.length) { + throw createError( `Cannot construct "${binding.name}" class. Container is not able to resolve its dependencies` ) } @@ -378,9 +388,7 @@ export class ContainerResolver> { return value } - throw new InvalidArgumentsException( - `Cannot resolve binding "${String(binding)}" from the container` - ) + throw createError(`Cannot resolve binding "${String(binding)}" from the container`) } /** @@ -399,18 +407,27 @@ export class ContainerResolver> { */ make( binding: Binding, - runtimeValues?: any[] + runtimeValues?: any[], + createError?: ErrorCreator ): Promise> - make(binding: Binding, runtimeValues?: any[]): Promise> - async make(binding: Binding, runtimeValues?: any[]): Promise> { + make( + binding: Binding, + runtimeValues?: any[], + createError?: ErrorCreator + ): Promise> + async make( + binding: Binding, + runtimeValues?: any[], + createError?: ErrorCreator + ): Promise> { /** * Make alias */ if (this.#containerAliases.has(binding)) { - return this.resolveFor(null, this.#containerAliases.get(binding), runtimeValues) + return this.resolveFor(null, this.#containerAliases.get(binding), runtimeValues, createError) } - return this.resolveFor(null, binding, runtimeValues) + return this.resolveFor(null, binding, runtimeValues, createError) } /** @@ -425,12 +442,11 @@ export class ContainerResolver> { async call, Method extends ExtractFunctions>( value: Value, method: Method, - runtimeValues?: any[] + runtimeValues?: any[], + createError: ErrorCreator = (message) => new RuntimeException(message) ): Promise> { if (typeof value[method] !== 'function') { - throw new InvalidArgumentsException( - `Missing method "${String(method)}" on "${inspect(value)}"` - ) + throw createError(`Missing method "${String(method)}" on "${inspect(value)}"`) } if (debug.enabled) { @@ -452,7 +468,7 @@ export class ContainerResolver> { * we have typehints. Therefore we throw an exception */ if (dependencies.length < value[method].length) { - throw new RuntimeException( + throw createError( `Cannot call "${binding.name}.${String( method )}" method. Container is not able to resolve its dependencies` diff --git a/src/types.ts b/src/types.ts index 3794b52..5980a16 100644 --- a/src/types.ts +++ b/src/types.ts @@ -7,9 +7,17 @@ * file that was distributed with this source code. */ +import type { Exception } from '@poppinss/utils' + import type { Container } from './container.js' import type { ContainerResolver } from './resolver.js' +/** + * A function to create custom errors when container fails. It can be + * used to point errors to the original source + */ +export type ErrorCreator = (message: string) => Exception + /** * Extract functions from a type */ @@ -31,7 +39,13 @@ export type AbstractConstructor = abstract new (...args: any[]) => T * Shape of a class constructor with injections */ export type InspectableConstructor = Function & { - containerInjections?: Record + containerInjections?: Record< + string | number | symbol, + { + dependencies: any[] + createError?: ErrorCreator + } + > containerProvider?: ContainerProvider } diff --git a/tests/container/call_method.spec.ts b/tests/container/call_method.spec.ts index 14b83f4..7177b5b 100644 --- a/tests/container/call_method.spec.ts +++ b/tests/container/call_method.spec.ts @@ -79,7 +79,9 @@ test.group('Container | Call method', () => { class UserService { static containerInjections = { - foo: [Database], + foo: { + dependencies: [Database], + }, } foo(db: Database) { @@ -99,7 +101,10 @@ test.group('Container | Call method', () => { class UserService { static containerInjections = { - foo: [Database, { foo: 'bar' }, 1], + foo: { + dependencies: [Database, { foo: 'bar' }, 1], + createError: (message: string) => new Error(message), + }, } foo(_: any, __: any, id: number) { @@ -108,10 +113,15 @@ test.group('Container | Call method', () => { } const container = new Container() - await assert.rejects( - () => container.call(new UserService(), 'foo'), - `Cannot inject "{ foo: 'bar' }" in "[class: UserService]". The value cannot be constructed` - ) + try { + await container.call(new UserService(), 'foo') + } catch (error) { + assert.match(error.stack, /at createError \(.*call_method/) + assert.equal( + error.message, + `Cannot inject "{ foo: 'bar' }" in "[class: UserService]". The value cannot be constructed` + ) + } }) test('merge runtime values with container dependencies', async ({ assert }) => { @@ -119,7 +129,9 @@ test.group('Container | Call method', () => { class UserService { static containerInjections = { - foo: [Database, String, Number], + foo: { + dependencies: [Database, String, Number], + }, } foo(db: Database, name: string, id: number) { diff --git a/tests/container/events.spec.ts b/tests/container/events.spec.ts index 6b2da71..b3f44b4 100644 --- a/tests/container/events.spec.ts +++ b/tests/container/events.spec.ts @@ -107,12 +107,16 @@ test.group('Container | Events', () => { class Config {} class Encryption { static containerInjections = { - _constructor: [Config], + _constructor: { + dependencies: [Config], + }, } } class Route { static containerInjections = { - _constructor: [Encryption], + _constructor: { + dependencies: [Encryption], + }, } } diff --git a/tests/container/known_make_class.spec.ts b/tests/container/known_make_class.spec.ts index dbd863b..64e067c 100644 --- a/tests/container/known_make_class.spec.ts +++ b/tests/container/known_make_class.spec.ts @@ -126,7 +126,10 @@ test.group('Container | Make class | Known bindings', () => { class UserService { static containerInjections = { - _constructor: [Database], + _constructor: { + dependencies: [Database], + createError: (message: string) => new Error(message), + }, } constructor(public db: Database) {} } @@ -140,11 +143,16 @@ test.group('Container | Make class | Known bindings', () => { }) test('throw error when injecting non-class values to the constructor', async ({ assert }) => { + assert.plan(2) + class UserService { args: any[] static containerInjections = { - _constructor: [{ foo: 'bar' }, 1, ['foo'], false, undefined, null, false], + _constructor: { + dependencies: [{ foo: 'bar' }, 1, ['foo'], false, undefined, null, false], + createError: (message: string) => new Error(message), + }, } constructor(...args: any[]) { this.args = args @@ -152,10 +160,15 @@ test.group('Container | Make class | Known bindings', () => { } const container = new Container<{ foo: 'bar' }>() - await assert.rejects( - () => container.make(UserService), - `Cannot inject "{ foo: 'bar' }" in "[class: UserService]". The value cannot be constructed` - ) + try { + await container.make(UserService) + } catch (error) { + assert.match(error.stack, /at createError \(.*known_make_class/) + assert.equal( + error.message, + `Cannot inject "{ foo: 'bar' }" in "[class: UserService]". The value cannot be constructed` + ) + } }) test('fail when class has dependencies when containerInjections are empty', async ({ @@ -163,13 +176,16 @@ test.group('Container | Make class | Known bindings', () => { }) => { class UserService { static containerInjections = { - _constructor: [], + _constructor: { + dependencies: [], + createError: (message: string) => new Error(message), + }, } constructor(public name: string) {} } const container = new Container() - assert.rejects( + await assert.rejects( () => container.make(UserService), 'Cannot construct "UserService" class. Container is not able to resolve its dependencies' ) @@ -178,16 +194,24 @@ test.group('Container | Make class | Known bindings', () => { test('raise error when injecting a primitive class', async ({ assert }) => { class UserService { static containerInjections = { - _constructor: [String], + _constructor: { + dependencies: [String], + createError: (message: string) => new Error(message), + }, } constructor() {} } const container = new Container<{ foo: 'bar' }>() - await assert.rejects( - () => container.make(UserService), - 'Cannot inject "[Function: String]" in "[class: UserService]". The value cannot be constructed' - ) + try { + await container.make(UserService) + } catch (error) { + assert.match(error.stack, /at createError \(.*known_make_class/) + assert.equal( + error.message, + 'Cannot inject "[Function: String]" in "[class: UserService]". The value cannot be constructed' + ) + } }) test('throw error when constructing primitive values', async ({ assert }) => { diff --git a/tests/container/make_class.spec.ts b/tests/container/make_class.spec.ts index 2091fc8..3219d79 100644 --- a/tests/container/make_class.spec.ts +++ b/tests/container/make_class.spec.ts @@ -126,7 +126,9 @@ test.group('Container | Make class', () => { class UserService { static containerInjections = { - _constructor: [Database], + _constructor: { + dependencies: [Database], + }, } constructor(public db: Database) {} } @@ -140,11 +142,16 @@ test.group('Container | Make class', () => { }) test('throw error when injecting non-class values to the constructor', async ({ assert }) => { + assert.plan(2) + class UserService { args: any[] static containerInjections = { - _constructor: [{ foo: 'bar' }, 1, ['foo'], false, undefined, null, false], + _constructor: { + dependencies: [{ foo: 'bar' }, 1, ['foo'], false, undefined, null, false], + createError: (message: string) => new Error(message), + }, } constructor(...args: any[]) { this.args = args @@ -152,10 +159,15 @@ test.group('Container | Make class', () => { } const container = new Container() - await assert.rejects( - () => container.make(UserService), - `Cannot inject "{ foo: 'bar' }" in "[class: UserService]". The value cannot be constructed` - ) + try { + await container.make(UserService) + } catch (error) { + assert.match(error.stack, /at createError \(.*make_class/) + assert.equal( + error.message, + `Cannot inject "{ foo: 'bar' }" in "[class: UserService]". The value cannot be constructed` + ) + } }) test('fail when class has dependencies when containerInjections are empty', async ({ @@ -163,31 +175,43 @@ test.group('Container | Make class', () => { }) => { class UserService { static containerInjections = { - _constructor: [], + _constructor: { + dependencies: [], + }, } constructor(public name: string) {} } const container = new Container() - assert.rejects( + await assert.rejects( () => container.make(UserService), 'Cannot construct "UserService" class. Container is not able to resolve its dependencies' ) }) - test('raise error when injecting is a primitive class', async ({ assert }) => { + test('raise error when injecting a primitive class', async ({ assert }) => { + assert.plan(2) + class UserService { static containerInjections = { - _constructor: [String], + _constructor: { + dependencies: [String], + createError: (message: string) => new Error(message), + }, } constructor() {} } const container = new Container() - await assert.rejects( - () => container.make(UserService), - 'Cannot inject "[Function: String]" in "[class: UserService]". The value cannot be constructed' - ) + try { + await container.make(UserService) + } catch (error) { + assert.match(error.stack, /at createError \(.*make_class/) + assert.equal( + error.message, + 'Cannot inject "[Function: String]" in "[class: UserService]". The value cannot be constructed' + ) + } }) test('throw error when constructing primitive values', async ({ assert }) => { diff --git a/tests/provider.spec.ts b/tests/provider.spec.ts index 5ac5e58..0a2993a 100644 --- a/tests/provider.spec.ts +++ b/tests/provider.spec.ts @@ -1,4 +1,5 @@ import { test } from '@japa/runner' +import { RuntimeException } from '@poppinss/utils' import { expectTypeOf } from 'expect-type' import { Container } from '../src/container.js' import { containerProvider } from '../src/provider.js' @@ -33,7 +34,10 @@ test.group('Provider', () => { class Database {} class UserService { static containerInjections = { - constructor: [Database], + constructor: { + dependencies: [Database], + createError: (message: string) => new RuntimeException(message), + }, } } @@ -50,7 +54,10 @@ test.group('Provider', () => { class Database {} class UserService { static containerInjections = { - constructor: [Database], + constructor: { + dependencies: [Database], + createError: (message: string) => new RuntimeException(message), + }, } } @@ -69,7 +76,10 @@ test.group('Provider', () => { class Database {} class UserService { static containerInjections = { - constructor: [Database], + constructor: { + dependencies: [Database], + createError: (message: string) => new RuntimeException(message), + }, } } @@ -88,7 +98,10 @@ test.group('Provider', () => { test('dis-allow primitive constructors', async ({ assert }) => { class UserService { static containerInjections = { - constructor: [String], + constructor: { + dependencies: [String], + createError: (message: string) => new RuntimeException(message), + }, } } From d6adea9810a11d846d02020acf9154105a2ca3d0 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Sat, 4 Mar 2023 11:23:02 +0530 Subject: [PATCH 102/145] chore(release): 9.9.3-1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 348718b..ddcae38 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@adonisjs/fold", - "version": "9.9.3-0", + "version": "9.9.3-1", "description": "A simple and straight forward implementation for IoC container in JavaScript", "main": "build/index.js", "files": [ From 33d687f94ee5484ec1726fdb990130ebc233a677 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Sat, 4 Mar 2023 11:46:33 +0530 Subject: [PATCH 103/145] refactor: make errors descriptive --- src/resolver.ts | 29 ++++++++++++++----- tests/container/call_method.spec.ts | 5 +--- tests/container/known_make_class.spec.ts | 14 +++------ tests/container/make_class.spec.ts | 14 +++------ tests/container/make_class_via_inject.spec.ts | 25 +++++++++++++--- tests/provider.spec.ts | 4 +-- 6 files changed, 53 insertions(+), 38 deletions(-) diff --git a/src/resolver.ts b/src/resolver.ts index 286c038..a0fb4ef 100644 --- a/src/resolver.ts +++ b/src/resolver.ts @@ -132,16 +132,31 @@ export class ContainerResolver> { createError: ErrorCreator ): InvalidArgumentsException { if (parent) { - return createError( - `Cannot inject "${inspect(binding)}" in "[class: ${ - parent.name - }]". The value cannot be constructed` - ) + const error = createError(`Cannot inject "${inspect(binding)}" in "[class ${parent.name}]"`) + error.help = 'The value is not a valid class' + return error } return createError(`Cannot construct value "${inspect(binding)}" using container`) } + /** + * Constructs exception for binding with missing dependencies + */ + #missingDependenciesException(parent: any, binding: any, createError: ErrorCreator) { + if (parent) { + const error = createError( + `Cannot inject "[class ${binding.name}]" in "[class ${parent.name}]"` + ) + error.help = `Container is not able to resolve "${parent.name}" class dependencies` + return error + } + + return createError( + `Cannot construct "[class ${binding.name}]" class. Container is not able to resolve its dependencies` + ) + } + /** * Returns the provider for the class constructor */ @@ -371,9 +386,7 @@ export class ContainerResolver> { * we have typehints. Therefore we throw an exception */ if (dependencies.length < classConstructor.length) { - throw createError( - `Cannot construct "${binding.name}" class. Container is not able to resolve its dependencies` - ) + throw this.#missingDependenciesException(parent, binding, createError) } const value = new binding(...dependencies) as Promise> diff --git a/tests/container/call_method.spec.ts b/tests/container/call_method.spec.ts index 7177b5b..5d9e663 100644 --- a/tests/container/call_method.spec.ts +++ b/tests/container/call_method.spec.ts @@ -117,10 +117,7 @@ test.group('Container | Call method', () => { await container.call(new UserService(), 'foo') } catch (error) { assert.match(error.stack, /at createError \(.*call_method/) - assert.equal( - error.message, - `Cannot inject "{ foo: 'bar' }" in "[class: UserService]". The value cannot be constructed` - ) + assert.equal(error.message, `Cannot inject "{ foo: 'bar' }" in "[class UserService]"`) } }) diff --git a/tests/container/known_make_class.spec.ts b/tests/container/known_make_class.spec.ts index 64e067c..e104092 100644 --- a/tests/container/known_make_class.spec.ts +++ b/tests/container/known_make_class.spec.ts @@ -164,10 +164,7 @@ test.group('Container | Make class | Known bindings', () => { await container.make(UserService) } catch (error) { assert.match(error.stack, /at createError \(.*known_make_class/) - assert.equal( - error.message, - `Cannot inject "{ foo: 'bar' }" in "[class: UserService]". The value cannot be constructed` - ) + assert.equal(error.message, `Cannot inject "{ foo: 'bar' }" in "[class UserService]"`) } }) @@ -187,7 +184,7 @@ test.group('Container | Make class | Known bindings', () => { const container = new Container() await assert.rejects( () => container.make(UserService), - 'Cannot construct "UserService" class. Container is not able to resolve its dependencies' + 'Cannot construct "[class UserService]" class. Container is not able to resolve its dependencies' ) }) @@ -207,10 +204,7 @@ test.group('Container | Make class | Known bindings', () => { await container.make(UserService) } catch (error) { assert.match(error.stack, /at createError \(.*known_make_class/) - assert.equal( - error.message, - 'Cannot inject "[Function: String]" in "[class: UserService]". The value cannot be constructed' - ) + assert.equal(error.message, 'Cannot inject "[Function: String]" in "[class UserService]"') } }) @@ -231,7 +225,7 @@ test.group('Container | Make class | Known bindings', () => { const container = new Container<{ foo: 'bar' }>() await assert.rejects( () => container.make(UserService), - 'Cannot construct "UserService" class. Container is not able to resolve its dependencies' + 'Cannot construct "[class UserService]" class. Container is not able to resolve its dependencies' ) }) diff --git a/tests/container/make_class.spec.ts b/tests/container/make_class.spec.ts index 3219d79..b913f6c 100644 --- a/tests/container/make_class.spec.ts +++ b/tests/container/make_class.spec.ts @@ -163,10 +163,7 @@ test.group('Container | Make class', () => { await container.make(UserService) } catch (error) { assert.match(error.stack, /at createError \(.*make_class/) - assert.equal( - error.message, - `Cannot inject "{ foo: 'bar' }" in "[class: UserService]". The value cannot be constructed` - ) + assert.equal(error.message, `Cannot inject "{ foo: 'bar' }" in "[class UserService]"`) } }) @@ -185,7 +182,7 @@ test.group('Container | Make class', () => { const container = new Container() await assert.rejects( () => container.make(UserService), - 'Cannot construct "UserService" class. Container is not able to resolve its dependencies' + 'Cannot construct "[class UserService]" class. Container is not able to resolve its dependencies' ) }) @@ -207,10 +204,7 @@ test.group('Container | Make class', () => { await container.make(UserService) } catch (error) { assert.match(error.stack, /at createError \(.*make_class/) - assert.equal( - error.message, - 'Cannot inject "[Function: String]" in "[class: UserService]". The value cannot be constructed' - ) + assert.equal(error.message, 'Cannot inject "[Function: String]" in "[class UserService]"') } }) @@ -231,7 +225,7 @@ test.group('Container | Make class', () => { const container = new Container() await assert.rejects( () => container.make(UserService), - 'Cannot construct "UserService" class. Container is not able to resolve its dependencies' + 'Cannot construct "[class UserService]" class. Container is not able to resolve its dependencies' ) }) diff --git a/tests/container/make_class_via_inject.spec.ts b/tests/container/make_class_via_inject.spec.ts index 77c0778..903fdc1 100644 --- a/tests/container/make_class_via_inject.spec.ts +++ b/tests/container/make_class_via_inject.spec.ts @@ -36,7 +36,7 @@ test.group('Container | Make class via inject', () => { const container = new Container() await assert.rejects( () => container.make(UserService), - 'Cannot inject "[Function: Array]" in "[class: UserService]". The value cannot be constructed' + 'Cannot inject "[Function: Array]" in "[class UserService]"' ) }) @@ -186,7 +186,7 @@ test.group('Container | Make class via inject', () => { const container = new Container() await assert.rejects( () => container.make(UserService), - 'Cannot inject "[Function: String]" in "[class: UserService]". The value cannot be constructed' + 'Cannot inject "[Function: String]" in "[class UserService]"' ) }) @@ -201,7 +201,7 @@ test.group('Container | Make class via inject', () => { const container = new Container() await assert.rejects( () => container.make(UserService), - 'Cannot inject "[Function: Object]" in "[class: UserService]". The value cannot be constructed' + 'Cannot inject "[Function: Object]" in "[class UserService]"' ) }) @@ -216,7 +216,7 @@ test.group('Container | Make class via inject', () => { const container = new Container() await assert.rejects( () => container.make(UserService), - 'Cannot inject "[Function: Object]" in "[class: UserService]". The value cannot be constructed' + 'Cannot inject "[Function: Object]" in "[class UserService]"' ) }) @@ -473,4 +473,21 @@ test.group('Container | Make class with contextual bindings', () => { expectTypeOf(controller).toEqualTypeOf() assert.instanceOf(controller.hash, Hash) }) + + test('raise error when unable to constructor class dependency', async ({ assert }) => { + class UserService { + constructor(public config: { foo: string }) {} + } + + @inject() + class UsersController { + constructor(_: UserService) {} + } + + const container = new Container<{ foo: 'bar' }>() + await assert.rejects( + () => container.make(UsersController), + 'Cannot inject "[class UserService]" in "[class UsersController]"' + ) + }) }) diff --git a/tests/provider.spec.ts b/tests/provider.spec.ts index 0a2993a..997bbe5 100644 --- a/tests/provider.spec.ts +++ b/tests/provider.spec.ts @@ -109,7 +109,7 @@ test.group('Provider', () => { const resolver = container.createResolver() await assert.rejects(async () => { - await containerProvider(UserService, 'constructor', resolver, [undefined, { foo: 'bar' }]) - }, 'Cannot inject "[Function: String]" in "[class: UserService]". The value cannot be constructed') + await containerProvider(UserService, 'constructor', resolver, []) + }, 'Cannot inject "[Function: String]" in "[class UserService]"') }) }) From d980257b90d275fd95d4cc1c40ca2a5a8ad56a76 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Sat, 4 Mar 2023 11:59:36 +0530 Subject: [PATCH 104/145] chore(release): 9.9.3-2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ddcae38..4602cfd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@adonisjs/fold", - "version": "9.9.3-1", + "version": "9.9.3-2", "description": "A simple and straight forward implementation for IoC container in JavaScript", "main": "build/index.js", "files": [ From a66b94b168dd78960edee00393bf3eb0f53ea306 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Fri, 10 Mar 2023 11:47:36 +0530 Subject: [PATCH 105/145] chore: update dependencies --- package.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 4602cfd..7475dbb 100644 --- a/package.json +++ b/package.json @@ -51,18 +51,18 @@ "@japa/run-failed-tests": "^1.1.1", "@japa/runner": "^2.5.0", "@japa/spec-reporter": "^1.3.3", - "@swc/core": "^1.3.35", - "@types/node": "^18.14.0", + "@swc/core": "^1.3.38", + "@types/node": "^18.15.0", "benchmark": "^2.1.4", "c8": "^7.13.0", "cross-env": "^7.0.3", "del-cli": "^5.0.0", "eslint": "^8.34.0", - "eslint-config-prettier": "^8.6.0", + "eslint-config-prettier": "^8.7.0", "eslint-plugin-adonis": "^3.0.3", "eslint-plugin-prettier": "^4.0.0", "expect-type": "^0.15.0", - "github-label-sync": "^2.2.0", + "github-label-sync": "^2.3.1", "husky": "^8.0.3", "np": "^7.6.3", "p-event": "^5.0.1", From 0a8ba1ab4c7446ea4aa55217c09c484ea573e898 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Sat, 11 Mar 2023 11:45:51 +0530 Subject: [PATCH 106/145] chore: update dependencies --- package.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 7475dbb..d00f0c8 100644 --- a/package.json +++ b/package.json @@ -49,18 +49,18 @@ "@japa/assert": "^1.4.1", "@japa/file-system": "^1.0.1", "@japa/run-failed-tests": "^1.1.1", - "@japa/runner": "^2.5.0", + "@japa/runner": "^2.5.1", "@japa/spec-reporter": "^1.3.3", - "@swc/core": "^1.3.38", + "@swc/core": "^1.3.39", "@types/node": "^18.15.0", "benchmark": "^2.1.4", "c8": "^7.13.0", "cross-env": "^7.0.3", "del-cli": "^5.0.0", - "eslint": "^8.34.0", + "eslint": "^8.36.0", "eslint-config-prettier": "^8.7.0", "eslint-plugin-adonis": "^3.0.3", - "eslint-plugin-prettier": "^4.0.0", + "eslint-plugin-prettier": "^4.2.1", "expect-type": "^0.15.0", "github-label-sync": "^2.3.1", "husky": "^8.0.3", @@ -68,7 +68,7 @@ "p-event": "^5.0.1", "prettier": "^2.8.4", "reflect-metadata": "^0.1.13", - "ts-node": "^10.8.1", + "ts-node": "^10.9.1", "typescript": "^4.9.5" }, "eslintConfig": { From d755cfeac6430b82aa72ce75f5248812de900958 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Sat, 11 Mar 2023 11:46:43 +0530 Subject: [PATCH 107/145] refactor: use latest version of utils --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d00f0c8..cae025d 100644 --- a/package.json +++ b/package.json @@ -124,7 +124,7 @@ }, "homepage": "https://github.com/adonisjs/fold#readme", "dependencies": { - "@poppinss/utils": "^6.5.0-0" + "@poppinss/utils": "^6.5.0-1" }, "c8": { "reporter": [ From 11f58da6b9c195d02050b799da6bf757affa5d91 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Sat, 11 Mar 2023 13:02:45 +0530 Subject: [PATCH 108/145] chore(release): 9.9.3-3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index cae025d..d54a7a0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@adonisjs/fold", - "version": "9.9.3-2", + "version": "9.9.3-3", "description": "A simple and straight forward implementation for IoC container in JavaScript", "main": "build/index.js", "files": [ From ef806eef912ac65342f368abc227ff8198905fd3 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Sat, 25 Mar 2023 10:23:09 +0530 Subject: [PATCH 109/145] chore: update dependencies --- package.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index d54a7a0..822120c 100644 --- a/package.json +++ b/package.json @@ -44,32 +44,32 @@ "author": "virk,adonisjs", "license": "MIT", "devDependencies": { - "@commitlint/cli": "^17.4.4", + "@commitlint/cli": "^17.5.0", "@commitlint/config-conventional": "^17.4.4", "@japa/assert": "^1.4.1", "@japa/file-system": "^1.0.1", "@japa/run-failed-tests": "^1.1.1", "@japa/runner": "^2.5.1", "@japa/spec-reporter": "^1.3.3", - "@swc/core": "^1.3.39", - "@types/node": "^18.15.0", + "@swc/core": "^1.3.42", + "@types/node": "^18.15.8", "benchmark": "^2.1.4", "c8": "^7.13.0", "cross-env": "^7.0.3", "del-cli": "^5.0.0", "eslint": "^8.36.0", - "eslint-config-prettier": "^8.7.0", + "eslint-config-prettier": "^8.8.0", "eslint-plugin-adonis": "^3.0.3", "eslint-plugin-prettier": "^4.2.1", "expect-type": "^0.15.0", "github-label-sync": "^2.3.1", "husky": "^8.0.3", - "np": "^7.6.3", + "np": "^7.6.4", "p-event": "^5.0.1", - "prettier": "^2.8.4", + "prettier": "^2.8.7", "reflect-metadata": "^0.1.13", "ts-node": "^10.9.1", - "typescript": "^4.9.5" + "typescript": "^5.0.2" }, "eslintConfig": { "extends": [ From 88c17245fe79c0f37ba551374844cfaa869b559f Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Sat, 25 Mar 2023 11:49:56 +0530 Subject: [PATCH 110/145] chore(package): update utils to latest version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 822120c..b822fa8 100644 --- a/package.json +++ b/package.json @@ -124,7 +124,7 @@ }, "homepage": "https://github.com/adonisjs/fold#readme", "dependencies": { - "@poppinss/utils": "^6.5.0-1" + "@poppinss/utils": "^6.5.0-2" }, "c8": { "reporter": [ From 9903ff6921b74dac0bcd5023ed2e8be58f438f2e Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Sat, 25 Mar 2023 11:50:08 +0530 Subject: [PATCH 111/145] docs: update License file --- LICENSE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE.md b/LICENSE.md index 59a3cfa..381426b 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,6 +1,6 @@ # The MIT License -Copyright (c) 2023 AdonisJS Framework +Copyright (c) 2023 Harminder Virk 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: From 731efb5c7bbb12ecb39db8686a42053a0806a62f Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Sat, 25 Mar 2023 13:26:22 +0530 Subject: [PATCH 112/145] chore(release): 9.9.3-4 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b822fa8..5cf972a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@adonisjs/fold", - "version": "9.9.3-3", + "version": "9.9.3-4", "description": "A simple and straight forward implementation for IoC container in JavaScript", "main": "build/index.js", "files": [ From 8b06e7bee68b64dc22bfe6979640d579c4ecfebd Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Sat, 1 Jul 2023 07:32:53 +0530 Subject: [PATCH 113/145] chore: update dependencies --- package.json | 24 +++++++-------- tests/container/make_class_via_inject.spec.ts | 30 ++++++++++++------- tests/container/swap.spec.ts | 2 +- 3 files changed, 33 insertions(+), 23 deletions(-) diff --git a/package.json b/package.json index 5cf972a..7bef45b 100644 --- a/package.json +++ b/package.json @@ -44,32 +44,32 @@ "author": "virk,adonisjs", "license": "MIT", "devDependencies": { - "@commitlint/cli": "^17.5.0", - "@commitlint/config-conventional": "^17.4.4", + "@commitlint/cli": "^17.6.6", + "@commitlint/config-conventional": "^17.6.6", "@japa/assert": "^1.4.1", - "@japa/file-system": "^1.0.1", + "@japa/file-system": "^1.1.0", "@japa/run-failed-tests": "^1.1.1", "@japa/runner": "^2.5.1", "@japa/spec-reporter": "^1.3.3", - "@swc/core": "^1.3.42", - "@types/node": "^18.15.8", + "@swc/core": "^1.3.67", + "@types/node": "^20.3.3", "benchmark": "^2.1.4", - "c8": "^7.13.0", + "c8": "^8.0.0", "cross-env": "^7.0.3", "del-cli": "^5.0.0", - "eslint": "^8.36.0", + "eslint": "^8.44.0", "eslint-config-prettier": "^8.8.0", "eslint-plugin-adonis": "^3.0.3", "eslint-plugin-prettier": "^4.2.1", - "expect-type": "^0.15.0", + "expect-type": "^0.16.0", "github-label-sync": "^2.3.1", "husky": "^8.0.3", - "np": "^7.6.4", - "p-event": "^5.0.1", - "prettier": "^2.8.7", + "np": "^8.0.4", + "p-event": "^6.0.0", + "prettier": "^2.8.8", "reflect-metadata": "^0.1.13", "ts-node": "^10.9.1", - "typescript": "^5.0.2" + "typescript": "^5.1.6" }, "eslintConfig": { "extends": [ diff --git a/tests/container/make_class_via_inject.spec.ts b/tests/container/make_class_via_inject.spec.ts index 903fdc1..19db698 100644 --- a/tests/container/make_class_via_inject.spec.ts +++ b/tests/container/make_class_via_inject.spec.ts @@ -294,10 +294,12 @@ test.group('Container | Make class with contextual bindings', () => { return new Argon2() }) - expectTypeOf(builder.provide).parameters.toEqualTypeOf<[BindingResolver]>() + expectTypeOf(builder.provide).parameters.toEqualTypeOf< + [BindingResolver, Hash>] + >() expectTypeOf(container.contextualBinding) .parameter(2) - .toEqualTypeOf>() + .toEqualTypeOf, Hash>>() const controller = await container.make(UsersController) expectTypeOf(controller).toEqualTypeOf() @@ -335,10 +337,12 @@ test.group('Container | Make class with contextual bindings', () => { return new Argon2() }) - expectTypeOf(builder.provide).parameters.toEqualTypeOf<[BindingResolver]>() + expectTypeOf(builder.provide).parameters.toEqualTypeOf< + [BindingResolver, Hash>] + >() expectTypeOf(container.contextualBinding) .parameter(2) - .toEqualTypeOf>() + .toEqualTypeOf, Hash>>() /** * As soon as a binding for the class is defined, the binding @@ -387,10 +391,12 @@ test.group('Container | Make class with contextual bindings', () => { return new Argon2() }) - expectTypeOf(builder.provide).parameters.toEqualTypeOf<[BindingResolver]>() + expectTypeOf(builder.provide).parameters.toEqualTypeOf< + [BindingResolver, Hash>] + >() expectTypeOf(container.contextualBinding) .parameter(2) - .toEqualTypeOf>() + .toEqualTypeOf, Hash>>() /** * When the binding is registered in the container, we consider @@ -432,10 +438,12 @@ test.group('Container | Make class with contextual bindings', () => { return resolver.make(Hash) }) - expectTypeOf(builder.provide).parameters.toEqualTypeOf<[BindingResolver]>() + expectTypeOf(builder.provide).parameters.toEqualTypeOf< + [BindingResolver, Hash>] + >() expectTypeOf(container.contextualBinding) .parameter(2) - .toEqualTypeOf>() + .toEqualTypeOf, Hash>>() const controller = await container.make(UsersController) expectTypeOf(controller).toEqualTypeOf() @@ -464,10 +472,12 @@ test.group('Container | Make class with contextual bindings', () => { return new Foo() }) - expectTypeOf(builder.provide).parameters.toEqualTypeOf<[BindingResolver]>() + expectTypeOf(builder.provide).parameters.toEqualTypeOf< + [BindingResolver, Foo>] + >() expectTypeOf(container.contextualBinding) .parameter(2) - .toEqualTypeOf>() + .toEqualTypeOf, Hash>>() const controller = await container.make(UsersController) expectTypeOf(controller).toEqualTypeOf() diff --git a/tests/container/swap.spec.ts b/tests/container/swap.spec.ts index fe090d8..667381a 100644 --- a/tests/container/swap.spec.ts +++ b/tests/container/swap.spec.ts @@ -254,7 +254,7 @@ test.group('Container | swap', () => { expectTypeOf(container.contextualBinding) .parameter(2) - .toEqualTypeOf>() + .toEqualTypeOf, Hash>>() const controller = await container.make(UsersController) expectTypeOf(controller).toEqualTypeOf() From ac2184cf1f084cdf634d41e9ae2940357164dc9a Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Mon, 3 Jul 2023 12:32:43 +0530 Subject: [PATCH 114/145] chore: upgrade japa to v3 --- bin/japa_types.ts | 11 ----------- bin/test.ts | 15 ++++----------- package.json | 8 +++----- 3 files changed, 7 insertions(+), 27 deletions(-) delete mode 100644 bin/japa_types.ts diff --git a/bin/japa_types.ts b/bin/japa_types.ts deleted file mode 100644 index 78cc527..0000000 --- a/bin/japa_types.ts +++ /dev/null @@ -1,11 +0,0 @@ -import '@japa/runner' - -declare module '@japa/runner' { - interface TestContext { - // notify TypeScript about custom context properties - } - - interface Test { - // notify TypeScript about custom test properties - } -} diff --git a/bin/test.ts b/bin/test.ts index be16c90..28cdca3 100644 --- a/bin/test.ts +++ b/bin/test.ts @@ -1,9 +1,6 @@ import { assert } from '@japa/assert' -import { pathToFileURL } from 'node:url' import { fileSystem } from '@japa/file-system' -import { specReporter } from '@japa/spec-reporter' -import { runFailedTests } from '@japa/run-failed-tests' -import { processCliArgs, configure, run } from '@japa/runner' +import { processCLIArgs, configure, run } from '@japa/runner' /* |-------------------------------------------------------------------------- @@ -18,14 +15,10 @@ import { processCliArgs, configure, run } from '@japa/runner' | | Please consult japa.dev/runner-config for the config docs. */ +processCLIArgs(process.argv.slice(2)) configure({ - ...processCliArgs(process.argv.slice(2)), - ...{ - files: ['tests/**/*.spec.ts'], - plugins: [assert(), runFailedTests(), fileSystem()], - reporters: [specReporter()], - importer: (filePath) => import(pathToFileURL(filePath).href), - }, + files: ['tests/**/*.spec.ts'], + plugins: [assert(), fileSystem()], }) /* diff --git a/package.json b/package.json index 7bef45b..b1b1da9 100644 --- a/package.json +++ b/package.json @@ -46,11 +46,9 @@ "devDependencies": { "@commitlint/cli": "^17.6.6", "@commitlint/config-conventional": "^17.6.6", - "@japa/assert": "^1.4.1", - "@japa/file-system": "^1.1.0", - "@japa/run-failed-tests": "^1.1.1", - "@japa/runner": "^2.5.1", - "@japa/spec-reporter": "^1.3.3", + "@japa/assert": "^2.0.0-1", + "@japa/file-system": "^2.0.0-1", + "@japa/runner": "^3.0.0-2", "@swc/core": "^1.3.67", "@types/node": "^20.3.3", "benchmark": "^2.1.4", From 8de89a4543949cfd2bc1fed13182dfae508c0654 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Mon, 3 Jul 2023 12:58:34 +0530 Subject: [PATCH 115/145] chore: use @adonisjs/tooling presets for tooling config --- .github/workflows/checks.yml | 14 ++++++++++ .github/workflows/test.yml | 7 ----- package.json | 51 +++++++++--------------------------- tsconfig.json | 31 +++------------------- 4 files changed, 30 insertions(+), 73 deletions(-) create mode 100644 .github/workflows/checks.yml delete mode 100644 .github/workflows/test.yml diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml new file mode 100644 index 0000000..c27fb04 --- /dev/null +++ b/.github/workflows/checks.yml @@ -0,0 +1,14 @@ +name: checks +on: + - push + - pull_request + +jobs: + test: + uses: adonisjs/.github/.github/workflows/test.yml@main + + lint: + uses: adonisjs/.github/.github/workflows/lint.yml@main + + typecheck: + uses: adonisjs/.github/.github/workflows/typecheck.yml@main diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml deleted file mode 100644 index 2d9bc9e..0000000 --- a/.github/workflows/test.yml +++ /dev/null @@ -1,7 +0,0 @@ -name: test -on: - - push - - pull_request -jobs: - test: - uses: adonisjs/.github/.github/workflows/test.yml@main diff --git a/package.json b/package.json index b1b1da9..3986ead 100644 --- a/package.json +++ b/package.json @@ -20,10 +20,11 @@ "type": "module", "scripts": { "pretest": "npm run lint", - "vscode:test": "node --loader=ts-node/esm --experimental-import-meta-resolve bin/test.ts", - "test": "cross-env NODE_DEBUG=adonisjs:fold c8 npm run vscode:test", + "test": "cross-env NODE_DEBUG=adonisjs:fold c8 npm run quick:test", + "quick:test": "node --loader=ts-node/esm --experimental-import-meta-resolve bin/test.ts", "clean": "del-cli build", "benchmark": "npm run build && node --experimental-import-meta-resolve build/benchmark/module_expression.js && node --experimental-import-meta-resolve build/benchmark/module_importer.js", + "typecheck": "tsc --noEmit", "compile": "npm run lint && npm run clean && tsc", "build": "npm run compile", "release": "np --message=\"chore(release): %s\"", @@ -44,11 +45,14 @@ "author": "virk,adonisjs", "license": "MIT", "devDependencies": { + "@adonisjs/eslint-config": "^1.1.7", + "@adonisjs/prettier-config": "^1.1.7", + "@adonisjs/tsconfig": "^1.1.7", "@commitlint/cli": "^17.6.6", "@commitlint/config-conventional": "^17.6.6", "@japa/assert": "^2.0.0-1", "@japa/file-system": "^2.0.0-1", - "@japa/runner": "^3.0.0-2", + "@japa/runner": "^3.0.0-3", "@swc/core": "^1.3.67", "@types/node": "^20.3.3", "benchmark": "^2.1.4", @@ -56,9 +60,6 @@ "cross-env": "^7.0.3", "del-cli": "^5.0.0", "eslint": "^8.44.0", - "eslint-config-prettier": "^8.8.0", - "eslint-plugin-adonis": "^3.0.3", - "eslint-plugin-prettier": "^4.2.1", "expect-type": "^0.16.0", "github-label-sync": "^2.3.1", "husky": "^8.0.3", @@ -69,36 +70,6 @@ "ts-node": "^10.9.1", "typescript": "^5.1.6" }, - "eslintConfig": { - "extends": [ - "plugin:adonis/typescriptPackage", - "prettier" - ], - "plugins": [ - "prettier" - ], - "rules": { - "prettier/prettier": [ - "error", - { - "endOfLine": "auto" - } - ] - } - }, - "eslintIgnore": [ - "build" - ], - "prettier": { - "trailingComma": "es5", - "semi": false, - "singleQuote": true, - "useTabs": false, - "quoteProps": "consistent", - "bracketSpacing": true, - "arrowParens": "always", - "printWidth": 100 - }, "commitlint": { "extends": [ "@commitlint/config-conventional" @@ -122,7 +93,7 @@ }, "homepage": "https://github.com/adonisjs/fold#readme", "dependencies": { - "@poppinss/utils": "^6.5.0-2" + "@poppinss/utils": "^6.5.0-3" }, "c8": { "reporter": [ @@ -132,5 +103,9 @@ "exclude": [ "tests/**" ] - } + }, + "eslintConfig": { + "extends": "@adonisjs/eslint-config/package" + }, + "prettier": "@adonisjs/prettier-config" } diff --git a/tsconfig.json b/tsconfig.json index e7a8514..2039043 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,32 +1,7 @@ { + "extends": "@adonisjs/tsconfig/tsconfig.package.json", "compilerOptions": { - "target": "ESNext", - "module": "NodeNext", - "lib": ["ESNext"], - "noUnusedLocals": true, - "noUnusedParameters": true, - "isolatedModules": true, - "removeComments": true, - "declaration": true, "rootDir": "./", - "experimentalDecorators": true, - "emitDecoratorMetadata": true, - "outDir": "./build", - "esModuleInterop": true, - "strictNullChecks": true, - "allowSyntheticDefaultImports": true, - "forceConsistentCasingInFileNames": true, - "strictPropertyInitialization": true, - "noImplicitAny": true, - "strictBindCallApply": true, - "strictFunctionTypes": true, - "noImplicitThis": true, - "skipLibCheck": true, - "types": ["@types/node"] - }, - "include": ["./**/*"], - "exclude": ["./node_modules", "./build"], - "ts-node": { - "swc": true + "outDir": "./build" } -} +} \ No newline at end of file From b1679c0eefb35d47cb7e60e2d59d95bbc7dafeb1 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Mon, 3 Jul 2023 13:05:13 +0530 Subject: [PATCH 116/145] docs(README): remove snyk badge and update tests badge URL --- README.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index c061d75..38d32f5 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@
-[![gh-workflow-image]][gh-workflow-url] [![npm-image]][npm-url] ![][typescript-image] [![license-image]][license-url] [![snyk-image]][snyk-url] +[![gh-workflow-image]][gh-workflow-url] [![npm-image]][npm-url] ![][typescript-image] [![license-image]][license-url] ## Why this project exists? @@ -662,12 +662,10 @@ const resolver = container.createResolver() await handler.handle(resolver, [ctx]) ``` -[gh-workflow-image]: https://img.shields.io/github/actions/workflow/status/adonisjs/fold/test.yml?style=for-the-badge -[gh-workflow-url]: https://github.com/adonisjs/fold/actions/workflows/test.yml 'Github action' +[gh-workflow-image]: https://img.shields.io/github/actions/workflow/status/adonisjs/fold/checks.yml?style=for-the-badge +[gh-workflow-url]: https://github.com/adonisjs/fold/actions/workflows/checks.yml 'Github action' [npm-image]: https://img.shields.io/npm/v/@adonisjs/fold/latest.svg?style=for-the-badge&logo=npm [npm-url]: https://www.npmjs.com/package/@adonisjs/fold/v/latest 'npm' [typescript-image]: https://img.shields.io/badge/Typescript-294E80.svg?style=for-the-badge&logo=typescript [license-url]: LICENSE.md [license-image]: https://img.shields.io/github/license/adonisjs/fold?style=for-the-badge -[snyk-image]: https://img.shields.io/snyk/vulnerabilities/github/adonisjs/fold?label=Snyk%20Vulnerabilities&style=for-the-badge -[snyk-url]: https://snyk.io/test/github/adonisjs/fold?targetFile=package.json 'snyk' From 60b77821c479af69b5ad0994b09b5e8ee2ff6b48 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Mon, 3 Jul 2023 13:07:30 +0530 Subject: [PATCH 117/145] chore: enable decorators --- tsconfig.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tsconfig.json b/tsconfig.json index 2039043..fe93d8d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,6 +2,8 @@ "extends": "@adonisjs/tsconfig/tsconfig.package.json", "compilerOptions": { "rootDir": "./", - "outDir": "./build" + "outDir": "./build", + "experimentalDecorators": true, + "emitDecoratorMetadata": true } -} \ No newline at end of file +} From 330e59e7734817601ace78f4a4e3174bc7addbe6 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Mon, 3 Jul 2023 13:13:17 +0530 Subject: [PATCH 118/145] chore: add engines to package.json file --- package.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/package.json b/package.json index 3986ead..b8cf01b 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,9 @@ "./types": "./build/src/types.js" }, "type": "module", + "engines": { + "node": ">=18.16.0" + }, "scripts": { "pretest": "npm run lint", "test": "cross-env NODE_DEBUG=adonisjs:fold c8 npm run quick:test", From 45427813966855c2718dab3f8c938216782c9ade Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Mon, 3 Jul 2023 13:14:56 +0530 Subject: [PATCH 119/145] chore(release): 9.9.3-5 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b8cf01b..7032e86 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@adonisjs/fold", - "version": "9.9.3-4", + "version": "9.9.3-5", "description": "A simple and straight forward implementation for IoC container in JavaScript", "main": "build/index.js", "files": [ From 1f7dad75ed1abcf110f34610452f5293445491a9 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Sat, 8 Jul 2023 13:32:07 +0530 Subject: [PATCH 120/145] chore: update dependencies --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 7032e86..abb3fb4 100644 --- a/package.json +++ b/package.json @@ -55,9 +55,9 @@ "@commitlint/config-conventional": "^17.6.6", "@japa/assert": "^2.0.0-1", "@japa/file-system": "^2.0.0-1", - "@japa/runner": "^3.0.0-3", - "@swc/core": "^1.3.67", - "@types/node": "^20.3.3", + "@japa/runner": "^3.0.0-5", + "@swc/core": "^1.3.68", + "@types/node": "^20.4.1", "benchmark": "^2.1.4", "c8": "^8.0.0", "cross-env": "^7.0.3", From 9021f909a52beaa9d5a07fdeab161a3808474c6a Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Sat, 8 Jul 2023 13:35:34 +0530 Subject: [PATCH 121/145] feat: add useEmitter method to register an emitter after creating container instance --- src/container.ts | 8 ++++++++ tests/container/events.spec.ts | 20 ++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/src/container.ts b/src/container.ts index 1d62b84..48ac61b 100644 --- a/src/container.ts +++ b/src/container.ts @@ -99,6 +99,14 @@ export class Container> { this.#options = options || {} } + /** + * Define an emitter instance to use + */ + useEmitter(emitter: Exclude) { + this.#options.emitter = emitter + return this + } + /** * Create a container resolver to resolve bindings, or make classes. * diff --git a/tests/container/events.spec.ts b/tests/container/events.spec.ts index b3f44b4..da4a01e 100644 --- a/tests/container/events.spec.ts +++ b/tests/container/events.spec.ts @@ -152,4 +152,24 @@ test.group('Container | Events', () => { assert.instanceOf(route, FakedRoute) assert.deepEqual(event, { binding: Route, value: route }) }) + + test('register emitter using the useEmitter method', async ({ assert }) => { + const emitter = new EventEmitter() + const container = new Container() + class Route {} + + container.useEmitter(emitter) + container.bind('route', () => { + return new Route() + }) + + const [event, route] = await Promise.all([ + pEvent(emitter, 'container:resolved'), + container.make('route'), + ]) + + expectTypeOf(route).toBeAny() + assert.instanceOf(route, Route) + assert.deepEqual(event, { binding: 'route', value: route }) + }) }) From 02d360ec99bd7bbf8305799d92f3400a3e11bc7d Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Sat, 8 Jul 2023 13:39:05 +0530 Subject: [PATCH 122/145] chore(release): 9.9.3-6 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index abb3fb4..bfeee4a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@adonisjs/fold", - "version": "9.9.3-5", + "version": "9.9.3-6", "description": "A simple and straight forward implementation for IoC container in JavaScript", "main": "build/index.js", "files": [ From 0778f7a522bd11854434e078a3ef4384d6fc4168 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Wed, 26 Jul 2023 09:57:39 +0530 Subject: [PATCH 123/145] chore: update dependencies --- README.md | 2 +- package.json | 20 +++++++++---------- src/contextual_bindings_builder.ts | 2 +- src/module_caller.ts | 4 ++-- src/module_expression.ts | 4 ++-- src/module_importer.ts | 4 ++-- tests/container/make_class_via_inject.spec.ts | 5 ++++- 7 files changed, 22 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 38d32f5..385f520 100644 --- a/README.md +++ b/README.md @@ -65,7 +65,7 @@ class Database {} class UserService { static containerInjections = { _constructor: { - dependencies: [Database] + dependencies: [Database], }, } diff --git a/package.json b/package.json index bfeee4a..dbe443e 100644 --- a/package.json +++ b/package.json @@ -48,27 +48,27 @@ "author": "virk,adonisjs", "license": "MIT", "devDependencies": { - "@adonisjs/eslint-config": "^1.1.7", - "@adonisjs/prettier-config": "^1.1.7", - "@adonisjs/tsconfig": "^1.1.7", - "@commitlint/cli": "^17.6.6", - "@commitlint/config-conventional": "^17.6.6", + "@adonisjs/eslint-config": "^1.1.8", + "@adonisjs/prettier-config": "^1.1.8", + "@adonisjs/tsconfig": "^1.1.8", + "@commitlint/cli": "^17.6.7", + "@commitlint/config-conventional": "^17.6.7", "@japa/assert": "^2.0.0-1", "@japa/file-system": "^2.0.0-1", "@japa/runner": "^3.0.0-5", - "@swc/core": "^1.3.68", - "@types/node": "^20.4.1", + "@swc/core": "^1.3.71", + "@types/node": "^20.4.5", "benchmark": "^2.1.4", - "c8": "^8.0.0", + "c8": "^8.0.1", "cross-env": "^7.0.3", "del-cli": "^5.0.0", - "eslint": "^8.44.0", + "eslint": "^8.45.0", "expect-type": "^0.16.0", "github-label-sync": "^2.3.1", "husky": "^8.0.3", "np": "^8.0.4", "p-event": "^6.0.0", - "prettier": "^2.8.8", + "prettier": "^3.0.0", "reflect-metadata": "^0.1.13", "ts-node": "^10.9.1", "typescript": "^5.1.6" diff --git a/src/contextual_bindings_builder.ts b/src/contextual_bindings_builder.ts index 3b9bbd7..38789e2 100644 --- a/src/contextual_bindings_builder.ts +++ b/src/contextual_bindings_builder.ts @@ -17,7 +17,7 @@ import type { AbstractConstructor, BindingResolver, Constructor, Make } from './ */ export class ContextBindingsBuilder< KnownBindings extends Record, - PinnedBinding extends AbstractConstructor + PinnedBinding extends AbstractConstructor, > { /** * The parent for whom to define the contextual diff --git a/src/module_caller.ts b/src/module_caller.ts index c8b8198..919aed6 100644 --- a/src/module_caller.ts +++ b/src/module_caller.ts @@ -62,7 +62,7 @@ export function moduleCaller(target: Constructor, method: string) { */ toCallable< T extends Container | ContainerResolver | undefined = undefined, - Args extends any[] = any[] + Args extends any[] = any[], >(container?: T): ModuleCallable { /** * When container defined at the time of the calling this function, @@ -112,7 +112,7 @@ export function moduleCaller(target: Constructor, method: string) { */ toHandleMethod< T extends Container | ContainerResolver | undefined = undefined, - Args extends any[] = any[] + Args extends any[] = any[], >(container?: T): ModuleHandler { if (container) { return { diff --git a/src/module_expression.ts b/src/module_expression.ts index 937750c..f635829 100644 --- a/src/module_expression.ts +++ b/src/module_expression.ts @@ -95,7 +95,7 @@ export function moduleExpression(expression: string, parentURL: URL | string) { */ toCallable< T extends Container | ContainerResolver | undefined = undefined, - Args extends any[] = any[] + Args extends any[] = any[], >(container?: T): ModuleCallable { let defaultExport: any = null const [importPath, method] = this.parse() @@ -151,7 +151,7 @@ export function moduleExpression(expression: string, parentURL: URL | string) { */ toHandleMethod< T extends Container | ContainerResolver | undefined = undefined, - Args extends any[] = any[] + Args extends any[] = any[], >(container?: T): ModuleHandler { let defaultExport: any = null const [importPath, method] = this.parse() diff --git a/src/module_importer.ts b/src/module_importer.ts index 65b2a64..164d62c 100644 --- a/src/module_importer.ts +++ b/src/module_importer.ts @@ -75,7 +75,7 @@ export function moduleImporter( */ toCallable< T extends Container | ContainerResolver | undefined = undefined, - Args extends any[] = any[] + Args extends any[] = any[], >(container?: T): ModuleCallable { let defaultExport: any = null @@ -130,7 +130,7 @@ export function moduleImporter( */ toHandleMethod< T extends Container | ContainerResolver | undefined = undefined, - Args extends any[] = any[] + Args extends any[] = any[], >(container?: T): ModuleHandler { let defaultExport: any = null diff --git a/tests/container/make_class_via_inject.spec.ts b/tests/container/make_class_via_inject.spec.ts index 19db698..03f9917 100644 --- a/tests/container/make_class_via_inject.spec.ts +++ b/tests/container/make_class_via_inject.spec.ts @@ -125,7 +125,10 @@ test.group('Container | Make class via inject', () => { @inject() class UserService extends BaseService { - constructor(db: Database, public emitter: Emitter) { + constructor( + db: Database, + public emitter: Emitter + ) { super(db) } } From 5ea29bb1cf6ffef6af4205b388fbe51f07a71450 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Wed, 26 Jul 2023 10:07:02 +0530 Subject: [PATCH 124/145] chore(release): 9.9.3-7 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index dbe443e..04a9e74 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@adonisjs/fold", - "version": "9.9.3-6", + "version": "9.9.3-7", "description": "A simple and straight forward implementation for IoC container in JavaScript", "main": "build/index.js", "files": [ From 8903ec81e943494e9e737e13f832575ba40583d7 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Wed, 23 Aug 2023 10:25:00 +0530 Subject: [PATCH 125/145] chore: update dependencies --- package.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 04a9e74..f7bc6ba 100644 --- a/package.json +++ b/package.json @@ -51,24 +51,24 @@ "@adonisjs/eslint-config": "^1.1.8", "@adonisjs/prettier-config": "^1.1.8", "@adonisjs/tsconfig": "^1.1.8", - "@commitlint/cli": "^17.6.7", - "@commitlint/config-conventional": "^17.6.7", + "@commitlint/cli": "^17.7.1", + "@commitlint/config-conventional": "^17.7.0", "@japa/assert": "^2.0.0-1", "@japa/file-system": "^2.0.0-1", "@japa/runner": "^3.0.0-5", - "@swc/core": "^1.3.71", - "@types/node": "^20.4.5", + "@swc/core": "^1.3.78", + "@types/node": "^20.5.3", "benchmark": "^2.1.4", "c8": "^8.0.1", "cross-env": "^7.0.3", "del-cli": "^5.0.0", - "eslint": "^8.45.0", + "eslint": "^8.47.0", "expect-type": "^0.16.0", "github-label-sync": "^2.3.1", "husky": "^8.0.3", "np": "^8.0.4", "p-event": "^6.0.0", - "prettier": "^3.0.0", + "prettier": "^3.0.2", "reflect-metadata": "^0.1.13", "ts-node": "^10.9.1", "typescript": "^5.1.6" @@ -96,7 +96,7 @@ }, "homepage": "https://github.com/adonisjs/fold#readme", "dependencies": { - "@poppinss/utils": "^6.5.0-3" + "@poppinss/utils": "^6.5.0-5" }, "c8": { "reporter": [ From 15a0b2d01771a6a43e95a8dec58f9b2404f7b620 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Wed, 23 Aug 2023 10:30:17 +0530 Subject: [PATCH 126/145] chore(release): 9.9.3-8 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f7bc6ba..e5ecd6e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@adonisjs/fold", - "version": "9.9.3-7", + "version": "9.9.3-8", "description": "A simple and straight forward implementation for IoC container in JavaScript", "main": "build/index.js", "files": [ From d56b60adc8a2a33804257780c9e7e2a467890950 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Mon, 16 Oct 2023 11:27:00 +0530 Subject: [PATCH 127/145] chore: update dependencies --- package.json | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/package.json b/package.json index e5ecd6e..931d240 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "typecheck": "tsc --noEmit", "compile": "npm run lint && npm run clean && tsc", "build": "npm run compile", - "release": "np --message=\"chore(release): %s\"", + "release": "np", "version": "npm run build", "prepublishOnly": "npm run build", "lint": "eslint . --ext=.ts", @@ -51,27 +51,27 @@ "@adonisjs/eslint-config": "^1.1.8", "@adonisjs/prettier-config": "^1.1.8", "@adonisjs/tsconfig": "^1.1.8", - "@commitlint/cli": "^17.7.1", - "@commitlint/config-conventional": "^17.7.0", - "@japa/assert": "^2.0.0-1", - "@japa/file-system": "^2.0.0-1", - "@japa/runner": "^3.0.0-5", + "@commitlint/cli": "^17.8.0", + "@commitlint/config-conventional": "^17.8.0", + "@japa/assert": "^2.0.0", + "@japa/file-system": "^2.0.0", + "@japa/runner": "^3.0.2", "@swc/core": "^1.3.78", - "@types/node": "^20.5.3", + "@types/node": "^20.8.6", "benchmark": "^2.1.4", "c8": "^8.0.1", "cross-env": "^7.0.3", - "del-cli": "^5.0.0", - "eslint": "^8.47.0", - "expect-type": "^0.16.0", + "del-cli": "^5.1.0", + "eslint": "^8.51.0", + "expect-type": "^0.17.3", "github-label-sync": "^2.3.1", "husky": "^8.0.3", "np": "^8.0.4", "p-event": "^6.0.0", - "prettier": "^3.0.2", + "prettier": "^3.0.3", "reflect-metadata": "^0.1.13", "ts-node": "^10.9.1", - "typescript": "^5.1.6" + "typescript": "^5.2.2" }, "commitlint": { "extends": [ @@ -96,7 +96,7 @@ }, "homepage": "https://github.com/adonisjs/fold#readme", "dependencies": { - "@poppinss/utils": "^6.5.0-5" + "@poppinss/utils": "^6.5.0" }, "c8": { "reporter": [ From f5aadafaa7881729f5fe506c7b34f3f3a1bc6ba8 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Mon, 16 Oct 2023 11:35:13 +0530 Subject: [PATCH 128/145] chore: use tsup for bundling --- package.json | 16 ++++++++++++++-- tsconfig.json | 3 ++- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 931d240..81b2a5b 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "clean": "del-cli build", "benchmark": "npm run build && node --experimental-import-meta-resolve build/benchmark/module_expression.js && node --experimental-import-meta-resolve build/benchmark/module_importer.js", "typecheck": "tsc --noEmit", - "compile": "npm run lint && npm run clean && tsc", + "compile": "npm run lint && npm run clean && tsup-node", "build": "npm run compile", "release": "np", "version": "npm run build", @@ -71,6 +71,7 @@ "prettier": "^3.0.3", "reflect-metadata": "^0.1.13", "ts-node": "^10.9.1", + "tsup": "^7.2.0", "typescript": "^5.2.2" }, "commitlint": { @@ -110,5 +111,16 @@ "eslintConfig": { "extends": "@adonisjs/eslint-config/package" }, - "prettier": "@adonisjs/prettier-config" + "prettier": "@adonisjs/prettier-config", + "tsup": { + "entry": [ + "./index.ts", + "./src/types.ts" + ], + "outDir": "./build", + "clean": true, + "format": "esm", + "dts": true, + "target": "esnext" + } } diff --git a/tsconfig.json b/tsconfig.json index fe93d8d..536aea1 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,6 +4,7 @@ "rootDir": "./", "outDir": "./build", "experimentalDecorators": true, - "emitDecoratorMetadata": true + "emitDecoratorMetadata": true, + "types": ["@types/node", "reflect-metadata"] } } From 981b3a4bf74e55db0d9658bd58e0f26065fce4ee Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Mon, 16 Oct 2023 11:37:00 +0530 Subject: [PATCH 129/145] chore: pin swc/core as the latest release breaks --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 81b2a5b..aebe6f8 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "@japa/assert": "^2.0.0", "@japa/file-system": "^2.0.0", "@japa/runner": "^3.0.2", - "@swc/core": "^1.3.78", + "@swc/core": "1.3.82", "@types/node": "^20.8.6", "benchmark": "^2.1.4", "c8": "^8.0.1", From e2dd5d45a2bd6874f6254639a547b823c4b52e66 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Mon, 16 Oct 2023 11:40:24 +0530 Subject: [PATCH 130/145] chore(release): 9.9.3-9 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index aebe6f8..6ecb530 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@adonisjs/fold", - "version": "9.9.3-8", + "version": "9.9.3-9", "description": "A simple and straight forward implementation for IoC container in JavaScript", "main": "build/index.js", "files": [ From b8244afa2f37637d0c3c50eccc38ce2c491fd735 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Mon, 16 Oct 2023 11:49:04 +0530 Subject: [PATCH 131/145] fix: publish the complete build folder --- package.json | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/package.json b/package.json index 6ecb530..d184311 100644 --- a/package.json +++ b/package.json @@ -4,9 +4,7 @@ "description": "A simple and straight forward implementation for IoC container in JavaScript", "main": "build/index.js", "files": [ - "build/src", - "build/index.d.ts", - "build/index.js" + "build" ], "imports": { "#controllers/*": "./tests/app/controllers/*.js", From 777d9a17cbfa5545f202664ea464c5561b62b583 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Mon, 16 Oct 2023 11:50:32 +0530 Subject: [PATCH 132/145] chore(release): 9.9.3-10 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d184311..44fab88 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@adonisjs/fold", - "version": "9.9.3-9", + "version": "9.9.3-10", "description": "A simple and straight forward implementation for IoC container in JavaScript", "main": "build/index.js", "files": [ From 86ff2b5acdc2da03f4ee0846ab9deb8b67956d7f Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Wed, 22 Nov 2023 10:32:26 +0530 Subject: [PATCH 133/145] chore: update dependencies --- package.json | 30 +++++++++++++++--------------- src/container.ts | 16 ++++++++-------- src/resolver.ts | 4 ++-- 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/package.json b/package.json index 44fab88..cd53a9e 100644 --- a/package.json +++ b/package.json @@ -46,31 +46,31 @@ "author": "virk,adonisjs", "license": "MIT", "devDependencies": { - "@adonisjs/eslint-config": "^1.1.8", - "@adonisjs/prettier-config": "^1.1.8", - "@adonisjs/tsconfig": "^1.1.8", - "@commitlint/cli": "^17.8.0", - "@commitlint/config-conventional": "^17.8.0", - "@japa/assert": "^2.0.0", - "@japa/file-system": "^2.0.0", - "@japa/runner": "^3.0.2", - "@swc/core": "1.3.82", - "@types/node": "^20.8.6", + "@adonisjs/eslint-config": "^1.1.9", + "@adonisjs/prettier-config": "^1.1.9", + "@adonisjs/tsconfig": "^1.1.9", + "@commitlint/cli": "^18.4.3", + "@commitlint/config-conventional": "^18.4.3", + "@japa/assert": "^2.0.1", + "@japa/file-system": "^2.0.1", + "@japa/runner": "^3.1.0", + "@swc/core": "^1.3.99", + "@types/node": "^20.9.4", "benchmark": "^2.1.4", "c8": "^8.0.1", "cross-env": "^7.0.3", "del-cli": "^5.1.0", - "eslint": "^8.51.0", + "eslint": "^8.54.0", "expect-type": "^0.17.3", "github-label-sync": "^2.3.1", "husky": "^8.0.3", "np": "^8.0.4", "p-event": "^6.0.0", - "prettier": "^3.0.3", + "prettier": "^3.1.0", "reflect-metadata": "^0.1.13", "ts-node": "^10.9.1", - "tsup": "^7.2.0", - "typescript": "^5.2.2" + "tsup": "^8.0.1", + "typescript": "5.2.2" }, "commitlint": { "extends": [ @@ -95,7 +95,7 @@ }, "homepage": "https://github.com/adonisjs/fold#readme", "dependencies": { - "@poppinss/utils": "^6.5.0" + "@poppinss/utils": "^6.5.1" }, "c8": { "reporter": [ diff --git a/src/container.ts b/src/container.ts index 48ac61b..19b85be 100644 --- a/src/container.ts +++ b/src/container.ts @@ -280,8 +280,8 @@ export class Container> { Binding extends AbstractConstructor ? A : Binding extends keyof KnownBindings - ? KnownBindings[Binding] - : never + ? KnownBindings[Binding] + : never > ): void { if (typeof binding !== 'string' && typeof binding !== 'symbol' && !isClass(binding)) { @@ -317,8 +317,8 @@ export class Container> { value: Binding extends AbstractConstructor ? A : Binding extends keyof KnownBindings - ? KnownBindings[Binding] - : never + ? KnownBindings[Binding] + : never ): void { if (typeof binding !== 'string' && typeof binding !== 'symbol' && !isClass(binding)) { throw new InvalidArgumentsException( @@ -365,8 +365,8 @@ export class Container> { Binding extends AbstractConstructor ? A : Binding extends keyof KnownBindings - ? KnownBindings[Binding] - : never + ? KnownBindings[Binding] + : never > ): void { if (typeof binding !== 'string' && typeof binding !== 'symbol' && !isClass(binding)) { @@ -448,8 +448,8 @@ export class Container> { callback: Binding extends AbstractConstructor ? HookCallback : Binding extends keyof KnownBindings - ? HookCallback - : never + ? HookCallback + : never ): void { binding = (this.#aliases.get(binding) as Binding) || binding diff --git a/src/resolver.ts b/src/resolver.ts index a0fb4ef..e1a032c 100644 --- a/src/resolver.ts +++ b/src/resolver.ts @@ -514,8 +514,8 @@ export class ContainerResolver> { value: Binding extends AbstractConstructor ? A : Binding extends keyof KnownBindings - ? KnownBindings[Binding] - : never + ? KnownBindings[Binding] + : never ): void { if (typeof binding !== 'string' && typeof binding !== 'symbol' && !isClass(binding)) { throw new InvalidArgumentsException( From b5a7cf9ddd3b0a6c64332c4c7e2ee6363cd4e61d Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Wed, 22 Nov 2023 10:39:33 +0530 Subject: [PATCH 134/145] chore: generate types using tsc --- .../module_expression.ts | 0 {benchmark => benchmarks}/module_importer.ts | 0 .../services/comments.ts | 0 {benchmark => benchmarks}/services/posts.ts | 0 {benchmark => benchmarks}/services/thread.ts | 0 {benchmark => benchmarks}/services/users.ts | 0 package.json | 43 +++++++++++-------- 7 files changed, 24 insertions(+), 19 deletions(-) rename {benchmark => benchmarks}/module_expression.ts (100%) rename {benchmark => benchmarks}/module_importer.ts (100%) rename {benchmark => benchmarks}/services/comments.ts (100%) rename {benchmark => benchmarks}/services/posts.ts (100%) rename {benchmark => benchmarks}/services/thread.ts (100%) rename {benchmark => benchmarks}/services/users.ts (100%) diff --git a/benchmark/module_expression.ts b/benchmarks/module_expression.ts similarity index 100% rename from benchmark/module_expression.ts rename to benchmarks/module_expression.ts diff --git a/benchmark/module_importer.ts b/benchmarks/module_importer.ts similarity index 100% rename from benchmark/module_importer.ts rename to benchmarks/module_importer.ts diff --git a/benchmark/services/comments.ts b/benchmarks/services/comments.ts similarity index 100% rename from benchmark/services/comments.ts rename to benchmarks/services/comments.ts diff --git a/benchmark/services/posts.ts b/benchmarks/services/posts.ts similarity index 100% rename from benchmark/services/posts.ts rename to benchmarks/services/posts.ts diff --git a/benchmark/services/thread.ts b/benchmarks/services/thread.ts similarity index 100% rename from benchmark/services/thread.ts rename to benchmarks/services/thread.ts diff --git a/benchmark/services/users.ts b/benchmarks/services/users.ts similarity index 100% rename from benchmark/services/users.ts rename to benchmarks/services/users.ts diff --git a/package.json b/package.json index cd53a9e..194e4de 100644 --- a/package.json +++ b/package.json @@ -2,23 +2,26 @@ "name": "@adonisjs/fold", "version": "9.9.3-10", "description": "A simple and straight forward implementation for IoC container in JavaScript", + "type": "module", "main": "build/index.js", "files": [ - "build" + "build", + "!build/benchmarks", + "!build/bin", + "!build/tests" ], + "engines": { + "node": ">=18.16.0" + }, "imports": { "#controllers/*": "./tests/app/controllers/*.js", "#middleware/*": "./tests/app/middleware/*.js", - "#services/*": "./build/benchmark/services/*.js" + "#services/*": "./build/benchmarks/services/*.js" }, "exports": { ".": "./build/index.js", "./types": "./build/src/types.js" }, - "type": "module", - "engines": { - "node": ">=18.16.0" - }, "scripts": { "pretest": "npm run lint", "test": "cross-env NODE_DEBUG=adonisjs:fold c8 npm run quick:test", @@ -26,7 +29,8 @@ "clean": "del-cli build", "benchmark": "npm run build && node --experimental-import-meta-resolve build/benchmark/module_expression.js && node --experimental-import-meta-resolve build/benchmark/module_importer.js", "typecheck": "tsc --noEmit", - "compile": "npm run lint && npm run clean && tsup-node", + "precompile": "npm run lint && npm run clean", + "compile": "tsup-node && tsc --emitDeclarationOnly --declaration", "build": "npm run compile", "release": "np", "version": "npm run build", @@ -35,16 +39,12 @@ "format": "prettier --write .", "sync-labels": "github-label-sync --labels .github/labels.json adonisjs/fold" }, - "publishConfig": { - "access": "public", - "tag": "next" - }, + "license": "MIT", "keywords": [ "ioc", "container" ], "author": "virk,adonisjs", - "license": "MIT", "devDependencies": { "@adonisjs/eslint-config": "^1.1.9", "@adonisjs/prettier-config": "^1.1.9", @@ -72,10 +72,12 @@ "tsup": "^8.0.1", "typescript": "5.2.2" }, - "commitlint": { - "extends": [ - "@commitlint/config-conventional" - ] + "dependencies": { + "@poppinss/utils": "^6.5.1" + }, + "publishConfig": { + "access": "public", + "tag": "next" }, "np": { "message": "chore(release): %s", @@ -94,8 +96,10 @@ "url": "https://github.com/adonisjs/fold/issues" }, "homepage": "https://github.com/adonisjs/fold#readme", - "dependencies": { - "@poppinss/utils": "^6.5.1" + "commitlint": { + "extends": [ + "@commitlint/config-conventional" + ] }, "c8": { "reporter": [ @@ -118,7 +122,8 @@ "outDir": "./build", "clean": true, "format": "esm", - "dts": true, + "dts": false, + "sourcemap": true, "target": "esnext" } } From 47d3c8a84670e9d55a2e557256d10721c6c4fb8e Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Wed, 22 Nov 2023 10:49:32 +0530 Subject: [PATCH 135/145] docs: update installation instructions --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 385f520..6c785f6 100644 --- a/README.md +++ b/README.md @@ -27,13 +27,13 @@ I have explained the [reasons for using an IoC container](https://github.com/the Install the package from the npm packages registry. ```sh -npm i @adonisjs/fold +npm i @adonisjs/fold@next # yarn lovers -yarn add @adonisjs/fold +yarn add @adonisjs/fold@next # pnpm followers -pnpm add @adonisjs/fold +pnpm add @adonisjs/fold@next ``` Once done, you can import the `Container` class from the package and create an instance of it. For the most part, you will use a single instance of the container. From 3928bb400173446819af431e93402806181ae0aa Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Wed, 22 Nov 2023 10:51:44 +0530 Subject: [PATCH 136/145] chore(release): 9.9.3-11 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 194e4de..90ee818 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@adonisjs/fold", - "version": "9.9.3-10", + "version": "9.9.3-11", "description": "A simple and straight forward implementation for IoC container in JavaScript", "type": "module", "main": "build/index.js", From ffaaa48b17e8c0c7e0aa5ee3d0943868592d7b95 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Mon, 18 Dec 2023 13:47:32 +0530 Subject: [PATCH 137/145] chore: update dependencies --- package.json | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/package.json b/package.json index 90ee818..64ea1aa 100644 --- a/package.json +++ b/package.json @@ -46,34 +46,34 @@ ], "author": "virk,adonisjs", "devDependencies": { - "@adonisjs/eslint-config": "^1.1.9", - "@adonisjs/prettier-config": "^1.1.9", - "@adonisjs/tsconfig": "^1.1.9", + "@adonisjs/eslint-config": "^1.2.0", + "@adonisjs/prettier-config": "^1.2.0", + "@adonisjs/tsconfig": "^1.2.0", "@commitlint/cli": "^18.4.3", "@commitlint/config-conventional": "^18.4.3", - "@japa/assert": "^2.0.1", - "@japa/file-system": "^2.0.1", - "@japa/runner": "^3.1.0", - "@swc/core": "^1.3.99", - "@types/node": "^20.9.4", + "@japa/assert": "^2.1.0", + "@japa/file-system": "^2.1.0", + "@japa/runner": "^3.1.1", + "@swc/core": "^1.3.101", + "@types/node": "^20.10.5", "benchmark": "^2.1.4", "c8": "^8.0.1", "cross-env": "^7.0.3", "del-cli": "^5.1.0", - "eslint": "^8.54.0", + "eslint": "^8.56.0", "expect-type": "^0.17.3", "github-label-sync": "^2.3.1", "husky": "^8.0.3", - "np": "^8.0.4", + "np": "^9.2.0", "p-event": "^6.0.0", - "prettier": "^3.1.0", - "reflect-metadata": "^0.1.13", - "ts-node": "^10.9.1", + "prettier": "^3.1.1", + "reflect-metadata": "^0.2.1", + "ts-node": "^10.9.2", "tsup": "^8.0.1", - "typescript": "5.2.2" + "typescript": "^5.3.3" }, "dependencies": { - "@poppinss/utils": "^6.5.1" + "@poppinss/utils": "^6.7.0" }, "publishConfig": { "access": "public", From ccf285259b4c7b86fd0829b58402c4b9e3e992b5 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Mon, 18 Dec 2023 14:06:51 +0530 Subject: [PATCH 138/145] refactor: assign names to wrapping methods created to invoke modules --- src/module_caller.ts | 4 +++- src/module_importer.ts | 2 ++ src/types.ts | 2 ++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/module_caller.ts b/src/module_caller.ts index 919aed6..2ec4db5 100644 --- a/src/module_caller.ts +++ b/src/module_caller.ts @@ -13,7 +13,7 @@ import type { ModuleHandler, ModuleCallable, Constructor } from './types.js' /** * The moduleCaller works around a very specific pattern we use with - * AdonisJS, ie to constructor classes and call methods using the + * AdonisJS, ie to construct classes and call methods using the * container. * * For example: Controllers of AdonisJS allows defining a controller @@ -116,6 +116,7 @@ export function moduleCaller(target: Constructor, method: string) { >(container?: T): ModuleHandler { if (container) { return { + name: `${target.name}.${method}`, async handle(...args: Args) { return container.call(await container.make(target), method, args) }, @@ -123,6 +124,7 @@ export function moduleCaller(target: Constructor, method: string) { } return { + name: `${target.name}.${method}`, async handle(resolver: ContainerResolver | Container, ...args: Args) { return resolver.call(await resolver.make(target), method, args) }, diff --git a/src/module_importer.ts b/src/module_importer.ts index 164d62c..e1c52c3 100644 --- a/src/module_importer.ts +++ b/src/module_importer.ts @@ -136,6 +136,7 @@ export function moduleImporter( if (container) { return { + name: importFn.name, async handle(...args: Args) { defaultExport = defaultExport || (await importDefault(importFn)) return container.call(await container.make(defaultExport), method, args) @@ -144,6 +145,7 @@ export function moduleImporter( } return { + name: importFn.name, async handle(resolver: ContainerResolver | Container, ...args: Args) { defaultExport = defaultExport || (await importDefault(importFn)) return resolver.call(await resolver.make(defaultExport), method, args) diff --git a/src/types.ts b/src/types.ts index 5980a16..24914ba 100644 --- a/src/types.ts +++ b/src/types.ts @@ -176,8 +176,10 @@ export type ModuleCallable = T extends undefined */ export type ModuleHandler = T extends undefined ? { + name?: string handle(resolver: ContainerResolver | Container, ...args: Args): Promise } : { + name?: string handle(...args: Args): Promise } From 6587dfe28d0db0e86e4a27df460024ab646195f7 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Mon, 18 Dec 2023 14:20:01 +0530 Subject: [PATCH 139/145] chore(release): 9.9.3-12 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 64ea1aa..0adaf3e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@adonisjs/fold", - "version": "9.9.3-11", + "version": "9.9.3-12", "description": "A simple and straight forward implementation for IoC container in JavaScript", "type": "module", "main": "build/index.js", From edf74265c857ef59b113eb409dbce22e300d23bf Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Tue, 19 Dec 2023 15:36:41 +0530 Subject: [PATCH 140/145] refactor: rename container:resolved event to container_binding:resolved --- src/resolver.ts | 2 +- src/types.ts | 2 +- tests/container/events.spec.ts | 18 +++++++++--------- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/resolver.ts b/src/resolver.ts index e1a032c..8257d21 100644 --- a/src/resolver.ts +++ b/src/resolver.ts @@ -192,7 +192,7 @@ export class ContainerResolver> { if (!this.#options.emitter) { return } - this.#options.emitter.emit('container:resolved', { binding, value }) + this.#options.emitter.emit('container_binding:resolved', { binding, value }) } /** diff --git a/src/types.ts b/src/types.ts index 24914ba..3232f41 100644 --- a/src/types.ts +++ b/src/types.ts @@ -101,7 +101,7 @@ export type Swaps = Map, BindingResolver /** - * The data emitted using the `container:resolve` event. If known bindings + * The data emitted by the `container_binding:resolved` event. If known bindings * are defined, then the bindings and values will be correctly * inferred. */ diff --git a/tests/container/events.spec.ts b/tests/container/events.spec.ts index da4a01e..83f6c38 100644 --- a/tests/container/events.spec.ts +++ b/tests/container/events.spec.ts @@ -16,7 +16,7 @@ test.group('Container | Events', () => { }) const [event, route] = await Promise.all([ - pEvent(emitter, 'container:resolved'), + pEvent(emitter, 'container_binding:resolved'), container.make('route'), ]) @@ -35,7 +35,7 @@ test.group('Container | Events', () => { }) const [event, route] = await Promise.all([ - pEvent(emitter, 'container:resolved'), + pEvent(emitter, 'container_binding:resolved'), container.make('route'), ]) @@ -54,11 +54,11 @@ test.group('Container | Events', () => { }) const [event, route] = await Promise.all([ - pEvent(emitter, 'container:resolved'), + pEvent(emitter, 'container_binding:resolved'), container.make('route'), ]) const [event1, route1] = await Promise.all([ - pEvent(emitter, 'container:resolved'), + pEvent(emitter, 'container_binding:resolved'), container.make('route'), ]) @@ -76,7 +76,7 @@ test.group('Container | Events', () => { container.bindValue('route', new Route()) const [event, route] = await Promise.all([ - pEvent(emitter, 'container:resolved'), + pEvent(emitter, 'container_binding:resolved'), container.make('route'), ]) @@ -91,7 +91,7 @@ test.group('Container | Events', () => { class Route {} const [event, route] = await Promise.all([ - pEvent(emitter, 'container:resolved'), + pEvent(emitter, 'container_binding:resolved'), container.make(Route), ]) @@ -121,7 +121,7 @@ test.group('Container | Events', () => { } const [events, route] = await Promise.all([ - pEventMultiple(emitter, 'container:resolved', { count: 3 }), + pEventMultiple(emitter, 'container_binding:resolved', { count: 3 }), container.make(Route), ]) @@ -143,7 +143,7 @@ test.group('Container | Events', () => { container.swap(Route, () => new FakedRoute()) const [event, route] = await Promise.all([ - pEvent(emitter, 'container:resolved'), + pEvent(emitter, 'container_binding:resolved'), container.make(Route), ]) @@ -164,7 +164,7 @@ test.group('Container | Events', () => { }) const [event, route] = await Promise.all([ - pEvent(emitter, 'container:resolved'), + pEvent(emitter, 'container_binding:resolved'), container.make('route'), ]) From 91ca351200b671da181be9dfbc06c59b448196fa Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Tue, 19 Dec 2023 15:40:59 +0530 Subject: [PATCH 141/145] chore(release): 9.9.3-13 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0adaf3e..a9f29c4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@adonisjs/fold", - "version": "9.9.3-12", + "version": "9.9.3-13", "description": "A simple and straight forward implementation for IoC container in JavaScript", "type": "module", "main": "build/index.js", From 1f5b563b54d5bb1fbc3e722e019da7d7584be69d Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Fri, 22 Dec 2023 12:09:09 +0530 Subject: [PATCH 142/145] refactor: make error messages more descriptive --- src/resolver.ts | 6 +++--- tests/container/call_method.spec.ts | 2 +- tests/container/known_make_class.spec.ts | 4 ++-- tests/container/make_class.spec.ts | 8 +++----- 4 files changed, 9 insertions(+), 11 deletions(-) diff --git a/src/resolver.ts b/src/resolver.ts index 8257d21..08d9133 100644 --- a/src/resolver.ts +++ b/src/resolver.ts @@ -148,12 +148,12 @@ export class ContainerResolver> { const error = createError( `Cannot inject "[class ${binding.name}]" in "[class ${parent.name}]"` ) - error.help = `Container is not able to resolve "${parent.name}" class dependencies` + error.help = `Container is not able to resolve "${parent.name}" class dependencies. Did you mean to use @inject decorator` return error } return createError( - `Cannot construct "[class ${binding.name}]" class. Container is not able to resolve its dependencies` + `Cannot construct "[class ${binding.name}]" class. Container is not able to resolve its dependencies. Did you mean to use @inject decorator` ) } @@ -484,7 +484,7 @@ export class ContainerResolver> { throw createError( `Cannot call "${binding.name}.${String( method - )}" method. Container is not able to resolve its dependencies` + )}" method. Container is not able to resolve its dependencies. Did you mean to use @inject decorator` ) } diff --git a/tests/container/call_method.spec.ts b/tests/container/call_method.spec.ts index 5d9e663..6847fd5 100644 --- a/tests/container/call_method.spec.ts +++ b/tests/container/call_method.spec.ts @@ -164,7 +164,7 @@ test.group('Container | Call method', () => { const container = new Container() await assert.rejects( () => container.call(new UserService(), 'foo'), - 'Cannot call "UserService.foo" method. Container is not able to resolve its dependencies' + 'Cannot call "UserService.foo" method. Container is not able to resolve its dependencies. Did you mean to use @inject decorator' ) }) diff --git a/tests/container/known_make_class.spec.ts b/tests/container/known_make_class.spec.ts index e104092..73468fc 100644 --- a/tests/container/known_make_class.spec.ts +++ b/tests/container/known_make_class.spec.ts @@ -184,7 +184,7 @@ test.group('Container | Make class | Known bindings', () => { const container = new Container() await assert.rejects( () => container.make(UserService), - 'Cannot construct "[class UserService]" class. Container is not able to resolve its dependencies' + 'Cannot construct "[class UserService]" class. Container is not able to resolve its dependencies. Did you mean to use @inject decorator' ) }) @@ -225,7 +225,7 @@ test.group('Container | Make class | Known bindings', () => { const container = new Container<{ foo: 'bar' }>() await assert.rejects( () => container.make(UserService), - 'Cannot construct "[class UserService]" class. Container is not able to resolve its dependencies' + 'Cannot construct "[class UserService]" class. Container is not able to resolve its dependencies. Did you mean to use @inject decorator' ) }) diff --git a/tests/container/make_class.spec.ts b/tests/container/make_class.spec.ts index b913f6c..edc2d2a 100644 --- a/tests/container/make_class.spec.ts +++ b/tests/container/make_class.spec.ts @@ -167,9 +167,7 @@ test.group('Container | Make class', () => { } }) - test('fail when class has dependencies when containerInjections are empty', async ({ - assert, - }) => { + test('fail when class has dependencies but containerInjections are empty', async ({ assert }) => { class UserService { static containerInjections = { _constructor: { @@ -182,7 +180,7 @@ test.group('Container | Make class', () => { const container = new Container() await assert.rejects( () => container.make(UserService), - 'Cannot construct "[class UserService]" class. Container is not able to resolve its dependencies' + 'Cannot construct "[class UserService]" class. Container is not able to resolve its dependencies. Did you mean to use @inject decorator' ) }) @@ -225,7 +223,7 @@ test.group('Container | Make class', () => { const container = new Container() await assert.rejects( () => container.make(UserService), - 'Cannot construct "[class UserService]" class. Container is not able to resolve its dependencies' + 'Cannot construct "[class UserService]" class. Container is not able to resolve its dependencies. Did you mean to use @inject decorator' ) }) From 14959fe15c0175dbd7212509320068ac1f8d4690 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Fri, 22 Dec 2023 12:13:02 +0530 Subject: [PATCH 143/145] chore(release): 9.9.3-14 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a9f29c4..ac8c3dd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@adonisjs/fold", - "version": "9.9.3-13", + "version": "9.9.3-14", "description": "A simple and straight forward implementation for IoC container in JavaScript", "type": "module", "main": "build/index.js", From 838769bc8a5f9a67435ce33eb9306604e0c3e56a Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Fri, 5 Jan 2024 11:37:58 +0530 Subject: [PATCH 144/145] chore: update dependencies --- package.json | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index ac8c3dd..c16782e 100644 --- a/package.json +++ b/package.json @@ -46,18 +46,18 @@ ], "author": "virk,adonisjs", "devDependencies": { - "@adonisjs/eslint-config": "^1.2.0", - "@adonisjs/prettier-config": "^1.2.0", - "@adonisjs/tsconfig": "^1.2.0", - "@commitlint/cli": "^18.4.3", - "@commitlint/config-conventional": "^18.4.3", + "@adonisjs/eslint-config": "^1.2.1", + "@adonisjs/prettier-config": "^1.2.1", + "@adonisjs/tsconfig": "^1.2.1", + "@commitlint/cli": "^18.4.4", + "@commitlint/config-conventional": "^18.4.4", "@japa/assert": "^2.1.0", - "@japa/file-system": "^2.1.0", + "@japa/file-system": "^2.1.1", "@japa/runner": "^3.1.1", - "@swc/core": "^1.3.101", - "@types/node": "^20.10.5", + "@swc/core": "^1.3.102", + "@types/node": "^20.10.6", "benchmark": "^2.1.4", - "c8": "^8.0.1", + "c8": "^9.0.0", "cross-env": "^7.0.3", "del-cli": "^5.1.0", "eslint": "^8.56.0", From e644b11ef8b12cc986bf02beeecad635b1c47032 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Fri, 5 Jan 2024 11:51:48 +0530 Subject: [PATCH 145/145] chore: fix benchmarks script --- package.json | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index c16782e..1929c84 100644 --- a/package.json +++ b/package.json @@ -25,9 +25,9 @@ "scripts": { "pretest": "npm run lint", "test": "cross-env NODE_DEBUG=adonisjs:fold c8 npm run quick:test", - "quick:test": "node --loader=ts-node/esm --experimental-import-meta-resolve bin/test.ts", + "quick:test": "node --loader=ts-node/esm bin/test.ts", "clean": "del-cli build", - "benchmark": "npm run build && node --experimental-import-meta-resolve build/benchmark/module_expression.js && node --experimental-import-meta-resolve build/benchmark/module_importer.js", + "benchmark": "npm run build && node build/benchmarks/module_expression.js && node build/benchmarks/module_importer.js", "typecheck": "tsc --noEmit", "precompile": "npm run lint && npm run clean", "compile": "tsup-node && tsc --emitDeclarationOnly --declaration", @@ -117,6 +117,12 @@ "tsup": { "entry": [ "./index.ts", + "./benchmarks/module_expression.ts", + "./benchmarks/module_importer.ts", + "./benchmarks/services/comments.ts", + "./benchmarks/services/posts.ts", + "./benchmarks/services/thread.ts", + "./benchmarks/services/users.ts", "./src/types.ts" ], "outDir": "./build",

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 m^GSSkdwnZ!(value: unknown): value is Constructor { } /** - * Parses an import expression to module path and its method. - * - * ```ts - * parseImportExpression('#controllers/users_controller') - * // ['#controllers/users_controller', 'handle'] - * ``` - * - * With method - * ```ts - * parseImportExpression('#controllers/users_controller.index') - * // ['#controllers/users_controller', 'index'] - * ``` + * Dynamically import a module and ensure it has a default export */ -export function parseImportExpression(importExpression: string): [string, string] { - const parts = importExpression.split('.') - if (parts.length === 1) { - return [importExpression, 'handle'] +export async function importDefault(importPath: string, parentURL: URL | string) { + const resolvedPath = await import.meta.resolve!(importPath, parentURL) + const moduleExports = await import(resolvedPath) + + /** + * Make sure a default export exists + */ + if (!moduleExports.default) { + throw new MissingDefaultExportException(`Missing export default from "${importPath}" module`, { + cause: { + source: resolvedPath, + }, + }) } - const method = parts.pop()! - return [parts.join('.'), method] -} - -/** - * Import provider allows lazy loading import expressions, alongside - * constructing the class constructor and calling methods via container. - * - * ```ts - * const provider = makeImportProvider('#controllers/users_controller.index') - * await provider.handle(resolver, ...values) - * ``` - */ -export function makeImportProvider(importExpression: string): ImportProvider { - const [importPath, method] = parseImportExpression(importExpression) - - return { - importPath, - method, - defaultExport: null, - async handle(resolver: ContainerResolver, runtimeValues?: any[]) { - if (!this.defaultExport) { - const moduleExports = await import(importPath) - - /** - * Make sure a default export exists - */ - if (!moduleExports.default) { - throw new MissingDefaultExportException( - `Missing export default from "${this.importPath}" module` - ) - } - - this.defaultExport = moduleExports.default - } - - return resolver.call(await resolver.make(this.defaultExport), this.method, runtimeValues) - }, - } + return moduleExports.default } diff --git a/src/module_expression.ts b/src/module_expression.ts new file mode 100644 index 0000000..0578d9e --- /dev/null +++ b/src/module_expression.ts @@ -0,0 +1,176 @@ +/* + * @adonisjs/fold + * + * (c) AdonisJS + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import { Container } from './container.js' +import { importDefault } from './helpers.js' +import { ContainerResolver } from './resolver.js' +import type { ModuleHandler, ModuleCallable } from './types.js' + +/** + * The moduleExpression module works around a very specific pattern we use + * with AdonisJS, ie to bind modules as string. + * + * For example: With the router of AdonisJS, we can bind a controller to a route + * as follows. + * + * ```ts + * Route.get('users', '#controllers/users_controller.index') + * ``` + * + * Behind the scenes, we have to run following operations in order to call a + * method on the users_controller class. + * + * - Dynamic import `#controllers/users_controller` module + * - Check if the module has a default export. + * - Create an instance of the default export class using the container. + * - Call the `index` method on the controller class using the index. + * + * Router is just one example, we do this with event listeners, redis pub/sub + * and so on. + * + * So, instead of writing all this parsing logic, we encapsulate it inside the + * "moduleExpression" module. + */ +export function moduleExpression(expression: string, parentURL: URL | string) { + return { + /** + * Parses a module expression to extract the module import path + * and the method to call on the default exported class. + * + * ```ts + * moduleExpression('#controllers/users_controller').parse() + * // ['#controllers/users_controller', 'handle'] + * ``` + * + * With method + * ```ts + * moduleExpression('#controllers/users_controller.index').parse() + * // ['#controllers/users_controller', 'index'] + * ``` + */ + parse(): [string, string] { + const parts = expression.split('.') + if (parts.length === 1) { + return [expression, 'handle'] + } + + const method = parts.pop()! + return [parts.join('.'), method] + }, + + /** + * Converts the module expression to a callable function. Invoking this + * method run internally import the module, create a new instance of the + * default export class using the container and invokes the method using + * the container. + * + * You can create a callable function using the container instance as shown below + * + * ```ts + * const fn = moduleExpression('#controllers/users_controller.index') + * .toCallable(container) + * + * // Call the function and pass context to it + * await fn(ctx) + * ``` + * + * Another option is to not pass the container at the time of creating + * the callable function, but instead pass a resolver instance at + * the time of calling the function + * + * ```ts + * const fn = moduleExpression('#controllers/users_controller.index') + * .toCallable() + * + * // Call the function and pass context to it + * const resolver = container.createResolver() + * await fn(resolver, ctx) + * ``` + */ + toCallable< + T extends Container | ContainerResolver | undefined = undefined, + Args extends any[] = any[] + >(container?: T): ModuleCallable { + let defaultExport: any = null + const [importPath, method] = this.parse() + + /** + * When container defined at the time of the calling this function, + * we will use it to inside the return function + */ + if (container) { + return async function (...args: Args) { + defaultExport = defaultExport || (await importDefault(importPath, parentURL)) + return container.call(await container.make(defaultExport), method, args) + } as ModuleCallable + } + + /** + * Otherwise the return function asks for the resolver or container + */ + return async function (resolver: ContainerResolver | Container, ...args: Args) { + defaultExport = defaultExport || (await importDefault(importPath, parentURL)) + return resolver.call(await resolver.make(defaultExport), method, args) + } as ModuleCallable + }, + + /** + * Converts the module expression to an object with handle method. Invoking the + * handle method run internally imports the module, create a new instance of + * the default export class using the container and invokes the method using + * the container. + * + * You can create a handle method object using the container instance as shown below + * + * ```ts + * const handler = moduleExpression('#controllers/users_controller.index') + * .toHandleMethod(container) + * + * // Call the function and pass context to it + * await handler.handle(ctx) + * ``` + * + * Another option is to not pass the container at the time of creating + * the handle method object, but instead pass a resolver instance at + * the time of calling the function + * + * ```ts + * const handler = moduleExpression('#controllers/users_controller.index') + * .toHandleMethod() + * + * // Call the function and pass context to it + * const resolver = container.createResolver() + * await handler.handle(resolver, ctx) + * ``` + */ + toHandleMethod< + T extends Container | ContainerResolver | undefined = undefined, + Args extends any[] = any[] + >(container?: T): ModuleHandler { + let defaultExport: any = null + const [importPath, method] = this.parse() + + if (container) { + return { + async handle(...args: Args) { + defaultExport = defaultExport || (await importDefault(importPath, parentURL)) + return container.call(await container.make(defaultExport), method, args) + }, + } as ModuleHandler + } + + return { + async handle(resolver: ContainerResolver | Container, ...args: Args) { + defaultExport = defaultExport || (await importDefault(importPath, parentURL)) + return resolver.call(await resolver.make(defaultExport), method, args) + }, + } as ModuleHandler + }, + } +} diff --git a/src/types.ts b/src/types.ts index 2c4e010..06e9430 100644 --- a/src/types.ts +++ b/src/types.ts @@ -7,7 +7,8 @@ * file that was distributed with this source code. */ -import { ContainerResolver } from './resolver.js' +import type { Container } from './container.js' +import type { ContainerResolver } from './resolver.js' /** * Extract functions from a type @@ -127,13 +128,14 @@ export type ContainerOptions = { } } -/** - * Import provider allows lazy loading import expressions, alongside - * constructing the class constructor and calling methods via container. - */ -export type ImportProvider = { - importPath: string - method: string - defaultExport: any - handle(resolver: ContainerResolver, ...args: any): Promise -} +export type ModuleCallable = T extends undefined + ? (resolver: ContainerResolver | Container, ...args: Args) => Promise + : (...args: Args) => Promise + +export type ModuleHandler = T extends undefined + ? { + handle(resolver: ContainerResolver | Container, ...args: Args): Promise + } + : { + handle(...args: Args): Promise + } diff --git a/tests/make_import_provider.spec.ts b/tests/make_import_provider.spec.ts deleted file mode 100644 index 0d79642..0000000 --- a/tests/make_import_provider.spec.ts +++ /dev/null @@ -1,78 +0,0 @@ -/* - * @adonisjs/fold - * - * (c) AdonisJS - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -import { join } from 'node:path' -import { test } from '@japa/runner' -import { fileURLToPath } from 'node:url' -import { outputFile, remove } from 'fs-extra' -import { Container, makeImportProvider } from '../index.js' - -const BASE_URL = new URL('./app/', import.meta.url) -const BASE_PATH = fileURLToPath(BASE_URL) - -test.group('Make import provider', (group) => { - group.each.setup(() => { - return () => { - remove(BASE_PATH) - } - }) - - test('make provider from import expression', async ({ assert }) => { - assert.containsSubset(makeImportProvider('#controllers/users_controller'), { - importPath: '#controllers/users_controller', - method: 'handle', - defaultExport: null, - }) - }) - - test('invoke method on import expression', async ({ assert }) => { - await outputFile( - join(BASE_PATH, 'controllers/users_controller.ts'), - ` - export default class UsersController { - handle(args) { - args.push('invoked') - } - } - ` - ) - - const args: string[] = [] - const container = new Container() - const resolver = container.createResolver() - const provider = makeImportProvider('#controllers/users_controller') - - await provider.handle(resolver, [args]) - assert.deepEqual(args, ['invoked']) - assert.isDefined(provider.defaultExport) - }) - - test('raise exception when module is missing default export', async ({ assert }) => { - await outputFile( - join(BASE_PATH, 'controllers/posts_controller.ts'), - ` - export class PostsController { - handle(args) { - args.push('invoked') - } - } - ` - ) - - const args: string[] = [] - const container = new Container() - const resolver = container.createResolver() - const provider = makeImportProvider('#controllers/posts_controller') - - await assert.rejects( - () => provider.handle(resolver, args), - 'Missing export default from "#controllers/posts_controller" module' - ) - }) -}) diff --git a/tests/module_expression/parse.spec.ts b/tests/module_expression/parse.spec.ts new file mode 100644 index 0000000..2ac265b --- /dev/null +++ b/tests/module_expression/parse.spec.ts @@ -0,0 +1,34 @@ +/* + * @adonisjs/fold + * + * (c) AdonisJS + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import { test } from '@japa/runner' +import { moduleExpression } from '../../src/module_expression.js' + +test.group('moduleExpression | parse', () => { + test('parse module expression with no methods', async ({ assert }) => { + assert.deepEqual(moduleExpression('#controllers/users_controller', import.meta.url).parse(), [ + '#controllers/users_controller', + 'handle', + ]) + }) + + test('parse module expression with method name', async ({ assert }) => { + assert.deepEqual( + moduleExpression('#controllers/users_controller.index', import.meta.url).parse(), + ['#controllers/users_controller', 'index'] + ) + }) + + test('parse module expression with multiple dot separators inside it', async ({ assert }) => { + assert.deepEqual( + moduleExpression('#controllers/users.controller.index', import.meta.url).parse(), + ['#controllers/users.controller', 'index'] + ) + }) +}) diff --git a/tests/module_expression/to_callable.spec.ts b/tests/module_expression/to_callable.spec.ts new file mode 100644 index 0000000..ecce8df --- /dev/null +++ b/tests/module_expression/to_callable.spec.ts @@ -0,0 +1,97 @@ +/* + * @adonisjs/fold + * + * (c) AdonisJS + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import { join } from 'node:path' +import { test } from '@japa/runner' +import { fileURLToPath } from 'node:url' +import { outputFile, remove } from 'fs-extra' +import { Container } from '../../src/container.js' +import { moduleExpression } from '../../src/module_expression.js' + +const BASE_URL = new URL('../app/', import.meta.url) +const BASE_PATH = fileURLToPath(BASE_URL) + +test.group('moduleExpression | toCallable', (group) => { + group.each.setup(() => { + return () => remove(BASE_PATH) + }) + + test('make callable from module expression', async ({ assert }) => { + assert.isFunction( + moduleExpression('#controllers/auth/users_controller', import.meta.url).toCallable() + ) + }) + + test('pass fixed container instance to the callable', async ({ assert }) => { + await outputFile( + join(BASE_PATH, 'controllers/auth/users_controller.ts'), + ` + export default class UsersController { + handle(args) { + args.push('invoked') + } + } + ` + ) + + const args: string[] = [] + const container = new Container() + const fn = moduleExpression('#controllers/auth/users_controller', import.meta.url).toCallable( + container + ) + + await fn(args) + assert.deepEqual(args, ['invoked']) + }) + + test('pass runtime resolver to the callable', async ({ assert }) => { + await outputFile( + join(BASE_PATH, 'controllers/auth/admin_controller.ts'), + ` + export default class AdminController { + async handle(resolver) { + const args = await resolver.make('args') + args.push('invoked') + } + } + ` + ) + + const container = new Container() + const resolver = container.createResolver() + resolver.bindValue('args', []) + const fn = moduleExpression('#controllers/auth/admin_controller', import.meta.url).toCallable() + + await fn(resolver, resolver) + assert.deepEqual(await resolver.make('args'), ['invoked']) + }) + + test('raise exception when module is missing default export', async ({ assert }) => { + await outputFile( + join(BASE_PATH, 'controllers/auth/posts_controller.ts'), + ` + export class PostsController { + handle(args) { + args.push('invoked') + } + } + ` + ) + + const args: string[] = [] + const container = new Container() + const resolver = container.createResolver() + const fn = moduleExpression('#controllers/auth/posts_controller', import.meta.url).toCallable() + + await assert.rejects( + () => fn(resolver, args), + 'Missing export default from "#controllers/auth/posts_controller" module' + ) + }) +}) diff --git a/tests/module_expression/to_handle_method.spec.ts b/tests/module_expression/to_handle_method.spec.ts new file mode 100644 index 0000000..d5142c6 --- /dev/null +++ b/tests/module_expression/to_handle_method.spec.ts @@ -0,0 +1,109 @@ +/* + * @adonisjs/fold + * + * (c) AdonisJS + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import { join } from 'node:path' +import { test } from '@japa/runner' +import { fileURLToPath } from 'node:url' +import { outputFile, remove } from 'fs-extra' +import { Container } from '../../src/container.js' +import { moduleExpression } from '../../src/module_expression.js' + +const BASE_URL = new URL('../app/', import.meta.url) +const BASE_PATH = fileURLToPath(BASE_URL) + +test.group('moduleExpression | toHandleMethod', (group) => { + group.each.setup(() => { + return () => remove(BASE_PATH) + }) + + test('make handle method object from module expression', async ({ assert }) => { + assert.containsSubset( + moduleExpression('#controllers/users_controller', import.meta.url).toHandleMethod(), + { + importPath: '#controllers/users_controller', + method: 'handle', + defaultExport: null, + } + ) + }) + + test('pass fixed container instance to the handle method object', async ({ assert }) => { + await outputFile( + join(BASE_PATH, 'controllers/users_controller.ts'), + ` + export default class UsersController { + handle(args) { + args.push('invoked') + } + } + ` + ) + + const args: string[] = [] + const container = new Container() + const handler = moduleExpression( + '#controllers/users_controller', + import.meta.url + ).toHandleMethod(container) + + await handler.handle(args) + assert.deepEqual(args, ['invoked']) + }) + + test('pass runtime resolver to the handle method object', async ({ assert }) => { + await outputFile( + join(BASE_PATH, 'controllers/admin_controller.ts'), + ` + export default class AdminController { + async handle(resolver) { + const args = await resolver.make('args') + args.push('invoked') + } + } + ` + ) + + const container = new Container() + const resolver = container.createResolver() + resolver.bindValue('args', []) + const handler = moduleExpression( + '#controllers/admin_controller', + import.meta.url + ).toHandleMethod() + + await handler.handle(resolver, resolver) + assert.deepEqual(await resolver.make('args'), ['invoked']) + }) + + test('raise exception when module is missing default export', async ({ assert }) => { + await outputFile( + join(BASE_PATH, 'controllers/posts_controller.ts'), + ` + export class PostsController { + handle(args) { + args.push('invoked') + } + } + ` + ) + + const args: string[] = [] + const container = new Container() + const resolver = container.createResolver() + const provider = moduleExpression( + '#controllers/posts_controller', + import.meta.url + ).toHandleMethod() + + await assert.rejects( + () => provider.handle(resolver, args), + 'Missing export default from "#controllers/posts_controller" module' + ) + }) +}) diff --git a/tests/parse_import_expression.spec.ts b/tests/parse_import_expression.spec.ts deleted file mode 100644 index 3a327a4..0000000 --- a/tests/parse_import_expression.spec.ts +++ /dev/null @@ -1,34 +0,0 @@ -/* - * @adonisjs/fold - * - * (c) AdonisJS - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -import { test } from '@japa/runner' -import { parseImportExpression } from '../index.js' - -test.group('Parse import expression', () => { - test('parse import expression with no methods', async ({ assert }) => { - assert.deepEqual(parseImportExpression('#controllers/users_controller'), [ - '#controllers/users_controller', - 'handle', - ]) - }) - - test('parse import expression with method name', async ({ assert }) => { - assert.deepEqual(parseImportExpression('#controllers/users_controller.index'), [ - '#controllers/users_controller', - 'index', - ]) - }) - - test('parse import expression with multiple dot separators inside it', async ({ assert }) => { - assert.deepEqual(parseImportExpression('#controllers/users.controller.index'), [ - '#controllers/users.controller', - 'index', - ]) - }) -}) From 97ce5980f6f4c1e111624b5c8434ceb63748b0ea Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Fri, 18 Nov 2022 13:06:14 +0530 Subject: [PATCH 037/145] test: fix breaking tests --- tests/module_expression/to_handle_method.spec.ts | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/tests/module_expression/to_handle_method.spec.ts b/tests/module_expression/to_handle_method.spec.ts index d5142c6..75a9715 100644 --- a/tests/module_expression/to_handle_method.spec.ts +++ b/tests/module_expression/to_handle_method.spec.ts @@ -23,13 +23,8 @@ test.group('moduleExpression | toHandleMethod', (group) => { }) test('make handle method object from module expression', async ({ assert }) => { - assert.containsSubset( - moduleExpression('#controllers/users_controller', import.meta.url).toHandleMethod(), - { - importPath: '#controllers/users_controller', - method: 'handle', - defaultExport: null, - } + assert.isFunction( + moduleExpression('#controllers/users_controller', import.meta.url).toHandleMethod().handle ) }) From b6d968c1c5fabe8142b2e11b707657b133ffc744 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Fri, 18 Nov 2022 13:24:52 +0530 Subject: [PATCH 038/145] test: improve tests coverage --- .gitignore | 15 +++++- package.json | 12 ++++- tests/container/bindings.spec.ts | 28 +++++++++++ tests/container/swap.spec.ts | 86 ++++++++++++++++++++++++++++++++ tests/resolver.spec.ts | 41 +++++++++++++++ 5 files changed, 180 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index b7dab5e..324fb8c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,15 @@ node_modules -build \ No newline at end of file +coverage +.DS_STORE +.nyc_output +.idea +.vscode/ +*.sublime-project +*.sublime-workspace +*.log +build +dist +yarn.lock +shrinkwrap.yaml +package-lock.json +test/__app diff --git a/package.json b/package.json index 79c3678..73e64ae 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "scripts": { "pretest": "npm run lint", "vscode:test": "node --loader=ts-node/esm --experimental-import-meta-resolve bin/test.ts", - "test": "node --loader=ts-node/esm bin/test.ts", + "test": "c8 npm run vscode:test", "clean": "del-cli build", "benchmark": "npm run build && node --experimental-import-meta-resolve build/benchmark/module_expression.js", "compile": "npm run lint && npm run clean && tsc", @@ -53,6 +53,7 @@ "@types/fs-extra": "^9.0.13", "@types/node": "^18.11.9", "benchmark": "^2.1.4", + "c8": "^7.12.0", "del-cli": "^5.0.0", "eslint": "^8.27.0", "eslint-config-prettier": "^8.5.0", @@ -123,5 +124,14 @@ "homepage": "https://github.com/adonisjs/fold#readme", "dependencies": { "@poppinss/utils": ">=6.0.0-0" + }, + "c8": { + "reporter": [ + "text", + "html" + ], + "exclude": [ + "tests/**" + ] } } diff --git a/tests/container/bindings.spec.ts b/tests/container/bindings.spec.ts index 39a3448..ff1f03d 100644 --- a/tests/container/bindings.spec.ts +++ b/tests/container/bindings.spec.ts @@ -109,6 +109,20 @@ test.group('Container | Bindings', () => { assert.isTrue(container.hasBinding(routeSymbol)) assert.isFalse(container.hasBinding('db')) }) + + test('find if all the bindings exists', async ({ assert }) => { + const container = new Container() + class Route {} + + const routeSymbol = Symbol('route') + + container.bind(Route, () => new Route()) + container.bind('route', () => new Route()) + container.bind(routeSymbol, () => new Route()) + + assert.isTrue(container.hasAllBindings([Route, 'route', routeSymbol])) + assert.isFalse(container.hasAllBindings([Route, 'db', routeSymbol])) + }) }) test.group('Container | Bindings Singleton', () => { @@ -338,4 +352,18 @@ test.group('Container | Binding values', () => { assert.isTrue(container.hasBinding(routeSymbol)) assert.isFalse(container.hasBinding('db')) }) + + test('find if all bindings exists', async ({ assert }) => { + const container = new Container() + class Route {} + + const routeSymbol = Symbol('route') + + container.bindValue(Route, new Route()) + container.bindValue('route', new Route()) + container.bindValue(routeSymbol, new Route()) + + assert.isTrue(container.hasAllBindings([Route, 'route', routeSymbol])) + assert.isFalse(container.hasAllBindings([Route, 'db', routeSymbol])) + }) }) diff --git a/tests/container/swap.spec.ts b/tests/container/swap.spec.ts index fdc664b..fc9302d 100644 --- a/tests/container/swap.spec.ts +++ b/tests/container/swap.spec.ts @@ -151,4 +151,90 @@ test.group('Container | swap', () => { assert.instanceOf(route1, Route) assert.notInstanceOf(route1, FakedRoute) }) + + test('disallow swap names other than string symbol or class constructor', async ({ assert }) => { + const container = new Container() + + assert.throws( + // @ts-expect-error + () => container.swap(1, () => {}), + 'The container binding key must be of type "string", "symbol", or a "class constructor"' + ) + + assert.throws( + // @ts-expect-error + () => container.swap([], () => {}), + 'The container binding key must be of type "string", "symbol", or a "class constructor"' + ) + + assert.throws( + // @ts-expect-error + () => container.swap({}, () => {}), + 'The container binding key must be of type "string", "symbol", or a "class constructor"' + ) + + assert.throws( + () => container.restore(1), + 'The container binding key must be of type "string", "symbol", or a "class constructor"' + ) + + assert.throws( + () => container.restore([]), + 'The container binding key must be of type "string", "symbol", or a "class constructor"' + ) + + assert.throws( + () => container.restore({}), + 'The container binding key must be of type "string", "symbol", or a "class constructor"' + ) + }) + + test('restore multiple swapped bindings', async ({ assert }) => { + const container = new Container<{ route: Route; route1: Route }>() + class Route {} + class FakedRoute extends Route {} + + container.bind('route', () => { + return new Route() + }) + container.bind('route1', () => { + return new Route() + }) + + container.swap('route', () => { + return new FakedRoute() + }) + container.swap('route1', () => { + return new FakedRoute() + }) + + const route = await container.make('route') + expectTypeOf(route).toEqualTypeOf() + + assert.instanceOf(route, Route) + assert.instanceOf(route, FakedRoute) + + const route1 = await container.make('route1') + expectTypeOf(route1).toEqualTypeOf() + + assert.instanceOf(route1, Route) + assert.instanceOf(route1, FakedRoute) + + /** + * Restoring multiple + */ + container.restoreAll(['route', 'route1']) + + const route2 = await container.make('route') + expectTypeOf(route2).toEqualTypeOf() + + assert.instanceOf(route2, Route) + assert.notInstanceOf(route2, FakedRoute) + + const route3 = await container.make('route1') + expectTypeOf(route3).toEqualTypeOf() + + assert.instanceOf(route3, Route) + assert.notInstanceOf(route3, FakedRoute) + }) }) diff --git a/tests/resolver.spec.ts b/tests/resolver.spec.ts index 279dc20..3991c62 100644 --- a/tests/resolver.spec.ts +++ b/tests/resolver.spec.ts @@ -27,6 +27,7 @@ test.group('Resolver', () => { assert.strictEqual(resolvedService, service1) assert.strictEqual(resolvedService.name, 'resolver_service') }) + test('use custom containerProvider from the class constructor', async ({ assert }) => { assert.plan(4) @@ -55,6 +56,31 @@ test.group('Resolver', () => { assert.instanceOf(resolvedService, UserService) }) + test('disallow binding names other than string symbol or class constructor', async ({ + assert, + }) => { + const container = new Container() + const resolver = container.createResolver() + + assert.throws( + // @ts-expect-error + () => resolver.bindValue(1, 1), + 'The container binding key must be of type "string", "symbol", or a "class constructor"' + ) + + assert.throws( + // @ts-expect-error + () => resolver.bindValue([], 1), + 'The container binding key must be of type "string", "symbol", or a "class constructor"' + ) + + assert.throws( + // @ts-expect-error + () => resolver.bindValue({}, 1), + 'The container binding key must be of type "string", "symbol", or a "class constructor"' + ) + }) + test('find if a binding exists', async ({ assert }) => { const container = new Container() const resolver = container.createResolver() @@ -71,4 +97,19 @@ test.group('Resolver', () => { assert.isTrue(resolver.hasBinding(routeSymbol)) assert.isFalse(resolver.hasBinding('db')) }) + + test('find if all bindings exists', async ({ assert }) => { + const container = new Container() + const resolver = container.createResolver() + class Route {} + + const routeSymbol = Symbol('route') + + container.bind(Route, () => new Route()) + resolver.bindValue('route', new Route()) + container.bindValue(routeSymbol, new Route()) + + assert.isTrue(resolver.hasAllBindings([Route, 'route', routeSymbol])) + assert.isFalse(resolver.hasAllBindings([Route, 'db', routeSymbol])) + }) }) From 2ee73b8b0fc091d00ca732afabf55c7d39f7d3b2 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Fri, 18 Nov 2022 13:28:14 +0530 Subject: [PATCH 039/145] chore(release): 9.2.0-0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 73e64ae..8d060bf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@adonisjs/fold", - "version": "9.1.0-0", + "version": "9.2.0-0", "description": "Simplest and straight forward implementation for IoC container in JavaScript", "main": "build/index.js", "files": [ From 017a64c8d7318d01ad41409672027a508de92754 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Fri, 25 Nov 2022 09:24:14 +0530 Subject: [PATCH 040/145] feat: add moduleImporter to lazily import modules moduleImporter is similar to moduleExpression, but a callback is used to lazily import the module --- README.md | 33 ++++ benchmark/module_expression.ts | 4 +- benchmark/module_importer.ts | 79 +++++++++ package.json | 3 +- src/helpers.ts | 22 ++- src/module_expression.ts | 12 +- src/module_importer.ts | 153 ++++++++++++++++++ tests/module_importer/to_callable.spec.ts | 107 ++++++++++++ .../module_importer/to_handle_method.spec.ts | 112 +++++++++++++ 9 files changed, 515 insertions(+), 10 deletions(-) create mode 100644 benchmark/module_importer.ts create mode 100644 src/module_importer.ts create mode 100644 tests/module_importer/to_callable.spec.ts create mode 100644 tests/module_importer/to_handle_method.spec.ts diff --git a/README.md b/README.md index b79acfb..144ce88 100644 --- a/README.md +++ b/README.md @@ -565,6 +565,39 @@ Following are benchmarks to see the performance loss that happens when using mod - `native`: Using dynamic imports to lazily import the module. This variation does not use any helpers from this package. - `inline`: When no lazy loading was performed. The module was importing inline using the `import` keyword. +## Module importer +The module importer is similar to module expression. However, instead of defining the import path as a string, you have to define a function that imports the module. + +```ts +import { moduleImporter } from '@adonisjs/fold' + +const fn = moduleImporter( + () => import('#middleware/auth') + 'handle' +).toCallable() + +// Later call it +const container = new Container() +const resolver = container.createResolver() +await fn(resolver, ctx) +``` + +Create handle method object + +```ts +import { moduleImporter } from '@adonisjs/fold' + +const handler = moduleImporter( + () => import('#middleware/auth') + 'handle' +).toHandleMethod() + +// Later call it +const container = new Container() +const resolver = container.createResolver() +await handler.handle(resolver, ctx) +``` + [gh-workflow-image]: https://img.shields.io/github/workflow/status/adonisjs/fold/test?style=for-the-badge [gh-workflow-url]: https://github.com/adonisjs/fold/actions/workflows/test.yml 'Github action' [npm-image]: https://img.shields.io/npm/v/@adonisjs/fold/latest.svg?style=for-the-badge&logo=npm diff --git a/benchmark/module_expression.ts b/benchmark/module_expression.ts index 8f9e7af..60331dd 100644 --- a/benchmark/module_expression.ts +++ b/benchmark/module_expression.ts @@ -10,7 +10,7 @@ // @ts-expect-error import benchmark from 'benchmark' import { Container } from '../index.js' -import { importDefault } from '../src/helpers.js' +import { resolveDefault } from '../src/helpers.js' import { moduleExpression } from '../src/module_expression.js' import Thread from '#services/thread' @@ -31,7 +31,7 @@ const handler = moduleExpression('#services/posts.find', import.meta.url).toHand * all the time */ const native = async (resolver: Container) => { - const defaultExport = await importDefault('#services/comments', import.meta.url) + const defaultExport = await resolveDefault('#services/comments', import.meta.url) return resolver.call(await resolver.make(defaultExport), 'find') } diff --git a/benchmark/module_importer.ts b/benchmark/module_importer.ts new file mode 100644 index 0000000..a639f53 --- /dev/null +++ b/benchmark/module_importer.ts @@ -0,0 +1,79 @@ +/* + * @adonisjs/fold + * + * (c) AdonisJS + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +// @ts-expect-error +import benchmark from 'benchmark' +import { Container } from '../index.js' +import { importDefault } from '../src/helpers.js' +import { moduleImporter } from '../src/module_importer.js' +import Thread from '#services/thread' + +const suite = new benchmark.Suite() + +/** + * Our implementation that returns a callable function + */ +const fn = moduleImporter(() => import('#services/users'), 'find').toCallable() + +/** + * Our implementation that returns an object with handle method. + */ +const handler = moduleImporter(() => import('#services/posts'), 'find').toHandleMethod() + +/** + * If we decided not to have cached version and rely on dynamic imports + * all the time + */ +const native = async (resolver: Container) => { + const defaultExport = await importDefault(() => import('#services/comments')) + return resolver.call(await resolver.make(defaultExport), 'find') +} + +/** + * What if there was were dynamic imports in first place and we were + * just importing everything inline in one place. + */ +const inline = async (resolver: Container) => { + return resolver.call(await resolver.make(Thread), 'find') +} + +const container = new Container() + +suite + .add('handler', { + defer: true, + fn: (deferred: any) => { + handler.handle(container).then(() => deferred.resolve()) + }, + }) + .add('callable', { + defer: true, + fn: (deferred: any) => { + fn(container).then(() => deferred.resolve()) + }, + }) + .add('native dynamic', { + defer: true, + fn: (deferred: any) => { + native(container).then(() => deferred.resolve()) + }, + }) + .add('inline', { + defer: true, + fn: (deferred: any) => { + inline(container).then(() => deferred.resolve()) + }, + }) + .on('cycle', function (event: any) { + console.log(String(event.target)) + }) + .on('complete', function (this: any) { + console.log('Fastest is ' + this.filter('fastest').map('name')) + }) + .run({ async: true }) diff --git a/package.json b/package.json index 8d060bf..102a616 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ ], "imports": { "#controllers/*": "./tests/app/controllers/*.js", + "#middleware/*": "./tests/app/middleware/*.js", "#services/*": "./build/benchmark/services/*.js" }, "exports": { @@ -22,7 +23,7 @@ "vscode:test": "node --loader=ts-node/esm --experimental-import-meta-resolve bin/test.ts", "test": "c8 npm run vscode:test", "clean": "del-cli build", - "benchmark": "npm run build && node --experimental-import-meta-resolve build/benchmark/module_expression.js", + "benchmark": "npm run build && node --experimental-import-meta-resolve build/benchmark/module_expression.js && node --experimental-import-meta-resolve build/benchmark/module_importer.js", "compile": "npm run lint && npm run clean && tsc", "build": "npm run compile", "release": "np --message=\"chore(release): %s\"", diff --git a/src/helpers.ts b/src/helpers.ts index e823c09..fa8dce8 100644 --- a/src/helpers.ts +++ b/src/helpers.ts @@ -21,7 +21,27 @@ export function isClass(value: unknown): value is Constructor { /** * Dynamically import a module and ensure it has a default export */ -export async function importDefault(importPath: string, parentURL: URL | string) { +export async function importDefault(importFn: () => Promise<{ default: any }>) { + const moduleExports = await importFn() + + /** + * Make sure a default export exists + */ + if (!moduleExports.default) { + throw new MissingDefaultExportException(`Missing export default from "${importFn}" module`, { + cause: { + source: importFn, + }, + }) + } + + return moduleExports.default +} + +/** + * Dynamically import a module and ensure it has a default export + */ +export async function resolveDefault(importPath: string, parentURL: URL | string) { const resolvedPath = await import.meta.resolve!(importPath, parentURL) const moduleExports = await import(resolvedPath) diff --git a/src/module_expression.ts b/src/module_expression.ts index 0578d9e..937750c 100644 --- a/src/module_expression.ts +++ b/src/module_expression.ts @@ -8,7 +8,7 @@ */ import { Container } from './container.js' -import { importDefault } from './helpers.js' +import { resolveDefault } from './helpers.js' import { ContainerResolver } from './resolver.js' import type { ModuleHandler, ModuleCallable } from './types.js' @@ -29,7 +29,7 @@ import type { ModuleHandler, ModuleCallable } from './types.js' * - Dynamic import `#controllers/users_controller` module * - Check if the module has a default export. * - Create an instance of the default export class using the container. - * - Call the `index` method on the controller class using the index. + * - Call the `index` method on the controller class using the container. * * Router is just one example, we do this with event listeners, redis pub/sub * and so on. @@ -106,7 +106,7 @@ export function moduleExpression(expression: string, parentURL: URL | string) { */ if (container) { return async function (...args: Args) { - defaultExport = defaultExport || (await importDefault(importPath, parentURL)) + defaultExport = defaultExport || (await resolveDefault(importPath, parentURL)) return container.call(await container.make(defaultExport), method, args) } as ModuleCallable } @@ -115,7 +115,7 @@ export function moduleExpression(expression: string, parentURL: URL | string) { * Otherwise the return function asks for the resolver or container */ return async function (resolver: ContainerResolver | Container, ...args: Args) { - defaultExport = defaultExport || (await importDefault(importPath, parentURL)) + defaultExport = defaultExport || (await resolveDefault(importPath, parentURL)) return resolver.call(await resolver.make(defaultExport), method, args) } as ModuleCallable }, @@ -159,7 +159,7 @@ export function moduleExpression(expression: string, parentURL: URL | string) { if (container) { return { async handle(...args: Args) { - defaultExport = defaultExport || (await importDefault(importPath, parentURL)) + defaultExport = defaultExport || (await resolveDefault(importPath, parentURL)) return container.call(await container.make(defaultExport), method, args) }, } as ModuleHandler @@ -167,7 +167,7 @@ export function moduleExpression(expression: string, parentURL: URL | string) { return { async handle(resolver: ContainerResolver | Container, ...args: Args) { - defaultExport = defaultExport || (await importDefault(importPath, parentURL)) + defaultExport = defaultExport || (await resolveDefault(importPath, parentURL)) return resolver.call(await resolver.make(defaultExport), method, args) }, } as ModuleHandler diff --git a/src/module_importer.ts b/src/module_importer.ts new file mode 100644 index 0000000..b94ba0c --- /dev/null +++ b/src/module_importer.ts @@ -0,0 +1,153 @@ +/* + * @adonisjs/fold + * + * (c) AdonisJS + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import { Container } from './container.js' +import { importDefault } from './helpers.js' +import { ContainerResolver } from './resolver.js' +import type { ModuleHandler, ModuleCallable, Constructor } from './types.js' + +/** + * The moduleImporter module works around a very specific pattern we use + * with AdonisJS, ie to lazy load modules by wrapping import calls inside + * a callback. + * + * For example: Middleware of AdonisJS allows registering middleware as an + * array of import calls. + * + * ```ts + * defineMiddleware([ + * () => import('#middleware/silent_auth') + * ]) + * + * defineMiddleware({ + * auth: () => import('#middleware/auth') + * }) + * ``` + * + * Behind the scenes, we have to run following operations in order to call the + * handle method on the defined middleware. + * + * - Lazily call the registered callbacks to import the middleware. + * - Check if the module has a default export. + * - Create an instance of the default export class using the container. + * - Call the `handle` method on the middleware class using the container. + */ +export function moduleImporter( + importFn: () => Promise<{ default: Constructor }>, + method: string +) { + return { + /** + * Converts the module import function to a callable function. Invoking this + * method run internally import the module, create a new instance of the + * default export class using the container and invokes the method using + * the container. + * + * You can create a callable function using the container instance as shown below + * + * ```ts + * const fn = moduleImporter(() => import('#middleware/auth_middleware'), 'handle') + * .toCallable(container) + * + * // Call the function and pass context to it + * await fn(ctx) + * ``` + * + * Another option is to not pass the container at the time of creating + * the callable function, but instead pass a resolver instance at + * the time of calling the function + * + * ```ts + * const fn = moduleImporter(() => import('#middleware/auth_middleware'), 'handle') + * .toCallable() + * + * // Call the function and pass context to it + * const resolver = container.createResolver() + * await fn(resolver, ctx) + * ``` + */ + toCallable< + T extends Container | ContainerResolver | undefined = undefined, + Args extends any[] = any[] + >(container?: T): ModuleCallable { + let defaultExport: any = null + + /** + * When container defined at the time of the calling this function, + * we will use it to inside the return function + */ + if (container) { + return async function (...args: Args) { + defaultExport = defaultExport || (await importDefault(importFn)) + return container.call(await container.make(defaultExport), method, args) + } as ModuleCallable + } + + /** + * Otherwise the return function asks for the resolver or container + */ + return async function (resolver: ContainerResolver | Container, ...args: Args) { + defaultExport = defaultExport || (await importDefault(importFn)) + return resolver.call(await resolver.make(defaultExport), method, args) + } as ModuleCallable + }, + + /** + * Converts the module import function to an object with handle method. Invoking the + * handle method run internally imports the module, create a new instance of + * the default export class using the container and invokes the method using + * the container. + * + * You can create a handle method object using the container instance as shown below + * + * ```ts + * const handler = moduleImporter(() => import('#middleware/auth_middleware'), 'handle') + * .toHandleMethod(container) + * + * // Call the function and pass context to it + * await handler.handle(ctx) + * ``` + * + * Another option is to not pass the container at the time of creating + * the handle method object, but instead pass a resolver instance at + * the time of calling the function + * + * ```ts + * const handler = moduleImporter(() => import('#middleware/auth_middleware'), 'handle') + * .toHandleMethod() + * + * // Call the function and pass context to it + * const resolver = container.createResolver() + * await handler.handle(resolver, ctx) + * ``` + */ + toHandleMethod< + T extends Container | ContainerResolver | undefined = undefined, + Args extends any[] = any[] + >(container?: T): ModuleHandler { + let defaultExport: any = null + + if (container) { + return { + async handle(...args: Args) { + defaultExport = defaultExport || (await importDefault(importFn)) + return container.call(await container.make(defaultExport), method, args) + }, + } as ModuleHandler + } + + return { + async handle(resolver: ContainerResolver | Container, ...args: Args) { + defaultExport = defaultExport || (await importDefault(importFn)) + return resolver.call(await resolver.make(defaultExport), method, args) + }, + } as ModuleHandler + }, + } +} diff --git a/tests/module_importer/to_callable.spec.ts b/tests/module_importer/to_callable.spec.ts new file mode 100644 index 0000000..cf408fa --- /dev/null +++ b/tests/module_importer/to_callable.spec.ts @@ -0,0 +1,107 @@ +/* + * @adonisjs/fold + * + * (c) AdonisJS + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import { join } from 'node:path' +import { test } from '@japa/runner' +import { fileURLToPath } from 'node:url' +import { outputFile, remove } from 'fs-extra' +import { Container } from '../../src/container.js' +import { moduleImporter } from '../../src/module_importer.js' + +const BASE_URL = new URL('../app/', import.meta.url) +const BASE_PATH = fileURLToPath(BASE_URL) + +test.group('moduleImporter | toCallable', (group) => { + group.each.setup(() => { + return () => remove(BASE_PATH) + }) + + test('make callable from module importer', async ({ assert }) => { + assert.isFunction( + // @ts-expect-error + moduleImporter(() => import('#middleware/auth'), 'handle').toCallable() + ) + }) + + test('pass fixed container instance to the callable', async ({ assert }) => { + await outputFile( + join(BASE_PATH, 'middleware/silent_auth.ts'), + ` + export default class SilentAuthMiddleware { + handle(args) { + args.push('invoked') + } + } + ` + ) + + const args: string[] = [] + const container = new Container() + + // @ts-expect-error + const fn = moduleImporter(() => import('#middleware/silent_auth'), 'handle').toCallable( + container + ) + + await fn(args) + assert.deepEqual(args, ['invoked']) + }) + + test('pass runtime resolver to the callable', async ({ assert }) => { + await outputFile( + join(BASE_PATH, 'middleware/silent_auth_v1.ts'), + ` + export default class SilentAuthMiddleware { + async handle(resolver) { + const args = await resolver.make('args') + args.push('invoked') + } + } + ` + ) + + const container = new Container() + const resolver = container.createResolver() + resolver.bindValue('args', []) + + // @ts-expect-error + const fn = moduleImporter(() => import('#middleware/silent_auth_v1'), 'handle').toCallable() + + await fn(resolver, resolver) + assert.deepEqual(await resolver.make('args'), ['invoked']) + }) + + test('raise exception when module is missing default export', async ({ assert }) => { + await outputFile( + join(BASE_PATH, 'middleware/silent_auth_v2.ts'), + ` + export class SilentAuthMiddleware { + async handle(resolver) { + const args = await resolver.make('args') + args.push('invoked') + } + } + ` + ) + + const args: string[] = [] + const container = new Container() + const resolver = container.createResolver() + + // @ts-expect-error + const fn = moduleImporter(() => import('#middleware/silent_auth_v2'), 'handle').toCallable( + container + ) + + await assert.rejects( + () => fn(resolver, args), + 'Missing export default from "()=>import(\'#middleware/silent_auth_v2\')" module' + ) + }) +}) diff --git a/tests/module_importer/to_handle_method.spec.ts b/tests/module_importer/to_handle_method.spec.ts new file mode 100644 index 0000000..6c2fda0 --- /dev/null +++ b/tests/module_importer/to_handle_method.spec.ts @@ -0,0 +1,112 @@ +/* + * @adonisjs/fold + * + * (c) AdonisJS + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import { join } from 'node:path' +import { test } from '@japa/runner' +import { fileURLToPath } from 'node:url' +import { outputFile, remove } from 'fs-extra' +import { Container } from '../../src/container.js' +import { moduleImporter } from '../../src/module_importer.js' + +const BASE_URL = new URL('../app/', import.meta.url) +const BASE_PATH = fileURLToPath(BASE_URL) + +test.group('moduleImporter | toHandleMethod', (group) => { + group.each.setup(() => { + return () => remove(BASE_PATH) + }) + + test('make callable from module importer', async ({ assert }) => { + assert.isFunction( + // @ts-expect-error + moduleImporter(() => import('#middleware/auth'), 'handle').toHandleMethod().handle + ) + }) + + test('pass fixed container instance to the callable', async ({ assert }) => { + await outputFile( + join(BASE_PATH, 'middleware/silent_auth_v3.ts'), + ` + export default class SilentAuthMiddleware { + handle(args) { + args.push('invoked') + } + } + ` + ) + + const args: string[] = [] + const container = new Container() + + const handler = moduleImporter( + // @ts-expect-error + () => import('#middleware/silent_auth_v3'), + 'handle' + ).toHandleMethod(container) + + await handler.handle(args) + assert.deepEqual(args, ['invoked']) + }) + + test('pass runtime resolver to the callable', async ({ assert }) => { + await outputFile( + join(BASE_PATH, 'middleware/silent_auth_v4.ts'), + ` + export default class SilentAuthMiddleware { + async handle(resolver) { + const args = await resolver.make('args') + args.push('invoked') + } + } + ` + ) + + const container = new Container() + const resolver = container.createResolver() + resolver.bindValue('args', []) + + const handler = moduleImporter( + // @ts-expect-error + () => import('#middleware/silent_auth_v4'), + 'handle' + ).toHandleMethod() + + await handler.handle(resolver, resolver) + assert.deepEqual(await resolver.make('args'), ['invoked']) + }) + + test('raise exception when module is missing default export', async ({ assert }) => { + await outputFile( + join(BASE_PATH, 'middleware/silent_auth_v5.ts'), + ` + export class SilentAuthMiddleware { + async handle(resolver) { + const args = await resolver.make('args') + args.push('invoked') + } + } + ` + ) + + const args: string[] = [] + const container = new Container() + const resolver = container.createResolver() + + const handler = moduleImporter( + // @ts-expect-error + () => import('#middleware/silent_auth_v5'), + 'handle' + ).toHandleMethod(container) + + await assert.rejects( + () => handler.handle(resolver, args), + 'Missing export default from "()=>import(\'#middleware/silent_auth_v5\')" module' + ) + }) +}) From e28849437ee0cfe051c55524ef93ff1d8ee27d8b Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Fri, 25 Nov 2022 09:29:19 +0530 Subject: [PATCH 041/145] chore(release): 9.3.0-0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 102a616..5d6888c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@adonisjs/fold", - "version": "9.2.0-0", + "version": "9.3.0-0", "description": "Simplest and straight forward implementation for IoC container in JavaScript", "main": "build/index.js", "files": [ From 680eef5e8383d003c1f6bc5668180a5df0e5e570 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Fri, 25 Nov 2022 09:31:42 +0530 Subject: [PATCH 042/145] fix: export moduleImporter from entry point --- index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/index.ts b/index.ts index c3fffec..2f2cea5 100644 --- a/index.ts +++ b/index.ts @@ -10,4 +10,5 @@ export { Container } from './src/container.js' export { inject } from './src/decorators/inject.js' export { ContainerResolver } from './src/resolver.js' +export { moduleImporter } from './src/module_importer.js' export { moduleExpression } from './src/module_expression.js' From 0d29a938b0053814cb370cfbe87cc552b438f755 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Fri, 25 Nov 2022 09:32:25 +0530 Subject: [PATCH 043/145] chore(release): 9.3.1-0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5d6888c..3411957 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@adonisjs/fold", - "version": "9.3.0-0", + "version": "9.3.1-0", "description": "Simplest and straight forward implementation for IoC container in JavaScript", "main": "build/index.js", "files": [ From de405c8f6e1d25fd690644f3fe5081b814694a3a Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Wed, 30 Nov 2022 13:16:24 +0530 Subject: [PATCH 044/145] refactor: accept import expression params as an array Breaking change: Earlier we were accepting the params as a spread argument --- README.md | 12 ++++++------ src/module_expression.ts | 8 ++++---- src/module_importer.ts | 8 ++++---- src/types.ts | 16 ++++++++++++---- tests/module_expression/to_callable.spec.ts | 4 ++-- tests/module_expression/to_handle_method.spec.ts | 4 ++-- tests/module_importer/to_callable.spec.ts | 7 +++---- tests/module_importer/to_handle_method.spec.ts | 7 +++---- 8 files changed, 36 insertions(+), 30 deletions(-) diff --git a/README.md b/README.md index 144ce88..1634107 100644 --- a/README.md +++ b/README.md @@ -503,7 +503,7 @@ const fn = moduleExpression( // Later call it const container = new Container() const resolver = container.createResolver() -await fn(resolver, ctx) +await fn(resolver, [ctx]) ``` You can also pass the container instance at the time of creating the callable function. @@ -516,7 +516,7 @@ const fn = moduleExpression( ).toCallable(container) // Later call it -await fn(ctx) +await fn([ctx]) ``` ### toHandleMethod @@ -536,7 +536,7 @@ const handler = moduleExpression( // Later call it const container = new Container() const resolver = container.createResolver() -await handler.handle(resolver, ctx) +await handler.handle(resolver, [ctx]) ``` You can also pass the container instance at the time of creating the handle method. @@ -550,7 +550,7 @@ const handler = moduleExpression( ).toHandleMethod(container) // Later call it -await handler.handle(ctx) +await handler.handle([ctx]) ``` ### Bechmarks @@ -579,7 +579,7 @@ const fn = moduleImporter( // Later call it const container = new Container() const resolver = container.createResolver() -await fn(resolver, ctx) +await fn(resolver, [ctx]) ``` Create handle method object @@ -595,7 +595,7 @@ const handler = moduleImporter( // Later call it const container = new Container() const resolver = container.createResolver() -await handler.handle(resolver, ctx) +await handler.handle(resolver, [ctx]) ``` [gh-workflow-image]: https://img.shields.io/github/workflow/status/adonisjs/fold/test?style=for-the-badge diff --git a/src/module_expression.ts b/src/module_expression.ts index 937750c..d972e3f 100644 --- a/src/module_expression.ts +++ b/src/module_expression.ts @@ -105,7 +105,7 @@ export function moduleExpression(expression: string, parentURL: URL | string) { * we will use it to inside the return function */ if (container) { - return async function (...args: Args) { + return async function (args: Args) { defaultExport = defaultExport || (await resolveDefault(importPath, parentURL)) return container.call(await container.make(defaultExport), method, args) } as ModuleCallable @@ -114,7 +114,7 @@ export function moduleExpression(expression: string, parentURL: URL | string) { /** * Otherwise the return function asks for the resolver or container */ - return async function (resolver: ContainerResolver | Container, ...args: Args) { + return async function (resolver: ContainerResolver | Container, args: Args) { defaultExport = defaultExport || (await resolveDefault(importPath, parentURL)) return resolver.call(await resolver.make(defaultExport), method, args) } as ModuleCallable @@ -158,7 +158,7 @@ export function moduleExpression(expression: string, parentURL: URL | string) { if (container) { return { - async handle(...args: Args) { + async handle(args: Args) { defaultExport = defaultExport || (await resolveDefault(importPath, parentURL)) return container.call(await container.make(defaultExport), method, args) }, @@ -166,7 +166,7 @@ export function moduleExpression(expression: string, parentURL: URL | string) { } return { - async handle(resolver: ContainerResolver | Container, ...args: Args) { + async handle(resolver: ContainerResolver | Container, args: Args) { defaultExport = defaultExport || (await resolveDefault(importPath, parentURL)) return resolver.call(await resolver.make(defaultExport), method, args) }, diff --git a/src/module_importer.ts b/src/module_importer.ts index b94ba0c..03fbe8b 100644 --- a/src/module_importer.ts +++ b/src/module_importer.ts @@ -83,7 +83,7 @@ export function moduleImporter( * we will use it to inside the return function */ if (container) { - return async function (...args: Args) { + return async function (args: Args) { defaultExport = defaultExport || (await importDefault(importFn)) return container.call(await container.make(defaultExport), method, args) } as ModuleCallable @@ -92,7 +92,7 @@ export function moduleImporter( /** * Otherwise the return function asks for the resolver or container */ - return async function (resolver: ContainerResolver | Container, ...args: Args) { + return async function (resolver: ContainerResolver | Container, args: Args) { defaultExport = defaultExport || (await importDefault(importFn)) return resolver.call(await resolver.make(defaultExport), method, args) } as ModuleCallable @@ -135,7 +135,7 @@ export function moduleImporter( if (container) { return { - async handle(...args: Args) { + async handle(args: Args) { defaultExport = defaultExport || (await importDefault(importFn)) return container.call(await container.make(defaultExport), method, args) }, @@ -143,7 +143,7 @@ export function moduleImporter( } return { - async handle(resolver: ContainerResolver | Container, ...args: Args) { + async handle(resolver: ContainerResolver | Container, args: Args) { defaultExport = defaultExport || (await importDefault(importFn)) return resolver.call(await resolver.make(defaultExport), method, args) }, diff --git a/src/types.ts b/src/types.ts index 06e9430..660a0ea 100644 --- a/src/types.ts +++ b/src/types.ts @@ -128,14 +128,22 @@ export type ContainerOptions = { } } +/** + * The shape of the function that imports a module expression and runs + * it using the container + */ export type ModuleCallable = T extends undefined - ? (resolver: ContainerResolver | Container, ...args: Args) => Promise - : (...args: Args) => Promise + ? (resolver: ContainerResolver | Container, args: Args) => Promise + : (args: Args) => Promise +/** + * The shape of the handle method objects that imports a module expression + * and runs it using the container + */ export type ModuleHandler = T extends undefined ? { - handle(resolver: ContainerResolver | Container, ...args: Args): Promise + handle(resolver: ContainerResolver | Container, args: Args): Promise } : { - handle(...args: Args): Promise + handle(args: Args): Promise } diff --git a/tests/module_expression/to_callable.spec.ts b/tests/module_expression/to_callable.spec.ts index ecce8df..465db80 100644 --- a/tests/module_expression/to_callable.spec.ts +++ b/tests/module_expression/to_callable.spec.ts @@ -46,7 +46,7 @@ test.group('moduleExpression | toCallable', (group) => { container ) - await fn(args) + await fn([args]) assert.deepEqual(args, ['invoked']) }) @@ -68,7 +68,7 @@ test.group('moduleExpression | toCallable', (group) => { resolver.bindValue('args', []) const fn = moduleExpression('#controllers/auth/admin_controller', import.meta.url).toCallable() - await fn(resolver, resolver) + await fn(resolver, [resolver]) assert.deepEqual(await resolver.make('args'), ['invoked']) }) diff --git a/tests/module_expression/to_handle_method.spec.ts b/tests/module_expression/to_handle_method.spec.ts index 75a9715..82cc7d0 100644 --- a/tests/module_expression/to_handle_method.spec.ts +++ b/tests/module_expression/to_handle_method.spec.ts @@ -47,7 +47,7 @@ test.group('moduleExpression | toHandleMethod', (group) => { import.meta.url ).toHandleMethod(container) - await handler.handle(args) + await handler.handle([args]) assert.deepEqual(args, ['invoked']) }) @@ -72,7 +72,7 @@ test.group('moduleExpression | toHandleMethod', (group) => { import.meta.url ).toHandleMethod() - await handler.handle(resolver, resolver) + await handler.handle(resolver, [resolver]) assert.deepEqual(await resolver.make('args'), ['invoked']) }) diff --git a/tests/module_importer/to_callable.spec.ts b/tests/module_importer/to_callable.spec.ts index cf408fa..670a4d2 100644 --- a/tests/module_importer/to_callable.spec.ts +++ b/tests/module_importer/to_callable.spec.ts @@ -49,7 +49,7 @@ test.group('moduleImporter | toCallable', (group) => { container ) - await fn(args) + await fn([args]) assert.deepEqual(args, ['invoked']) }) @@ -73,7 +73,7 @@ test.group('moduleImporter | toCallable', (group) => { // @ts-expect-error const fn = moduleImporter(() => import('#middleware/silent_auth_v1'), 'handle').toCallable() - await fn(resolver, resolver) + await fn(resolver, [resolver]) assert.deepEqual(await resolver.make('args'), ['invoked']) }) @@ -92,7 +92,6 @@ test.group('moduleImporter | toCallable', (group) => { const args: string[] = [] const container = new Container() - const resolver = container.createResolver() // @ts-expect-error const fn = moduleImporter(() => import('#middleware/silent_auth_v2'), 'handle').toCallable( @@ -100,7 +99,7 @@ test.group('moduleImporter | toCallable', (group) => { ) await assert.rejects( - () => fn(resolver, args), + () => fn(args), 'Missing export default from "()=>import(\'#middleware/silent_auth_v2\')" module' ) }) diff --git a/tests/module_importer/to_handle_method.spec.ts b/tests/module_importer/to_handle_method.spec.ts index 6c2fda0..c9cb35c 100644 --- a/tests/module_importer/to_handle_method.spec.ts +++ b/tests/module_importer/to_handle_method.spec.ts @@ -50,7 +50,7 @@ test.group('moduleImporter | toHandleMethod', (group) => { 'handle' ).toHandleMethod(container) - await handler.handle(args) + await handler.handle([args]) assert.deepEqual(args, ['invoked']) }) @@ -77,7 +77,7 @@ test.group('moduleImporter | toHandleMethod', (group) => { 'handle' ).toHandleMethod() - await handler.handle(resolver, resolver) + await handler.handle(resolver, [resolver]) assert.deepEqual(await resolver.make('args'), ['invoked']) }) @@ -96,7 +96,6 @@ test.group('moduleImporter | toHandleMethod', (group) => { const args: string[] = [] const container = new Container() - const resolver = container.createResolver() const handler = moduleImporter( // @ts-expect-error @@ -105,7 +104,7 @@ test.group('moduleImporter | toHandleMethod', (group) => { ).toHandleMethod(container) await assert.rejects( - () => handler.handle(resolver, args), + () => handler.handle(args), 'Missing export default from "()=>import(\'#middleware/silent_auth_v5\')" module' ) }) From 0ae1ff0ec53ea908431336f6399911dd6495a7c7 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Wed, 30 Nov 2022 13:24:39 +0530 Subject: [PATCH 045/145] refactor: fix build issues in benchmarks --- benchmark/module_expression.ts | 6 +++--- benchmark/module_importer.ts | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/benchmark/module_expression.ts b/benchmark/module_expression.ts index 60331dd..326979a 100644 --- a/benchmark/module_expression.ts +++ b/benchmark/module_expression.ts @@ -9,10 +9,10 @@ // @ts-expect-error import benchmark from 'benchmark' +import Thread from '#services/thread' import { Container } from '../index.js' import { resolveDefault } from '../src/helpers.js' import { moduleExpression } from '../src/module_expression.js' -import Thread from '#services/thread' const suite = new benchmark.Suite() @@ -49,13 +49,13 @@ suite .add('handler', { defer: true, fn: (deferred: any) => { - handler.handle(container).then(() => deferred.resolve()) + handler.handle(container, []).then(() => deferred.resolve()) }, }) .add('callable', { defer: true, fn: (deferred: any) => { - fn(container).then(() => deferred.resolve()) + fn(container, []).then(() => deferred.resolve()) }, }) .add('native dynamic', { diff --git a/benchmark/module_importer.ts b/benchmark/module_importer.ts index a639f53..ab07f4c 100644 --- a/benchmark/module_importer.ts +++ b/benchmark/module_importer.ts @@ -9,10 +9,10 @@ // @ts-expect-error import benchmark from 'benchmark' +import Thread from '#services/thread' import { Container } from '../index.js' import { importDefault } from '../src/helpers.js' import { moduleImporter } from '../src/module_importer.js' -import Thread from '#services/thread' const suite = new benchmark.Suite() @@ -49,13 +49,13 @@ suite .add('handler', { defer: true, fn: (deferred: any) => { - handler.handle(container).then(() => deferred.resolve()) + handler.handle(container, []).then(() => deferred.resolve()) }, }) .add('callable', { defer: true, fn: (deferred: any) => { - fn(container).then(() => deferred.resolve()) + fn(container, []).then(() => deferred.resolve()) }, }) .add('native dynamic', { From 03425e8e7bb7f84e5e334470e9f2ec7d27e5aa1b Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Wed, 30 Nov 2022 13:27:43 +0530 Subject: [PATCH 046/145] refactor: defining defaults for generics --- src/container.ts | 2 +- src/resolver.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/container.ts b/src/container.ts index b1e1f07..7d96eb9 100644 --- a/src/container.ts +++ b/src/container.ts @@ -42,7 +42,7 @@ import { InvalidBindingKeyException } from './exceptions/invalid_binding_key_exc * await container.make(CLASS_CONSTRUCTOR) * ``` */ -export class Container> { +export class Container = Record> { /** * A collection of bindings with registered swapped implementations */ diff --git a/src/resolver.ts b/src/resolver.ts index 13295b9..f7c24cb 100644 --- a/src/resolver.ts +++ b/src/resolver.ts @@ -39,7 +39,7 @@ import { InvalidBindingKeyException } from './exceptions/invalid_binding_key_exc * await resolver.make(CLASS_CONSTRUCTOR) * ``` */ -export class ContainerResolver> { +export class ContainerResolver = Record> { /** * Pre-registered bindings. They are shared between the container * and resolver. From b6e62716cc4793ca8cdd211e5c26e2e1a09254f7 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Thu, 1 Dec 2022 21:31:34 +0530 Subject: [PATCH 047/145] chore(release): 9.3.2-0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3411957..568e571 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@adonisjs/fold", - "version": "9.3.1-0", + "version": "9.3.2-0", "description": "Simplest and straight forward implementation for IoC container in JavaScript", "main": "build/index.js", "files": [ From 874ffe5de234e8752ddfbec4fcb63afff4dd4b3b Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Fri, 2 Dec 2022 13:00:18 +0530 Subject: [PATCH 048/145] refactor: switch back to spreading arguments vs accepting an array --- package.json | 2 +- src/container.ts | 8 +++++ src/debug.ts | 11 +++++++ src/module_expression.ts | 8 ++--- src/module_importer.ts | 8 ++--- src/provider.ts | 31 +++++++++++++++++++ src/resolver.ts | 5 ++- src/types.ts | 8 ++--- tests/module_expression/to_callable.spec.ts | 4 +-- .../to_handle_method.spec.ts | 4 +-- tests/module_importer/to_callable.spec.ts | 4 +-- .../module_importer/to_handle_method.spec.ts | 4 +-- 12 files changed, 75 insertions(+), 22 deletions(-) create mode 100644 src/debug.ts diff --git a/package.json b/package.json index 568e571..2d6203c 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "scripts": { "pretest": "npm run lint", "vscode:test": "node --loader=ts-node/esm --experimental-import-meta-resolve bin/test.ts", - "test": "c8 npm run vscode:test", + "test": "NODE_DEBUG=adonisjs:fold c8 npm run vscode:test", "clean": "del-cli build", "benchmark": "npm run build && node --experimental-import-meta-resolve build/benchmark/module_expression.js && node --experimental-import-meta-resolve build/benchmark/module_importer.js", "compile": "npm run lint && npm run clean && tsc", diff --git a/src/container.ts b/src/container.ts index 7d96eb9..efa90c5 100644 --- a/src/container.ts +++ b/src/container.ts @@ -23,6 +23,7 @@ import type { import { isClass } from './helpers.js' import { ContainerResolver } from './resolver.js' import { InvalidBindingKeyException } from './exceptions/invalid_binding_key_exception.js' +import debug from './debug.js' /** * The container class exposes the API to register bindings, values @@ -202,6 +203,7 @@ export class Container = Record throw new InvalidBindingKeyException() } + debug('adding binding to container "%O"', binding) this.#bindings.set(binding, { resolver, isSingleton: false }) } @@ -232,6 +234,7 @@ export class Container = Record throw new InvalidBindingKeyException() } + debug('adding value to container "%O"', binding) this.#bindingValues.set(binding, value) } @@ -278,6 +281,7 @@ export class Container = Record throw new InvalidBindingKeyException() } + debug('adding singleton to container "%O"', binding) this.#bindings.set(binding, { resolver, isSingleton: true }) } @@ -307,6 +311,7 @@ export class Container = Record throw new InvalidBindingKeyException() } + debug('defining swap for "%O"', binding) this.#swaps.set(binding, resolver) } @@ -317,6 +322,8 @@ export class Container = Record if (typeof binding !== 'string' && typeof binding !== 'symbol' && !isClass(binding)) { throw new InvalidBindingKeyException() } + + debug('removing swap for "%s"', binding) this.#swaps.delete(binding) } @@ -326,6 +333,7 @@ export class Container = Record */ restoreAll(bindings?: (keyof KnownBindings | Constructor)[]) { if (!bindings) { + debug('removing all swaps') this.#swaps.clear() return } diff --git a/src/debug.ts b/src/debug.ts new file mode 100644 index 0000000..1e00e7e --- /dev/null +++ b/src/debug.ts @@ -0,0 +1,11 @@ +/* + * @adonisjs/fold + * + * (c) AdonisJS + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import { debuglog } from 'node:util' +export default debuglog('adonisjs:fold') diff --git a/src/module_expression.ts b/src/module_expression.ts index d972e3f..937750c 100644 --- a/src/module_expression.ts +++ b/src/module_expression.ts @@ -105,7 +105,7 @@ export function moduleExpression(expression: string, parentURL: URL | string) { * we will use it to inside the return function */ if (container) { - return async function (args: Args) { + return async function (...args: Args) { defaultExport = defaultExport || (await resolveDefault(importPath, parentURL)) return container.call(await container.make(defaultExport), method, args) } as ModuleCallable @@ -114,7 +114,7 @@ export function moduleExpression(expression: string, parentURL: URL | string) { /** * Otherwise the return function asks for the resolver or container */ - return async function (resolver: ContainerResolver | Container, args: Args) { + return async function (resolver: ContainerResolver | Container, ...args: Args) { defaultExport = defaultExport || (await resolveDefault(importPath, parentURL)) return resolver.call(await resolver.make(defaultExport), method, args) } as ModuleCallable @@ -158,7 +158,7 @@ export function moduleExpression(expression: string, parentURL: URL | string) { if (container) { return { - async handle(args: Args) { + async handle(...args: Args) { defaultExport = defaultExport || (await resolveDefault(importPath, parentURL)) return container.call(await container.make(defaultExport), method, args) }, @@ -166,7 +166,7 @@ export function moduleExpression(expression: string, parentURL: URL | string) { } return { - async handle(resolver: ContainerResolver | Container, args: Args) { + async handle(resolver: ContainerResolver | Container, ...args: Args) { defaultExport = defaultExport || (await resolveDefault(importPath, parentURL)) return resolver.call(await resolver.make(defaultExport), method, args) }, diff --git a/src/module_importer.ts b/src/module_importer.ts index 03fbe8b..b94ba0c 100644 --- a/src/module_importer.ts +++ b/src/module_importer.ts @@ -83,7 +83,7 @@ export function moduleImporter( * we will use it to inside the return function */ if (container) { - return async function (args: Args) { + return async function (...args: Args) { defaultExport = defaultExport || (await importDefault(importFn)) return container.call(await container.make(defaultExport), method, args) } as ModuleCallable @@ -92,7 +92,7 @@ export function moduleImporter( /** * Otherwise the return function asks for the resolver or container */ - return async function (resolver: ContainerResolver | Container, args: Args) { + return async function (resolver: ContainerResolver | Container, ...args: Args) { defaultExport = defaultExport || (await importDefault(importFn)) return resolver.call(await resolver.make(defaultExport), method, args) } as ModuleCallable @@ -135,7 +135,7 @@ export function moduleImporter( if (container) { return { - async handle(args: Args) { + async handle(...args: Args) { defaultExport = defaultExport || (await importDefault(importFn)) return container.call(await container.make(defaultExport), method, args) }, @@ -143,7 +143,7 @@ export function moduleImporter( } return { - async handle(resolver: ContainerResolver | Container, args: Args) { + async handle(resolver: ContainerResolver | Container, ...args: Args) { defaultExport = defaultExport || (await importDefault(importFn)) return resolver.call(await resolver.make(defaultExport), method, args) }, diff --git a/src/provider.ts b/src/provider.ts index e539aac..3e738b7 100644 --- a/src/provider.ts +++ b/src/provider.ts @@ -7,6 +7,7 @@ * file that was distributed with this source code. */ +import debug from './debug.js' import { inspect } from 'node:util' import string from '@poppinss/utils/string' import { ContainerResolver } from './resolver.js' @@ -43,6 +44,21 @@ export async function containerProvider( * values and fill undefined slots with container lookup */ if (values.length > injections.length) { + if (debug.enabled) { + debug( + 'created resolver plan. target: "[class %s]", property: "%s", injections: %O', + binding.name, + property, + values.map((value, index) => { + if (value !== undefined) { + return value + } + + return injections[index] + }) + ) + } + return Promise.all( values.map((value, index) => { if (value !== undefined) { @@ -65,6 +81,21 @@ export async function containerProvider( * Otherwise, we go through the injections, giving * priority to the runtime values for a given index. */ + if (debug.enabled) { + debug( + 'created resolver plan. target: "[class %s]", property: "%s", injections: %O', + binding.name, + property, + injections.map((injection, index) => { + if (values[index] !== undefined) { + return values[index] + } + + return injection + }) + ) + } + return Promise.all( injections.map((injection, index) => { if (values[index] !== undefined) { diff --git a/src/resolver.ts b/src/resolver.ts index f7c24cb..cf0592e 100644 --- a/src/resolver.ts +++ b/src/resolver.ts @@ -21,6 +21,7 @@ import type { ContainerOptions, InspectableConstructor, } from './types.js' +import debug from './debug.js' import { isClass } from './helpers.js' import { containerProvider } from './provider.js' import { MethodNotFoundException } from './exceptions/method_not_found_exception.js' @@ -105,10 +106,11 @@ export class ContainerResolver = Record, value: any) { + debug('resolved from container. binding :%O, resolved value :%O', binding, value) + if (!this.#options.emitter) { return } - this.#options.emitter.emit('container:resolve', { binding, value }) } @@ -309,6 +311,7 @@ export class ContainerResolver = Record = T extends undefined - ? (resolver: ContainerResolver | Container, args: Args) => Promise - : (args: Args) => Promise + ? (resolver: ContainerResolver | Container, ...args: Args) => Promise + : (...args: Args) => Promise /** * The shape of the handle method objects that imports a module expression @@ -142,8 +142,8 @@ export type ModuleCallable = T extends undefined */ export type ModuleHandler = T extends undefined ? { - handle(resolver: ContainerResolver | Container, args: Args): Promise + handle(resolver: ContainerResolver | Container, ...args: Args): Promise } : { - handle(args: Args): Promise + handle(...args: Args): Promise } diff --git a/tests/module_expression/to_callable.spec.ts b/tests/module_expression/to_callable.spec.ts index 465db80..ecce8df 100644 --- a/tests/module_expression/to_callable.spec.ts +++ b/tests/module_expression/to_callable.spec.ts @@ -46,7 +46,7 @@ test.group('moduleExpression | toCallable', (group) => { container ) - await fn([args]) + await fn(args) assert.deepEqual(args, ['invoked']) }) @@ -68,7 +68,7 @@ test.group('moduleExpression | toCallable', (group) => { resolver.bindValue('args', []) const fn = moduleExpression('#controllers/auth/admin_controller', import.meta.url).toCallable() - await fn(resolver, [resolver]) + await fn(resolver, resolver) assert.deepEqual(await resolver.make('args'), ['invoked']) }) diff --git a/tests/module_expression/to_handle_method.spec.ts b/tests/module_expression/to_handle_method.spec.ts index 82cc7d0..75a9715 100644 --- a/tests/module_expression/to_handle_method.spec.ts +++ b/tests/module_expression/to_handle_method.spec.ts @@ -47,7 +47,7 @@ test.group('moduleExpression | toHandleMethod', (group) => { import.meta.url ).toHandleMethod(container) - await handler.handle([args]) + await handler.handle(args) assert.deepEqual(args, ['invoked']) }) @@ -72,7 +72,7 @@ test.group('moduleExpression | toHandleMethod', (group) => { import.meta.url ).toHandleMethod() - await handler.handle(resolver, [resolver]) + await handler.handle(resolver, resolver) assert.deepEqual(await resolver.make('args'), ['invoked']) }) diff --git a/tests/module_importer/to_callable.spec.ts b/tests/module_importer/to_callable.spec.ts index 670a4d2..723b06a 100644 --- a/tests/module_importer/to_callable.spec.ts +++ b/tests/module_importer/to_callable.spec.ts @@ -49,7 +49,7 @@ test.group('moduleImporter | toCallable', (group) => { container ) - await fn([args]) + await fn(args) assert.deepEqual(args, ['invoked']) }) @@ -73,7 +73,7 @@ test.group('moduleImporter | toCallable', (group) => { // @ts-expect-error const fn = moduleImporter(() => import('#middleware/silent_auth_v1'), 'handle').toCallable() - await fn(resolver, [resolver]) + await fn(resolver, resolver) assert.deepEqual(await resolver.make('args'), ['invoked']) }) diff --git a/tests/module_importer/to_handle_method.spec.ts b/tests/module_importer/to_handle_method.spec.ts index c9cb35c..7568966 100644 --- a/tests/module_importer/to_handle_method.spec.ts +++ b/tests/module_importer/to_handle_method.spec.ts @@ -50,7 +50,7 @@ test.group('moduleImporter | toHandleMethod', (group) => { 'handle' ).toHandleMethod(container) - await handler.handle([args]) + await handler.handle(args) assert.deepEqual(args, ['invoked']) }) @@ -77,7 +77,7 @@ test.group('moduleImporter | toHandleMethod', (group) => { 'handle' ).toHandleMethod() - await handler.handle(resolver, [resolver]) + await handler.handle(resolver, resolver) assert.deepEqual(await resolver.make('args'), ['invoked']) }) From d48f0a65933139ee2b3028817b8a241d9179ad4c Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Fri, 2 Dec 2022 15:01:43 +0530 Subject: [PATCH 049/145] chore(release): 9.4.0-0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2d6203c..b9989e6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@adonisjs/fold", - "version": "9.3.2-0", + "version": "9.4.0-0", "description": "Simplest and straight forward implementation for IoC container in JavaScript", "main": "build/index.js", "files": [ From 523483f7935f5a24e8b734cd41ed78e3ece19487 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Fri, 2 Dec 2022 15:26:01 +0530 Subject: [PATCH 050/145] chore: use cross-env to set environment variables --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index b9989e6..60fa768 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "scripts": { "pretest": "npm run lint", "vscode:test": "node --loader=ts-node/esm --experimental-import-meta-resolve bin/test.ts", - "test": "NODE_DEBUG=adonisjs:fold c8 npm run vscode:test", + "test": "cross-env NODE_DEBUG=adonisjs:fold c8 npm run vscode:test", "clean": "del-cli build", "benchmark": "npm run build && node --experimental-import-meta-resolve build/benchmark/module_expression.js && node --experimental-import-meta-resolve build/benchmark/module_importer.js", "compile": "npm run lint && npm run clean && tsc", @@ -55,6 +55,7 @@ "@types/node": "^18.11.9", "benchmark": "^2.1.4", "c8": "^7.12.0", + "cross-env": "^7.0.3", "del-cli": "^5.0.0", "eslint": "^8.27.0", "eslint-config-prettier": "^8.5.0", From 4ec39c1cb25452d7f87548ec8fddd4920e52c111 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Fri, 2 Dec 2022 15:33:34 +0530 Subject: [PATCH 051/145] refactor: export known exceptions --- README.md | 15 --------------- index.ts | 2 ++ package.json | 4 ++-- src/exceptions/method_not_found_exception.ts | 16 ---------------- .../missing_default_export_exception.ts | 15 --------------- src/helpers.ts | 4 ++-- src/resolver.ts | 7 ++----- 7 files changed, 8 insertions(+), 55 deletions(-) delete mode 100644 src/exceptions/method_not_found_exception.ts delete mode 100644 src/exceptions/missing_default_export_exception.ts diff --git a/README.md b/README.md index 1634107..9f8c728 100644 --- a/README.md +++ b/README.md @@ -441,21 +441,6 @@ class UsersController { } ``` -### E_METHOD_NOT_FOUND -The exception is raised when you are trying to invoke a method on a class instance and the method does not exist. For example: - -```ts -class UserService {} - -const service = await container.make(UserService) - -// Exception raised. Missing method "find" on "UserService {}" -await container.call(service, 'find') -``` - -### E_MISSING_DEFAULT_EXPORT -The exception is raised when a dynamically imported module using `makeImportProvider` method is missing `export default`. - ## Module expressions In AdonisJS, we allow binding methods in form of string based module expression. For example: diff --git a/index.ts b/index.ts index 2f2cea5..deb7160 100644 --- a/index.ts +++ b/index.ts @@ -12,3 +12,5 @@ export { inject } from './src/decorators/inject.js' export { ContainerResolver } from './src/resolver.js' export { moduleImporter } from './src/module_importer.js' export { moduleExpression } from './src/module_expression.js' +export { InvalidBindingKeyException } from './src/exceptions/invalid_binding_key_exception.js' +export { InvalidDependencyException } from './src/exceptions/invalid_dependency_exception.js' diff --git a/package.json b/package.json index 60fa768..d53fd58 100644 --- a/package.json +++ b/package.json @@ -62,7 +62,7 @@ "eslint-plugin-adonis": "^3.0.3", "eslint-plugin-prettier": "^4.0.0", "expect-type": "^0.15.0", - "fs-extra": "^10.1.0", + "fs-extra": "^11.1.0", "github-label-sync": "^2.2.0", "husky": "^8.0.2", "np": "^7.6.1", @@ -125,7 +125,7 @@ }, "homepage": "https://github.com/adonisjs/fold#readme", "dependencies": { - "@poppinss/utils": ">=6.0.0-0" + "@poppinss/utils": "^6.1.0-0" }, "c8": { "reporter": [ diff --git a/src/exceptions/method_not_found_exception.ts b/src/exceptions/method_not_found_exception.ts deleted file mode 100644 index 58b550e..0000000 --- a/src/exceptions/method_not_found_exception.ts +++ /dev/null @@ -1,16 +0,0 @@ -/* - * @adonisjs/fold - * - * (c) AdonisJS - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -import { Exception } from '@poppinss/utils' - -export class MethodNotFoundException extends Exception { - static code = 'E_METHOD_NOT_FOUND' - static status = 500 - static message = 'Missing method "{{ method }}" on "{{ object }}"' -} diff --git a/src/exceptions/missing_default_export_exception.ts b/src/exceptions/missing_default_export_exception.ts deleted file mode 100644 index cff953b..0000000 --- a/src/exceptions/missing_default_export_exception.ts +++ /dev/null @@ -1,15 +0,0 @@ -/* - * @adonisjs/fold - * - * (c) AdonisJS - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -import { Exception } from '@poppinss/utils' - -export class MissingDefaultExportException extends Exception { - static code = 'E_MISSING_DEFAULT_EXPORT' - static status = 500 -} diff --git a/src/helpers.ts b/src/helpers.ts index fa8dce8..6e627c1 100644 --- a/src/helpers.ts +++ b/src/helpers.ts @@ -8,7 +8,7 @@ */ import type { Constructor } from './types.js' -import { MissingDefaultExportException } from './exceptions/missing_default_export_exception.js' +import { RuntimeException } from '@poppinss/utils' /** * Type guard and check if value is a class constructor. Plain old @@ -28,7 +28,7 @@ export async function importDefault(importFn: () => Promise<{ default: any }>) { * Make sure a default export exists */ if (!moduleExports.default) { - throw new MissingDefaultExportException(`Missing export default from "${importFn}" module`, { + throw new RuntimeException(`Missing export default from "${importFn}" module`, { cause: { source: importFn, }, diff --git a/src/resolver.ts b/src/resolver.ts index cf0592e..d120146 100644 --- a/src/resolver.ts +++ b/src/resolver.ts @@ -8,7 +8,7 @@ */ import { inspect } from 'node:util' -import string from '@poppinss/utils/string' +import { RuntimeException } from '@poppinss/utils' import type { Make, @@ -24,7 +24,6 @@ import type { import debug from './debug.js' import { isClass } from './helpers.js' import { containerProvider } from './provider.js' -import { MethodNotFoundException } from './exceptions/method_not_found_exception.js' import { InvalidBindingKeyException } from './exceptions/invalid_binding_key_exception.js' /** @@ -275,9 +274,7 @@ export class ContainerResolver = Record> { if (typeof value[method] !== 'function') { - throw new MethodNotFoundException( - string.interpolate(MethodNotFoundException.message, { method, object: inspect(value) }) - ) + throw new RuntimeException(`Missing method "${String(method)}" on "${inspect(value)}"`) } const dependencies = await containerProvider(value.constructor, method, this, runtimeValues) From f932d6cd4a6096593e2e705d7715d347007b21ed Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Fri, 2 Dec 2022 15:40:04 +0530 Subject: [PATCH 052/145] fix: breaking tests --- src/helpers.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/helpers.ts b/src/helpers.ts index 6e627c1..1d00922 100644 --- a/src/helpers.ts +++ b/src/helpers.ts @@ -49,7 +49,7 @@ export async function resolveDefault(importPath: string, parentURL: URL | string * Make sure a default export exists */ if (!moduleExports.default) { - throw new MissingDefaultExportException(`Missing export default from "${importPath}" module`, { + throw new RuntimeException(`Missing export default from "${importPath}" module`, { cause: { source: resolvedPath, }, From 3e35a02ca6ac2c51f5a2bde20aba07403b17048c Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Fri, 2 Dec 2022 15:44:02 +0530 Subject: [PATCH 053/145] chore(release): 9.4.1-0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d53fd58..a0fc357 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@adonisjs/fold", - "version": "9.4.0-0", + "version": "9.4.1-0", "description": "Simplest and straight forward implementation for IoC container in JavaScript", "main": "build/index.js", "files": [ From df7209d8a77529b01cbd4b5936d61999f33312c0 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Sat, 10 Dec 2022 09:43:17 +0530 Subject: [PATCH 054/145] chore: update dependencies --- package.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index a0fc357..e8cbed3 100644 --- a/package.json +++ b/package.json @@ -50,14 +50,14 @@ "@japa/run-failed-tests": "^1.0.7", "@japa/runner": "^2.2.2", "@japa/spec-reporter": "^1.3.2", - "@swc/core": "^1.3.14", + "@swc/core": "^1.3.22", "@types/fs-extra": "^9.0.13", - "@types/node": "^18.11.9", + "@types/node": "^18.11.12", "benchmark": "^2.1.4", "c8": "^7.12.0", "cross-env": "^7.0.3", "del-cli": "^5.0.0", - "eslint": "^8.27.0", + "eslint": "^8.29.0", "eslint-config-prettier": "^8.5.0", "eslint-plugin-adonis": "^3.0.3", "eslint-plugin-prettier": "^4.0.0", @@ -67,10 +67,10 @@ "husky": "^8.0.2", "np": "^7.6.1", "p-event": "^5.0.1", - "prettier": "^2.7.1", + "prettier": "^2.8.1", "reflect-metadata": "^0.1.13", "ts-node": "^10.8.1", - "typescript": "^4.7.3" + "typescript": "^4.9.4" }, "eslintConfig": { "extends": [ From 018f92c1b7535579c11276444542ab75f9bfe3ac Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Sat, 10 Dec 2022 10:00:10 +0530 Subject: [PATCH 055/145] refactor: improve typings for the resolver.make method --- src/container.ts | 12 ++++--- src/resolver.ts | 22 +++++++------ tests/container/known_bindings.spec.ts | 43 ++++++++++++++++++++++++++ 3 files changed, 62 insertions(+), 15 deletions(-) diff --git a/src/container.ts b/src/container.ts index efa90c5..eadaa0b 100644 --- a/src/container.ts +++ b/src/container.ts @@ -91,11 +91,13 @@ export class Container = Record * ``` */ createResolver() { - return new ContainerResolver( - this.#bindings, - this.#bindingValues, - this.#swaps, - this.#hooks, + return new ContainerResolver( + { + bindings: this.#bindings, + bindingValues: this.#bindingValues, + swaps: this.#swaps, + hooks: this.#hooks, + }, this.#options ) } diff --git a/src/resolver.ts b/src/resolver.ts index d120146..9232a41 100644 --- a/src/resolver.ts +++ b/src/resolver.ts @@ -81,16 +81,18 @@ export class ContainerResolver = Record = Record( + make( binding: Binding, runtimeValues?: any[] - ): Promise + ): Promise> make(binding: Binding, runtimeValues?: any[]): Promise> async make(binding: Binding, runtimeValues?: any[]): Promise> { const isAClass = isClass(binding) diff --git a/tests/container/known_bindings.spec.ts b/tests/container/known_bindings.spec.ts index 66ca586..9564e86 100644 --- a/tests/container/known_bindings.spec.ts +++ b/tests/container/known_bindings.spec.ts @@ -16,6 +16,21 @@ test.group('Container | Bindings', () => { assert.instanceOf(route, Route) }) + test('resolve binding using the resolver', async ({ assert }) => { + const container = new Container<{ route: Route }>() + class Route {} + + container.bind('route', () => { + return new Route() + }) + + const resolver = container.createResolver() + const route = await resolver.make('route') + + expectTypeOf(route).toEqualTypeOf() + assert.instanceOf(route, Route) + }) + test('use symbol for the binding name', async ({ assert }) => { class Route {} const routeSymbol = Symbol('route') @@ -77,6 +92,21 @@ test.group('Container | Bindings Singleton', () => { assert.instanceOf(route, Route) }) + test('resolve singleton using the resolver', async ({ assert }) => { + class Route {} + const container = new Container<{ route: Route }>() + + container.singleton('route', () => { + return new Route() + }) + + const resolver = container.createResolver() + const route = await resolver.make('route') + + expectTypeOf(route).toEqualTypeOf() + assert.instanceOf(route, Route) + }) + test('use symbol for the singleton name', async ({ assert }) => { class Route {} const routeSymbol = Symbol('route') @@ -138,6 +168,19 @@ test.group('Container | Binding values', () => { assert.instanceOf(route, Route) }) + test('resolve value using the container resolver', async ({ assert }) => { + class Route {} + const container = new Container<{ route: Route }>() + + container.bindValue('route', new Route()) + + const resolver = container.createResolver() + const route = await resolver.make('route') + + expectTypeOf(route).toEqualTypeOf() + assert.instanceOf(route, Route) + }) + test('use symbol for the value name', async ({ assert }) => { class Route {} const routeSymbol = Symbol('route') From 2e90a7dc0e2dcefafbdf4584d928acdc4d42fb64 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Sat, 10 Dec 2022 13:38:33 +0530 Subject: [PATCH 056/145] feat: add support for contextual bindings --- README.md | 38 ++++ src/container.ts | 86 +++++++- src/contextual_bindings_builder.ts | 67 ++++++ src/decorators/inject.ts | 2 + src/provider.ts | 4 +- src/resolver.ts | 115 ++++++++-- src/types.ts | 13 +- tests/container/bindings.spec.ts | 38 ++++ tests/container/make_class_via_inject.spec.ts | 206 ++++++++++++++++++ tests/container/swap.spec.ts | 42 ++++ 10 files changed, 575 insertions(+), 36 deletions(-) create mode 100644 src/contextual_bindings_builder.ts diff --git a/README.md b/README.md index 9f8c728..9c6d779 100644 --- a/README.md +++ b/README.md @@ -264,6 +264,44 @@ resolver.bindValue(Request, req) await resolve.make(SomeClass) ``` +## Contextual bindings +Contextual bindings allows you to register custom dependency resolvers on a given class for a specific dependency. You will be mostly using contextual bindings with driver based implementations. + +For example: You have a `UserService` and a `BlogService` and both of them needs an instance of the Drive disk to write and read files. You want to the `UserService` to use the local disk driver and `BlogService` to use `S3DiskDriver`. + +> **Note** +> Contextual bindings can be defined for class constructors and not for container bindngs + +```ts +import { Disk } from '@adonisjs/core/driver' + +class UserService { + constructor(disk: Disk) {} +} +``` + +```ts +import { Disk } from '@adonisjs/core/driver' + +class BlogService { + constructor(disk: Disk) {} +} +``` + +Now, let's use contextual bindings to tell the container that when `UserService` needs the `Disk` class, provide it the local driver disk. + +```ts +container + .when(BlogService) + .asksFor(Disk) + .provide(() => drive.use('s3')) + +container + .when(UserService) + .asksFor(Disk) + .provide(() => drive.use('local')) +``` + ## Swapping implementations When using the container to resolve a tree of dependencies, quite often you will have no control over the construction of a class and therefore you will be not able to swap/fake its dependencies when writing tests. diff --git a/src/container.ts b/src/container.ts index eadaa0b..5f11ebe 100644 --- a/src/container.ts +++ b/src/container.ts @@ -7,6 +7,8 @@ * file that was distributed with this source code. */ +import { RuntimeException } from '@poppinss/utils' + import type { Make, Hooks, @@ -19,11 +21,14 @@ import type { BindingResolver, ExtractFunctions, ContainerOptions, + AbstractConstructor, } from './types.js' + +import debug from './debug.js' import { isClass } from './helpers.js' import { ContainerResolver } from './resolver.js' import { InvalidBindingKeyException } from './exceptions/invalid_binding_key_exception.js' -import debug from './debug.js' +import { ContextBindingsBuilder } from './contextual_bindings_builder.js' /** * The container class exposes the API to register bindings, values @@ -44,6 +49,12 @@ import debug from './debug.js' * ``` */ export class Container = Record> { + /** + * Contextual bindings are same as binding, but instead defined + * for a parent class constructor. + */ + #contextualBindings: Map, Bindings> = new Map() + /** * A collection of bindings with registered swapped implementations */ @@ -97,6 +108,7 @@ export class Container = Record bindingValues: this.#bindingValues, swaps: this.#swaps, hooks: this.#hooks, + contextualBindings: this.#contextualBindings, }, this.#options ) @@ -107,7 +119,7 @@ export class Container = Record * "bind", the "singleton", or the "bindValue" methods. */ hasBinding(binding: Binding): boolean - hasBinding(binding: string | symbol | Constructor): boolean { + hasBinding(binding: string | symbol | Constructor | AbstractConstructor): boolean { return this.#bindingValues.has(binding) || this.#bindings.has(binding) } @@ -116,7 +128,9 @@ export class Container = Record * "bind", the "singleton", or the "bindValue" methods. */ hasAllBindings(bindings: Binding[]): boolean - hasAllBindings(bindings: (string | symbol | Constructor)[]): boolean { + hasAllBindings( + bindings: (string | symbol | Constructor | AbstractConstructor)[] + ): boolean { return bindings.every((binding) => this.hasBinding(binding)) } @@ -186,7 +200,7 @@ export class Container = Record binding: Binding extends string | symbol ? Binding : never, resolver: BindingResolver ): void - bind>( + bind | AbstractConstructor>( binding: Binding, resolver: BindingResolver> ): void @@ -223,7 +237,10 @@ export class Container = Record binding: Binding extends string | symbol ? Binding : never, value: KnownBindings[Binding] ): void - bindValue>(binding: Binding, value: InstanceType): void + bindValue | AbstractConstructor>( + binding: Binding, + value: InstanceType + ): void bindValue( binding: Binding, value: Binding extends Constructor @@ -264,7 +281,7 @@ export class Container = Record binding: Binding extends string | symbol ? Binding : never, resolver: BindingResolver ): void - singleton>( + singleton | AbstractConstructor>( binding: Binding, resolver: BindingResolver> ): void @@ -287,6 +304,11 @@ export class Container = Record this.#bindings.set(binding, { resolver, isSingleton: true }) } + /** + * Define a fake implementation for a binding or a class constructor. + * Fakes have the highest priority when resolving dependencies + * from the container. + */ swap( /** * Need to narrow down the "Binding" for the case where "KnownBindings" are @@ -294,7 +316,7 @@ export class Container = Record binding: Binding extends string | symbol ? Binding : never, resolver: BindingResolver ): void - swap>( + swap | AbstractConstructor>( binding: Binding, resolver: BindingResolver> ): void @@ -320,7 +342,7 @@ export class Container = Record /** * Restore binding by removing its swap */ - restore(binding: keyof KnownBindings | Constructor) { + restore(binding: keyof KnownBindings | Constructor | AbstractConstructor) { if (typeof binding !== 'string' && typeof binding !== 'symbol' && !isClass(binding)) { throw new InvalidBindingKeyException() } @@ -333,7 +355,7 @@ export class Container = Record * Restore mentioned or all bindings by removing * their swaps */ - restoreAll(bindings?: (keyof KnownBindings | Constructor)[]) { + restoreAll(bindings?: (keyof KnownBindings | Constructor | AbstractConstructor)[]) { if (!bindings) { debug('removing all swaps') this.#swaps.clear() @@ -362,7 +384,7 @@ export class Container = Record binding: Binding extends string | symbol ? Binding : never, callback: HookCallback ): void - resolving>( + resolving | AbstractConstructor>( binding: Binding, callback: HookCallback> ): void @@ -381,4 +403,48 @@ export class Container = Record const callbacks = this.#hooks.get(binding)! callbacks.add(callback) } + + /** + * Create a contextual builder to define contextual bindings + */ + when( + parent: Constructor + ): ContextBindingsBuilder | AbstractConstructor> { + return new ContextBindingsBuilder(parent, this) + } + + /** + * Add a contextual binding for a given class constructor. A + * contextual takes a parent, parent's dependency and a callback + * to self resolve the dependency. + * + * For example: + * - When "UsersController" + * - Asks for "Hash class" + * - Provide "Argon2" implementation + */ + contextualBinding | AbstractConstructor>( + parent: Constructor, + binding: Binding, + resolver: BindingResolver> + ): void { + if (!isClass(binding)) { + throw new RuntimeException('The binding value for contextual binding should be class') + } + if (!isClass(parent)) { + throw new RuntimeException('The parent value for contextual binding should be class') + } + + debug('adding contextual binding "%O" to "%O"', binding, parent) + + /** + * Create map for the parent if doesn't already exists + */ + if (!this.#contextualBindings.has(parent)) { + this.#contextualBindings.set(parent, new Map()) + } + + const parentBindings = this.#contextualBindings.get(parent)! + parentBindings.set(binding, { resolver, isSingleton: false }) + } } diff --git a/src/contextual_bindings_builder.ts b/src/contextual_bindings_builder.ts new file mode 100644 index 0000000..5c5882a --- /dev/null +++ b/src/contextual_bindings_builder.ts @@ -0,0 +1,67 @@ +/* + * @adonisjs/fold + * + * (c) AdonisJS + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import { RuntimeException } from '@poppinss/utils' +import type { Container } from './container.js' +import type { AbstractConstructor, BindingResolver, Constructor, Make } from './types.js' + +/** + * A fluent builder to register contextual bindings with the + * container. + */ +export class ContextBindingsBuilder< + KnownBindings extends Record, + PinnedBinding extends Constructor | AbstractConstructor +> { + /** + * The parent for whom to define the contextual + * binding + */ + #parent: Constructor + + /** + * The binding the parent asks for + */ + #binding?: PinnedBinding + + /** + * Container instance for registering the contextual + * bindings + */ + #container: Container + + constructor(parent: Constructor, container: Container) { + this.#parent = parent + this.#container = container + } + + /** + * Specify the binding for which to register a custom + * resolver. + */ + asksFor( + binding: Binding + ): ContextBindingsBuilder { + this.#binding = binding + return this as unknown as ContextBindingsBuilder + } + + /** + * Provide a resolver to resolve the parent dependency + */ + provide(resolver: BindingResolver>): void { + if (!this.#binding) { + throw new RuntimeException( + 'Missing value for contextual binding. Call "asksFor" method before calling the "provide" method' + ) + } + + this.#container.contextualBinding(this.#parent, this.#binding, resolver) + } +} diff --git a/src/decorators/inject.ts b/src/decorators/inject.ts index 7b7aef4..ca72d6d 100644 --- a/src/decorators/inject.ts +++ b/src/decorators/inject.ts @@ -24,6 +24,7 @@ function initiateContainerInjections(target: any, method: string | symbol) { */ function defineConstructorInjections(target: any) { const params = Reflect.getMetadata('design:paramtypes', target) + /* c8 ignore next 3 */ if (!params) { return } @@ -40,6 +41,7 @@ function defineConstructorInjections(target: any) { function defineMethodInjections(target: any, method: string | symbol) { const constructor = target.constructor const params = Reflect.getMetadata('design:paramtypes', target, method) + /* c8 ignore next 3 */ if (!params) { return } diff --git a/src/provider.ts b/src/provider.ts index 3e738b7..d8e83f1 100644 --- a/src/provider.ts +++ b/src/provider.ts @@ -72,7 +72,7 @@ export async function containerProvider( ) } - return resolver.make(injection) + return resolver.resolveFor(binding, injection) }) ) } @@ -108,7 +108,7 @@ export async function containerProvider( ) } - return resolver.make(injection) + return resolver.resolveFor(binding, injection) }) ) } diff --git a/src/resolver.ts b/src/resolver.ts index 9232a41..f17a42d 100644 --- a/src/resolver.ts +++ b/src/resolver.ts @@ -20,6 +20,8 @@ import type { ExtractFunctions, ContainerOptions, InspectableConstructor, + BindingResolver, + AbstractConstructor, } from './types.js' import debug from './debug.js' import { isClass } from './helpers.js' @@ -40,6 +42,14 @@ import { InvalidBindingKeyException } from './exceptions/invalid_binding_key_exc * ``` */ export class ContainerResolver = Record> { + /** + * Pre-registered contextual bindings. They are shared between the container + * and resolver. + * + * We do not mutate this property within the resolver + */ + #containerContextualBindings: Map, Bindings> + /** * Pre-registered bindings. They are shared between the container * and resolver. @@ -68,7 +78,7 @@ export class ContainerResolver = Record = Record, Bindings> }, options: ContainerOptions ) { @@ -93,6 +104,7 @@ export class ContainerResolver = Record = Record, + binding: string | symbol | Constructor | AbstractConstructor + ): BindingResolver | undefined { + const parentBindings = this.#containerContextualBindings.get(parent) + if (!parentBindings) { + return + } + + const bindingResolver = parentBindings.get(binding) + if (!bindingResolver) { + return + } + + return bindingResolver.resolver + } + /** * Notify emitter */ - #emit(binding: string | symbol | Constructor, value: any) { + #emit(binding: string | symbol | Constructor | AbstractConstructor, value: any) { debug('resolved from container. binding :%O, resolved value :%O', binding, value) if (!this.#options.emitter) { @@ -118,7 +151,10 @@ export class ContainerResolver = Record, value: any) { + async #execHooks( + binding: string | symbol | Constructor | AbstractConstructor, + value: any + ) { const callbacks = this.#containerHooks.get(binding) if (!callbacks || callbacks.size === 0) { return @@ -134,7 +170,7 @@ export class ContainerResolver = Record(binding: Binding): boolean - hasBinding(binding: string | symbol | Constructor): boolean { + hasBinding(binding: string | symbol | Constructor | AbstractConstructor): boolean { return ( this.#bindingValues.has(binding) || this.#containerBindingValues.has(binding) || @@ -147,30 +183,22 @@ export class ContainerResolver = Record(bindings: Binding[]): boolean - hasAllBindings(bindings: (string | symbol | Constructor)[]): boolean { + hasAllBindings( + bindings: (string | symbol | Constructor | AbstractConstructor)[] + ): boolean { return bindings.every((binding) => this.hasBinding(binding)) } /** - * Resolves the binding or constructor a class instance as follows. - * - * - Resolve the binding from the values (if registered) - * - Resolve the binding from the bindings (if registered) - * - If binding is a class, then create a instance of it. The constructor - * dependencies are further resolved as well. - * - All other values are returned as it is. - * - * ```ts - * await resolver.make('route') - * await resolver.make(Database) - * ``` + * Resolves binding in context of a parent. The method is same as + * the "make" method, but instead takes a parent class + * constructor. */ - make( + async resolveFor( + parent: unknown, binding: Binding, runtimeValues?: any[] - ): Promise> - make(binding: Binding, runtimeValues?: any[]): Promise> - async make(binding: Binding, runtimeValues?: any[]): Promise> { + ): Promise> { const isAClass = isClass(binding) /** @@ -193,6 +221,23 @@ export class ContainerResolver = Record = Record> } + /** + * Resolves the binding or constructor a class instance as follows. + * + * - Resolve the binding from the values (if registered) + * - Resolve the binding from the bindings (if registered) + * - If binding is a class, then create a instance of it. The constructor + * dependencies are further resolved as well. + * - All other values are returned as it is. + * + * ```ts + * await resolver.make('route') + * await resolver.make(Database) + * ``` + */ + make( + binding: Binding, + runtimeValues?: any[] + ): Promise> + make(binding: Binding, runtimeValues?: any[]): Promise> + async make(binding: Binding, runtimeValues?: any[]): Promise> { + return this.resolveFor(null, binding, runtimeValues) + } + /** * Call a method on an object by injecting its dependencies. The method * dependencies are resolved in the same manner as a class constructor @@ -297,7 +365,10 @@ export class ContainerResolver = Record>(binding: Binding, value: InstanceType): void + bindValue | AbstractConstructor>( + binding: Binding, + value: InstanceType + ): void bindValue( binding: Binding, value: Binding extends Constructor diff --git a/src/types.ts b/src/types.ts index 3ae9cc9..c6578a7 100644 --- a/src/types.ts +++ b/src/types.ts @@ -22,6 +22,11 @@ export type ExtractFunctions = { */ export type Constructor = new (...args: any[]) => T +/** + * Shape of a abstract class constructor + */ +export type AbstractConstructor = abstract new (...args: any[]) => T + /** * Shape of a class constructor with injections */ @@ -33,12 +38,16 @@ export type InspectableConstructor = Function & { /** * Returns the inferred value for the make method */ -export type Make = T extends Constructor ? A : T +export type Make = T extends Constructor + ? A + : T extends AbstractConstructor + ? B + : T /** * Accepted values for the binding key */ -export type BindingKey = string | symbol | Constructor +export type BindingKey = string | symbol | Constructor | AbstractConstructor /** * Shape of the binding resolver diff --git a/tests/container/bindings.spec.ts b/tests/container/bindings.spec.ts index ff1f03d..c39f043 100644 --- a/tests/container/bindings.spec.ts +++ b/tests/container/bindings.spec.ts @@ -367,3 +367,41 @@ test.group('Container | Binding values', () => { assert.isFalse(container.hasAllBindings([Route, 'db', routeSymbol])) }) }) + +test.group('Container | Contextual Bindings', () => { + test('raise error when "provide" method is called before "asksFor" method', async ({ + assert, + }) => { + const container = new Container() + class Route {} + + assert.throws( + () => container.when(Route).provide(() => {}), + 'Missing value for contextual binding. Call "asksFor" method before calling the "provide" method' + ) + }) + + test('disallow contextual bindings on anything other than classes', async ({ assert }) => { + const container = new Container() + class Hash {} + class Route {} + + assert.throws( + // @ts-expect-error + () => container.contextualBinding('route', 'hash', () => {}), + 'The binding value for contextual binding should be class' + ) + + assert.throws( + // @ts-expect-error + () => container.contextualBinding('route', Hash, () => {}), + 'The parent value for contextual binding should be class' + ) + + assert.throws( + // @ts-expect-error + () => container.contextualBinding(Route, 'hash', () => {}), + 'The binding value for contextual binding should be class' + ) + }) +}) diff --git a/tests/container/make_class_via_inject.spec.ts b/tests/container/make_class_via_inject.spec.ts index 544f4b8..9fd8a5a 100644 --- a/tests/container/make_class_via_inject.spec.ts +++ b/tests/container/make_class_via_inject.spec.ts @@ -4,6 +4,7 @@ import { EventEmitter } from 'node:events' import { expectTypeOf } from 'expect-type' import { Container } from '../../src/container.js' import { inject } from '../../src/decorators/inject.js' +import type { BindingResolver } from '../../src/types.js' test.group('Container | Make class via inject', () => { test('inject constructor dependencies using @inject', async ({ assert }) => { @@ -220,3 +221,208 @@ test.group('Container | Make class via inject', () => { ) }) }) + +test.group('Container | Make class with contextual bindings', () => { + test('resolve contextual bindings for a class constructor', async ({ assert }) => { + const container = new Container() + + abstract class Hash { + abstract make(value: string): string + } + + @inject() + class UsersController { + constructor(public hash: Hash) {} + } + + class Argon2 { + make(value: string): string { + return value.toUpperCase() + } + } + + const builder = container.when(UsersController).asksFor(Hash) + builder.provide(() => { + return new Argon2() + }) + + expectTypeOf(builder.provide).parameters.toEqualTypeOf<[BindingResolver]>() + expectTypeOf(container.contextualBinding) + .parameter(2) + .toEqualTypeOf>() + + const controller = await container.make(UsersController) + expectTypeOf(controller).toEqualTypeOf() + assert.instanceOf(controller.hash, Argon2) + }) + + test('do not resolve contextual binding when parent is registered as a binding to the container', async ({ + assert, + }) => { + const container = new Container() + + abstract class Hash { + abstract make(value: string): string + } + + class BaseHasher extends Hash { + make(value: string): string { + return value.toUpperCase() + } + } + + @inject() + class UsersController { + constructor(public hash: Hash) {} + } + + class Argon2 { + make(value: string): string { + return value.toUpperCase() + } + } + + const builder = container.when(UsersController).asksFor(Hash) + builder.provide(() => { + return new Argon2() + }) + + expectTypeOf(builder.provide).parameters.toEqualTypeOf<[BindingResolver]>() + expectTypeOf(container.contextualBinding) + .parameter(2) + .toEqualTypeOf>() + + /** + * As soon as a binding for the class is defined, the binding + * callback will be source of truth. + * + * Contextual bindings are used when container performs constructor + * building + */ + container.bind(UsersController, () => { + return new UsersController(new BaseHasher()) + }) + + const controller = await container.make(UsersController) + expectTypeOf(controller).toEqualTypeOf() + assert.instanceOf(controller.hash, BaseHasher) + }) + + test('given preference to contextual binding when binding is also registered to the container', async ({ + assert, + }) => { + const container = new Container() + + abstract class Hash { + abstract make(value: string): string + } + + @inject() + class UsersController { + constructor(public hash: Hash) {} + } + + class Argon2 { + make(value: string): string { + return value.toUpperCase() + } + } + + class Bcrypt { + make(value: string): string { + return value.toUpperCase() + } + } + + const builder = container.when(UsersController).asksFor(Hash) + builder.provide(() => { + return new Argon2() + }) + + expectTypeOf(builder.provide).parameters.toEqualTypeOf<[BindingResolver]>() + expectTypeOf(container.contextualBinding) + .parameter(2) + .toEqualTypeOf>() + + /** + * When the binding is registered in the container, we consider + * it as the default value. + * + * Therefore, the contextual binding takes preference over it. + */ + container.bind(Hash, () => { + return new Bcrypt() + }) + + const controller = await container.make(UsersController) + expectTypeOf(controller).toEqualTypeOf() + assert.instanceOf(controller.hash, Argon2) + }) + + test('re-use container to resolve the same binding', async ({ assert }) => { + const container = new Container() + + abstract class Hash { + abstract make(value: string): string + } + + class BaseHasher extends Hash { + make(value: string): string { + return value.toUpperCase() + } + } + + @inject() + class UsersController { + constructor(public hash: Hash) {} + } + + container.bind(Hash, () => new BaseHasher()) + + const builder = container.when(UsersController).asksFor(Hash) + builder.provide((resolver) => { + return resolver.make(Hash) + }) + + expectTypeOf(builder.provide).parameters.toEqualTypeOf<[BindingResolver]>() + expectTypeOf(container.contextualBinding) + .parameter(2) + .toEqualTypeOf>() + + const controller = await container.make(UsersController) + expectTypeOf(controller).toEqualTypeOf() + + assert.instanceOf(controller.hash, BaseHasher) + }) + + test('handle case when class has a contextual binding but not for the current binding', async ({ + assert, + }) => { + const container = new Container() + + class Foo {} + + abstract class Hash { + abstract make(value: string): string + } + + @inject() + class UsersController { + constructor(public hash: Hash) {} + } + + const builder = container.when(UsersController).asksFor(Foo) + builder.provide(() => { + return new Foo() + }) + + expectTypeOf(builder.provide).parameters.toEqualTypeOf<[BindingResolver]>() + expectTypeOf(container.contextualBinding) + .parameter(2) + .toEqualTypeOf>() + + const controller = await container.make(UsersController) + expectTypeOf(controller).toEqualTypeOf() + assert.instanceOf(controller.hash, Hash) + }) +}) diff --git a/tests/container/swap.spec.ts b/tests/container/swap.spec.ts index fc9302d..8f21714 100644 --- a/tests/container/swap.spec.ts +++ b/tests/container/swap.spec.ts @@ -13,6 +13,7 @@ import { expectTypeOf } from 'expect-type' import { inject } from '../../index.js' import { Container } from '../../src/container.js' +import type { BindingResolver } from '../../src/types.js' test.group('Container | swap', () => { test('swap a class implementation', async ({ assert }) => { @@ -237,4 +238,45 @@ test.group('Container | swap', () => { assert.instanceOf(route3, Route) assert.notInstanceOf(route3, FakedRoute) }) + + test('use swap over contextual binding', async ({ assert }) => { + const container = new Container() + + abstract class Hash { + abstract make(value: string): string + } + + class Argon2 { + make(value: string): string { + return value.toUpperCase() + } + } + + class FakedHash { + make(_: string): string { + return 'fake' + } + } + + @inject() + class UsersController { + constructor(public hash: Hash) {} + } + + container.contextualBinding(UsersController, Hash, () => { + return new Argon2() + }) + container.swap(Hash, () => { + return new FakedHash() + }) + + expectTypeOf(container.contextualBinding) + .parameter(2) + .toEqualTypeOf>() + + const controller = await container.make(UsersController) + expectTypeOf(controller).toEqualTypeOf() + assert.instanceOf(controller.hash, FakedHash) + assert.equal(controller.hash.make('foo'), 'fake') + }) }) From 273c385d684f553ad055fcd1d003cedcf81d8466 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Sat, 10 Dec 2022 13:48:36 +0530 Subject: [PATCH 057/145] refactor: cleanup types --- src/container.ts | 38 +++++++++++++----------------- src/contextual_bindings_builder.ts | 2 +- src/provider.ts | 2 +- src/resolver.ts | 20 +++++++--------- src/types.ts | 10 +++----- 5 files changed, 30 insertions(+), 42 deletions(-) diff --git a/src/container.ts b/src/container.ts index 5f11ebe..08197f0 100644 --- a/src/container.ts +++ b/src/container.ts @@ -48,7 +48,7 @@ import { ContextBindingsBuilder } from './contextual_bindings_builder.js' * await container.make(CLASS_CONSTRUCTOR) * ``` */ -export class Container = Record> { +export class Container> { /** * Contextual bindings are same as binding, but instead defined * for a parent class constructor. @@ -119,7 +119,7 @@ export class Container = Record * "bind", the "singleton", or the "bindValue" methods. */ hasBinding(binding: Binding): boolean - hasBinding(binding: string | symbol | Constructor | AbstractConstructor): boolean { + hasBinding(binding: BindingKey): boolean { return this.#bindingValues.has(binding) || this.#bindings.has(binding) } @@ -128,9 +128,7 @@ export class Container = Record * "bind", the "singleton", or the "bindValue" methods. */ hasAllBindings(bindings: Binding[]): boolean - hasAllBindings( - bindings: (string | symbol | Constructor | AbstractConstructor)[] - ): boolean { + hasAllBindings(bindings: BindingKey[]): boolean { return bindings.every((binding) => this.hasBinding(binding)) } @@ -200,7 +198,7 @@ export class Container = Record binding: Binding extends string | symbol ? Binding : never, resolver: BindingResolver ): void - bind | AbstractConstructor>( + bind>( binding: Binding, resolver: BindingResolver> ): void @@ -208,7 +206,7 @@ export class Container = Record binding: Binding, resolver: BindingResolver< KnownBindings, - Binding extends Constructor + Binding extends AbstractConstructor ? A : Binding extends keyof KnownBindings ? KnownBindings[Binding] @@ -237,13 +235,13 @@ export class Container = Record binding: Binding extends string | symbol ? Binding : never, value: KnownBindings[Binding] ): void - bindValue | AbstractConstructor>( + bindValue>( binding: Binding, value: InstanceType ): void bindValue( binding: Binding, - value: Binding extends Constructor + value: Binding extends AbstractConstructor ? A : Binding extends keyof KnownBindings ? KnownBindings[Binding] @@ -281,7 +279,7 @@ export class Container = Record binding: Binding extends string | symbol ? Binding : never, resolver: BindingResolver ): void - singleton | AbstractConstructor>( + singleton>( binding: Binding, resolver: BindingResolver> ): void @@ -289,7 +287,7 @@ export class Container = Record binding: Binding, resolver: BindingResolver< KnownBindings, - Binding extends Constructor + Binding extends AbstractConstructor ? A : Binding extends keyof KnownBindings ? KnownBindings[Binding] @@ -316,7 +314,7 @@ export class Container = Record binding: Binding extends string | symbol ? Binding : never, resolver: BindingResolver ): void - swap | AbstractConstructor>( + swap>( binding: Binding, resolver: BindingResolver> ): void @@ -324,7 +322,7 @@ export class Container = Record binding: Binding, resolver: BindingResolver< KnownBindings, - Binding extends Constructor + Binding extends AbstractConstructor ? A : Binding extends keyof KnownBindings ? KnownBindings[Binding] @@ -342,7 +340,7 @@ export class Container = Record /** * Restore binding by removing its swap */ - restore(binding: keyof KnownBindings | Constructor | AbstractConstructor) { + restore(binding: keyof KnownBindings | AbstractConstructor) { if (typeof binding !== 'string' && typeof binding !== 'symbol' && !isClass(binding)) { throw new InvalidBindingKeyException() } @@ -355,7 +353,7 @@ export class Container = Record * Restore mentioned or all bindings by removing * their swaps */ - restoreAll(bindings?: (keyof KnownBindings | Constructor | AbstractConstructor)[]) { + restoreAll(bindings?: (keyof KnownBindings | AbstractConstructor)[]) { if (!bindings) { debug('removing all swaps') this.#swaps.clear() @@ -384,13 +382,13 @@ export class Container = Record binding: Binding extends string | symbol ? Binding : never, callback: HookCallback ): void - resolving | AbstractConstructor>( + resolving>( binding: Binding, callback: HookCallback> ): void resolving( binding: Binding, - callback: Binding extends Constructor + callback: Binding extends AbstractConstructor ? HookCallback : Binding extends keyof KnownBindings ? HookCallback @@ -407,9 +405,7 @@ export class Container = Record /** * Create a contextual builder to define contextual bindings */ - when( - parent: Constructor - ): ContextBindingsBuilder | AbstractConstructor> { + when(parent: Constructor): ContextBindingsBuilder> { return new ContextBindingsBuilder(parent, this) } @@ -423,7 +419,7 @@ export class Container = Record * - Asks for "Hash class" * - Provide "Argon2" implementation */ - contextualBinding | AbstractConstructor>( + contextualBinding>( parent: Constructor, binding: Binding, resolver: BindingResolver> diff --git a/src/contextual_bindings_builder.ts b/src/contextual_bindings_builder.ts index 5c5882a..3b9bbd7 100644 --- a/src/contextual_bindings_builder.ts +++ b/src/contextual_bindings_builder.ts @@ -17,7 +17,7 @@ import type { AbstractConstructor, BindingResolver, Constructor, Make } from './ */ export class ContextBindingsBuilder< KnownBindings extends Record, - PinnedBinding extends Constructor | AbstractConstructor + PinnedBinding extends AbstractConstructor > { /** * The parent for whom to define the contextual diff --git a/src/provider.ts b/src/provider.ts index d8e83f1..2543c90 100644 --- a/src/provider.ts +++ b/src/provider.ts @@ -10,7 +10,7 @@ import debug from './debug.js' import { inspect } from 'node:util' import string from '@poppinss/utils/string' -import { ContainerResolver } from './resolver.js' +import type { ContainerResolver } from './resolver.js' import type { InspectableConstructor } from './types.js' import { InvalidDependencyException } from './exceptions/invalid_dependency_exception.js' diff --git a/src/resolver.ts b/src/resolver.ts index f17a42d..14be2ea 100644 --- a/src/resolver.ts +++ b/src/resolver.ts @@ -22,6 +22,7 @@ import type { InspectableConstructor, BindingResolver, AbstractConstructor, + BindingKey, } from './types.js' import debug from './debug.js' import { isClass } from './helpers.js' @@ -121,7 +122,7 @@ export class ContainerResolver = Record, - binding: string | symbol | Constructor | AbstractConstructor + binding: string | symbol | AbstractConstructor ): BindingResolver | undefined { const parentBindings = this.#containerContextualBindings.get(parent) if (!parentBindings) { @@ -139,7 +140,7 @@ export class ContainerResolver = Record | AbstractConstructor, value: any) { + #emit(binding: BindingKey, value: any) { debug('resolved from container. binding :%O, resolved value :%O', binding, value) if (!this.#options.emitter) { @@ -151,10 +152,7 @@ export class ContainerResolver = Record | AbstractConstructor, - value: any - ) { + async #execHooks(binding: BindingKey, value: any) { const callbacks = this.#containerHooks.get(binding) if (!callbacks || callbacks.size === 0) { return @@ -170,7 +168,7 @@ export class ContainerResolver = Record(binding: Binding): boolean - hasBinding(binding: string | symbol | Constructor | AbstractConstructor): boolean { + hasBinding(binding: BindingKey): boolean { return ( this.#bindingValues.has(binding) || this.#containerBindingValues.has(binding) || @@ -183,9 +181,7 @@ export class ContainerResolver = Record(bindings: Binding[]): boolean - hasAllBindings( - bindings: (string | symbol | Constructor | AbstractConstructor)[] - ): boolean { + hasAllBindings(bindings: BindingKey[]): boolean { return bindings.every((binding) => this.hasBinding(binding)) } @@ -365,13 +361,13 @@ export class ContainerResolver = Record | AbstractConstructor>( + bindValue>( binding: Binding, value: InstanceType ): void bindValue( binding: Binding, - value: Binding extends Constructor + value: Binding extends AbstractConstructor ? A : Binding extends keyof KnownBindings ? KnownBindings[Binding] diff --git a/src/types.ts b/src/types.ts index c6578a7..d45e774 100644 --- a/src/types.ts +++ b/src/types.ts @@ -38,16 +38,12 @@ export type InspectableConstructor = Function & { /** * Returns the inferred value for the make method */ -export type Make = T extends Constructor - ? A - : T extends AbstractConstructor - ? B - : T +export type Make = T extends AbstractConstructor ? A : T /** * Accepted values for the binding key */ -export type BindingKey = string | symbol | Constructor | AbstractConstructor +export type BindingKey = string | symbol | AbstractConstructor /** * Shape of the binding resolver @@ -82,7 +78,7 @@ export type BindingValues = Map */ export type ContainerResolveEventData = | { - binding: Constructor + binding: AbstractConstructor value: unknown } | { From 6b4b0650a74a3144011fc3263a0ded6271305690 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Sat, 10 Dec 2022 13:51:20 +0530 Subject: [PATCH 058/145] docs: update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9c6d779..b663f88 100644 --- a/README.md +++ b/README.md @@ -267,7 +267,7 @@ await resolve.make(SomeClass) ## Contextual bindings Contextual bindings allows you to register custom dependency resolvers on a given class for a specific dependency. You will be mostly using contextual bindings with driver based implementations. -For example: You have a `UserService` and a `BlogService` and both of them needs an instance of the Drive disk to write and read files. You want to the `UserService` to use the local disk driver and `BlogService` to use `S3DiskDriver`. +For example: You have a `UserService` and a `BlogService` and both of them needs an instance of the Drive disk to write and read files. You want the `UserService` to use the local disk driver and `BlogService` to use the s3 disk driver. > **Note** > Contextual bindings can be defined for class constructors and not for container bindngs From 08241d9aee1159e722766cbf1a8135864c05cf4f Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Sat, 10 Dec 2022 13:51:57 +0530 Subject: [PATCH 059/145] refactor: remove default value for generics --- src/resolver.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/resolver.ts b/src/resolver.ts index 14be2ea..2c51c24 100644 --- a/src/resolver.ts +++ b/src/resolver.ts @@ -42,7 +42,7 @@ import { InvalidBindingKeyException } from './exceptions/invalid_binding_key_exc * await resolver.make(CLASS_CONSTRUCTOR) * ``` */ -export class ContainerResolver = Record> { +export class ContainerResolver> { /** * Pre-registered contextual bindings. They are shared between the container * and resolver. From ae04198d2752e81b94f0e4fcf7c2153dd086c91f Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Sat, 10 Dec 2022 16:38:57 +0530 Subject: [PATCH 060/145] chore(release): 9.5.0-0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e8cbed3..10bc579 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@adonisjs/fold", - "version": "9.4.1-0", + "version": "9.5.0-0", "description": "Simplest and straight forward implementation for IoC container in JavaScript", "main": "build/index.js", "files": [ From 766c8f0750842710646632d85d50828f2796fdb3 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Sun, 11 Dec 2022 12:51:46 +0530 Subject: [PATCH 061/145] chore: update dependencies --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 10bc579..902489b 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "@japa/spec-reporter": "^1.3.2", "@swc/core": "^1.3.22", "@types/fs-extra": "^9.0.13", - "@types/node": "^18.11.12", + "@types/node": "^18.11.13", "benchmark": "^2.1.4", "c8": "^7.12.0", "cross-env": "^7.0.3", From ba3339330c8e13f3e8930419a39137e45674a4fe Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Sun, 11 Dec 2022 13:22:26 +0530 Subject: [PATCH 062/145] refactor: make container strict and raise exception when unable to construct values --- index.ts | 1 - .../invalid_dependency_exception.ts | 16 --- src/provider.ts | 17 --- src/resolver.ts | 14 +- src/types.ts | 2 +- tests/container/call_method.spec.ts | 10 +- tests/container/events.spec.ts | 32 ----- tests/container/hooks.spec.ts | 8 -- tests/container/known_make_class.spec.ts | 123 ++++++++++++------ tests/container/make_class.spec.ts | 123 ++++++++++++------ tests/container/make_class_via_inject.spec.ts | 17 ++- tests/provider.spec.ts | 2 +- 12 files changed, 190 insertions(+), 175 deletions(-) delete mode 100644 src/exceptions/invalid_dependency_exception.ts diff --git a/index.ts b/index.ts index deb7160..417163e 100644 --- a/index.ts +++ b/index.ts @@ -13,4 +13,3 @@ export { ContainerResolver } from './src/resolver.js' export { moduleImporter } from './src/module_importer.js' export { moduleExpression } from './src/module_expression.js' export { InvalidBindingKeyException } from './src/exceptions/invalid_binding_key_exception.js' -export { InvalidDependencyException } from './src/exceptions/invalid_dependency_exception.js' diff --git a/src/exceptions/invalid_dependency_exception.ts b/src/exceptions/invalid_dependency_exception.ts deleted file mode 100644 index 1d67a86..0000000 --- a/src/exceptions/invalid_dependency_exception.ts +++ /dev/null @@ -1,16 +0,0 @@ -/* - * @adonisjs/fold - * - * (c) AdonisJS - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -import { Exception } from '@poppinss/utils' - -export class InvalidDependencyException extends Exception { - static code = 'E_INVALID_CONTAINER_DEPENDENCY' - static status = 500 - static message = 'Cannot inject "{{ value }}". The value cannot be constructed' -} diff --git a/src/provider.ts b/src/provider.ts index 2543c90..df57052 100644 --- a/src/provider.ts +++ b/src/provider.ts @@ -8,13 +8,8 @@ */ import debug from './debug.js' -import { inspect } from 'node:util' -import string from '@poppinss/utils/string' import type { ContainerResolver } from './resolver.js' import type { InspectableConstructor } from './types.js' -import { InvalidDependencyException } from './exceptions/invalid_dependency_exception.js' - -const primitiveConstructors = [String, Function, Object, Date, Number, Boolean] /** * The default provider for resolving dependencies. It uses the resolver @@ -66,12 +61,6 @@ export async function containerProvider( } const injection = injections[index] - if (primitiveConstructors.includes(injection)) { - throw new InvalidDependencyException( - string.interpolate(InvalidDependencyException.message, { value: inspect(injection) }) - ) - } - return resolver.resolveFor(binding, injection) }) ) @@ -102,12 +91,6 @@ export async function containerProvider( return values[index] } - if (primitiveConstructors.includes(injection)) { - throw new InvalidDependencyException( - string.interpolate(InvalidDependencyException.message, { value: inspect(injection) }) - ) - } - return resolver.resolveFor(binding, injection) }) ) diff --git a/src/resolver.ts b/src/resolver.ts index 2c51c24..504bcd9 100644 --- a/src/resolver.ts +++ b/src/resolver.ts @@ -198,15 +198,15 @@ export class ContainerResolver> { const isAClass = isClass(binding) /** - * Return binding as it is, when the binding type is not a string, symbol - * or a class constructor. + * Raise exception when the binding is not a string, a class constructor + * or a symbol. */ if (typeof binding !== 'string' && typeof binding !== 'symbol' && !isAClass) { - return binding as Promise> + throw new RuntimeException(`Cannot construct value "${inspect(binding)}" using container`) } /** - * Entertain swaps when registered + * Entertain swaps with highest priority. */ if (this.#containerSwaps.has(binding)) { const resolver = this.#containerSwaps.get(binding)! @@ -218,8 +218,8 @@ export class ContainerResolver> { } /** - * Resolving contextual binding with the highest priority - * after fakes. + * Resolving contextual binding. Contextual bindings have more + * priority over bindings or binding values. */ const contextualResolver = isClass(parent) ? this.#getBindingResolver(parent, binding) @@ -299,7 +299,7 @@ export class ContainerResolver> { return value } - return binding as unknown as Promise> + throw new RuntimeException(`Cannot resolve binding "${String(binding)}" from the container`) } /** diff --git a/src/types.ts b/src/types.ts index d45e774..69503b0 100644 --- a/src/types.ts +++ b/src/types.ts @@ -38,7 +38,7 @@ export type InspectableConstructor = Function & { /** * Returns the inferred value for the make method */ -export type Make = T extends AbstractConstructor ? A : T +export type Make = T extends AbstractConstructor ? A : never /** * Accepted values for the binding key diff --git a/tests/container/call_method.spec.ts b/tests/container/call_method.spec.ts index 43a466d..9aa5080 100644 --- a/tests/container/call_method.spec.ts +++ b/tests/container/call_method.spec.ts @@ -94,7 +94,7 @@ test.group('Container | Call method', () => { assert.instanceOf(fooResult, Database) }) - test('inject non class dependencies to class method', async ({ assert }) => { + test('throw error when injecting non class dependencies to the container', async ({ assert }) => { class Database {} class UserService { @@ -108,10 +108,10 @@ test.group('Container | Call method', () => { } const container = new Container() - const fooResult = await container.call(new UserService(), 'foo') - - expectTypeOf(fooResult).toEqualTypeOf() - assert.equal(fooResult, 1) + await assert.rejects( + () => container.call(new UserService(), 'foo'), + `Cannot construct value "{ foo: 'bar' }" using container` + ) }) test('merge runtime values with container dependencies', async ({ assert }) => { diff --git a/tests/container/events.spec.ts b/tests/container/events.spec.ts index 040c620..56e54ac 100644 --- a/tests/container/events.spec.ts +++ b/tests/container/events.spec.ts @@ -85,38 +85,6 @@ test.group('Container | Events', () => { assert.deepEqual(event, { binding: 'route', value: route }) }) - test('do not emit when non class value is resolved', async ({ assert }) => { - const emitter = new EventEmitter() - const container = new Container({ emitter }) - - await assert.rejects( - async () => - await Promise.all([ - pEvent(emitter, 'container:resolve', { timeout: 100 }), - container.make('route'), - ]), - 'Promise timed out after 100 milliseconds' - ) - - await assert.rejects( - async () => - await Promise.all([ - pEvent(emitter, 'container:resolve', { timeout: 100 }), - container.make({ foo: 'bar' }), - ]), - 'Promise timed out after 100 milliseconds' - ) - - await assert.rejects( - async () => - await Promise.all([ - pEvent(emitter, 'container:resolve', { timeout: 100 }), - container.make([]), - ]), - 'Promise timed out after 100 milliseconds' - ) - }) - test('emit event when class is constructed', async ({ assert }) => { const emitter = new EventEmitter() const container = new Container({ emitter }) diff --git a/tests/container/hooks.spec.ts b/tests/container/hooks.spec.ts index dbf8204..e222a10 100644 --- a/tests/container/hooks.spec.ts +++ b/tests/container/hooks.spec.ts @@ -92,10 +92,6 @@ test.group('Container | Hooks', () => { route.invocations++ }) - await container.make('route') - await container.make('route') - await container.make('route') - const route = await container.make(Route) expectTypeOf(route).toEqualTypeOf() @@ -120,10 +116,6 @@ test.group('Container | Hooks', () => { return new FakedRoute() }) - await container.make('route') - await container.make('route') - await container.make('route') - const route = await container.make(Route) expectTypeOf(route).toEqualTypeOf() diff --git a/tests/container/known_make_class.spec.ts b/tests/container/known_make_class.spec.ts index 434c02b..91b7134 100644 --- a/tests/container/known_make_class.spec.ts +++ b/tests/container/known_make_class.spec.ts @@ -7,45 +7,90 @@ test.group('Container | Make class | Known bindings', () => { assert.instanceOf(new Container(), Container) }) - test('return non classes values as it is', async ({ assert }) => { + test('throw error when unsupported data type is given to the container', async ({ assert }) => { const container = new Container<{ foo: 'bar' }>() - const obj = await container.make({ foo: 'bar' }) - expectTypeOf(obj).toEqualTypeOf<{ foo: string }>() - assert.deepEqual(obj, { foo: 'bar' }) + try { + const obj = await container.make({ foo: 'bar' }) + expectTypeOf(obj).toEqualTypeOf() + } catch (error) { + assert.equal(error.message, `Cannot construct value "{ foo: 'bar' }" using container`) + } - const numeric = await container.make(1) - expectTypeOf(numeric).toEqualTypeOf() - assert.deepEqual(numeric, 1) + try { + const numeric = await container.make(1) + expectTypeOf(numeric).toEqualTypeOf() + } catch (error) { + assert.equal(error.message, `Cannot construct value "1" using container`) + } - const bool = await container.make(false) - expectTypeOf(bool).toEqualTypeOf() - assert.deepEqual(bool, false) + try { + const bool = await container.make(false) + expectTypeOf(bool).toEqualTypeOf() + } catch (error) { + assert.equal(error.message, `Cannot construct value "false" using container`) + } - const notDefined = await container.make(undefined) - expectTypeOf(notDefined).toEqualTypeOf() - assert.deepEqual(notDefined, undefined) + try { + const notDefined = await container.make(undefined) + expectTypeOf(notDefined).toEqualTypeOf() + } catch (error) { + assert.equal(error.message, `Cannot construct value "undefined" using container`) + } - const nullValue = await container.make(null) - expectTypeOf(nullValue).toEqualTypeOf() - assert.deepEqual(nullValue, null) + try { + const nullValue = await container.make(null) + expectTypeOf(nullValue).toEqualTypeOf() + } catch (error) { + assert.equal(error.message, `Cannot construct value "null" using container`) + } - const mapValue = await container.make(new Map([[1, 1]])) - expectTypeOf(mapValue).toEqualTypeOf>() - assert.deepEqual(mapValue, new Map([[1, 1]])) + try { + const mapValue = await container.make(new Map([[1, 1]])) + expectTypeOf(mapValue).toEqualTypeOf() + } catch (error) { + assert.equal(error.message, `Cannot construct value "Map(1) { 1 => 1 }" using container`) + } - const setValue = await container.make(new Set([1])) - expectTypeOf(setValue).toEqualTypeOf>() - assert.deepEqual(setValue, new Set([1])) + try { + const setValue = await container.make(new Set([1])) + expectTypeOf(setValue).toEqualTypeOf() + } catch (error) { + assert.equal(error.message, `Cannot construct value "Set(1) { 1 }" using container`) + } - const arrayValue = await container.make(['foo']) - expectTypeOf(arrayValue).toEqualTypeOf() - assert.deepEqual(arrayValue, ['foo']) + try { + const arrayValue = await container.make(['foo']) + expectTypeOf(arrayValue).toEqualTypeOf() + } catch (error) { + assert.equal(error.message, `Cannot construct value "[ 'foo' ]" using container`) + } function foo() {} - const func = await container.make(foo) - expectTypeOf(func).toEqualTypeOf<() => void>() - assert.deepEqual(func, foo) + try { + const func = await container.make(foo) + expectTypeOf(func).toEqualTypeOf() + } catch (error) { + assert.equal(error.message, `Cannot construct value "[Function: foo]" using container`) + } + }) + + test('throw error when unable to resolve a binding by name', async ({ assert }) => { + const container = new Container<{ foo: 'bar' }>() + + try { + const obj = await container.make('bar') + expectTypeOf(obj).toEqualTypeOf() + } catch (error) { + assert.equal(error.message, `Cannot resolve binding "bar" from the container`) + } + + try { + const obj = await container.make(Symbol('bar')) + expectTypeOf(obj).toEqualTypeOf() + } catch (error) { + assert.equal(error.message, `Cannot resolve binding "Symbol(bar)" from the container`) + } }) test('make instance of a class using the container', async ({ assert }) => { @@ -94,7 +139,7 @@ test.group('Container | Make class | Known bindings', () => { assert.instanceOf(service.db, Database) }) - test('inject non class dependencies as it is', async ({ assert }) => { + test('throw error when injecting non-class values to the constructor', async ({ assert }) => { class UserService { args: any[] @@ -107,11 +152,10 @@ test.group('Container | Make class | Known bindings', () => { } const container = new Container<{ foo: 'bar' }>() - const service = await container.make(UserService) - - assert.instanceOf(service, UserService) - expectTypeOf(service).toEqualTypeOf() - assert.deepEqual(service.args, [{ foo: 'bar' }, 1, ['foo'], false, undefined, null, false]) + await assert.rejects( + () => container.make(UserService), + `Cannot construct value "{ foo: 'bar' }" using container` + ) }) test('do not inject constructor dependencies when containerInjections are empty', async ({ @@ -143,15 +187,16 @@ test.group('Container | Make class | Known bindings', () => { const container = new Container<{ foo: 'bar' }>() await assert.rejects( () => container.make(UserService), - 'Cannot inject "[Function: String]". The value cannot be constructed' + 'Cannot construct value "[Function: String]" using container' ) }) - test('return primitive constructor as it is', async ({ assert }) => { + test('throw error when constructing primitive values', async ({ assert }) => { const container = new Container<{ foo: 'bar' }>() - const stringPrimitive = await container.make(String) - expectTypeOf(stringPrimitive).toEqualTypeOf() - assert.deepEqual(stringPrimitive, String) + await assert.rejects( + () => container.make(String), + 'Cannot construct value "[Function: String]" using container' + ) }) }) diff --git a/tests/container/make_class.spec.ts b/tests/container/make_class.spec.ts index d77b5bc..b0fad1c 100644 --- a/tests/container/make_class.spec.ts +++ b/tests/container/make_class.spec.ts @@ -7,45 +7,90 @@ test.group('Container | Make class', () => { assert.instanceOf(new Container(), Container) }) - test('return non classes values as it is', async ({ assert }) => { + test('throw error when unsupported data type is given to the container', async ({ assert }) => { const container = new Container() - const obj = await container.make({ foo: 'bar' }) - expectTypeOf(obj).toEqualTypeOf<{ foo: string }>() - assert.deepEqual(obj, { foo: 'bar' }) + try { + const obj = await container.make({ foo: 'bar' }) + expectTypeOf(obj).toEqualTypeOf() + } catch (error) { + assert.equal(error.message, `Cannot construct value "{ foo: 'bar' }" using container`) + } - const numeric = await container.make(1) - expectTypeOf(numeric).toEqualTypeOf() - assert.deepEqual(numeric, 1) + try { + const numeric = await container.make(1) + expectTypeOf(numeric).toEqualTypeOf() + } catch (error) { + assert.equal(error.message, `Cannot construct value "1" using container`) + } - const bool = await container.make(false) - expectTypeOf(bool).toEqualTypeOf() - assert.deepEqual(bool, false) + try { + const bool = await container.make(false) + expectTypeOf(bool).toEqualTypeOf() + } catch (error) { + assert.equal(error.message, `Cannot construct value "false" using container`) + } - const notDefined = await container.make(undefined) - expectTypeOf(notDefined).toEqualTypeOf() - assert.deepEqual(notDefined, undefined) + try { + const notDefined = await container.make(undefined) + expectTypeOf(notDefined).toEqualTypeOf() + } catch (error) { + assert.equal(error.message, `Cannot construct value "undefined" using container`) + } - const nullValue = await container.make(null) - expectTypeOf(nullValue).toEqualTypeOf() - assert.deepEqual(nullValue, null) + try { + const nullValue = await container.make(null) + expectTypeOf(nullValue).toEqualTypeOf() + } catch (error) { + assert.equal(error.message, `Cannot construct value "null" using container`) + } - const mapValue = await container.make(new Map([[1, 1]])) - expectTypeOf(mapValue).toEqualTypeOf>() - assert.deepEqual(mapValue, new Map([[1, 1]])) + try { + const mapValue = await container.make(new Map([[1, 1]])) + expectTypeOf(mapValue).toEqualTypeOf() + } catch (error) { + assert.equal(error.message, `Cannot construct value "Map(1) { 1 => 1 }" using container`) + } - const setValue = await container.make(new Set([1])) - expectTypeOf(setValue).toEqualTypeOf>() - assert.deepEqual(setValue, new Set([1])) + try { + const setValue = await container.make(new Set([1])) + expectTypeOf(setValue).toEqualTypeOf() + } catch (error) { + assert.equal(error.message, `Cannot construct value "Set(1) { 1 }" using container`) + } - const arrayValue = await container.make(['foo']) - expectTypeOf(arrayValue).toEqualTypeOf() - assert.deepEqual(arrayValue, ['foo']) + try { + const arrayValue = await container.make(['foo']) + expectTypeOf(arrayValue).toEqualTypeOf() + } catch (error) { + assert.equal(error.message, `Cannot construct value "[ 'foo' ]" using container`) + } function foo() {} - const func = await container.make(foo) - expectTypeOf(func).toEqualTypeOf<() => void>() - assert.deepEqual(func, foo) + try { + const func = await container.make(foo) + expectTypeOf(func).toEqualTypeOf() + } catch (error) { + assert.equal(error.message, `Cannot construct value "[Function: foo]" using container`) + } + }) + + test('throw error when unable to resolve a binding by name', async ({ assert }) => { + const container = new Container() + + try { + const obj = await container.make('bar') + expectTypeOf(obj).toEqualTypeOf() + } catch (error) { + assert.equal(error.message, `Cannot resolve binding "bar" from the container`) + } + + try { + const obj = await container.make(Symbol('bar')) + expectTypeOf(obj).toEqualTypeOf() + } catch (error) { + assert.equal(error.message, `Cannot resolve binding "Symbol(bar)" from the container`) + } }) test('make instance of a class using the container', async ({ assert }) => { @@ -94,7 +139,7 @@ test.group('Container | Make class', () => { assert.instanceOf(service.db, Database) }) - test('inject non class dependencies as it is', async ({ assert }) => { + test('throw error when injecting non-class values to the constructor', async ({ assert }) => { class UserService { args: any[] @@ -107,11 +152,10 @@ test.group('Container | Make class', () => { } const container = new Container() - const service = await container.make(UserService) - - assert.instanceOf(service, UserService) - expectTypeOf(service).toEqualTypeOf() - assert.deepEqual(service.args, [{ foo: 'bar' }, 1, ['foo'], false, undefined, null, false]) + await assert.rejects( + () => container.make(UserService), + `Cannot construct value "{ foo: 'bar' }" using container` + ) }) test('do not inject constructor dependencies when containerInjections are empty', async ({ @@ -143,15 +187,16 @@ test.group('Container | Make class', () => { const container = new Container() await assert.rejects( () => container.make(UserService), - 'Cannot inject "[Function: String]". The value cannot be constructed' + 'Cannot construct value "[Function: String]" using container' ) }) - test('return primitive constructor as it is', async ({ assert }) => { + test('throw error when constructing primitive values', async ({ assert }) => { const container = new Container() - const stringPrimitive = await container.make(String) - expectTypeOf(stringPrimitive).toEqualTypeOf() - assert.deepEqual(stringPrimitive, String) + await assert.rejects( + () => container.make(String), + 'Cannot construct value "[Function: String]" using container' + ) }) }) diff --git a/tests/container/make_class_via_inject.spec.ts b/tests/container/make_class_via_inject.spec.ts index 9fd8a5a..9f7a940 100644 --- a/tests/container/make_class_via_inject.spec.ts +++ b/tests/container/make_class_via_inject.spec.ts @@ -23,7 +23,7 @@ test.group('Container | Make class via inject', () => { assert.instanceOf(service.db, Database) }) - test('inject primitive values as it is', async ({ assert }) => { + test('throw error when injecting primitive values', async ({ assert }) => { @inject() class UserService { args: any[] @@ -34,11 +34,10 @@ test.group('Container | Make class via inject', () => { } const container = new Container() - const service = await container.make(UserService) - - assert.instanceOf(service, UserService) - expectTypeOf(service).toEqualTypeOf() - assert.deepEqual(service.args, [Array]) + await assert.rejects( + () => container.make(UserService), + 'Cannot construct value "[Function: Array]" using container' + ) }) test('construct nested dependencies', async ({ assert }) => { @@ -187,7 +186,7 @@ test.group('Container | Make class via inject', () => { const container = new Container() await assert.rejects( () => container.make(UserService), - 'Cannot inject "[Function: String]". The value cannot be constructed' + 'Cannot construct value "[Function: String]" using container' ) }) @@ -202,7 +201,7 @@ test.group('Container | Make class via inject', () => { const container = new Container() await assert.rejects( () => container.make(UserService), - 'Cannot inject "[Function: Object]". The value cannot be constructed' + 'Cannot construct value "[Function: Object]" using container' ) }) @@ -217,7 +216,7 @@ test.group('Container | Make class via inject', () => { const container = new Container() await assert.rejects( () => container.make(UserService), - 'Cannot inject "[Function: Object]". The value cannot be constructed' + 'Cannot construct value "[Function: Object]" using container' ) }) }) diff --git a/tests/provider.spec.ts b/tests/provider.spec.ts index 8c90f8f..0aba95d 100644 --- a/tests/provider.spec.ts +++ b/tests/provider.spec.ts @@ -97,6 +97,6 @@ test.group('Provider', () => { await assert.rejects(async () => { await containerProvider(UserService, 'constructor', resolver, [undefined, { foo: 'bar' }]) - }, 'Cannot inject "[Function: String]". The value cannot be constructed') + }, 'Cannot construct value "[Function: String]" using container') }) }) From dbfced793c6e0423f60851823679a4eb7f168c0e Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Sun, 11 Dec 2022 13:30:44 +0530 Subject: [PATCH 063/145] refactor: add more context to raised exception --- src/resolver.ts | 18 +++++++++++++++++- tests/container/call_method.spec.ts | 2 +- tests/container/known_make_class.spec.ts | 4 ++-- tests/container/make_class.spec.ts | 4 ++-- tests/container/make_class_via_inject.spec.ts | 8 ++++---- tests/provider.spec.ts | 2 +- 6 files changed, 27 insertions(+), 11 deletions(-) diff --git a/src/resolver.ts b/src/resolver.ts index 504bcd9..6b1163e 100644 --- a/src/resolver.ts +++ b/src/resolver.ts @@ -109,6 +109,22 @@ export class ContainerResolver> { this.#options = options } + /** + * Raises exception when uanble to construct a data type using + * container. + */ + #disallowUnsupportValues(parent: any, binding: any): never { + if (parent) { + throw new RuntimeException( + `Cannot inject "${inspect(binding)}" in "[class: ${ + parent.name + }]". The value cannot be constructed` + ) + } + + throw new RuntimeException(`Cannot construct value "${inspect(binding)}" using container`) + } + /** * Returns the provider for the class constructor */ @@ -202,7 +218,7 @@ export class ContainerResolver> { * or a symbol. */ if (typeof binding !== 'string' && typeof binding !== 'symbol' && !isAClass) { - throw new RuntimeException(`Cannot construct value "${inspect(binding)}" using container`) + this.#disallowUnsupportValues(parent, binding) } /** diff --git a/tests/container/call_method.spec.ts b/tests/container/call_method.spec.ts index 9aa5080..dc1222f 100644 --- a/tests/container/call_method.spec.ts +++ b/tests/container/call_method.spec.ts @@ -110,7 +110,7 @@ test.group('Container | Call method', () => { const container = new Container() await assert.rejects( () => container.call(new UserService(), 'foo'), - `Cannot construct value "{ foo: 'bar' }" using container` + `Cannot inject "{ foo: 'bar' }" in "[class: UserService]". The value cannot be constructed` ) }) diff --git a/tests/container/known_make_class.spec.ts b/tests/container/known_make_class.spec.ts index 91b7134..1385cf4 100644 --- a/tests/container/known_make_class.spec.ts +++ b/tests/container/known_make_class.spec.ts @@ -154,7 +154,7 @@ test.group('Container | Make class | Known bindings', () => { const container = new Container<{ foo: 'bar' }>() await assert.rejects( () => container.make(UserService), - `Cannot construct value "{ foo: 'bar' }" using container` + `Cannot inject "{ foo: 'bar' }" in "[class: UserService]". The value cannot be constructed` ) }) @@ -187,7 +187,7 @@ test.group('Container | Make class | Known bindings', () => { const container = new Container<{ foo: 'bar' }>() await assert.rejects( () => container.make(UserService), - 'Cannot construct value "[Function: String]" using container' + 'Cannot inject "[Function: String]" in "[class: UserService]". The value cannot be constructed' ) }) diff --git a/tests/container/make_class.spec.ts b/tests/container/make_class.spec.ts index b0fad1c..bfdfba9 100644 --- a/tests/container/make_class.spec.ts +++ b/tests/container/make_class.spec.ts @@ -154,7 +154,7 @@ test.group('Container | Make class', () => { const container = new Container() await assert.rejects( () => container.make(UserService), - `Cannot construct value "{ foo: 'bar' }" using container` + `Cannot inject "{ foo: 'bar' }" in "[class: UserService]". The value cannot be constructed` ) }) @@ -187,7 +187,7 @@ test.group('Container | Make class', () => { const container = new Container() await assert.rejects( () => container.make(UserService), - 'Cannot construct value "[Function: String]" using container' + 'Cannot inject "[Function: String]" in "[class: UserService]". The value cannot be constructed' ) }) diff --git a/tests/container/make_class_via_inject.spec.ts b/tests/container/make_class_via_inject.spec.ts index 9f7a940..5ba677d 100644 --- a/tests/container/make_class_via_inject.spec.ts +++ b/tests/container/make_class_via_inject.spec.ts @@ -36,7 +36,7 @@ test.group('Container | Make class via inject', () => { const container = new Container() await assert.rejects( () => container.make(UserService), - 'Cannot construct value "[Function: Array]" using container' + 'Cannot inject "[Function: Array]" in "[class: UserService]". The value cannot be constructed' ) }) @@ -186,7 +186,7 @@ test.group('Container | Make class via inject', () => { const container = new Container() await assert.rejects( () => container.make(UserService), - 'Cannot construct value "[Function: String]" using container' + 'Cannot inject "[Function: String]" in "[class: UserService]". The value cannot be constructed' ) }) @@ -201,7 +201,7 @@ test.group('Container | Make class via inject', () => { const container = new Container() await assert.rejects( () => container.make(UserService), - 'Cannot construct value "[Function: Object]" using container' + 'Cannot inject "[Function: Object]" in "[class: UserService]". The value cannot be constructed' ) }) @@ -216,7 +216,7 @@ test.group('Container | Make class via inject', () => { const container = new Container() await assert.rejects( () => container.make(UserService), - 'Cannot construct value "[Function: Object]" using container' + 'Cannot inject "[Function: Object]" in "[class: UserService]". The value cannot be constructed' ) }) }) diff --git a/tests/provider.spec.ts b/tests/provider.spec.ts index 0aba95d..5ac5e58 100644 --- a/tests/provider.spec.ts +++ b/tests/provider.spec.ts @@ -97,6 +97,6 @@ test.group('Provider', () => { await assert.rejects(async () => { await containerProvider(UserService, 'constructor', resolver, [undefined, { foo: 'bar' }]) - }, 'Cannot construct value "[Function: String]" using container') + }, 'Cannot inject "[Function: String]" in "[class: UserService]". The value cannot be constructed') }) }) From ae2a50dc4348d7fcc3512c71fd7c94394d0aec6b Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Sun, 11 Dec 2022 13:35:01 +0530 Subject: [PATCH 064/145] refactor: make debug calls more contextual --- src/resolver.ts | 37 +++++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/src/resolver.ts b/src/resolver.ts index 6b1163e..2386a15 100644 --- a/src/resolver.ts +++ b/src/resolver.ts @@ -157,8 +157,6 @@ export class ContainerResolver> { * Notify emitter */ #emit(binding: BindingKey, value: any) { - debug('resolved from container. binding :%O, resolved value :%O', binding, value) - if (!this.#options.emitter) { return } @@ -228,6 +226,10 @@ export class ContainerResolver> { const resolver = this.#containerSwaps.get(binding)! const value = await resolver(this, runtimeValues) + if (debug.enabled) { + debug('resolved swap for binding %O, resolved value :%O', binding, value) + } + await this.#execHooks(binding, value) this.#emit(binding, value) return value @@ -244,6 +246,10 @@ export class ContainerResolver> { if (contextualResolver) { const value = await contextualResolver(this, runtimeValues) + if (debug.enabled) { + debug('resolved using contextual resolver binding %O, resolved value :%O', binding, value) + } + await this.#execHooks(binding, value) this.#emit(binding, value) @@ -255,6 +261,11 @@ export class ContainerResolver> { */ if (this.#bindingValues.has(binding)) { const value = this.#bindingValues.get(binding) + + if (debug.enabled) { + debug('resolved from resolver values %O, resolved value :%O', binding, value) + } + this.#emit(binding, value) return value } @@ -264,6 +275,11 @@ export class ContainerResolver> { */ if (this.#containerBindingValues.has(binding)) { const value = this.#containerBindingValues.get(binding) + + if (debug.enabled) { + debug('resolved from container values %O, resolved value :%O', binding, value) + } + this.#emit(binding, value) return value } @@ -282,6 +298,15 @@ export class ContainerResolver> { this.#containerBindingValues.set(binding, value) } + if (debug.enabled) { + debug( + 'resolved %s %O, resolved value :%O', + isSingleton ? 'singleton' : 'binding', + binding, + value + ) + } + await this.#execHooks(binding, value) this.#emit(binding, value) return value @@ -309,6 +334,10 @@ export class ContainerResolver> { const value = new binding(...dependencies) as Promise> + if (debug.enabled) { + debug('constructed class %O, resolved value :%O', binding, value) + } + await this.#execHooks(binding, value) this.#emit(binding, value) @@ -359,6 +388,10 @@ export class ContainerResolver> { throw new RuntimeException(`Missing method "${String(method)}" on "${inspect(value)}"`) } + if (debug.enabled) { + debug('calling method %s, on value :%O', method, value) + } + const dependencies = await containerProvider(value.constructor, method, this, runtimeValues) return value[method](...dependencies) } From dacf06ad92652f051a3ca2d5441b7bfdcb083bc0 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Sun, 11 Dec 2022 13:39:07 +0530 Subject: [PATCH 065/145] chore(release): 9.6.0-0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 902489b..cbda00b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@adonisjs/fold", - "version": "9.5.0-0", + "version": "9.6.0-0", "description": "Simplest and straight forward implementation for IoC container in JavaScript", "main": "build/index.js", "files": [ From c208bfe7ac27e6aa9442e604e48ed721232f8316 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Mon, 12 Dec 2022 14:35:09 +0530 Subject: [PATCH 066/145] refactor: make singleton callbacks to handle parallel calls The singleton resolvers are wrapped inside a method with promises queue management to ensure all parallel calls receives the same value --- src/container.ts | 8 +- src/deferred_promise.ts | 24 +++ src/helpers.ts | 91 ++++++++- src/resolver.ts | 24 +-- src/types.ts | 5 +- tests/container/bindings.spec.ts | 52 +++++ tests/container/make_class_via_inject.spec.ts | 49 +++++ tests/enqueue.spec.ts | 186 ++++++++++++++++++ 8 files changed, 413 insertions(+), 26 deletions(-) create mode 100644 src/deferred_promise.ts create mode 100644 tests/enqueue.spec.ts diff --git a/src/container.ts b/src/container.ts index 08197f0..99a55a0 100644 --- a/src/container.ts +++ b/src/container.ts @@ -25,7 +25,7 @@ import type { } from './types.js' import debug from './debug.js' -import { isClass } from './helpers.js' +import { enqueue, isClass } from './helpers.js' import { ContainerResolver } from './resolver.js' import { InvalidBindingKeyException } from './exceptions/invalid_binding_key_exception.js' import { ContextBindingsBuilder } from './contextual_bindings_builder.js' @@ -218,7 +218,7 @@ export class Container> { } debug('adding binding to container "%O"', binding) - this.#bindings.set(binding, { resolver, isSingleton: false }) + this.#bindings.set(binding, { resolver }) } /** @@ -299,7 +299,7 @@ export class Container> { } debug('adding singleton to container "%O"', binding) - this.#bindings.set(binding, { resolver, isSingleton: true }) + this.#bindings.set(binding, { resolver: enqueue(resolver) }) } /** @@ -441,6 +441,6 @@ export class Container> { } const parentBindings = this.#contextualBindings.get(parent)! - parentBindings.set(binding, { resolver, isSingleton: false }) + parentBindings.set(binding, { resolver }) } } diff --git a/src/deferred_promise.ts b/src/deferred_promise.ts new file mode 100644 index 0000000..f540049 --- /dev/null +++ b/src/deferred_promise.ts @@ -0,0 +1,24 @@ +/* + * @adonisjs/fold + * + * (c) AdonisJS + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Exports the `resolve` and the reject methods as part of the + * class public API. + * + * It allows resolving and rejecting promises outside of the + * class constructor. + */ +export class Deferred { + resolve!: (value: T | PromiseLike) => void + reject!: (reason?: any) => void + promise: Promise = new Promise((resolve, reject) => { + this.reject = reject + this.resolve = resolve + }) +} diff --git a/src/helpers.ts b/src/helpers.ts index 1d00922..accc38e 100644 --- a/src/helpers.ts +++ b/src/helpers.ts @@ -7,9 +7,11 @@ * file that was distributed with this source code. */ -import type { Constructor } from './types.js' import { RuntimeException } from '@poppinss/utils' +import type { Constructor } from './types.js' +import { Deferred } from './deferred_promise.js' + /** * Type guard and check if value is a class constructor. Plain old * functions are not considered as class constructor. @@ -38,6 +40,93 @@ export async function importDefault(importFn: () => Promise<{ default: any }>) { return moduleExports.default } +/** + * Converts a function to a self contained queue, where each call to + * the function is queued until the first call resolves or rejects. + * + * After the first call, the value is cached and used forever. + */ +export function enqueue(callback: Function) { + /** + * A flag to know if we are in the middleware of computing the + * value. + */ + let isComputingValue = false + + /** + * The computed after the callback resolves + */ + let computedValue: { value?: any; completed: boolean } = { completed: false } + + /** + * The computed error the callback resolves + */ + let computedError: { error?: any; completed: boolean } = { completed: false } + + /** + * The internal queue of deferred promises. + */ + let queue: Deferred[] = [] + + /** + * Resolve pending queue promises + */ + function resolvePromises(value: any) { + isComputingValue = false + computedValue.completed = true + computedValue.value = value + queue.forEach((promise) => promise.resolve(value)) + queue = [] + } + + /** + * Reject pending queue promises + */ + function rejectPromises(error: any) { + isComputingValue = false + computedError.completed = true + computedError.error = error + queue.forEach((promise) => promise.reject(error)) + queue = [] + } + + return async function (...args: any) { + /** + * Already has value + */ + if (computedValue.completed) { + return computedValue.value + } + + /** + * Already ended with error + */ + if (computedError.completed) { + throw computedError.error + } + + /** + * In process, returning a deferred promise + */ + if (isComputingValue) { + const promise = new Deferred() + queue.push(promise) + return promise.promise + } + + isComputingValue = true + + try { + const value = await callback(...args) + resolvePromises(value) + return value + } catch (error) { + rejectPromises(error) + throw error + } + } +} + /** * Dynamically import a module and ensure it has a default export */ diff --git a/src/resolver.ts b/src/resolver.ts index 2386a15..af1d6e2 100644 --- a/src/resolver.ts +++ b/src/resolver.ts @@ -137,7 +137,7 @@ export class ContainerResolver> { * undefined when no contextual binding exists */ #getBindingResolver( - parent: Constructor, + parent: any, binding: string | symbol | AbstractConstructor ): BindingResolver | undefined { const parentBindings = this.#containerContextualBindings.get(parent) @@ -239,10 +239,7 @@ export class ContainerResolver> { * Resolving contextual binding. Contextual bindings have more * priority over bindings or binding values. */ - const contextualResolver = isClass(parent) - ? this.#getBindingResolver(parent, binding) - : undefined - + const contextualResolver = this.#getBindingResolver(parent, binding) if (contextualResolver) { const value = await contextualResolver(this, runtimeValues) @@ -288,27 +285,20 @@ export class ContainerResolver> { * Followed by the CONTAINER bindings */ if (this.#containerBindings.has(binding)) { - const { resolver, isSingleton } = this.#containerBindings.get(binding)! - const value = await resolver(this, runtimeValues) + const { resolver } = this.#containerBindings.get(binding)! /** - * Caching singletons + * Invoke binding resolver to get the value. */ - if (isSingleton) { - this.#containerBindingValues.set(binding, value) - } + const value = await resolver(this, runtimeValues) if (debug.enabled) { - debug( - 'resolved %s %O, resolved value :%O', - isSingleton ? 'singleton' : 'binding', - binding, - value - ) + debug('resolved binding %O, resolved value :%O', binding, value) } await this.#execHooks(binding, value) this.#emit(binding, value) + return value } diff --git a/src/types.ts b/src/types.ts index 69503b0..71585a2 100644 --- a/src/types.ts +++ b/src/types.ts @@ -56,10 +56,7 @@ export type BindingResolver, Value> = ( /** * Shape of the registered bindings */ -export type Bindings = Map< - BindingKey, - { resolver: BindingResolver, any>; isSingleton: boolean } -> +export type Bindings = Map, any> }> /** * Shape of the registered swaps diff --git a/tests/container/bindings.spec.ts b/tests/container/bindings.spec.ts index c39f043..f66e705 100644 --- a/tests/container/bindings.spec.ts +++ b/tests/container/bindings.spec.ts @@ -232,6 +232,58 @@ test.group('Container | Bindings Singleton', () => { assert.isTrue(container.hasBinding(routeSymbol)) assert.isFalse(container.hasBinding('db')) }) + + test('parallel calls to make should resolve the same singleton', async ({ assert }) => { + const container = new Container() + class Route {} + + container.singleton('route', () => { + return new Route() + }) + + const [route, route1] = await Promise.all([container.make('route'), container.make('route')]) + + assert.instanceOf(route, Route) + assert.instanceOf(route1, Route) + assert.strictEqual(route, route1) + }) + + test('fail when parallel calls to singleton fails', async ({ assert }) => { + const container = new Container() + container.singleton('route', () => { + throw new Error('Rejected') + }) + + const results = await Promise.allSettled([container.make('route'), container.make('route')]) + + assert.deepEqual( + results.map((result) => result.status), + ['rejected', 'rejected'] + ) + }) + + test('fail when parallel calls to async singleton fails', async ({ assert }) => { + const container = new Container() + container.singleton('route', async () => { + throw new Error('Rejected') + }) + + const results = await Promise.allSettled([container.make('route'), container.make('route')]) + + assert.deepEqual( + results.map((result) => result.status), + ['rejected', 'rejected'] + ) + }) + + test('fail when single call to async singleton fails', async ({ assert }) => { + const container = new Container() + container.singleton('route', async () => { + throw new Error('Rejected') + }) + + await assert.rejects(() => container.make('route'), 'Rejected') + }) }) test.group('Container | Binding values', () => { diff --git a/tests/container/make_class_via_inject.spec.ts b/tests/container/make_class_via_inject.spec.ts index 5ba677d..77c0778 100644 --- a/tests/container/make_class_via_inject.spec.ts +++ b/tests/container/make_class_via_inject.spec.ts @@ -219,6 +219,55 @@ test.group('Container | Make class via inject', () => { 'Cannot inject "[Function: Object]" in "[class: UserService]". The value cannot be constructed' ) }) + + test('parallel calls to singleton injection should return the same value', async ({ assert }) => { + class Encryption {} + + @inject() + class UserService { + constructor(public encryption: Encryption) {} + } + + const container = new Container() + container.singleton(Encryption, () => new Encryption()) + + const [service, service1] = await Promise.all([ + container.make(UserService), + container.make(UserService), + ]) + + expectTypeOf(service).toEqualTypeOf() + expectTypeOf(service1).toEqualTypeOf() + assert.instanceOf(service, UserService) + assert.instanceOf(service1, UserService) + + assert.notStrictEqual(service1, service) + assert.strictEqual(service1.encryption, service.encryption) + }) + + test('fail when singleton binding resolver fails', async ({ assert }) => { + class Encryption {} + + @inject() + class UserService { + constructor(public encryption: Encryption) {} + } + + const container = new Container() + container.singleton(Encryption, () => { + throw new Error('Cannot resolve') + }) + + const results = await Promise.allSettled([ + container.make(UserService), + container.make(UserService), + ]) + + assert.deepEqual( + results.map((result) => result.status), + ['rejected', 'rejected'] + ) + }) }) test.group('Container | Make class with contextual bindings', () => { diff --git a/tests/enqueue.spec.ts b/tests/enqueue.spec.ts new file mode 100644 index 0000000..2dc5a05 --- /dev/null +++ b/tests/enqueue.spec.ts @@ -0,0 +1,186 @@ +/* + * @adonisjs/fold + * + * (c) AdonisJS + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import { test } from '@japa/runner' +import { enqueue } from '../src/helpers.js' + +test.group('Enqueue', () => { + test('parallel calls should invoke the underlying method once', async ({ assert }) => { + const stack: string[] = [] + const fn = enqueue(() => { + stack.push('invoked') + }) + + await Promise.all([fn(), fn(), fn()]) + assert.deepEqual(stack, ['invoked']) + }) + + test('get return value from the underlying method', async ({ assert }) => { + const fn = enqueue(() => { + return new Date().getTime() + }) + + const times = await Promise.all([fn(), fn(), fn()]) + assert.lengthOf(times, 3) + assert.strictEqual(times[0], times[1]) + assert.strictEqual(times[1], times[2]) + }) + + test('get return value from the async underlying method', async ({ assert }) => { + const fn = enqueue(async () => { + return new Date().getTime() + }) + + const times = await Promise.all([fn(), fn(), fn()]) + assert.lengthOf(times, 3) + assert.strictEqual(times[0], times[1]) + assert.strictEqual(times[1], times[2]) + }) + + test('get error from the underlying method', async ({ assert }) => { + const fn = enqueue(() => { + throw new Error('failed') + }) + + await assert.rejects(() => Promise.all([fn(), fn(), fn()]), 'failed') + }) + + test('get error from the underlying async method', async ({ assert }) => { + const fn = enqueue(async () => { + throw new Error('failed') + }) + + await assert.rejects(() => Promise.all([fn(), fn(), fn()]), 'failed') + }) + + test('get error from all the under method calls', async ({ assert }) => { + const fn = enqueue(() => { + throw new Error('failed') + }) + + const results = await Promise.allSettled([fn(), fn(), fn()]) + assert.deepEqual( + results.map((result) => result.status), + ['rejected', 'rejected', 'rejected'] + ) + }) + + test('get error from all the under async method calls', async ({ assert }) => { + const fn = enqueue(async () => { + throw new Error('failed') + }) + + const results = await Promise.allSettled([fn(), fn(), fn()]) + assert.deepEqual( + results.map((result) => result.status), + ['rejected', 'rejected', 'rejected'] + ) + }) + + test('cache value in multiple sequential calls', async ({ assert }) => { + const fn = enqueue(async () => { + return new Date() + }) + + const date = await fn() + const date1 = await fn() + const date2 = await fn() + assert.strictEqual(date, date1) + assert.strictEqual(date1, date2) + }) + + test('cache error in sequential calls', async ({ assert }) => { + const fn = enqueue(async () => { + throw new Error('failed') + }) + + await assert.rejects(() => fn(), 'failed') + await assert.rejects(() => fn(), 'failed') + await assert.rejects(() => fn(), 'failed') + await assert.rejects(() => fn(), 'failed') + }) + + test('resolve queue promises in the order they are registered', async ({ assert }) => { + const stack: string[] = [] + const fn = enqueue(() => { + stack.push('invoked') + }) + + const firstWrapper = async () => { + await fn() + stack.push('first') + } + + const secondWrapper = async () => { + await fn() + stack.push('second') + } + + const thirdWrapper = async () => { + await fn() + stack.push('third') + } + + await firstWrapper() + await secondWrapper() + await thirdWrapper() + + assert.deepEqual(stack, ['invoked', 'first', 'second', 'third']) + }) + + test('resolve parallel queue promises in the order they are registered', async ({ assert }) => { + const stack: string[] = [] + const fn = enqueue(() => { + stack.push('invoked') + }) + + const firstWrapper = async () => { + await fn() + stack.push('first') + } + + const secondWrapper = async () => { + await fn() + stack.push('second') + } + + const thirdWrapper = async () => { + await fn() + stack.push('third') + } + + await Promise.all([firstWrapper(), secondWrapper(), thirdWrapper()]) + assert.deepEqual(stack, ['invoked', 'first', 'second', 'third']) + }) + + test('resolve parallel queue promises with allSettled', async ({ assert }) => { + const stack: string[] = [] + const fn = enqueue(() => { + stack.push('invoked') + }) + + const firstWrapper = async () => { + await fn() + stack.push('first') + } + + const secondWrapper = async () => { + await fn() + stack.push('second') + } + + const thirdWrapper = async () => { + await fn() + stack.push('third') + } + + await Promise.allSettled([firstWrapper(), secondWrapper(), thirdWrapper()]) + assert.deepEqual(stack, ['invoked', 'first', 'second', 'third']) + }) +}) From 7c56534755fa16e8c630786cdc8cb9f732fcf6ee Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Mon, 12 Dec 2022 14:43:49 +0530 Subject: [PATCH 067/145] chore(release): 9.7.0-0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index cbda00b..b64ec63 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@adonisjs/fold", - "version": "9.6.0-0", + "version": "9.7.0-0", "description": "Simplest and straight forward implementation for IoC container in JavaScript", "main": "build/index.js", "files": [ From 689e3e709bc95ce039444971417699e0c3b8a49e Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Wed, 14 Dec 2022 10:07:42 +0530 Subject: [PATCH 068/145] chore: update dependencies --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b64ec63..d8eecc2 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "@japa/spec-reporter": "^1.3.2", "@swc/core": "^1.3.22", "@types/fs-extra": "^9.0.13", - "@types/node": "^18.11.13", + "@types/node": "^18.11.15", "benchmark": "^2.1.4", "c8": "^7.12.0", "cross-env": "^7.0.3", From 9a61c537a10bd9be06e888d9363847101953e896 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Wed, 14 Dec 2022 10:21:33 +0530 Subject: [PATCH 069/145] feat: add moduleCaller helper --- README.md | 41 ++++++ index.ts | 1 + src/module_caller.ts | 132 ++++++++++++++++++ tests/module_caller/to_callable.spec.ts | 54 +++++++ tests/module_caller/to_handle_method.spec.ts | 54 +++++++ .../module_importer/to_handle_method.spec.ts | 6 +- 6 files changed, 285 insertions(+), 3 deletions(-) create mode 100644 src/module_caller.ts create mode 100644 tests/module_caller/to_callable.spec.ts create mode 100644 tests/module_caller/to_handle_method.spec.ts diff --git a/README.md b/README.md index b663f88..ec26b55 100644 --- a/README.md +++ b/README.md @@ -621,6 +621,47 @@ const resolver = container.createResolver() await handler.handle(resolver, [ctx]) ``` +## Module caller +The module caller is similar to module importer. However, instead of lazy loading a class, you pass the class constructor to this method. + +```ts +import { moduleCaller } from '@adonisjs/fold' + +class AuthMiddleware { + handle() {} +} + +const fn = moduleCaller( + AuthMiddleware, + 'handle' +).toCallable() + +// Later call it +const container = new Container() +const resolver = container.createResolver() +await fn(resolver, [ctx]) +``` + +Create handle method object + +```ts +import { moduleCaller } from '@adonisjs/fold' + +class AuthMiddleware { + handle() {} +} + +const handler = moduleImporter( + AuthMiddleware, + 'handle' +).toHandleMethod() + +// Later call it +const container = new Container() +const resolver = container.createResolver() +await handler.handle(resolver, [ctx]) +``` + [gh-workflow-image]: https://img.shields.io/github/workflow/status/adonisjs/fold/test?style=for-the-badge [gh-workflow-url]: https://github.com/adonisjs/fold/actions/workflows/test.yml 'Github action' [npm-image]: https://img.shields.io/npm/v/@adonisjs/fold/latest.svg?style=for-the-badge&logo=npm diff --git a/index.ts b/index.ts index 417163e..4fdf396 100644 --- a/index.ts +++ b/index.ts @@ -9,6 +9,7 @@ export { Container } from './src/container.js' export { inject } from './src/decorators/inject.js' +export { moduleCaller } from './src/module_caller.js' export { ContainerResolver } from './src/resolver.js' export { moduleImporter } from './src/module_importer.js' export { moduleExpression } from './src/module_expression.js' diff --git a/src/module_caller.ts b/src/module_caller.ts new file mode 100644 index 0000000..c8b8198 --- /dev/null +++ b/src/module_caller.ts @@ -0,0 +1,132 @@ +/* + * @adonisjs/fold + * + * (c) AdonisJS + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import { Container } from './container.js' +import { ContainerResolver } from './resolver.js' +import type { ModuleHandler, ModuleCallable, Constructor } from './types.js' + +/** + * The moduleCaller works around a very specific pattern we use with + * AdonisJS, ie to constructor classes and call methods using the + * container. + * + * For example: Controllers of AdonisJS allows defining a controller + * as follows + * + * ```ts + * route.get('/', [HomeController, 'index']) + * ``` + * + * Behind the scenes, we have to run following operations in order to call the + * handle method on the defined middleware. + * + * - Create an instance of the controller class using the container. + * - Call the method using the container. Hence having the ability to use + * DI + */ +export function moduleCaller(target: Constructor, method: string) { + return { + /** + * Converts the class reference to a callable function. Invoking this method + * internally creates a new instance of the class using the container and + * invokes the method using the container. + * + * You can create a callable function using the container instance as shown below + * + * ```ts + * const fn = moduleCaller(HomeController, 'handle') + * .toCallable(container) + * + * // Call the function and pass context to it + * await fn(ctx) + * ``` + * + * Another option is to not pass the container at the time of creating + * the callable function, but instead pass a resolver instance at + * the time of calling the function + * + * ```ts + * const fn = moduleCaller(HomeController, 'handle') + * .toCallable() + * + * // Call the function and pass context to it + * const resolver = container.createResolver() + * await fn(resolver, ctx) + * ``` + */ + toCallable< + T extends Container | ContainerResolver | undefined = undefined, + Args extends any[] = any[] + >(container?: T): ModuleCallable { + /** + * When container defined at the time of the calling this function, + * we will use it to inside the return function + */ + if (container) { + return async function (...args: Args) { + return container.call(await container.make(target), method, args) + } as ModuleCallable + } + + /** + * Otherwise the return function asks for the resolver or container + */ + return async function (resolver: ContainerResolver | Container, ...args: Args) { + return resolver.call(await resolver.make(target), method, args) + } as ModuleCallable + }, + + /** + * Converts the class reference to an object with handle method. Invoking this + * method internally creates a new instance of the class using the container + * and invokes the method using the container. + * + * You can create a handle method object using the container instance as shown below + * + * ```ts + * const handler = moduleCaller(HomeController, 'handle') + * .toHandleMethod(container) + * + * // Call the function and pass context to it + * await handler.handle(ctx) + * ``` + * + * Another option is to not pass the container at the time of creating + * the handle method object, but instead pass a resolver instance at + * the time of calling the function + * + * ```ts + * const handler = moduleCaller(HomeController, 'handle') + * .toHandleMethod() + * + * // Call the function and pass context to it + * const resolver = container.createResolver() + * await handler.handle(resolver, ctx) + * ``` + */ + toHandleMethod< + T extends Container | ContainerResolver | undefined = undefined, + Args extends any[] = any[] + >(container?: T): ModuleHandler { + if (container) { + return { + async handle(...args: Args) { + return container.call(await container.make(target), method, args) + }, + } as ModuleHandler + } + + return { + async handle(resolver: ContainerResolver | Container, ...args: Args) { + return resolver.call(await resolver.make(target), method, args) + }, + } as ModuleHandler + }, + } +} diff --git a/tests/module_caller/to_callable.spec.ts b/tests/module_caller/to_callable.spec.ts new file mode 100644 index 0000000..99d0b4a --- /dev/null +++ b/tests/module_caller/to_callable.spec.ts @@ -0,0 +1,54 @@ +/* + * @adonisjs/fold + * + * (c) AdonisJS + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import { test } from '@japa/runner' + +import { Container } from '../../src/container.js' +import { moduleCaller } from '../../src/module_caller.js' +import { ContainerResolver } from '../../src/resolver.js' + +test.group('moduleCaller | toCallable', () => { + test('make callable from module caller', async ({ assert }) => { + class HomeController {} + assert.isFunction(moduleCaller(HomeController, 'handle').toCallable()) + }) + + test('pass fixed container instance to the callable', async ({ assert }) => { + class HomeController { + handle(args: string[]) { + args.push('invoked') + } + } + + const args: string[] = [] + const container = new Container() + + const fn = moduleCaller(HomeController, 'handle').toCallable(container) + await fn(args) + assert.deepEqual(args, ['invoked']) + }) + + test('pass runtime resolver to the callable', async ({ assert }) => { + class HomeController { + async handle(resolver: ContainerResolver) { + const args = await resolver.make('args') + args.push('invoked') + } + } + + const container = new Container() + const resolver = container.createResolver() + resolver.bindValue('args', []) + + const fn = moduleCaller(HomeController, 'handle').toCallable() + + await fn(resolver, resolver) + assert.deepEqual(await resolver.make('args'), ['invoked']) + }) +}) diff --git a/tests/module_caller/to_handle_method.spec.ts b/tests/module_caller/to_handle_method.spec.ts new file mode 100644 index 0000000..bac2f59 --- /dev/null +++ b/tests/module_caller/to_handle_method.spec.ts @@ -0,0 +1,54 @@ +/* + * @adonisjs/fold + * + * (c) AdonisJS + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import { test } from '@japa/runner' + +import { Container } from '../../src/container.js' +import { moduleCaller } from '../../src/module_caller.js' +import { ContainerResolver } from '../../src/resolver.js' + +test.group('moduleCaller | toHandleMethod', () => { + test('make handle method object from module caller', async ({ assert }) => { + class HomeController {} + assert.isFunction(moduleCaller(HomeController, 'handle').toHandleMethod().handle) + }) + + test('pass fixed container instance to the handle method object', async ({ assert }) => { + class HomeController { + handle(args: string[]) { + args.push('invoked') + } + } + + const args: string[] = [] + const container = new Container() + + const handler = moduleCaller(HomeController, 'handle').toHandleMethod(container) + await handler.handle(args) + assert.deepEqual(args, ['invoked']) + }) + + test('pass runtime resolver to the handle method object', async ({ assert }) => { + class HomeController { + async handle(resolver: ContainerResolver) { + const args = await resolver.make('args') + args.push('invoked') + } + } + + const container = new Container() + const resolver = container.createResolver() + resolver.bindValue('args', []) + + const handler = moduleCaller(HomeController, 'handle').toHandleMethod() + + await handler.handle(resolver, resolver) + assert.deepEqual(await resolver.make('args'), ['invoked']) + }) +}) diff --git a/tests/module_importer/to_handle_method.spec.ts b/tests/module_importer/to_handle_method.spec.ts index 7568966..210a18e 100644 --- a/tests/module_importer/to_handle_method.spec.ts +++ b/tests/module_importer/to_handle_method.spec.ts @@ -22,14 +22,14 @@ test.group('moduleImporter | toHandleMethod', (group) => { return () => remove(BASE_PATH) }) - test('make callable from module importer', async ({ assert }) => { + test('make handle method object from module importer', async ({ assert }) => { assert.isFunction( // @ts-expect-error moduleImporter(() => import('#middleware/auth'), 'handle').toHandleMethod().handle ) }) - test('pass fixed container instance to the callable', async ({ assert }) => { + test('pass fixed container instance to the handle method object', async ({ assert }) => { await outputFile( join(BASE_PATH, 'middleware/silent_auth_v3.ts'), ` @@ -54,7 +54,7 @@ test.group('moduleImporter | toHandleMethod', (group) => { assert.deepEqual(args, ['invoked']) }) - test('pass runtime resolver to the callable', async ({ assert }) => { + test('pass runtime resolver to the handle method object', async ({ assert }) => { await outputFile( join(BASE_PATH, 'middleware/silent_auth_v4.ts'), ` From 48c7c3924b30955b70e759702c8bb38ddf27e236 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Wed, 14 Dec 2022 10:27:41 +0530 Subject: [PATCH 070/145] chore(release): 9.8.0-0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d8eecc2..c30ee20 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@adonisjs/fold", - "version": "9.7.0-0", + "version": "9.8.0-0", "description": "Simplest and straight forward implementation for IoC container in JavaScript", "main": "build/index.js", "files": [ From 3765e3dd14dd7e0f7878e380f938b2c110db558a Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Wed, 14 Dec 2022 12:44:52 +0530 Subject: [PATCH 071/145] feat: add support for aliases --- README.md | 17 +++ src/container.ts | 43 +++++- src/exceptions/invalid_alias_key_exception.ts | 16 +++ src/resolver.ts | 23 ++++ tests/container/bindings.spec.ts | 85 ++++++++++++ tests/container/known_bindings.spec.ts | 126 ++++++++++++++++++ 6 files changed, 308 insertions(+), 2 deletions(-) create mode 100644 src/exceptions/invalid_alias_key_exception.ts diff --git a/README.md b/README.md index ec26b55..ae5224a 100644 --- a/README.md +++ b/README.md @@ -264,6 +264,23 @@ resolver.bindValue(Request, req) await resolve.make(SomeClass) ``` +## Aliases +Container aliases allows defining aliases for an existing binding. The alias should be either a `string` or a `symbol`. + +```ts +container.singleton(Database, () => { + return new Database() +}) + +container.alias('db', Database) + +/** + * Make using the alias + */ +const db = await container.make('db') +assert.instanceOf(db, Database) +``` + ## Contextual bindings Contextual bindings allows you to register custom dependency resolvers on a given class for a specific dependency. You will be mostly using contextual bindings with driver based implementations. diff --git a/src/container.ts b/src/container.ts index 99a55a0..9e60948 100644 --- a/src/container.ts +++ b/src/container.ts @@ -27,8 +27,9 @@ import type { import debug from './debug.js' import { enqueue, isClass } from './helpers.js' import { ContainerResolver } from './resolver.js' -import { InvalidBindingKeyException } from './exceptions/invalid_binding_key_exception.js' import { ContextBindingsBuilder } from './contextual_bindings_builder.js' +import { InvalidAliasKeyException } from './exceptions/invalid_alias_key_exception.js' +import { InvalidBindingKeyException } from './exceptions/invalid_binding_key_exception.js' /** * The container class exposes the API to register bindings, values @@ -49,6 +50,12 @@ import { ContextBindingsBuilder } from './contextual_bindings_builder.js' * ``` */ export class Container> { + /** + * A set of defined aliases for the bindings + */ + #aliases: Map, keyof KnownBindings | AbstractConstructor> = + new Map() + /** * Contextual bindings are same as binding, but instead defined * for a parent class constructor. @@ -108,6 +115,7 @@ export class Container> { bindingValues: this.#bindingValues, swaps: this.#swaps, hooks: this.#hooks, + aliases: this.#aliases, contextualBindings: this.#contextualBindings, }, this.#options @@ -119,8 +127,11 @@ export class Container> { * "bind", the "singleton", or the "bindValue" methods. */ hasBinding(binding: Binding): boolean + hasBinding(binding: BindingKey): boolean hasBinding(binding: BindingKey): boolean { - return this.#bindingValues.has(binding) || this.#bindings.has(binding) + return ( + this.#aliases.has(binding) || this.#bindingValues.has(binding) || this.#bindings.has(binding) + ) } /** @@ -128,6 +139,7 @@ export class Container> { * "bind", the "singleton", or the "bindValue" methods. */ hasAllBindings(bindings: Binding[]): boolean + hasAllBindings(binding: BindingKey[]): boolean hasAllBindings(bindings: BindingKey[]): boolean { return bindings.every((binding) => this.hasBinding(binding)) } @@ -172,6 +184,33 @@ export class Container> { return this.createResolver().call(value, method, runtimeValues) } + alias( + /** + * An alias must always be defined as a string or a symbol. Classes cannot be + * aliases + */ + alias: Alias extends string | symbol ? Alias : never, + + /** + * The value should either be the constructor point to the alias value + * or reference to binding that has the same value as the alias + */ + value: + | AbstractConstructor + | Exclude< + { + [K in keyof KnownBindings]: KnownBindings[K] extends KnownBindings[Alias] ? K : never + }[keyof KnownBindings], + Alias + > + ): void { + if (typeof alias !== 'string' && typeof alias !== 'symbol') { + throw new InvalidAliasKeyException() + } + + this.#aliases.set(alias, value) + } + /** * Register a binding inside the container. The method receives a * key-value pair. diff --git a/src/exceptions/invalid_alias_key_exception.ts b/src/exceptions/invalid_alias_key_exception.ts new file mode 100644 index 0000000..1be36e0 --- /dev/null +++ b/src/exceptions/invalid_alias_key_exception.ts @@ -0,0 +1,16 @@ +/* + * @adonisjs/fold + * + * (c) AdonisJS + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import { Exception } from '@poppinss/utils' + +export class InvalidAliasKeyException extends Exception { + static code = 'E_INVALID_ALIAS_KEY' + static status = 500 + static message = 'The container alias key must be of type "string" or "symbol"' +} diff --git a/src/resolver.ts b/src/resolver.ts index af1d6e2..30141bf 100644 --- a/src/resolver.ts +++ b/src/resolver.ts @@ -43,6 +43,17 @@ import { InvalidBindingKeyException } from './exceptions/invalid_binding_key_exc * ``` */ export class ContainerResolver> { + /** + * Reference to the container aliases. They are shared between the container + * and resolver. + * + * We do not mutate this property within the resolver + */ + #containerAliases: Map< + Partial, + keyof KnownBindings | AbstractConstructor + > + /** * Pre-registered contextual bindings. They are shared between the container * and resolver. @@ -97,6 +108,7 @@ export class ContainerResolver> { bindingValues: BindingValues swaps: Swaps hooks: Hooks + aliases: Map, keyof KnownBindings | AbstractConstructor> contextualBindings: Map, Bindings> }, options: ContainerOptions @@ -105,6 +117,7 @@ export class ContainerResolver> { this.#containerBindingValues = container.bindingValues this.#containerSwaps = container.swaps this.#containerHooks = container.hooks + this.#containerAliases = container.aliases this.#containerContextualBindings = container.contextualBindings this.#options = options } @@ -182,8 +195,10 @@ export class ContainerResolver> { * "bind", the "singleton", or the "bindValue" methods. */ hasBinding(binding: Binding): boolean + hasBinding(binding: BindingKey): boolean hasBinding(binding: BindingKey): boolean { return ( + this.#containerAliases.has(binding) || this.#bindingValues.has(binding) || this.#containerBindingValues.has(binding) || this.#containerBindings.has(binding) @@ -195,6 +210,7 @@ export class ContainerResolver> { * "bind", the "singleton", or the "bindValue" methods. */ hasAllBindings(bindings: Binding[]): boolean + hasAllBindings(bindings: BindingKey[]): boolean hasAllBindings(bindings: BindingKey[]): boolean { return bindings.every((binding) => this.hasBinding(binding)) } @@ -357,6 +373,13 @@ export class ContainerResolver> { ): Promise> make(binding: Binding, runtimeValues?: any[]): Promise> async make(binding: Binding, runtimeValues?: any[]): Promise> { + /** + * Make alias + */ + if (this.#containerAliases.has(binding)) { + return this.resolveFor(null, this.#containerAliases.get(binding), runtimeValues) + } + return this.resolveFor(null, binding, runtimeValues) } diff --git a/tests/container/bindings.spec.ts b/tests/container/bindings.spec.ts index f66e705..8b825b0 100644 --- a/tests/container/bindings.spec.ts +++ b/tests/container/bindings.spec.ts @@ -457,3 +457,88 @@ test.group('Container | Contextual Bindings', () => { ) }) }) + +test.group('Container | Aliases', () => { + test('register an alias that point to an existing binding', async ({ assert }) => { + const container = new Container() + class Route {} + + container.bind('route', () => { + return new Route() + }) + container.alias('adonisjs.route', 'route') + + const route = await container.make('adonisjs.route') + expectTypeOf(route).toBeAny() + assert.instanceOf(route, Route) + }) + + test('use symbol for the alias name', async ({ assert }) => { + const container = new Container() + class Route {} + + container.bind('route', () => { + return new Route() + }) + container.alias(Symbol.for('adonisjs.route'), 'route') + + const route = await container.make(Symbol.for('adonisjs.route')) + expectTypeOf(route).toBeAny() + assert.instanceOf(route, Route) + }) + + test('disallow values other than string or symbol for the alias name', async ({ assert }) => { + const container = new Container() + + assert.throws( + // @ts-expect-error + () => container.alias(1, 'router'), + 'The container alias key must be of type "string" or "symbol"' + ) + + assert.throws( + // @ts-expect-error + () => container.alias([], 'router'), + 'The container alias key must be of type "string" or "symbol"' + ) + + assert.throws( + // @ts-expect-error + () => container.alias({}, 'router'), + 'The container alias key must be of type "string" or "symbol"' + ) + }) + + test('return true from hasBinding when checking for alias', async ({ assert }) => { + const container = new Container() + class Route {} + + const routeSymbol = Symbol('route') + + container.bind(Route, () => new Route()) + container.bind('route', () => new Route()) + container.bind(routeSymbol, () => new Route()) + container.alias('adonisjs.router', 'route') + + assert.isTrue(container.hasBinding(Route)) + assert.isTrue(container.hasBinding('route')) + assert.isTrue(container.hasBinding(routeSymbol)) + assert.isTrue(container.hasBinding('adonisjs.router')) + assert.isFalse(container.hasBinding('db')) + }) + + test('return true from hasAllBindings when checking for alias', async ({ assert }) => { + const container = new Container() + class Route {} + + const routeSymbol = Symbol('route') + + container.bind(Route, () => new Route()) + container.bind('route', () => new Route()) + container.bind(routeSymbol, () => new Route()) + container.alias('adonisjs.router', 'route') + + assert.isTrue(container.hasAllBindings([Route, 'route', routeSymbol, 'adonisjs.router'])) + assert.isFalse(container.hasAllBindings([Route, 'db', routeSymbol])) + }) +}) diff --git a/tests/container/known_bindings.spec.ts b/tests/container/known_bindings.spec.ts index 9564e86..c18cfeb 100644 --- a/tests/container/known_bindings.spec.ts +++ b/tests/container/known_bindings.spec.ts @@ -241,3 +241,129 @@ test.group('Container | Binding values', () => { assert.strictEqual(route, route1) }) }) + +test.group('Container | Aliases', () => { + test('register an alias that point to an existing binding', async ({ assert }) => { + const container = new Container<{ 'route': Route; 'adonisjs.route': Route; 'foo': Foo }>() + + class Route { + makeUrl() {} + } + class Foo {} + + container.bind('route', () => { + return new Route() + }) + // @ts-expect-error + container.alias('adonisjs.route', 'foo') + container.alias('adonisjs.route', 'route') + + const route = await container.make('adonisjs.route') + expectTypeOf(route).toEqualTypeOf() + assert.instanceOf(route, Route) + }) + + test('use symbol for the alias name', async ({ assert }) => { + const aliasSymbol = Symbol('adonisjs.route') + const container = new Container<{ route: Route; [aliasSymbol]: Route }>() + class Route { + makeUrl() {} + } + + container.bind('route', () => { + return new Route() + }) + + container.alias(aliasSymbol, 'route') + + const route = await container.make(aliasSymbol) + expectTypeOf(route).toEqualTypeOf() + assert.instanceOf(route, Route) + }) + + test('make alias point to class constructor', async ({ assert }) => { + const container = new Container<{ 'adonisjs.route': Route }>() + class Route { + makeUrl() {} + } + class Foo {} + + container.bind(Route, () => { + return new Route() + }) + + // @ts-expect-error + container.alias('adonisjs.route', Foo) + container.alias('adonisjs.route', Route) + + const route = await container.make('adonisjs.route') + expectTypeOf(route).toEqualTypeOf() + assert.instanceOf(route, Route) + }) + + test('disallow values other than string or symbol for the alias name', async ({ assert }) => { + const container = new Container<{ 'route': Route; 'adonisjs.route': Route }>() + class Route { + makeUrl() {} + } + + assert.throws( + // @ts-expect-error + () => container.alias(1, 'route'), + 'The container alias key must be of type "string" or "symbol"' + ) + + assert.throws( + // @ts-expect-error + () => container.alias([], 'route'), + 'The container alias key must be of type "string" or "symbol"' + ) + + assert.throws( + // @ts-expect-error + () => container.alias({}, 'route'), + 'The container alias key must be of type "string" or "symbol"' + ) + }) + + test('return true from hasBinding when checking for alias', async ({ assert }) => { + const routeSymbol = Symbol('route') + + const container = new Container<{ + [routeSymbol]: Route + 'route': Route + 'adonisjs.router': Route + }>() + class Route {} + + container.bind(Route, () => new Route()) + container.bind('route', () => new Route()) + container.bind(routeSymbol, () => new Route()) + container.alias('adonisjs.router', 'route') + + assert.isTrue(container.hasBinding(Route)) + assert.isTrue(container.hasBinding('route')) + assert.isTrue(container.hasBinding(routeSymbol)) + assert.isTrue(container.hasBinding('adonisjs.router')) + assert.isFalse(container.hasBinding('db')) + }) + + test('return true from hasAllBindings when checking for alias', async ({ assert }) => { + const routeSymbol = Symbol('route') + + const container = new Container<{ + [routeSymbol]: Route + 'route': Route + 'adonisjs.router': Route + }>() + class Route {} + + container.bind(Route, () => new Route()) + container.bind('route', () => new Route()) + container.bind(routeSymbol, () => new Route()) + container.alias('adonisjs.router', 'route') + + assert.isTrue(container.hasAllBindings([Route, 'route', routeSymbol, 'adonisjs.router'])) + assert.isFalse(container.hasAllBindings([Route, 'db', routeSymbol])) + }) +}) From 9d5532c4052cfa28b3af2d5ad70a922a994865dd Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Wed, 14 Dec 2022 13:08:53 +0530 Subject: [PATCH 072/145] refactor: simplify implemention of swaps and contextual bindings --- src/container.ts | 41 +++----- src/resolver.ts | 24 +++-- src/types.ts | 10 +- tests/container/swap.spec.ts | 183 +++++++++++++++++------------------ 4 files changed, 126 insertions(+), 132 deletions(-) diff --git a/src/container.ts b/src/container.ts index 9e60948..f1415c0 100644 --- a/src/container.ts +++ b/src/container.ts @@ -22,6 +22,7 @@ import type { ExtractFunctions, ContainerOptions, AbstractConstructor, + ContextualBindings, } from './types.js' import debug from './debug.js' @@ -59,11 +60,17 @@ export class Container> { /** * Contextual bindings are same as binding, but instead defined * for a parent class constructor. + * + * The contextual bindings can only be registered for class constructors, because + * that is what gets injected to the class. */ - #contextualBindings: Map, Bindings> = new Map() + #contextualBindings: Map, ContextualBindings> = new Map() /** - * A collection of bindings with registered swapped implementations + * A collection of bindings with registered swapped implementations. Swaps can only + * be define for a class, because the goal is swap the dependency tree defined + * using the Inject decorator and inject decorator does not take anything + * other than a class. */ #swaps: Swaps = new Map() @@ -346,30 +353,12 @@ export class Container> { * Fakes have the highest priority when resolving dependencies * from the container. */ - swap( - /** - * Need to narrow down the "Binding" for the case where "KnownBindings" are - */ - binding: Binding extends string | symbol ? Binding : never, - resolver: BindingResolver - ): void swap>( binding: Binding, resolver: BindingResolver> - ): void - swap( - binding: Binding, - resolver: BindingResolver< - KnownBindings, - Binding extends AbstractConstructor - ? A - : Binding extends keyof KnownBindings - ? KnownBindings[Binding] - : never - > ): void { - if (typeof binding !== 'string' && typeof binding !== 'symbol' && !isClass(binding)) { - throw new InvalidBindingKeyException() + if (!isClass(binding)) { + throw new RuntimeException('The binding value for a swap should be a class') } debug('defining swap for "%O"', binding) @@ -379,9 +368,9 @@ export class Container> { /** * Restore binding by removing its swap */ - restore(binding: keyof KnownBindings | AbstractConstructor) { - if (typeof binding !== 'string' && typeof binding !== 'symbol' && !isClass(binding)) { - throw new InvalidBindingKeyException() + restore(binding: AbstractConstructor) { + if (!isClass(binding)) { + throw new RuntimeException('The binding value for a restore should be a class') } debug('removing swap for "%s"', binding) @@ -392,7 +381,7 @@ export class Container> { * Restore mentioned or all bindings by removing * their swaps */ - restoreAll(bindings?: (keyof KnownBindings | AbstractConstructor)[]) { + restoreAll(bindings?: AbstractConstructor[]) { if (!bindings) { debug('removing all swaps') this.#swaps.clear() diff --git a/src/resolver.ts b/src/resolver.ts index 30141bf..0276e93 100644 --- a/src/resolver.ts +++ b/src/resolver.ts @@ -15,14 +15,15 @@ import type { Hooks, Swaps, Bindings, + BindingKey, Constructor, BindingValues, + BindingResolver, ExtractFunctions, ContainerOptions, - InspectableConstructor, - BindingResolver, + ContextualBindings, AbstractConstructor, - BindingKey, + InspectableConstructor, } from './types.js' import debug from './debug.js' import { isClass } from './helpers.js' @@ -60,7 +61,7 @@ export class ContainerResolver> { * * We do not mutate this property within the resolver */ - #containerContextualBindings: Map, Bindings> + #containerContextualBindings: Map, ContextualBindings> /** * Pre-registered bindings. They are shared between the container @@ -109,7 +110,7 @@ export class ContainerResolver> { swaps: Swaps hooks: Hooks aliases: Map, keyof KnownBindings | AbstractConstructor> - contextualBindings: Map, Bindings> + contextualBindings: Map, ContextualBindings> }, options: ContainerOptions ) { @@ -151,7 +152,7 @@ export class ContainerResolver> { */ #getBindingResolver( parent: any, - binding: string | symbol | AbstractConstructor + binding: AbstractConstructor ): BindingResolver | undefined { const parentBindings = this.#containerContextualBindings.get(parent) if (!parentBindings) { @@ -236,9 +237,10 @@ export class ContainerResolver> { } /** - * Entertain swaps with highest priority. + * Entertain swaps with highest priority. The swaps can only exists for + * class constructors. */ - if (this.#containerSwaps.has(binding)) { + if (isAClass && this.#containerSwaps.has(binding)) { const resolver = this.#containerSwaps.get(binding)! const value = await resolver(this, runtimeValues) @@ -246,6 +248,10 @@ export class ContainerResolver> { debug('resolved swap for binding %O, resolved value :%O', binding, value) } + /** + * Executing hooks and emitting events for the swaps is + * debatable for now + */ await this.#execHooks(binding, value) this.#emit(binding, value) return value @@ -255,7 +261,7 @@ export class ContainerResolver> { * Resolving contextual binding. Contextual bindings have more * priority over bindings or binding values. */ - const contextualResolver = this.#getBindingResolver(parent, binding) + const contextualResolver = isAClass && this.#getBindingResolver(parent, binding) if (contextualResolver) { const value = await contextualResolver(this, runtimeValues) diff --git a/src/types.ts b/src/types.ts index 71585a2..b3266d5 100644 --- a/src/types.ts +++ b/src/types.ts @@ -58,10 +58,18 @@ export type BindingResolver, Value> = ( */ export type Bindings = Map, any> }> +/** + * Shape of the registered contextual bindings + */ +export type ContextualBindings = Map< + AbstractConstructor, + { resolver: BindingResolver, any> } +> + /** * Shape of the registered swaps */ -export type Swaps = Map, any>> +export type Swaps = Map, BindingResolver, any>> /** * Shape of the registered binding values diff --git a/tests/container/swap.spec.ts b/tests/container/swap.spec.ts index 8f21714..4ec3fd2 100644 --- a/tests/container/swap.spec.ts +++ b/tests/container/swap.spec.ts @@ -105,138 +105,129 @@ test.group('Container | swap', () => { assert.deepEqual(user1, { id: 1, username: 'virk' }) }) - test('swap a binding', async ({ assert }) => { - const container = new Container<{ route: Route }>() - class Route {} - class FakedRoute extends Route {} + test('restore multiple implementations', async ({ assert }) => { + class UserService { + get() { + return { + id: 1, + username: 'virk', + } + } + } - container.bind('route', () => { - return new Route() - }) + class UsersController { + constructor() {} + + @inject() + show(user: UserService) { + return user.get() + } + } + + class FakedUserService extends UserService { + get() { + return { + id: 1, + username: 'faked-virk', + } + } + } - container.swap('route', () => { - return new FakedRoute() + const container = new Container() + container.swap(UserService, () => { + return new FakedUserService() }) - const route = await container.make('route') - expectTypeOf(route).toEqualTypeOf() + const controller = await container.make(UsersController) + expectTypeOf(controller).toEqualTypeOf() - assert.instanceOf(route, Route) - assert.instanceOf(route, FakedRoute) + const user = await container.call(controller, 'show') + expectTypeOf(user).toEqualTypeOf<{ id: number; username: string }>() + assert.deepEqual(user, { id: 1, username: 'faked-virk' }) + + container.restoreAll([UserService]) + + const user1 = await container.call(controller, 'show') + expectTypeOf(user1).toEqualTypeOf<{ id: number; username: string }>() + assert.deepEqual(user1, { id: 1, username: 'virk' }) }) - test('restore swapped binding', async ({ assert }) => { - const container = new Container<{ route: Route }>() - class Route {} - class FakedRoute extends Route {} + test('restore all implementations', async ({ assert }) => { + class UserService { + get() { + return { + id: 1, + username: 'virk', + } + } + } - container.bind('route', () => { - return new Route() - }) + class UsersController { + constructor() {} - container.swap('route', () => { - return new FakedRoute() + @inject() + show(user: UserService) { + return user.get() + } + } + + class FakedUserService extends UserService { + get() { + return { + id: 1, + username: 'faked-virk', + } + } + } + + const container = new Container() + container.swap(UserService, () => { + return new FakedUserService() }) - const route = await container.make('route') - expectTypeOf(route).toEqualTypeOf() + const controller = await container.make(UsersController) + expectTypeOf(controller).toEqualTypeOf() - assert.instanceOf(route, Route) - assert.instanceOf(route, FakedRoute) + const user = await container.call(controller, 'show') + expectTypeOf(user).toEqualTypeOf<{ id: number; username: string }>() + assert.deepEqual(user, { id: 1, username: 'faked-virk' }) container.restoreAll() - const route1 = await container.make('route') - expectTypeOf(route1).toEqualTypeOf() - - assert.instanceOf(route1, Route) - assert.notInstanceOf(route1, FakedRoute) + const user1 = await container.call(controller, 'show') + expectTypeOf(user1).toEqualTypeOf<{ id: number; username: string }>() + assert.deepEqual(user1, { id: 1, username: 'virk' }) }) - test('disallow swap names other than string symbol or class constructor', async ({ assert }) => { + test('disallow swap names other than class constructor', async ({ assert }) => { const container = new Container() assert.throws( // @ts-expect-error () => container.swap(1, () => {}), - 'The container binding key must be of type "string", "symbol", or a "class constructor"' + 'The binding value for a swap should be a class' ) assert.throws( // @ts-expect-error () => container.swap([], () => {}), - 'The container binding key must be of type "string", "symbol", or a "class constructor"' + 'The binding value for a swap should be a class' ) assert.throws( // @ts-expect-error () => container.swap({}, () => {}), - 'The container binding key must be of type "string", "symbol", or a "class constructor"' + 'The binding value for a swap should be a class' ) - assert.throws( - () => container.restore(1), - 'The container binding key must be of type "string", "symbol", or a "class constructor"' - ) - - assert.throws( - () => container.restore([]), - 'The container binding key must be of type "string", "symbol", or a "class constructor"' - ) - - assert.throws( - () => container.restore({}), - 'The container binding key must be of type "string", "symbol", or a "class constructor"' - ) - }) - - test('restore multiple swapped bindings', async ({ assert }) => { - const container = new Container<{ route: Route; route1: Route }>() - class Route {} - class FakedRoute extends Route {} - - container.bind('route', () => { - return new Route() - }) - container.bind('route1', () => { - return new Route() - }) - - container.swap('route', () => { - return new FakedRoute() - }) - container.swap('route1', () => { - return new FakedRoute() - }) - - const route = await container.make('route') - expectTypeOf(route).toEqualTypeOf() - - assert.instanceOf(route, Route) - assert.instanceOf(route, FakedRoute) - - const route1 = await container.make('route1') - expectTypeOf(route1).toEqualTypeOf() - - assert.instanceOf(route1, Route) - assert.instanceOf(route1, FakedRoute) - - /** - * Restoring multiple - */ - container.restoreAll(['route', 'route1']) - - const route2 = await container.make('route') - expectTypeOf(route2).toEqualTypeOf() - - assert.instanceOf(route2, Route) - assert.notInstanceOf(route2, FakedRoute) + // @ts-expect-error + assert.throws(() => container.restore(1), 'The binding value for a restore should be a class') - const route3 = await container.make('route1') - expectTypeOf(route3).toEqualTypeOf() + // @ts-expect-error + assert.throws(() => container.restore([]), 'The binding value for a restore should be a class') - assert.instanceOf(route3, Route) - assert.notInstanceOf(route3, FakedRoute) + // @ts-expect-error + assert.throws(() => container.restore({}), 'The binding value for a restore should be a class') }) test('use swap over contextual binding', async ({ assert }) => { From 6853f39b1031230f1dd35aa77b8b535e8dce5ff5 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Wed, 14 Dec 2022 13:15:59 +0530 Subject: [PATCH 073/145] refactor: ensure hooks can be defined on both aliases and the bindings --- src/container.ts | 2 + tests/container/hooks.spec.ts | 74 ++++++++++++++++++++++++++++++++++- 2 files changed, 75 insertions(+), 1 deletion(-) diff --git a/src/container.ts b/src/container.ts index f1415c0..452df50 100644 --- a/src/container.ts +++ b/src/container.ts @@ -422,6 +422,8 @@ export class Container> { ? HookCallback : never ): void { + binding = (this.#aliases.get(binding) as Binding) || binding + if (!this.#hooks.has(binding)) { this.#hooks.set(binding, new Set()) } diff --git a/tests/container/hooks.spec.ts b/tests/container/hooks.spec.ts index e222a10..5f3051e 100644 --- a/tests/container/hooks.spec.ts +++ b/tests/container/hooks.spec.ts @@ -5,7 +5,7 @@ import { expectTypeOf } from 'expect-type' import { Container } from '../../src/container.js' test.group('Container | Hooks', () => { - test('run hook when a binding a resolved', async ({ assert }) => { + test('run hook when a binding is resolved', async ({ assert }) => { const emitter = new EventEmitter() const container = new Container<{ route: Route }>({ emitter }) class Route { @@ -28,6 +28,78 @@ test.group('Container | Hooks', () => { assert.equal(route.pattern, '/') }) + test('run hook when an alias is resolved', async ({ assert }) => { + const emitter = new EventEmitter() + const container = new Container<{ 'route': Route; 'adonisjs.route': Route }>({ emitter }) + class Route { + pattern!: string + } + + container.bind('route', () => { + return new Route() + }) + container.alias('adonisjs.route', 'route') + + container.resolving('adonisjs.route', (route) => { + expectTypeOf(route).toEqualTypeOf() + route.pattern = '/' + }) + + const route = await container.make('adonisjs.route') + expectTypeOf(route).toEqualTypeOf() + + assert.instanceOf(route, Route) + assert.equal(route.pattern, '/') + }) + + test('run hook listening for binding when an alias is resolved', async ({ assert }) => { + const emitter = new EventEmitter() + const container = new Container<{ 'route': Route; 'adonisjs.route': Route }>({ emitter }) + class Route { + pattern!: string + } + + container.bind('route', () => { + return new Route() + }) + container.alias('adonisjs.route', 'route') + + container.resolving('route', (route) => { + expectTypeOf(route).toEqualTypeOf() + route.pattern = '/' + }) + + const route = await container.make('adonisjs.route') + expectTypeOf(route).toEqualTypeOf() + + assert.instanceOf(route, Route) + assert.equal(route.pattern, '/') + }) + + test('run hook listening for alias when binding is resolved', async ({ assert }) => { + const emitter = new EventEmitter() + const container = new Container<{ 'route': Route; 'adonisjs.route': Route }>({ emitter }) + class Route { + pattern!: string + } + + container.bind('route', () => { + return new Route() + }) + container.alias('adonisjs.route', 'route') + + container.resolving('adonisjs.route', (route) => { + expectTypeOf(route).toEqualTypeOf() + route.pattern = '/' + }) + + const route = await container.make('route') + expectTypeOf(route).toEqualTypeOf() + + assert.instanceOf(route, Route) + assert.equal(route.pattern, '/') + }) + test('run hook only once when a singleton resolved', async ({ assert }) => { const emitter = new EventEmitter() const container = new Container<{ route: Route }>({ emitter }) From 6d36efb5e740de3217971bdde08510a39b279b50 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Fri, 30 Dec 2022 13:21:58 +0530 Subject: [PATCH 074/145] chore: update dependencies --- package.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index c30ee20..bf91142 100644 --- a/package.json +++ b/package.json @@ -50,14 +50,14 @@ "@japa/run-failed-tests": "^1.0.7", "@japa/runner": "^2.2.2", "@japa/spec-reporter": "^1.3.2", - "@swc/core": "^1.3.22", + "@swc/core": "^1.3.24", "@types/fs-extra": "^9.0.13", - "@types/node": "^18.11.15", + "@types/node": "^18.11.18", "benchmark": "^2.1.4", "c8": "^7.12.0", "cross-env": "^7.0.3", "del-cli": "^5.0.0", - "eslint": "^8.29.0", + "eslint": "^8.30.0", "eslint-config-prettier": "^8.5.0", "eslint-plugin-adonis": "^3.0.3", "eslint-plugin-prettier": "^4.0.0", @@ -65,7 +65,7 @@ "fs-extra": "^11.1.0", "github-label-sync": "^2.2.0", "husky": "^8.0.2", - "np": "^7.6.1", + "np": "^7.6.3", "p-event": "^5.0.1", "prettier": "^2.8.1", "reflect-metadata": "^0.1.13", @@ -125,7 +125,7 @@ }, "homepage": "https://github.com/adonisjs/fold#readme", "dependencies": { - "@poppinss/utils": "^6.1.0-0" + "@poppinss/utils": "^6.2.0-0" }, "c8": { "reporter": [ From 4da4829ef60842bb4c9e5cd635a54e9a1f57c49e Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Thu, 5 Jan 2023 11:34:19 +0530 Subject: [PATCH 075/145] chore: update dependencies --- package.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index bf91142..7883cbd 100644 --- a/package.json +++ b/package.json @@ -44,8 +44,8 @@ "author": "virk,adonisjs", "license": "MIT", "devDependencies": { - "@commitlint/cli": "^17.2.0", - "@commitlint/config-conventional": "^17.2.0", + "@commitlint/cli": "^17.4.0", + "@commitlint/config-conventional": "^17.4.0", "@japa/assert": "^1.3.4", "@japa/run-failed-tests": "^1.0.7", "@japa/runner": "^2.2.2", @@ -57,14 +57,14 @@ "c8": "^7.12.0", "cross-env": "^7.0.3", "del-cli": "^5.0.0", - "eslint": "^8.30.0", - "eslint-config-prettier": "^8.5.0", + "eslint": "^8.31.0", + "eslint-config-prettier": "^8.6.0", "eslint-plugin-adonis": "^3.0.3", "eslint-plugin-prettier": "^4.0.0", "expect-type": "^0.15.0", "fs-extra": "^11.1.0", "github-label-sync": "^2.2.0", - "husky": "^8.0.2", + "husky": "^8.0.3", "np": "^7.6.3", "p-event": "^5.0.1", "prettier": "^2.8.1", @@ -125,7 +125,7 @@ }, "homepage": "https://github.com/adonisjs/fold#readme", "dependencies": { - "@poppinss/utils": "^6.2.0-0" + "@poppinss/utils": "^6.3.1-0" }, "c8": { "reporter": [ From 089765c7d1307740fa09d1b4dfea85289182626e Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Thu, 5 Jan 2023 12:54:51 +0530 Subject: [PATCH 076/145] refactor: cleanup exceptions --- README.md | 22 +++--------- index.ts | 1 - src/container.ts | 35 +++++++++++-------- src/exceptions/invalid_alias_key_exception.ts | 16 --------- .../invalid_binding_key_exception.ts | 17 --------- src/resolver.ts | 32 ++++++++++------- tests/container/swap.spec.ts | 15 ++------ 7 files changed, 47 insertions(+), 91 deletions(-) delete mode 100644 src/exceptions/invalid_alias_key_exception.ts delete mode 100644 src/exceptions/invalid_binding_key_exception.ts diff --git a/README.md b/README.md index ae5224a..d18cad4 100644 --- a/README.md +++ b/README.md @@ -460,28 +460,14 @@ container.bind('db', () => new Database()) const db = await container.make('db') ``` -## Exceptions -The following known exceptions are raised by the container. +## Common errors -### E_INVALID_BINDING_KEY -The exception is raised, when you try to bind a value/factory function to the container and the binding key is not a `string`, a `symbol` or a `class constructor`. - -For example: - -```ts -// Exception will raised -container.bind(123, () => { }) - -// Works fine -container.bind('123', () => { }) -``` - -### E_INVALID_CONTAINER_DEPENDENCY -The exception is raised, when you are trying to inject a value that cannot be constructed. A common source of issue is within TypeScript project, when using an `interface` or a `type` for dependency injection. +### Cannot inject "xxxxx" in "[class: xxxxx]". The value cannot be constructed +The error occurs, when you are trying to inject a value that cannot be constructed. A common source of issue is within TypeScript project, when using an `interface` or a `type` for dependency injection. In the following example, the `User` is a TypeScript type and there is no way for the container to construct a runtime value from this type (types are removed after transpiling the TypeScript code). -Therefore, the container will raise an exception saying `Cannot inject "[Function: Object]". The value cannot be constructed`. +Therefore, the container will raise an exception saying `Cannot inject "[Function: Object]" in "[class: UsersController]". The value cannot be constructed`. ```ts type User = { diff --git a/index.ts b/index.ts index 4fdf396..fd4c555 100644 --- a/index.ts +++ b/index.ts @@ -13,4 +13,3 @@ export { moduleCaller } from './src/module_caller.js' export { ContainerResolver } from './src/resolver.js' export { moduleImporter } from './src/module_importer.js' export { moduleExpression } from './src/module_expression.js' -export { InvalidBindingKeyException } from './src/exceptions/invalid_binding_key_exception.js' diff --git a/src/container.ts b/src/container.ts index 452df50..56cf606 100644 --- a/src/container.ts +++ b/src/container.ts @@ -7,7 +7,8 @@ * file that was distributed with this source code. */ -import { RuntimeException } from '@poppinss/utils' +import { inspect } from 'node:util' +import { InvalidArgumentsException } from '@poppinss/utils' import type { Make, @@ -29,8 +30,6 @@ import debug from './debug.js' import { enqueue, isClass } from './helpers.js' import { ContainerResolver } from './resolver.js' import { ContextBindingsBuilder } from './contextual_bindings_builder.js' -import { InvalidAliasKeyException } from './exceptions/invalid_alias_key_exception.js' -import { InvalidBindingKeyException } from './exceptions/invalid_binding_key_exception.js' /** * The container class exposes the API to register bindings, values @@ -212,7 +211,9 @@ export class Container> { > ): void { if (typeof alias !== 'string' && typeof alias !== 'symbol') { - throw new InvalidAliasKeyException() + throw new InvalidArgumentsException( + 'The container alias key must be of type "string" or "symbol"' + ) } this.#aliases.set(alias, value) @@ -260,7 +261,9 @@ export class Container> { > ): void { if (typeof binding !== 'string' && typeof binding !== 'symbol' && !isClass(binding)) { - throw new InvalidBindingKeyException() + throw new InvalidArgumentsException( + 'The container binding key must be of type "string", "symbol", or a "class constructor"' + ) } debug('adding binding to container "%O"', binding) @@ -294,7 +297,9 @@ export class Container> { : never ): void { if (typeof binding !== 'string' && typeof binding !== 'symbol' && !isClass(binding)) { - throw new InvalidBindingKeyException() + throw new InvalidArgumentsException( + 'The container binding key must be of type "string", "symbol", or a "class constructor"' + ) } debug('adding value to container "%O"', binding) @@ -341,7 +346,9 @@ export class Container> { > ): void { if (typeof binding !== 'string' && typeof binding !== 'symbol' && !isClass(binding)) { - throw new InvalidBindingKeyException() + throw new InvalidArgumentsException( + 'The container binding key must be of type "string", "symbol", or a "class constructor"' + ) } debug('adding singleton to container "%O"', binding) @@ -358,7 +365,9 @@ export class Container> { resolver: BindingResolver> ): void { if (!isClass(binding)) { - throw new RuntimeException('The binding value for a swap should be a class') + throw new InvalidArgumentsException( + `Cannot call swap on value "${inspect(binding)}". Only classes can be swapped` + ) } debug('defining swap for "%O"', binding) @@ -369,10 +378,6 @@ export class Container> { * Restore binding by removing its swap */ restore(binding: AbstractConstructor) { - if (!isClass(binding)) { - throw new RuntimeException('The binding value for a restore should be a class') - } - debug('removing swap for "%s"', binding) this.#swaps.delete(binding) } @@ -455,10 +460,12 @@ export class Container> { resolver: BindingResolver> ): void { if (!isClass(binding)) { - throw new RuntimeException('The binding value for contextual binding should be class') + throw new InvalidArgumentsException( + `The binding value for contextual binding should be class` + ) } if (!isClass(parent)) { - throw new RuntimeException('The parent value for contextual binding should be class') + throw new InvalidArgumentsException(`The parent value for contextual binding should be class`) } debug('adding contextual binding "%O" to "%O"', binding, parent) diff --git a/src/exceptions/invalid_alias_key_exception.ts b/src/exceptions/invalid_alias_key_exception.ts deleted file mode 100644 index 1be36e0..0000000 --- a/src/exceptions/invalid_alias_key_exception.ts +++ /dev/null @@ -1,16 +0,0 @@ -/* - * @adonisjs/fold - * - * (c) AdonisJS - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -import { Exception } from '@poppinss/utils' - -export class InvalidAliasKeyException extends Exception { - static code = 'E_INVALID_ALIAS_KEY' - static status = 500 - static message = 'The container alias key must be of type "string" or "symbol"' -} diff --git a/src/exceptions/invalid_binding_key_exception.ts b/src/exceptions/invalid_binding_key_exception.ts deleted file mode 100644 index 2e96295..0000000 --- a/src/exceptions/invalid_binding_key_exception.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* - * @adonisjs/fold - * - * (c) AdonisJS - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -import { Exception } from '@poppinss/utils' - -export class InvalidBindingKeyException extends Exception { - static code = 'E_INVALID_BINDING_KEY' - static status = 500 - static message = - 'The container binding key must be of type "string", "symbol", or a "class constructor"' -} diff --git a/src/resolver.ts b/src/resolver.ts index 0276e93..644c42a 100644 --- a/src/resolver.ts +++ b/src/resolver.ts @@ -8,7 +8,7 @@ */ import { inspect } from 'node:util' -import { RuntimeException } from '@poppinss/utils' +import { InvalidArgumentsException } from '@poppinss/utils' import type { Make, @@ -28,7 +28,6 @@ import type { import debug from './debug.js' import { isClass } from './helpers.js' import { containerProvider } from './provider.js' -import { InvalidBindingKeyException } from './exceptions/invalid_binding_key_exception.js' /** * Container resolver exposes the APIs to resolve bindings. You can think @@ -124,19 +123,20 @@ export class ContainerResolver> { } /** - * Raises exception when uanble to construct a data type using - * container. + * Constructs exception for invalid binding value */ - #disallowUnsupportValues(parent: any, binding: any): never { + #invalidBindingException(parent: any, binding: any): InvalidArgumentsException { if (parent) { - throw new RuntimeException( + return new InvalidArgumentsException( `Cannot inject "${inspect(binding)}" in "[class: ${ parent.name }]". The value cannot be constructed` ) } - throw new RuntimeException(`Cannot construct value "${inspect(binding)}" using container`) + return new InvalidArgumentsException( + `Cannot construct value "${inspect(binding)}" using container` + ) } /** @@ -233,7 +233,7 @@ export class ContainerResolver> { * or a symbol. */ if (typeof binding !== 'string' && typeof binding !== 'symbol' && !isAClass) { - this.#disallowUnsupportValues(parent, binding) + throw this.#invalidBindingException(parent, binding) } /** @@ -258,8 +258,8 @@ export class ContainerResolver> { } /** - * Resolving contextual binding. Contextual bindings have more - * priority over bindings or binding values. + * Resolving contextual binding. Contextual bindings can only exists for + * class constructors */ const contextualResolver = isAClass && this.#getBindingResolver(parent, binding) if (contextualResolver) { @@ -356,7 +356,9 @@ export class ContainerResolver> { return value } - throw new RuntimeException(`Cannot resolve binding "${String(binding)}" from the container`) + throw new InvalidArgumentsException( + `Cannot resolve binding "${String(binding)}" from the container` + ) } /** @@ -404,7 +406,9 @@ export class ContainerResolver> { runtimeValues?: any[] ): Promise> { if (typeof value[method] !== 'function') { - throw new RuntimeException(`Missing method "${String(method)}" on "${inspect(value)}"`) + throw new InvalidArgumentsException( + `Missing method "${String(method)}" on "${inspect(value)}"` + ) } if (debug.enabled) { @@ -442,7 +446,9 @@ export class ContainerResolver> { : never ): void { if (typeof binding !== 'string' && typeof binding !== 'symbol' && !isClass(binding)) { - throw new InvalidBindingKeyException() + throw new InvalidArgumentsException( + 'The container binding key must be of type "string", "symbol", or a "class constructor"' + ) } debug('adding value to resolver "%O"', binding) diff --git a/tests/container/swap.spec.ts b/tests/container/swap.spec.ts index 4ec3fd2..fe090d8 100644 --- a/tests/container/swap.spec.ts +++ b/tests/container/swap.spec.ts @@ -205,29 +205,20 @@ test.group('Container | swap', () => { assert.throws( // @ts-expect-error () => container.swap(1, () => {}), - 'The binding value for a swap should be a class' + 'Cannot call swap on value "1". Only classes can be swapped' ) assert.throws( // @ts-expect-error () => container.swap([], () => {}), - 'The binding value for a swap should be a class' + 'Cannot call swap on value "[]". Only classes can be swapped' ) assert.throws( // @ts-expect-error () => container.swap({}, () => {}), - 'The binding value for a swap should be a class' + 'Cannot call swap on value "{}". Only classes can be swapped' ) - - // @ts-expect-error - assert.throws(() => container.restore(1), 'The binding value for a restore should be a class') - - // @ts-expect-error - assert.throws(() => container.restore([]), 'The binding value for a restore should be a class') - - // @ts-expect-error - assert.throws(() => container.restore({}), 'The binding value for a restore should be a class') }) test('use swap over contextual binding', async ({ assert }) => { From 9c6c2651d9cc88da27933d2c345f5ef3b5bb5531 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Thu, 5 Jan 2023 13:07:25 +0530 Subject: [PATCH 077/145] feat: use custom provider when calling method on a class instance --- src/resolver.ts | 11 ++++++++++- tests/resolver.spec.ts | 30 +++++++++++++++++++++++++++++- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/src/resolver.ts b/src/resolver.ts index 644c42a..fc1c3b4 100644 --- a/src/resolver.ts +++ b/src/resolver.ts @@ -415,7 +415,16 @@ export class ContainerResolver> { debug('calling method %s, on value :%O', method, value) } - const dependencies = await containerProvider(value.constructor, method, this, runtimeValues) + let dependencies: any[] = [] + const binding = value.constructor + + const bindingProvider = this.#getBindingProvider(binding) + if (bindingProvider) { + dependencies = await bindingProvider(binding, method, this, containerProvider, runtimeValues) + } else { + dependencies = await containerProvider(binding, method, this, runtimeValues) + } + return value[method](...dependencies) } diff --git a/tests/resolver.spec.ts b/tests/resolver.spec.ts index 3991c62..3de00b8 100644 --- a/tests/resolver.spec.ts +++ b/tests/resolver.spec.ts @@ -28,7 +28,7 @@ test.group('Resolver', () => { assert.strictEqual(resolvedService.name, 'resolver_service') }) - test('use custom containerProvider from the class constructor', async ({ assert }) => { + test('use static containerProvider to construct a class', async ({ assert }) => { assert.plan(4) class UserService { @@ -56,6 +56,34 @@ test.group('Resolver', () => { assert.instanceOf(resolvedService, UserService) }) + test('use static containerProvider to call a method', async ({ assert }) => { + assert.plan(3) + + class UserService { + static containerProvider: ContainerProvider = ( + binding, + property, + resolver, + defaultProvider, + runtimeValues + ) => { + assert.deepEqual(binding, UserService) + assert.deepEqual(this, UserService) + assert.equal(property, 'store') + return defaultProvider(binding, property, resolver, runtimeValues) + } + + name?: string + + store() {} + } + + const container = new Container() + const resolver = container.createResolver() + + await resolver.call(new UserService(), 'store') + }) + test('disallow binding names other than string symbol or class constructor', async ({ assert, }) => { From 98807ee14f94ea2aafe22bba478984b888ced861 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Thu, 5 Jan 2023 13:16:27 +0530 Subject: [PATCH 078/145] chore(release): 9.9.0-0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7883cbd..888eccf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@adonisjs/fold", - "version": "9.8.0-0", + "version": "9.9.0-0", "description": "Simplest and straight forward implementation for IoC container in JavaScript", "main": "build/index.js", "files": [ From d60b05bee43171883f4aed14ad6f70f2dade6e2f Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Mon, 16 Jan 2023 16:44:03 +0530 Subject: [PATCH 079/145] chore: update dependencies --- package.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 888eccf..654fe65 100644 --- a/package.json +++ b/package.json @@ -44,20 +44,20 @@ "author": "virk,adonisjs", "license": "MIT", "devDependencies": { - "@commitlint/cli": "^17.4.0", - "@commitlint/config-conventional": "^17.4.0", + "@commitlint/cli": "^17.4.2", + "@commitlint/config-conventional": "^17.4.2", "@japa/assert": "^1.3.4", "@japa/run-failed-tests": "^1.0.7", "@japa/runner": "^2.2.2", "@japa/spec-reporter": "^1.3.2", - "@swc/core": "^1.3.24", - "@types/fs-extra": "^9.0.13", + "@swc/core": "^1.3.26", + "@types/fs-extra": "^11.0.1", "@types/node": "^18.11.18", "benchmark": "^2.1.4", "c8": "^7.12.0", "cross-env": "^7.0.3", "del-cli": "^5.0.0", - "eslint": "^8.31.0", + "eslint": "^8.32.0", "eslint-config-prettier": "^8.6.0", "eslint-plugin-adonis": "^3.0.3", "eslint-plugin-prettier": "^4.0.0", @@ -67,7 +67,7 @@ "husky": "^8.0.3", "np": "^7.6.3", "p-event": "^5.0.1", - "prettier": "^2.8.1", + "prettier": "^2.8.3", "reflect-metadata": "^0.1.13", "ts-node": "^10.8.1", "typescript": "^4.9.4" From 6f8b652b0b13543f7aba1dc6e895af65cee49a5b Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Mon, 23 Jan 2023 17:52:11 +0530 Subject: [PATCH 080/145] chore: update dependencies --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 654fe65..33393a5 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "@japa/run-failed-tests": "^1.0.7", "@japa/runner": "^2.2.2", "@japa/spec-reporter": "^1.3.2", - "@swc/core": "^1.3.26", + "@swc/core": "^1.3.27", "@types/fs-extra": "^11.0.1", "@types/node": "^18.11.18", "benchmark": "^2.1.4", @@ -125,7 +125,7 @@ }, "homepage": "https://github.com/adonisjs/fold#readme", "dependencies": { - "@poppinss/utils": "^6.3.1-0" + "@poppinss/utils": "^6.4.0-0" }, "c8": { "reporter": [ From c81b75527be1326012e6d494a863b89a5a99e315 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Mon, 23 Jan 2023 17:56:07 +0530 Subject: [PATCH 081/145] refactor: rename container:resolve event to be in past tense The new event name is container:resolved --- README.md | 4 ++-- src/resolver.ts | 2 +- tests/container/events.spec.ts | 16 ++++++++-------- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index d18cad4..553c4c4 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# AdonisJS Fold + # AdonisJS Fold > Simplest, straightforward implementation for IoC container in JavaScript @@ -364,7 +364,7 @@ You can pass an instance of the [EventEmitter](https://nodejs.org/dist/latest-v1 import { EventEmitter } from 'node:events' const emitter = new EventEmitter() -emitter.on('container:resolve', ({ value, binding }) => { +emitter.on('container:resolved', ({ value, binding }) => { // value is the resolved value // binding name can be a mix of string, class constructor, or a symbol. }) diff --git a/src/resolver.ts b/src/resolver.ts index fc1c3b4..7bd8f26 100644 --- a/src/resolver.ts +++ b/src/resolver.ts @@ -174,7 +174,7 @@ export class ContainerResolver> { if (!this.#options.emitter) { return } - this.#options.emitter.emit('container:resolve', { binding, value }) + this.#options.emitter.emit('container:resolved', { binding, value }) } /** diff --git a/tests/container/events.spec.ts b/tests/container/events.spec.ts index 56e54ac..6b2da71 100644 --- a/tests/container/events.spec.ts +++ b/tests/container/events.spec.ts @@ -16,7 +16,7 @@ test.group('Container | Events', () => { }) const [event, route] = await Promise.all([ - pEvent(emitter, 'container:resolve'), + pEvent(emitter, 'container:resolved'), container.make('route'), ]) @@ -35,7 +35,7 @@ test.group('Container | Events', () => { }) const [event, route] = await Promise.all([ - pEvent(emitter, 'container:resolve'), + pEvent(emitter, 'container:resolved'), container.make('route'), ]) @@ -54,11 +54,11 @@ test.group('Container | Events', () => { }) const [event, route] = await Promise.all([ - pEvent(emitter, 'container:resolve'), + pEvent(emitter, 'container:resolved'), container.make('route'), ]) const [event1, route1] = await Promise.all([ - pEvent(emitter, 'container:resolve'), + pEvent(emitter, 'container:resolved'), container.make('route'), ]) @@ -76,7 +76,7 @@ test.group('Container | Events', () => { container.bindValue('route', new Route()) const [event, route] = await Promise.all([ - pEvent(emitter, 'container:resolve'), + pEvent(emitter, 'container:resolved'), container.make('route'), ]) @@ -91,7 +91,7 @@ test.group('Container | Events', () => { class Route {} const [event, route] = await Promise.all([ - pEvent(emitter, 'container:resolve'), + pEvent(emitter, 'container:resolved'), container.make(Route), ]) @@ -117,7 +117,7 @@ test.group('Container | Events', () => { } const [events, route] = await Promise.all([ - pEventMultiple(emitter, 'container:resolve', { count: 3 }), + pEventMultiple(emitter, 'container:resolved', { count: 3 }), container.make(Route), ]) @@ -139,7 +139,7 @@ test.group('Container | Events', () => { container.swap(Route, () => new FakedRoute()) const [event, route] = await Promise.all([ - pEvent(emitter, 'container:resolve'), + pEvent(emitter, 'container:resolved'), container.make(Route), ]) From 94c94a3bceb1876af014e4102b63648ede869346 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Mon, 23 Jan 2023 19:34:08 +0530 Subject: [PATCH 082/145] fix: ensure resolving hooks are called only once for singletons --- src/container.ts | 4 +- src/helpers.ts | 37 +++++++++++---- src/resolver.ts | 21 +++++++-- src/types.ts | 12 ++++- tests/container/hooks.spec.ts | 75 +++++++++++++++++++---------- tests/enqueue.spec.ts | 89 +++++++++++++++++++++++++++++++---- 6 files changed, 188 insertions(+), 50 deletions(-) diff --git a/src/container.ts b/src/container.ts index 56cf606..b2ef5e9 100644 --- a/src/container.ts +++ b/src/container.ts @@ -267,7 +267,7 @@ export class Container> { } debug('adding binding to container "%O"', binding) - this.#bindings.set(binding, { resolver }) + this.#bindings.set(binding, { resolver, isSingleton: false }) } /** @@ -352,7 +352,7 @@ export class Container> { } debug('adding singleton to container "%O"', binding) - this.#bindings.set(binding, { resolver: enqueue(resolver) }) + this.#bindings.set(binding, { resolver: enqueue(resolver), isSingleton: true }) } /** diff --git a/src/helpers.ts b/src/helpers.ts index accc38e..757df09 100644 --- a/src/helpers.ts +++ b/src/helpers.ts @@ -40,6 +40,14 @@ export async function importDefault(importFn: () => Promise<{ default: any }>) { return moduleExports.default } +/** + * Runs a function inside an async function. This ensure that syncrohonous + * errors are handled in the same way rejected promise is handled + */ +async function runAsAsync(callback: Function, args: any[]) { + return callback(...args) +} + /** * Converts a function to a self contained queue, where each call to * the function is queued until the first call resolves or rejects. @@ -90,7 +98,7 @@ export function enqueue(callback: Function) { queue = [] } - return async function (...args: any) { + return function (...args: any): Promise<{ value: any; cached: boolean }> { /** * Already has value */ @@ -109,21 +117,30 @@ export function enqueue(callback: Function) { * In process, returning a deferred promise */ if (isComputingValue) { - const promise = new Deferred() + const promise = new Deferred<{ value: any; cached: true }>() queue.push(promise) return promise.promise } isComputingValue = true - try { - const value = await callback(...args) - resolvePromises(value) - return value - } catch (error) { - rejectPromises(error) - throw error - } + /** + * We could have removed this promise in favor of async/await. But then + * we will have to call "resolvePromises" before returning the value. + * However, we want the following promise to resolve first and + * then resolve all other deferred promises. + */ + return new Promise((resolve, reject) => { + runAsAsync(callback, args) + .then((value) => { + resolve({ value, cached: false }) + resolvePromises({ value, cached: true }) + }) + .catch((error) => { + reject(error) + rejectPromises(error) + }) + }) } } diff --git a/src/resolver.ts b/src/resolver.ts index 7bd8f26..617e785 100644 --- a/src/resolver.ts +++ b/src/resolver.ts @@ -28,6 +28,7 @@ import type { import debug from './debug.js' import { isClass } from './helpers.js' import { containerProvider } from './provider.js' +import { exec } from 'node:child_process' /** * Container resolver exposes the APIs to resolve bindings. You can think @@ -307,18 +308,30 @@ export class ContainerResolver> { * Followed by the CONTAINER bindings */ if (this.#containerBindings.has(binding)) { - const { resolver } = this.#containerBindings.get(binding)! + const { resolver, isSingleton } = this.#containerBindings.get(binding)! + let value + let executeHooks = isSingleton ? false : true /** - * Invoke binding resolver to get the value. + * Invoke binding resolver to get the value. In case of singleton, + * the "enqueue" method returns an object with the value and a + * boolean telling if a cached value is resolved. */ - const value = await resolver(this, runtimeValues) + if (isSingleton) { + const result = await resolver(this, runtimeValues) + value = result.value + executeHooks = !result.cached + } else { + value = await resolver(this, runtimeValues) + } if (debug.enabled) { debug('resolved binding %O, resolved value :%O', binding, value) } - await this.#execHooks(binding, value) + if (executeHooks) { + await this.#execHooks(binding, value) + } this.#emit(binding, value) return value diff --git a/src/types.ts b/src/types.ts index b3266d5..3794b52 100644 --- a/src/types.ts +++ b/src/types.ts @@ -56,7 +56,17 @@ export type BindingResolver, Value> = ( /** * Shape of the registered bindings */ -export type Bindings = Map, any> }> +export type Bindings = Map< + BindingKey, + | { resolver: BindingResolver, any>; isSingleton: false } + | { + resolver: ( + containerResolver: ContainerResolver>, + runtimeValues?: any[] + ) => Promise<{ value: any; cached: boolean }> + isSingleton: true + } +> /** * Shape of the registered contextual bindings diff --git a/tests/container/hooks.spec.ts b/tests/container/hooks.spec.ts index 5f3051e..2999ecd 100644 --- a/tests/container/hooks.spec.ts +++ b/tests/container/hooks.spec.ts @@ -100,16 +100,14 @@ test.group('Container | Hooks', () => { assert.equal(route.pattern, '/') }) - test('run hook only once when a singleton resolved', async ({ assert }) => { + test('do not run hooks when values are resolved', async ({ assert }) => { const emitter = new EventEmitter() const container = new Container<{ route: Route }>({ emitter }) class Route { invocations: number = 0 } - container.bind('route', () => { - return new Route() - }) + container.bindValue('route', new Route()) container.resolving('route', (route) => { expectTypeOf(route).toEqualTypeOf() @@ -124,75 +122,102 @@ test.group('Container | Hooks', () => { expectTypeOf(route).toEqualTypeOf() assert.instanceOf(route, Route) - assert.equal(route.invocations, 1) + assert.equal(route.invocations, 0) }) - test('do not run hooks when values are resolved', async ({ assert }) => { + test('run hooks when classes are constructed', async ({ assert }) => { const emitter = new EventEmitter() - const container = new Container<{ route: Route }>({ emitter }) + const container = new Container({ emitter }) class Route { invocations: number = 0 } - container.bindValue('route', new Route()) - - container.resolving('route', (route) => { + container.resolving(Route, (route) => { expectTypeOf(route).toEqualTypeOf() route.invocations++ }) - await container.make('route') - await container.make('route') - await container.make('route') - - const route = await container.make('route') + const route = await container.make(Route) expectTypeOf(route).toEqualTypeOf() assert.instanceOf(route, Route) - assert.equal(route.invocations, 0) + assert.equal(route.invocations, 1) }) - test('run hooks when classes are constructed', async ({ assert }) => { + test('run hooks when a swap is resolved', async ({ assert }) => { const emitter = new EventEmitter() const container = new Container({ emitter }) class Route { invocations: number = 0 } + class FakedRoute extends Route {} container.resolving(Route, (route) => { expectTypeOf(route).toEqualTypeOf() route.invocations++ }) + container.swap(Route, () => { + return new FakedRoute() + }) + const route = await container.make(Route) expectTypeOf(route).toEqualTypeOf() assert.instanceOf(route, Route) + assert.instanceOf(route, FakedRoute) assert.equal(route.invocations, 1) }) - test('run hooks when a swap is resolved', async ({ assert }) => { + test('run hook once when a singleton resolved', async ({ assert }) => { const emitter = new EventEmitter() - const container = new Container({ emitter }) + const container = new Container<{ route: Route }>({ emitter }) class Route { invocations: number = 0 } - class FakedRoute extends Route {} - container.resolving(Route, (route) => { + container.singleton('route', () => { + return new Route() + }) + + container.resolving('route', (route) => { expectTypeOf(route).toEqualTypeOf() route.invocations++ }) - container.swap(Route, () => { - return new FakedRoute() + await container.make('route') + await container.make('route') + await container.make('route') + + const route = await container.make('route') + expectTypeOf(route).toEqualTypeOf() + + assert.instanceOf(route, Route) + assert.equal(route.invocations, 1) + }) + + test('call hook once when a singleton is resolved parallely', async ({ assert }) => { + const emitter = new EventEmitter() + const container = new Container<{ route: Route }>({ emitter }) + class Route { + invocations: number = 0 + } + + container.singleton('route', () => { + return new Route() }) - const route = await container.make(Route) + container.resolving('route', (route) => { + expectTypeOf(route).toEqualTypeOf() + route.invocations++ + }) + + await Promise.all([container.make('route'), container.make('route'), container.make('route')]) + + const route = await container.make('route') expectTypeOf(route).toEqualTypeOf() assert.instanceOf(route, Route) - assert.instanceOf(route, FakedRoute) assert.equal(route.invocations, 1) }) }) diff --git a/tests/enqueue.spec.ts b/tests/enqueue.spec.ts index 2dc5a05..c40343f 100644 --- a/tests/enqueue.spec.ts +++ b/tests/enqueue.spec.ts @@ -28,8 +28,8 @@ test.group('Enqueue', () => { const times = await Promise.all([fn(), fn(), fn()]) assert.lengthOf(times, 3) - assert.strictEqual(times[0], times[1]) - assert.strictEqual(times[1], times[2]) + assert.strictEqual(times[0].value, times[1].value) + assert.strictEqual(times[1].value, times[2].value) }) test('get return value from the async underlying method', async ({ assert }) => { @@ -39,8 +39,8 @@ test.group('Enqueue', () => { const times = await Promise.all([fn(), fn(), fn()]) assert.lengthOf(times, 3) - assert.strictEqual(times[0], times[1]) - assert.strictEqual(times[1], times[2]) + assert.strictEqual(times[0].value, times[1].value) + assert.strictEqual(times[1].value, times[2].value) }) test('get error from the underlying method', async ({ assert }) => { @@ -59,7 +59,7 @@ test.group('Enqueue', () => { await assert.rejects(() => Promise.all([fn(), fn(), fn()]), 'failed') }) - test('get error from all the under method calls', async ({ assert }) => { + test('get error for all underlying method calls', async ({ assert }) => { const fn = enqueue(() => { throw new Error('failed') }) @@ -71,7 +71,7 @@ test.group('Enqueue', () => { ) }) - test('get error from all the under async method calls', async ({ assert }) => { + test('get error for all underlying async method calls', async ({ assert }) => { const fn = enqueue(async () => { throw new Error('failed') }) @@ -91,8 +91,8 @@ test.group('Enqueue', () => { const date = await fn() const date1 = await fn() const date2 = await fn() - assert.strictEqual(date, date1) - assert.strictEqual(date1, date2) + assert.strictEqual(date.value, date1.value) + assert.strictEqual(date1.value, date2.value) }) test('cache error in sequential calls', async ({ assert }) => { @@ -183,4 +183,77 @@ test.group('Enqueue', () => { await Promise.allSettled([firstWrapper(), secondWrapper(), thirdWrapper()]) assert.deepEqual(stack, ['invoked', 'first', 'second', 'third']) }) + + test('reject parallel queue promises in the order they are registered', async ({ assert }) => { + const stack: string[] = [] + const fn = enqueue(async () => { + throw new Error('Failed') + }) + + const firstWrapper = async () => { + try { + await fn() + } catch { + stack.push('handled by first') + } + } + + const secondWrapper = async () => { + try { + await fn() + } catch { + stack.push('handled by second') + } + } + + const thirdWrapper = async () => { + try { + await fn() + } catch { + stack.push('handled by third') + } + } + + await Promise.all([firstWrapper(), secondWrapper(), thirdWrapper()]) + assert.deepEqual(stack, ['handled by first', 'handled by second', 'handled by third']) + }) + + test('reject parallel queue promises in the order they are registered with allSettled', async ({ + assert, + }) => { + const stack: string[] = [] + const fn = enqueue(async () => { + throw new Error('Failed') + }) + + const firstWrapper = async () => { + try { + await fn() + } catch (error) { + stack.push('handled by first') + throw error + } + } + + const secondWrapper = async () => { + try { + await fn() + } catch (error) { + stack.push('handled by second') + throw error + } + } + + const thirdWrapper = async () => { + try { + await fn() + } catch (error) { + stack.push('handled by third') + throw error + } + } + + await Promise.allSettled([firstWrapper(), secondWrapper(), thirdWrapper()]) + assert.deepEqual(stack, ['handled by first', 'handled by second', 'handled by third']) + }) }) From 9a75b24d5526c401d3d31dcd31823891d255e225 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Mon, 23 Jan 2023 19:41:08 +0530 Subject: [PATCH 083/145] style: removed unused imports --- src/resolver.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/resolver.ts b/src/resolver.ts index 617e785..04dbafa 100644 --- a/src/resolver.ts +++ b/src/resolver.ts @@ -28,7 +28,6 @@ import type { import debug from './debug.js' import { isClass } from './helpers.js' import { containerProvider } from './provider.js' -import { exec } from 'node:child_process' /** * Container resolver exposes the APIs to resolve bindings. You can think From 2a6fc87ee39ead2cf7f463118e6ddab17a69147d Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Mon, 23 Jan 2023 19:41:36 +0530 Subject: [PATCH 084/145] chore(release): 9.9.1-0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 33393a5..b25fdb1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@adonisjs/fold", - "version": "9.9.0-0", + "version": "9.9.1-0", "description": "Simplest and straight forward implementation for IoC container in JavaScript", "main": "build/index.js", "files": [ From 20317c79453449f966e5e0c972d7a6768109d5c5 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Thu, 26 Jan 2023 19:36:31 +0530 Subject: [PATCH 085/145] chore: update dependencies --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b25fdb1..2128043 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "@japa/run-failed-tests": "^1.0.7", "@japa/runner": "^2.2.2", "@japa/spec-reporter": "^1.3.2", - "@swc/core": "^1.3.27", + "@swc/core": "^1.3.29", "@types/fs-extra": "^11.0.1", "@types/node": "^18.11.18", "benchmark": "^2.1.4", From 9af496cb9ab17c6aea7ac533c15c5fa18c910adf Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Thu, 26 Jan 2023 19:36:55 +0530 Subject: [PATCH 086/145] docs(LICENSE): update license meta --- LICENSE.md | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 LICENSE.md diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..59a3cfa --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,9 @@ +# The MIT License + +Copyright (c) 2023 AdonisJS Framework + +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. From 7127a68090f3c831a85fa407ce993c9e0c318be7 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Thu, 26 Jan 2023 21:16:48 +0530 Subject: [PATCH 087/145] chore: update dependencies --- benchmark/module_importer.ts | 3 ++- package.json | 2 +- src/helpers.ts | 20 ------------------- src/module_importer.ts | 3 ++- tests/module_importer/to_callable.spec.ts | 2 +- .../module_importer/to_handle_method.spec.ts | 2 +- 6 files changed, 7 insertions(+), 25 deletions(-) diff --git a/benchmark/module_importer.ts b/benchmark/module_importer.ts index ab07f4c..52b7f64 100644 --- a/benchmark/module_importer.ts +++ b/benchmark/module_importer.ts @@ -9,9 +9,10 @@ // @ts-expect-error import benchmark from 'benchmark' +import { importDefault } from '@poppinss/utils' + import Thread from '#services/thread' import { Container } from '../index.js' -import { importDefault } from '../src/helpers.js' import { moduleImporter } from '../src/module_importer.js' const suite = new benchmark.Suite() diff --git a/package.json b/package.json index 2128043..09fe4ae 100644 --- a/package.json +++ b/package.json @@ -125,7 +125,7 @@ }, "homepage": "https://github.com/adonisjs/fold#readme", "dependencies": { - "@poppinss/utils": "^6.4.0-0" + "@poppinss/utils": "^6.5.0-0" }, "c8": { "reporter": [ diff --git a/src/helpers.ts b/src/helpers.ts index 757df09..fdd3f9f 100644 --- a/src/helpers.ts +++ b/src/helpers.ts @@ -20,26 +20,6 @@ export function isClass(value: unknown): value is Constructor { return typeof value === 'function' && value.toString().startsWith('class ') } -/** - * Dynamically import a module and ensure it has a default export - */ -export async function importDefault(importFn: () => Promise<{ default: any }>) { - const moduleExports = await importFn() - - /** - * Make sure a default export exists - */ - if (!moduleExports.default) { - throw new RuntimeException(`Missing export default from "${importFn}" module`, { - cause: { - source: importFn, - }, - }) - } - - return moduleExports.default -} - /** * Runs a function inside an async function. This ensure that syncrohonous * errors are handled in the same way rejected promise is handled diff --git a/src/module_importer.ts b/src/module_importer.ts index b94ba0c..65b2a64 100644 --- a/src/module_importer.ts +++ b/src/module_importer.ts @@ -7,8 +7,9 @@ * file that was distributed with this source code. */ +import { importDefault } from '@poppinss/utils' + import { Container } from './container.js' -import { importDefault } from './helpers.js' import { ContainerResolver } from './resolver.js' import type { ModuleHandler, ModuleCallable, Constructor } from './types.js' diff --git a/tests/module_importer/to_callable.spec.ts b/tests/module_importer/to_callable.spec.ts index 723b06a..afe9e31 100644 --- a/tests/module_importer/to_callable.spec.ts +++ b/tests/module_importer/to_callable.spec.ts @@ -100,7 +100,7 @@ test.group('moduleImporter | toCallable', (group) => { await assert.rejects( () => fn(args), - 'Missing export default from "()=>import(\'#middleware/silent_auth_v2\')" module' + `Missing "export default" from lazy import "()=>import('#middleware/silent_auth_v2')"` ) }) }) diff --git a/tests/module_importer/to_handle_method.spec.ts b/tests/module_importer/to_handle_method.spec.ts index 210a18e..1b69ea8 100644 --- a/tests/module_importer/to_handle_method.spec.ts +++ b/tests/module_importer/to_handle_method.spec.ts @@ -105,7 +105,7 @@ test.group('moduleImporter | toHandleMethod', (group) => { await assert.rejects( () => handler.handle(args), - 'Missing export default from "()=>import(\'#middleware/silent_auth_v5\')" module' + `Missing "export default" from lazy import "()=>import('#middleware/silent_auth_v5')"` ) }) }) From fcfe8cc4a8fc9054ea3671ddd76d806e81e4305f Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Thu, 26 Jan 2023 21:25:10 +0530 Subject: [PATCH 088/145] refactor: improve debugging --- package.json | 2 +- src/container.ts | 10 +++++----- src/decorators/inject.ts | 12 ++++++++++++ 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 09fe4ae..28ef444 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@adonisjs/fold", "version": "9.9.1-0", - "description": "Simplest and straight forward implementation for IoC container in JavaScript", + "description": "A simple and straight forward implementation for IoC container in JavaScript", "main": "build/index.js", "files": [ "build/src", diff --git a/src/container.ts b/src/container.ts index b2ef5e9..143751e 100644 --- a/src/container.ts +++ b/src/container.ts @@ -302,7 +302,7 @@ export class Container> { ) } - debug('adding value to container "%O"', binding) + debug('adding value to container %O', binding) this.#bindingValues.set(binding, value) } @@ -351,7 +351,7 @@ export class Container> { ) } - debug('adding singleton to container "%O"', binding) + debug('adding singleton to container %O', binding) this.#bindings.set(binding, { resolver: enqueue(resolver), isSingleton: true }) } @@ -370,7 +370,7 @@ export class Container> { ) } - debug('defining swap for "%O"', binding) + debug('defining swap for %O', binding) this.#swaps.set(binding, resolver) } @@ -378,7 +378,7 @@ export class Container> { * Restore binding by removing its swap */ restore(binding: AbstractConstructor) { - debug('removing swap for "%s"', binding) + debug('removing swap for %s', binding) this.#swaps.delete(binding) } @@ -468,7 +468,7 @@ export class Container> { throw new InvalidArgumentsException(`The parent value for contextual binding should be class`) } - debug('adding contextual binding "%O" to "%O"', binding, parent) + debug('adding contextual binding %O to %O', binding, parent) /** * Create map for the parent if doesn't already exists diff --git a/src/decorators/inject.ts b/src/decorators/inject.ts index ca72d6d..8b7b081 100644 --- a/src/decorators/inject.ts +++ b/src/decorators/inject.ts @@ -8,6 +8,7 @@ */ import { defineStaticProperty } from '@poppinss/utils' +import debug from '../debug.js' /** * Initiating the "containerInjections" property on the target, which is assumed @@ -30,6 +31,9 @@ function defineConstructorInjections(target: any) { } initiateContainerInjections(target, '_constructor') + if (debug.enabled) { + debug('defining constructor injections for %O, params %O', `[class: ${target.name}]`, params) + } for (const param of params) { target.containerInjections._constructor.push(param) } @@ -47,6 +51,14 @@ function defineMethodInjections(target: any, method: string | symbol) { } initiateContainerInjections(constructor, method) + if (debug.enabled) { + debug( + 'defining method injections for %O, method %O, params %O', + `[class ${constructor.name}]`, + method, + params + ) + } for (const param of params) { constructor.containerInjections[method].push(param) } From 39100833f48110b724c5fc5eadad264304c77ace Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Thu, 26 Jan 2023 21:27:08 +0530 Subject: [PATCH 089/145] docs(README): update badge to use tests status from github actions --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 553c4c4..7ccdb16 100644 --- a/README.md +++ b/README.md @@ -665,7 +665,7 @@ const resolver = container.createResolver() await handler.handle(resolver, [ctx]) ``` -[gh-workflow-image]: https://img.shields.io/github/workflow/status/adonisjs/fold/test?style=for-the-badge +[gh-workflow-image]: https://img.shields.io/github/actions/workflow/status/adonisjs/fold/test.yml?style=for-the-badge [gh-workflow-url]: https://github.com/adonisjs/fold/actions/workflows/test.yml 'Github action' [npm-image]: https://img.shields.io/npm/v/@adonisjs/fold/latest.svg?style=for-the-badge&logo=npm [npm-url]: https://www.npmjs.com/package/@adonisjs/fold/v/latest 'npm' From d01e3e382d041f802331df1172f7a02a88198c11 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Thu, 26 Jan 2023 21:27:23 +0530 Subject: [PATCH 090/145] docs(README): reformat badges --- README.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/README.md b/README.md index 7ccdb16..f89f7e5 100644 --- a/README.md +++ b/README.md @@ -4,12 +4,8 @@
-