├── .eslintrc.js
├── .github
└── workflows
│ ├── ci.yml
│ └── npm-publish.yml
├── .gitignore
├── .vscode
└── launch.json
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── jest.config.js
├── package.json
├── pnpm-lock.yaml
├── src
├── example.ts
├── index.ts
├── retry.decorator.test.ts
├── retry.decorator.ts
└── utils.ts
└── tsconfig.json
/.eslintrc.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | root: true,
3 | parser: '@typescript-eslint/parser', // Specifies the ESLint parser
4 | plugins: ["@typescript-eslint"],
5 | extends: [
6 | // https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/src/configs/recommended.json
7 | 'plugin:@typescript-eslint/recommended', // Uses the recommended rules from the @typescript-eslint/eslint-plugin
8 | 'eslint-config-ts-vcfvct',
9 | ],
10 | parserOptions: {
11 | ecmaVersion: 2018, // Allows for the parsing of modern ECMAScript features
12 | sourceType: 'module', // Allows for the use of imports
13 | },
14 | rules: {
15 | // Place to specify ESLint rules. Can be used to overwrite rules specified from the extended configs
16 | },
17 | };
18 |
19 |
20 |
--------------------------------------------------------------------------------
/.github/workflows/ci.yml:
--------------------------------------------------------------------------------
1 | name: CI
2 |
3 | on:
4 | push:
5 | branches: [ master ]
6 | pull_request:
7 | branches: [ master ]
8 |
9 | jobs:
10 | build:
11 |
12 | runs-on: ubuntu-latest
13 |
14 | steps:
15 | - uses: actions/checkout@v3
16 |
17 | - name: Install Node.js
18 | uses: actions/setup-node@v3
19 | with:
20 | node-version: 18
21 |
22 | - uses: pnpm/action-setup@v2
23 | name: Install pnpm
24 | id: pnpm-install
25 | with:
26 | version: 7
27 | run_install: false
28 |
29 | - name: Get pnpm store directory
30 | id: pnpm-cache
31 | shell: bash
32 | run: |
33 | echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT
34 |
35 | - uses: actions/cache@v3
36 | name: Setup pnpm cache
37 | with:
38 | path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}
39 | key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
40 | restore-keys: |
41 | ${{ runner.os }}-pnpm-store-
42 |
43 | - run: pnpm install
44 | - run: npm run build
45 | - run: npm test
46 |
--------------------------------------------------------------------------------
/.github/workflows/npm-publish.yml:
--------------------------------------------------------------------------------
1 | # This workflow will run tests using node and then publish a package to GitHub Packages when a release is created
2 | # For more information see: https://help.github.com/actions/language-and-framework-guides/publishing-nodejs-packages
3 |
4 | name: Node.js Package
5 |
6 | on:
7 | release:
8 | types: [created]
9 |
10 | jobs:
11 | publish-npm:
12 | runs-on: ubuntu-latest
13 | steps:
14 | - uses: actions/checkout@v3
15 | - name: Install Node.js
16 | uses: actions/setup-node@v3
17 | with:
18 | node-version: 18
19 | registry-url: https://registry.npmjs.org/
20 |
21 | - uses: pnpm/action-setup@v2
22 | name: Install pnpm
23 | id: pnpm-install
24 | with:
25 | version: 7
26 | run_install: false
27 |
28 | - name: Get pnpm store directory
29 | id: pnpm-cache
30 | shell: bash
31 | run: |
32 | echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT
33 |
34 | - uses: actions/cache@v3
35 | name: Setup pnpm cache
36 | with:
37 | path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}
38 | key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
39 | restore-keys: |
40 | ${{ runner.os }}-pnpm-store-
41 |
42 | - run: pnpm install
43 | - run: npm run build
44 | - run: npm test
45 | - run: npm publish
46 | env:
47 | NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}}
48 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/
2 | dist/
3 | .vscode/
4 | coverage/
--------------------------------------------------------------------------------
/.vscode/launch.json:
--------------------------------------------------------------------------------
1 | {
2 | // Use IntelliSense to learn about possible attributes.
3 | // Hover to view descriptions of existing attributes.
4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
5 | "version": "0.2.0",
6 | "configurations": [
7 | {
8 | "name": "Current TS File",
9 | "type": "node",
10 | "request": "launch",
11 | "env": {
12 | "TS_NODE_FILES": "true"
13 | },
14 | "args": [
15 | "${relativeFile}",
16 | ],
17 | "runtimeArgs": [
18 | "--nolazy",
19 | "-r",
20 | "ts-node/register"
21 | ],
22 | "sourceMaps": true,
23 | "cwd": "${workspaceRoot}",
24 | "protocol": "inspector",
25 | }
26 | ]
27 | }
--------------------------------------------------------------------------------
/CODE_OF_CONDUCT.md:
--------------------------------------------------------------------------------
1 | # Contributor Covenant Code of Conduct
2 |
3 | ## Our Pledge
4 |
5 | We as members, contributors, and leaders pledge to make participation in our
6 | community a harassment-free experience for everyone, regardless of age, body
7 | size, visible or invisible disability, ethnicity, sex characteristics, gender
8 | identity and expression, level of experience, education, socio-economic status,
9 | nationality, personal appearance, race, religion, or sexual identity
10 | and orientation.
11 |
12 | We pledge to act and interact in ways that contribute to an open, welcoming,
13 | diverse, inclusive, and healthy community.
14 |
15 | ## Our Standards
16 |
17 | Examples of behavior that contributes to a positive environment for our
18 | community include:
19 |
20 | * Demonstrating empathy and kindness toward other people
21 | * Being respectful of differing opinions, viewpoints, and experiences
22 | * Giving and gracefully accepting constructive feedback
23 | * Accepting responsibility and apologizing to those affected by our mistakes,
24 | and learning from the experience
25 | * Focusing on what is best not just for us as individuals, but for the
26 | overall community
27 |
28 | Examples of unacceptable behavior include:
29 |
30 | * The use of sexualized language or imagery, and sexual attention or
31 | advances of any kind
32 | * Trolling, insulting or derogatory comments, and personal or political attacks
33 | * Public or private harassment
34 | * Publishing others' private information, such as a physical or email
35 | address, without their explicit permission
36 | * Other conduct which could reasonably be considered inappropriate in a
37 | professional setting
38 |
39 | ## Enforcement Responsibilities
40 |
41 | Community leaders are responsible for clarifying and enforcing our standards of
42 | acceptable behavior and will take appropriate and fair corrective action in
43 | response to any behavior that they deem inappropriate, threatening, offensive,
44 | or harmful.
45 |
46 | Community leaders have the right and responsibility to remove, edit, or reject
47 | comments, commits, code, wiki edits, issues, and other contributions that are
48 | not aligned to this Code of Conduct, and will communicate reasons for moderation
49 | decisions when appropriate.
50 |
51 | ## Scope
52 |
53 | This Code of Conduct applies within all community spaces, and also applies when
54 | an individual is officially representing the community in public spaces.
55 | Examples of representing our community include using an official e-mail address,
56 | posting via an official social media account, or acting as an appointed
57 | representative at an online or offline event.
58 |
59 | ## Enforcement
60 |
61 | Instances of abusive, harassing, or otherwise unacceptable behavior may be
62 | reported to the community leaders responsible for enforcement at
63 | .
64 | All complaints will be reviewed and investigated promptly and fairly.
65 |
66 | All community leaders are obligated to respect the privacy and security of the
67 | reporter of any incident.
68 |
69 | ## Enforcement Guidelines
70 |
71 | Community leaders will follow these Community Impact Guidelines in determining
72 | the consequences for any action they deem in violation of this Code of Conduct:
73 |
74 | ### 1. Correction
75 |
76 | **Community Impact**: Use of inappropriate language or other behavior deemed
77 | unprofessional or unwelcome in the community.
78 |
79 | **Consequence**: A private, written warning from community leaders, providing
80 | clarity around the nature of the violation and an explanation of why the
81 | behavior was inappropriate. A public apology may be requested.
82 |
83 | ### 2. Warning
84 |
85 | **Community Impact**: A violation through a single incident or series
86 | of actions.
87 |
88 | **Consequence**: A warning with consequences for continued behavior. No
89 | interaction with the people involved, including unsolicited interaction with
90 | those enforcing the Code of Conduct, for a specified period of time. This
91 | includes avoiding interactions in community spaces as well as external channels
92 | like social media. Violating these terms may lead to a temporary or
93 | permanent ban.
94 |
95 | ### 3. Temporary Ban
96 |
97 | **Community Impact**: A serious violation of community standards, including
98 | sustained inappropriate behavior.
99 |
100 | **Consequence**: A temporary ban from any sort of interaction or public
101 | communication with the community for a specified period of time. No public or
102 | private interaction with the people involved, including unsolicited interaction
103 | with those enforcing the Code of Conduct, is allowed during this period.
104 | Violating these terms may lead to a permanent ban.
105 |
106 | ### 4. Permanent Ban
107 |
108 | **Community Impact**: Demonstrating a pattern of violation of community
109 | standards, including sustained inappropriate behavior, harassment of an
110 | individual, or aggression toward or disparagement of classes of individuals.
111 |
112 | **Consequence**: A permanent ban from any sort of public interaction within
113 | the community.
114 |
115 | ## Attribution
116 |
117 | This Code of Conduct is adapted from the [Contributor Covenant][homepage],
118 | version 2.0, available at
119 | https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
120 |
121 | Community Impact Guidelines were inspired by [Mozilla's code of conduct
122 | enforcement ladder](https://github.com/mozilla/diversity).
123 |
124 | [homepage]: https://www.contributor-covenant.org
125 |
126 | For answers to common questions about this code of conduct, see the FAQ at
127 | https://www.contributor-covenant.org/faq. Translations are available at
128 | https://www.contributor-covenant.org/translations.
129 |
--------------------------------------------------------------------------------
/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 | # Contributing
2 |
3 | When contributing to this repository, please first discuss the change you wish to make via issue,
4 | email, or any other method with the owners of this repository before making a change.
5 |
6 | Please note we have a code of conduct, please follow it in all your interactions with the project.
7 |
8 | ## Pull Request Process
9 |
10 | 1. Ensure any install or build dependencies are removed before the end of the layer when doing a
11 | build.
12 | 2. Update the README.md with details of changes to the interface, this includes new environment
13 | variables, exposed ports, useful file locations and container parameters.
14 | 3. Increase the version numbers in `package.json` to the new version that this
15 | Pull Request would represent. The versioning scheme we use is [SemVer](http://semver.org/).
16 | 4. You may merge the Pull Request in once you have the sign-off, or the maintainer will do the merge.
17 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2019 Han Li
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | 
2 | ## A simple retry decorator for typescript with 0 dependency.
3 | This is inspired by the [Spring-Retry project](https://github.com/spring-projects/spring-retry). Written in Typescript, *100%* Test Coverage.
4 |
5 | Import and use it. Retry for `Promise` is supported as long as the `runtime` has promise(nodejs/evergreen-browser).
6 |
7 | ### Install
8 | > npm install typescript-retry-decorator
9 |
10 | Depending on your setup, you may need to enable [`experimentalDecorators`](https://www.typescriptlang.org/tsconfig#experimentalDecorators) flag in `tsconfig.json`.
11 |
12 | ### Options
13 | | Option Name | Type | Required? | Default | Description |
14 | |:-----------------:|:------------------------:|:---------:|:---------------------------------------:|:-----------------------------------------------------------------------------------------------------------------:|
15 | | maxAttempts | number | Yes | - | The max attempts to try |
16 | | backOff | number | No | 0 | number in `ms` to back off. If not set, then no wait |
17 | | backOffPolicy | enum | No | FixedBackOffPolicy | can be fixed or exponential |
18 | | exponentialOption | object | No | `{ maxInterval: 2000, multiplier: 2 }` | This is for the `ExponentialBackOffPolicy`
The max interval each wait and the multiplier for the `backOff`. For `backoffStrategy`, more details below |
19 | | doRetry | (e: any) => boolean | No | - | Function with error parameter to decide if repetition is necessary. |
20 | | value | Error/Exception class | No | [ ] | An array of Exception types that are retryable. |
21 | | useConsoleLogger | boolean | No | true | Print errors on console. |
22 | | useOriginalError | throw original exception | No | false | `MaxAttemptsError` by default. if this is set to *true*, the `original` exception would be thrown instead. |
23 |
24 | #### Exponential options
25 |
26 | The `exponentialOption` allows you to fine-tune the exponential backoff strategy using several options:
27 | - `maxInterval`: The maximum interval between two retries. The default value is 2000 ms.
28 | - `multiplier`: The multiplier to use to generate the next backoff interval from the last one. The default value is 2.
29 | - `backoffStrategy`: Optional. If specified, determines the strategy used to introduce "jitter" between retry intervals. For an explanation of the available strategies and why you might select one over the other, check out [this article](https://aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/).
30 | - `ExponentialBackoffStrategy.FullJitter`: The base backoff interval is multiplied by a random number between 0 and 1.
31 | - `ExponentialBackoffStrategy.EqualJitter`: The backoff interval is (base interval / 2) + (random value between 0 and base interval / 2).
32 |
33 | ### Example
34 | ```typescript
35 | import { Retryable, BackOffPolicy } from 'typescript-retry-decorator';
36 |
37 | let count: number = 1;
38 |
39 | class RetryExample {
40 | @Retryable({ maxAttempts: 3 })
41 | static async noDelayRetry() {
42 | console.info(`Calling noDelayRetry for the ${count++} time at ${new Date().toLocaleTimeString()}`);
43 | throw new Error('I failed!');
44 | }
45 |
46 | @Retryable({
47 | maxAttempts: 3,
48 | value: [SyntaxError, ReferenceError]
49 | })
50 | static async noDelaySpecificRetry(): Promise {
51 | console.info(`Calling noDelaySpecificRetry for the ${count++} time at ${new Date().toLocaleTimeString()}`);
52 | throw new SyntaxError('I failed with SyntaxError!');
53 | }
54 |
55 | @Retryable({
56 | maxAttempts: 3,
57 | backOff: 1000,
58 | doRetry: (e: Error) => {
59 | return e.message === 'Error: 429';
60 | }
61 | })
62 | static async doRetry() {
63 | console.info(`Calling doRetry for the ${count++} time at ${new Date().toLocaleTimeString()}`);
64 | throw new Error('Error: 429');
65 | }
66 |
67 | @Retryable({
68 | maxAttempts: 3,
69 | backOff: 1000,
70 | doRetry: (e: Error) => {
71 | return e.message === 'Error: 429';
72 | }
73 | })
74 | static async doNotRetry() {
75 | console.info(`Calling doNotRetry for the ${count++} time at ${new Date().toLocaleTimeString()}`);
76 | throw new Error('Error: 404');
77 | }
78 |
79 | @Retryable({
80 | maxAttempts: 3,
81 | backOffPolicy: BackOffPolicy.FixedBackOffPolicy,
82 | backOff: 1000
83 | })
84 | static async fixedBackOffRetry() {
85 | console.info(`Calling fixedBackOffRetry 1s for the ${count++} time at ${new Date().toLocaleTimeString()}`);
86 | throw new Error('I failed!');
87 | }
88 |
89 | @Retryable({
90 | maxAttempts: 3,
91 | backOffPolicy: BackOffPolicy.ExponentialBackOffPolicy,
92 | backOff: 1000,
93 | exponentialOption: { maxInterval: 4000, multiplier: 3 }
94 | })
95 | static async ExponentialBackOffRetry() {
96 | console.info(`Calling ExponentialBackOffRetry backOff 1s, multiplier=3 for the ${count++} time at ${new Date().toLocaleTimeString()}`);
97 | throw new Error('I failed!');
98 | }
99 |
100 | @Retryable({
101 | maxAttempts: 3,
102 | backOffPolicy: BackOffPolicy.ExponentialBackOffPolicy,
103 | backOff: 1000,
104 | exponentialOption: { maxInterval: 4000, multiplier: 2, backoffStrategy: ExponentialBackoffStrategy.EqualJitter }
105 | })
106 | static async ExponentialBackOffWithJitterRetry() {
107 | console.info(`Calling ExponentialBackOffWithJitterRetry backOff 1s, multiplier=2 for the ${count++} time at ${new Date().toLocaleTimeString()}`);
108 | throw new Error('I failed!');
109 | }
110 | }
111 |
112 | (async () => {
113 | try {
114 | resetCount();
115 | await RetryExample.noDelayRetry();
116 | } catch (e) {
117 | console.info(`All retry done as expected, final message: '${e.message}'`);
118 | }
119 |
120 | try {
121 | resetCount();
122 | await RetryExample.doRetry();
123 | } catch (e) {
124 | console.info(`All retry done as expected, final message: '${e.message}'`);
125 | }
126 |
127 | try {
128 | resetCount();
129 | await RetryExample.doNotRetry();
130 | } catch (e) {
131 | console.info(`All retry done as expected, final message: '${e.message}'`);
132 | }
133 |
134 | try {
135 | resetCount();
136 | await RetryExample.fixedBackOffRetry();
137 | } catch (e) {
138 | console.info(`All retry done as expected, final message: '${e.message}'`);
139 | }
140 |
141 | try {
142 | resetCount();
143 | await RetryExample.ExponentialBackOffRetry();
144 | } catch (e) {
145 | console.info(`All retry done as expected, final message: '${e.message}'`);
146 | }
147 |
148 | try {
149 | resetCount();
150 | await RetryExample.ExponentialBackOffWithJitterRetry();
151 | } catch (e) {
152 | console.info(`All retry done as expected, final message: '${e.message}'`);
153 | }
154 |
155 | })();
156 |
157 | function resetCount() {
158 | count = 1;
159 | }
160 | ```
161 |
162 | Run the above code with `ts-node`, then output will be:
163 | ```
164 | Calling noDelayRetry for the 1 time at 4:12:49 PM
165 | Calling noDelayRetry for the 2 time at 4:12:49 PM
166 | Calling noDelayRetry for the 3 time at 4:12:49 PM
167 | Calling noDelayRetry for the 4 time at 4:12:49 PM
168 | I failed!
169 | All retry done as expected, final message: 'Failed for 'noDelayRetry' for 3 times.'
170 | Calling noDelayRetry for the 1 time at 4:12:49 PM
171 | Calling noDelayRetry for the 2 time at 4:12:49 PM
172 | Calling noDelayRetry for the 3 time at 4:12:49 PM
173 | Calling noDelayRetry for the 4 time at 4:12:49 PM
174 | I failed with SyntaxError!
175 | All retry done as expected, final message: 'Failed for 'noDelaySpecificRetry' for 3 times.'
176 | Calling doRetry for the 1 time at 4:12:49 PM
177 | Calling doRetry for the 2 time at 4:12:50 PM
178 | Calling doRetry for the 3 time at 4:12:51 PM
179 | Calling doRetry for the 4 time at 4:12:52 PM
180 | Error: 429
181 | All retry done as expected, final message: 'Failed for 'doRetry' for 3 times.'
182 | Calling doNotRetry for the 1 time at 4:12:52 PM
183 | All retry done as expected, final message: 'Error: 404'
184 | Calling fixedBackOffRetry 1s for the 1 time at 4:12:52 PM
185 | Calling fixedBackOffRetry 1s for the 2 time at 4:12:53 PM
186 | Calling fixedBackOffRetry 1s for the 3 time at 4:12:54 PM
187 | Calling fixedBackOffRetry 1s for the 4 time at 4:12:55 PM
188 | I failed!
189 | All retry done as expected, final message: 'Failed for 'fixedBackOffRetry' for 3 times.'
190 | Calling ExponentialBackOffRetry backOff 1s, multiplier=3 for the 1 time at 4:12:55 PM
191 | Calling ExponentialBackOffRetry backOff 1s, multiplier=3 for the 2 time at 4:12:56 PM
192 | Calling ExponentialBackOffRetry backOff 1s, multiplier=3 for the 3 time at 4:12:59 PM
193 | Calling ExponentialBackOffRetry backOff 1s, multiplier=3 for the 4 time at 4:13:03 PM
194 | I failed!
195 | All retry done as expected, final message: 'Failed for 'ExponentialBackOffRetry' for 3 times.'
196 | Calling ExponentialBackOffWithJitterRetry backOff 1s, multiplier=2 for the 1 time at 4:13:03 PM
197 | Calling ExponentialBackOffWithJitterRetry backOff 1s, multiplier=2 for the 2 time at 4:13:03 PM
198 | Calling ExponentialBackOffWithJitterRetry backOff 1s, multiplier=2 for the 3 time at 4:13:05 PM
199 | Calling ExponentialBackOffWithJitterRetry backOff 1s, multiplier=2 for the 4 time at 4:13:09 PM
200 | I failed!
201 | All retry done as expected, final message: 'Failed for 'ExponentialBackOffWithJitterRetry' for 3 times.'
202 | ```
203 |
--------------------------------------------------------------------------------
/jest.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | moduleFileExtensions: ['ts', 'js', 'json'],
3 | transform: {
4 | '^.+\\.(ts)$': 'ts-jest',
5 | },
6 | globals: {
7 | 'ts-jest': {
8 | tsconfig: 'tsconfig.json',
9 | },
10 | },
11 | testMatch: ['**/*.test.ts'],
12 | testPathIgnorePatterns: ['/node_modules/', '/dist/', '/lib/'],
13 | collectCoverage: true,
14 | 'coverageReporters': ['json', 'html'],
15 | verbose: true,
16 | testTimeout: 30000,
17 | };
18 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "typescript-retry-decorator",
3 | "version": "2.4.2",
4 | "description": "A simple retry decorator for typescript with no dependency.",
5 | "main": "dist/index.js",
6 | "types": "dist/index.d.ts",
7 | "typings": "dist/index.d.ts",
8 | "scripts": {
9 | "test": "jest",
10 | "example": "ts-node src/example.ts",
11 | "lint": "eslint --ext .ts src/",
12 | "build": "tsc --declaration --project ."
13 | },
14 | "repository": {
15 | "type": "git",
16 | "url": "git+https://github.com/vcfvct/typescript-retry-decorator.git"
17 | },
18 | "keywords": [
19 | "typescirpt",
20 | "decorator",
21 | "retry"
22 | ],
23 | "author": "Han Li",
24 | "license": "MIT",
25 | "bugs": {
26 | "url": "https://github.com/vcfvct/typescript-retry-decorator/issues"
27 | },
28 | "homepage": "https://github.com/vcfvct/typescript-retry-decorator#readme",
29 | "devDependencies": {
30 | "@types/jest": "^28.1.1",
31 | "@types/node": "^17.0.41",
32 | "@typescript-eslint/eslint-plugin": "^5.27.1",
33 | "@typescript-eslint/parser": "^5.27.1",
34 | "eslint": "^8.17.0",
35 | "eslint-config-ts-vcfvct": "^1.0.0",
36 | "jest": "^28.1.1",
37 | "ts-jest": "^28.0.4",
38 | "ts-node": "^10.8.1",
39 | "typescript": "^4.7.3"
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/pnpm-lock.yaml:
--------------------------------------------------------------------------------
1 | lockfileVersion: '6.0'
2 |
3 | settings:
4 | autoInstallPeers: true
5 | excludeLinksFromLockfile: false
6 |
7 | devDependencies:
8 | '@types/jest':
9 | specifier: ^28.1.1
10 | version: 28.1.1
11 | '@types/node':
12 | specifier: ^17.0.41
13 | version: 17.0.41
14 | '@typescript-eslint/eslint-plugin':
15 | specifier: ^5.27.1
16 | version: 5.27.1(@typescript-eslint/parser@5.27.1)(eslint@8.17.0)(typescript@4.7.3)
17 | '@typescript-eslint/parser':
18 | specifier: ^5.27.1
19 | version: 5.27.1(eslint@8.17.0)(typescript@4.7.3)
20 | eslint:
21 | specifier: ^8.17.0
22 | version: 8.17.0
23 | eslint-config-ts-vcfvct:
24 | specifier: ^1.0.0
25 | version: 1.0.1(eslint@8.17.0)
26 | jest:
27 | specifier: ^28.1.1
28 | version: 28.1.1(@types/node@17.0.41)(ts-node@10.8.1)
29 | ts-jest:
30 | specifier: ^28.0.4
31 | version: 28.0.4(@babel/core@7.18.2)(jest@28.1.1)(typescript@4.7.3)
32 | ts-node:
33 | specifier: ^10.8.1
34 | version: 10.8.1(@types/node@17.0.41)(typescript@4.7.3)
35 | typescript:
36 | specifier: ^4.7.3
37 | version: 4.7.3
38 |
39 | packages:
40 |
41 | /@ampproject/remapping@2.2.0:
42 | resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==}
43 | engines: {node: '>=6.0.0'}
44 | dependencies:
45 | '@jridgewell/gen-mapping': 0.1.1
46 | '@jridgewell/trace-mapping': 0.3.13
47 | dev: true
48 |
49 | /@babel/code-frame@7.16.7:
50 | resolution: {integrity: sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==}
51 | engines: {node: '>=6.9.0'}
52 | dependencies:
53 | '@babel/highlight': 7.17.12
54 | dev: true
55 |
56 | /@babel/compat-data@7.17.10:
57 | resolution: {integrity: sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw==}
58 | engines: {node: '>=6.9.0'}
59 | dev: true
60 |
61 | /@babel/core@7.18.2:
62 | resolution: {integrity: sha512-A8pri1YJiC5UnkdrWcmfZTJTV85b4UXTAfImGmCfYmax4TR9Cw8sDS0MOk++Gp2mE/BefVJ5nwy5yzqNJbP/DQ==}
63 | engines: {node: '>=6.9.0'}
64 | dependencies:
65 | '@ampproject/remapping': 2.2.0
66 | '@babel/code-frame': 7.16.7
67 | '@babel/generator': 7.18.2
68 | '@babel/helper-compilation-targets': 7.18.2(@babel/core@7.18.2)
69 | '@babel/helper-module-transforms': 7.18.0
70 | '@babel/helpers': 7.18.2
71 | '@babel/parser': 7.18.4
72 | '@babel/template': 7.16.7
73 | '@babel/traverse': 7.18.2
74 | '@babel/types': 7.18.4
75 | convert-source-map: 1.8.0
76 | debug: 4.3.4
77 | gensync: 1.0.0-beta.2
78 | json5: 2.2.1
79 | semver: 6.3.0
80 | transitivePeerDependencies:
81 | - supports-color
82 | dev: true
83 |
84 | /@babel/generator@7.18.2:
85 | resolution: {integrity: sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==}
86 | engines: {node: '>=6.9.0'}
87 | dependencies:
88 | '@babel/types': 7.18.4
89 | '@jridgewell/gen-mapping': 0.3.1
90 | jsesc: 2.5.2
91 | dev: true
92 |
93 | /@babel/helper-compilation-targets@7.18.2(@babel/core@7.18.2):
94 | resolution: {integrity: sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ==}
95 | engines: {node: '>=6.9.0'}
96 | peerDependencies:
97 | '@babel/core': ^7.0.0
98 | dependencies:
99 | '@babel/compat-data': 7.17.10
100 | '@babel/core': 7.18.2
101 | '@babel/helper-validator-option': 7.16.7
102 | browserslist: 4.20.4
103 | semver: 6.3.0
104 | dev: true
105 |
106 | /@babel/helper-environment-visitor@7.18.2:
107 | resolution: {integrity: sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ==}
108 | engines: {node: '>=6.9.0'}
109 | dev: true
110 |
111 | /@babel/helper-function-name@7.17.9:
112 | resolution: {integrity: sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==}
113 | engines: {node: '>=6.9.0'}
114 | dependencies:
115 | '@babel/template': 7.16.7
116 | '@babel/types': 7.18.4
117 | dev: true
118 |
119 | /@babel/helper-hoist-variables@7.16.7:
120 | resolution: {integrity: sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==}
121 | engines: {node: '>=6.9.0'}
122 | dependencies:
123 | '@babel/types': 7.18.4
124 | dev: true
125 |
126 | /@babel/helper-module-imports@7.16.7:
127 | resolution: {integrity: sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==}
128 | engines: {node: '>=6.9.0'}
129 | dependencies:
130 | '@babel/types': 7.18.4
131 | dev: true
132 |
133 | /@babel/helper-module-transforms@7.18.0:
134 | resolution: {integrity: sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA==}
135 | engines: {node: '>=6.9.0'}
136 | dependencies:
137 | '@babel/helper-environment-visitor': 7.18.2
138 | '@babel/helper-module-imports': 7.16.7
139 | '@babel/helper-simple-access': 7.18.2
140 | '@babel/helper-split-export-declaration': 7.16.7
141 | '@babel/helper-validator-identifier': 7.16.7
142 | '@babel/template': 7.16.7
143 | '@babel/traverse': 7.18.2
144 | '@babel/types': 7.18.4
145 | transitivePeerDependencies:
146 | - supports-color
147 | dev: true
148 |
149 | /@babel/helper-plugin-utils@7.17.12:
150 | resolution: {integrity: sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==}
151 | engines: {node: '>=6.9.0'}
152 | dev: true
153 |
154 | /@babel/helper-simple-access@7.18.2:
155 | resolution: {integrity: sha512-7LIrjYzndorDY88MycupkpQLKS1AFfsVRm2k/9PtKScSy5tZq0McZTj+DiMRynboZfIqOKvo03pmhTaUgiD6fQ==}
156 | engines: {node: '>=6.9.0'}
157 | dependencies:
158 | '@babel/types': 7.18.4
159 | dev: true
160 |
161 | /@babel/helper-split-export-declaration@7.16.7:
162 | resolution: {integrity: sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==}
163 | engines: {node: '>=6.9.0'}
164 | dependencies:
165 | '@babel/types': 7.18.4
166 | dev: true
167 |
168 | /@babel/helper-validator-identifier@7.16.7:
169 | resolution: {integrity: sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==}
170 | engines: {node: '>=6.9.0'}
171 | dev: true
172 |
173 | /@babel/helper-validator-option@7.16.7:
174 | resolution: {integrity: sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==}
175 | engines: {node: '>=6.9.0'}
176 | dev: true
177 |
178 | /@babel/helpers@7.18.2:
179 | resolution: {integrity: sha512-j+d+u5xT5utcQSzrh9p+PaJX94h++KN+ng9b9WEJq7pkUPAd61FGqhjuUEdfknb3E/uDBb7ruwEeKkIxNJPIrg==}
180 | engines: {node: '>=6.9.0'}
181 | dependencies:
182 | '@babel/template': 7.16.7
183 | '@babel/traverse': 7.18.2
184 | '@babel/types': 7.18.4
185 | transitivePeerDependencies:
186 | - supports-color
187 | dev: true
188 |
189 | /@babel/highlight@7.17.12:
190 | resolution: {integrity: sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg==}
191 | engines: {node: '>=6.9.0'}
192 | dependencies:
193 | '@babel/helper-validator-identifier': 7.16.7
194 | chalk: 2.4.2
195 | js-tokens: 4.0.0
196 | dev: true
197 |
198 | /@babel/parser@7.18.4:
199 | resolution: {integrity: sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==}
200 | engines: {node: '>=6.0.0'}
201 | hasBin: true
202 | dependencies:
203 | '@babel/types': 7.18.4
204 | dev: true
205 |
206 | /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.18.2):
207 | resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==}
208 | peerDependencies:
209 | '@babel/core': ^7.0.0-0
210 | dependencies:
211 | '@babel/core': 7.18.2
212 | '@babel/helper-plugin-utils': 7.17.12
213 | dev: true
214 |
215 | /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.18.2):
216 | resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==}
217 | peerDependencies:
218 | '@babel/core': ^7.0.0-0
219 | dependencies:
220 | '@babel/core': 7.18.2
221 | '@babel/helper-plugin-utils': 7.17.12
222 | dev: true
223 |
224 | /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.18.2):
225 | resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==}
226 | peerDependencies:
227 | '@babel/core': ^7.0.0-0
228 | dependencies:
229 | '@babel/core': 7.18.2
230 | '@babel/helper-plugin-utils': 7.17.12
231 | dev: true
232 |
233 | /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.18.2):
234 | resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==}
235 | peerDependencies:
236 | '@babel/core': ^7.0.0-0
237 | dependencies:
238 | '@babel/core': 7.18.2
239 | '@babel/helper-plugin-utils': 7.17.12
240 | dev: true
241 |
242 | /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.18.2):
243 | resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==}
244 | peerDependencies:
245 | '@babel/core': ^7.0.0-0
246 | dependencies:
247 | '@babel/core': 7.18.2
248 | '@babel/helper-plugin-utils': 7.17.12
249 | dev: true
250 |
251 | /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.18.2):
252 | resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==}
253 | peerDependencies:
254 | '@babel/core': ^7.0.0-0
255 | dependencies:
256 | '@babel/core': 7.18.2
257 | '@babel/helper-plugin-utils': 7.17.12
258 | dev: true
259 |
260 | /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.18.2):
261 | resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==}
262 | peerDependencies:
263 | '@babel/core': ^7.0.0-0
264 | dependencies:
265 | '@babel/core': 7.18.2
266 | '@babel/helper-plugin-utils': 7.17.12
267 | dev: true
268 |
269 | /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.18.2):
270 | resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==}
271 | peerDependencies:
272 | '@babel/core': ^7.0.0-0
273 | dependencies:
274 | '@babel/core': 7.18.2
275 | '@babel/helper-plugin-utils': 7.17.12
276 | dev: true
277 |
278 | /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.18.2):
279 | resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==}
280 | peerDependencies:
281 | '@babel/core': ^7.0.0-0
282 | dependencies:
283 | '@babel/core': 7.18.2
284 | '@babel/helper-plugin-utils': 7.17.12
285 | dev: true
286 |
287 | /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.18.2):
288 | resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==}
289 | peerDependencies:
290 | '@babel/core': ^7.0.0-0
291 | dependencies:
292 | '@babel/core': 7.18.2
293 | '@babel/helper-plugin-utils': 7.17.12
294 | dev: true
295 |
296 | /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.18.2):
297 | resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==}
298 | peerDependencies:
299 | '@babel/core': ^7.0.0-0
300 | dependencies:
301 | '@babel/core': 7.18.2
302 | '@babel/helper-plugin-utils': 7.17.12
303 | dev: true
304 |
305 | /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.18.2):
306 | resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==}
307 | engines: {node: '>=6.9.0'}
308 | peerDependencies:
309 | '@babel/core': ^7.0.0-0
310 | dependencies:
311 | '@babel/core': 7.18.2
312 | '@babel/helper-plugin-utils': 7.17.12
313 | dev: true
314 |
315 | /@babel/plugin-syntax-typescript@7.17.12(@babel/core@7.18.2):
316 | resolution: {integrity: sha512-TYY0SXFiO31YXtNg3HtFwNJHjLsAyIIhAhNWkQ5whPPS7HWUFlg9z0Ta4qAQNjQbP1wsSt/oKkmZ/4/WWdMUpw==}
317 | engines: {node: '>=6.9.0'}
318 | peerDependencies:
319 | '@babel/core': ^7.0.0-0
320 | dependencies:
321 | '@babel/core': 7.18.2
322 | '@babel/helper-plugin-utils': 7.17.12
323 | dev: true
324 |
325 | /@babel/template@7.16.7:
326 | resolution: {integrity: sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==}
327 | engines: {node: '>=6.9.0'}
328 | dependencies:
329 | '@babel/code-frame': 7.16.7
330 | '@babel/parser': 7.18.4
331 | '@babel/types': 7.18.4
332 | dev: true
333 |
334 | /@babel/traverse@7.18.2:
335 | resolution: {integrity: sha512-9eNwoeovJ6KH9zcCNnENY7DMFwTU9JdGCFtqNLfUAqtUHRCOsTOqWoffosP8vKmNYeSBUv3yVJXjfd8ucwOjUA==}
336 | engines: {node: '>=6.9.0'}
337 | dependencies:
338 | '@babel/code-frame': 7.16.7
339 | '@babel/generator': 7.18.2
340 | '@babel/helper-environment-visitor': 7.18.2
341 | '@babel/helper-function-name': 7.17.9
342 | '@babel/helper-hoist-variables': 7.16.7
343 | '@babel/helper-split-export-declaration': 7.16.7
344 | '@babel/parser': 7.18.4
345 | '@babel/types': 7.18.4
346 | debug: 4.3.4
347 | globals: 11.12.0
348 | transitivePeerDependencies:
349 | - supports-color
350 | dev: true
351 |
352 | /@babel/types@7.18.4:
353 | resolution: {integrity: sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw==}
354 | engines: {node: '>=6.9.0'}
355 | dependencies:
356 | '@babel/helper-validator-identifier': 7.16.7
357 | to-fast-properties: 2.0.0
358 | dev: true
359 |
360 | /@bcoe/v8-coverage@0.2.3:
361 | resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==}
362 | dev: true
363 |
364 | /@cspotcode/source-map-support@0.8.1:
365 | resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
366 | engines: {node: '>=12'}
367 | dependencies:
368 | '@jridgewell/trace-mapping': 0.3.9
369 | dev: true
370 |
371 | /@eslint/eslintrc@1.3.0:
372 | resolution: {integrity: sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==}
373 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
374 | dependencies:
375 | ajv: 6.12.6
376 | debug: 4.3.4
377 | espree: 9.3.2
378 | globals: 13.15.0
379 | ignore: 5.2.0
380 | import-fresh: 3.3.0
381 | js-yaml: 4.1.0
382 | minimatch: 3.1.2
383 | strip-json-comments: 3.1.1
384 | transitivePeerDependencies:
385 | - supports-color
386 | dev: true
387 |
388 | /@humanwhocodes/config-array@0.9.5:
389 | resolution: {integrity: sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==}
390 | engines: {node: '>=10.10.0'}
391 | dependencies:
392 | '@humanwhocodes/object-schema': 1.2.1
393 | debug: 4.3.4
394 | minimatch: 3.1.2
395 | transitivePeerDependencies:
396 | - supports-color
397 | dev: true
398 |
399 | /@humanwhocodes/object-schema@1.2.1:
400 | resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==}
401 | dev: true
402 |
403 | /@istanbuljs/load-nyc-config@1.1.0:
404 | resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==}
405 | engines: {node: '>=8'}
406 | dependencies:
407 | camelcase: 5.3.1
408 | find-up: 4.1.0
409 | get-package-type: 0.1.0
410 | js-yaml: 3.14.1
411 | resolve-from: 5.0.0
412 | dev: true
413 |
414 | /@istanbuljs/schema@0.1.3:
415 | resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==}
416 | engines: {node: '>=8'}
417 | dev: true
418 |
419 | /@jest/console@28.1.1:
420 | resolution: {integrity: sha512-0RiUocPVFEm3WRMOStIHbRWllG6iW6E3/gUPnf4lkrVFyXIIDeCe+vlKeYyFOMhB2EPE6FLFCNADSOOQMaqvyA==}
421 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
422 | dependencies:
423 | '@jest/types': 28.1.1
424 | '@types/node': 17.0.41
425 | chalk: 4.1.2
426 | jest-message-util: 28.1.1
427 | jest-util: 28.1.1
428 | slash: 3.0.0
429 | dev: true
430 |
431 | /@jest/core@28.1.1(ts-node@10.8.1):
432 | resolution: {integrity: sha512-3pYsBoZZ42tXMdlcFeCc/0j9kOlK7MYuXs2B1QbvDgMoW1K9NJ4G/VYvIbMb26iqlkTfPHo7SC2JgjDOk/mxXw==}
433 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
434 | peerDependencies:
435 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
436 | peerDependenciesMeta:
437 | node-notifier:
438 | optional: true
439 | dependencies:
440 | '@jest/console': 28.1.1
441 | '@jest/reporters': 28.1.1
442 | '@jest/test-result': 28.1.1
443 | '@jest/transform': 28.1.1
444 | '@jest/types': 28.1.1
445 | '@types/node': 17.0.41
446 | ansi-escapes: 4.3.2
447 | chalk: 4.1.2
448 | ci-info: 3.3.1
449 | exit: 0.1.2
450 | graceful-fs: 4.2.10
451 | jest-changed-files: 28.0.2
452 | jest-config: 28.1.1(@types/node@17.0.41)(ts-node@10.8.1)
453 | jest-haste-map: 28.1.1
454 | jest-message-util: 28.1.1
455 | jest-regex-util: 28.0.2
456 | jest-resolve: 28.1.1
457 | jest-resolve-dependencies: 28.1.1
458 | jest-runner: 28.1.1
459 | jest-runtime: 28.1.1
460 | jest-snapshot: 28.1.1
461 | jest-util: 28.1.1
462 | jest-validate: 28.1.1
463 | jest-watcher: 28.1.1
464 | micromatch: 4.0.5
465 | pretty-format: 28.1.1
466 | rimraf: 3.0.2
467 | slash: 3.0.0
468 | strip-ansi: 6.0.1
469 | transitivePeerDependencies:
470 | - supports-color
471 | - ts-node
472 | dev: true
473 |
474 | /@jest/environment@28.1.1:
475 | resolution: {integrity: sha512-9auVQ2GzQ7nrU+lAr8KyY838YahElTX9HVjbQPPS2XjlxQ+na18G113OoBhyBGBtD6ZnO/SrUy5WR8EzOj1/Uw==}
476 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
477 | dependencies:
478 | '@jest/fake-timers': 28.1.1
479 | '@jest/types': 28.1.1
480 | '@types/node': 17.0.41
481 | jest-mock: 28.1.1
482 | dev: true
483 |
484 | /@jest/expect-utils@28.1.1:
485 | resolution: {integrity: sha512-n/ghlvdhCdMI/hTcnn4qV57kQuV9OTsZzH1TTCVARANKhl6hXJqLKUkwX69ftMGpsbpt96SsDD8n8LD2d9+FRw==}
486 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
487 | dependencies:
488 | jest-get-type: 28.0.2
489 | dev: true
490 |
491 | /@jest/expect@28.1.1:
492 | resolution: {integrity: sha512-/+tQprrFoT6lfkMj4mW/mUIfAmmk/+iQPmg7mLDIFOf2lyf7EBHaS+x3RbeR0VZVMe55IvX7QRoT/2aK3AuUXg==}
493 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
494 | dependencies:
495 | expect: 28.1.1
496 | jest-snapshot: 28.1.1
497 | transitivePeerDependencies:
498 | - supports-color
499 | dev: true
500 |
501 | /@jest/fake-timers@28.1.1:
502 | resolution: {integrity: sha512-BY/3+TyLs5+q87rGWrGUY5f8e8uC3LsVHS9Diz8+FV3ARXL4sNnkLlIB8dvDvRrp+LUCGM+DLqlsYubizGUjIA==}
503 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
504 | dependencies:
505 | '@jest/types': 28.1.1
506 | '@sinonjs/fake-timers': 9.1.2
507 | '@types/node': 17.0.41
508 | jest-message-util: 28.1.1
509 | jest-mock: 28.1.1
510 | jest-util: 28.1.1
511 | dev: true
512 |
513 | /@jest/globals@28.1.1:
514 | resolution: {integrity: sha512-dEgl/6v7ToB4vXItdvcltJBgny0xBE6xy6IYQrPJAJggdEinGxCDMivNv7sFzPcTITGquXD6UJwYxfJ/5ZwDSg==}
515 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
516 | dependencies:
517 | '@jest/environment': 28.1.1
518 | '@jest/expect': 28.1.1
519 | '@jest/types': 28.1.1
520 | transitivePeerDependencies:
521 | - supports-color
522 | dev: true
523 |
524 | /@jest/reporters@28.1.1:
525 | resolution: {integrity: sha512-597Zj4D4d88sZrzM4atEGLuO7SdA/YrOv9SRXHXRNC+/FwPCWxZhBAEzhXoiJzfRwn8zes/EjS8Lo6DouGN5Gg==}
526 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
527 | peerDependencies:
528 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
529 | peerDependenciesMeta:
530 | node-notifier:
531 | optional: true
532 | dependencies:
533 | '@bcoe/v8-coverage': 0.2.3
534 | '@jest/console': 28.1.1
535 | '@jest/test-result': 28.1.1
536 | '@jest/transform': 28.1.1
537 | '@jest/types': 28.1.1
538 | '@jridgewell/trace-mapping': 0.3.13
539 | '@types/node': 17.0.41
540 | chalk: 4.1.2
541 | collect-v8-coverage: 1.0.1
542 | exit: 0.1.2
543 | glob: 7.1.6
544 | graceful-fs: 4.2.10
545 | istanbul-lib-coverage: 3.2.0
546 | istanbul-lib-instrument: 5.2.0
547 | istanbul-lib-report: 3.0.0
548 | istanbul-lib-source-maps: 4.0.1
549 | istanbul-reports: 3.1.4
550 | jest-message-util: 28.1.1
551 | jest-util: 28.1.1
552 | jest-worker: 28.1.1
553 | slash: 3.0.0
554 | string-length: 4.0.2
555 | strip-ansi: 6.0.1
556 | terminal-link: 2.1.1
557 | v8-to-istanbul: 9.0.0
558 | transitivePeerDependencies:
559 | - supports-color
560 | dev: true
561 |
562 | /@jest/schemas@28.0.2:
563 | resolution: {integrity: sha512-YVDJZjd4izeTDkij00vHHAymNXQ6WWsdChFRK86qck6Jpr3DCL5W3Is3vslviRlP+bLuMYRLbdp98amMvqudhA==}
564 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
565 | dependencies:
566 | '@sinclair/typebox': 0.23.5
567 | dev: true
568 |
569 | /@jest/source-map@28.0.2:
570 | resolution: {integrity: sha512-Y9dxC8ZpN3kImkk0LkK5XCEneYMAXlZ8m5bflmSL5vrwyeUpJfentacCUg6fOb8NOpOO7hz2+l37MV77T6BFPw==}
571 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
572 | dependencies:
573 | '@jridgewell/trace-mapping': 0.3.13
574 | callsites: 3.1.0
575 | graceful-fs: 4.2.10
576 | dev: true
577 |
578 | /@jest/test-result@28.1.1:
579 | resolution: {integrity: sha512-hPmkugBktqL6rRzwWAtp1JtYT4VHwv8OQ+9lE5Gymj6dHzubI/oJHMUpPOt8NrdVWSrz9S7bHjJUmv2ggFoUNQ==}
580 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
581 | dependencies:
582 | '@jest/console': 28.1.1
583 | '@jest/types': 28.1.1
584 | '@types/istanbul-lib-coverage': 2.0.4
585 | collect-v8-coverage: 1.0.1
586 | dev: true
587 |
588 | /@jest/test-sequencer@28.1.1:
589 | resolution: {integrity: sha512-nuL+dNSVMcWB7OOtgb0EGH5AjO4UBCt68SLP08rwmC+iRhyuJWS9MtZ/MpipxFwKAlHFftbMsydXqWre8B0+XA==}
590 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
591 | dependencies:
592 | '@jest/test-result': 28.1.1
593 | graceful-fs: 4.2.10
594 | jest-haste-map: 28.1.1
595 | slash: 3.0.0
596 | dev: true
597 |
598 | /@jest/transform@28.1.1:
599 | resolution: {integrity: sha512-PkfaTUuvjUarl1EDr5ZQcCA++oXkFCP9QFUkG0yVKVmNObjhrqDy0kbMpMebfHWm3CCDHjYNem9eUSH8suVNHQ==}
600 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
601 | dependencies:
602 | '@babel/core': 7.18.2
603 | '@jest/types': 28.1.1
604 | '@jridgewell/trace-mapping': 0.3.13
605 | babel-plugin-istanbul: 6.1.1
606 | chalk: 4.1.2
607 | convert-source-map: 1.8.0
608 | fast-json-stable-stringify: 2.0.0
609 | graceful-fs: 4.2.10
610 | jest-haste-map: 28.1.1
611 | jest-regex-util: 28.0.2
612 | jest-util: 28.1.1
613 | micromatch: 4.0.5
614 | pirates: 4.0.5
615 | slash: 3.0.0
616 | write-file-atomic: 4.0.1
617 | transitivePeerDependencies:
618 | - supports-color
619 | dev: true
620 |
621 | /@jest/types@28.1.1:
622 | resolution: {integrity: sha512-vRXVqSg1VhDnB8bWcmvLzmg0Bt9CRKVgHPXqYwvWMX3TvAjeO+nRuK6+VdTKCtWOvYlmkF/HqNAL/z+N3B53Kw==}
623 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
624 | dependencies:
625 | '@jest/schemas': 28.0.2
626 | '@types/istanbul-lib-coverage': 2.0.4
627 | '@types/istanbul-reports': 3.0.1
628 | '@types/node': 17.0.41
629 | '@types/yargs': 17.0.10
630 | chalk: 4.1.2
631 | dev: true
632 |
633 | /@jridgewell/gen-mapping@0.1.1:
634 | resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==}
635 | engines: {node: '>=6.0.0'}
636 | dependencies:
637 | '@jridgewell/set-array': 1.1.1
638 | '@jridgewell/sourcemap-codec': 1.4.13
639 | dev: true
640 |
641 | /@jridgewell/gen-mapping@0.3.1:
642 | resolution: {integrity: sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==}
643 | engines: {node: '>=6.0.0'}
644 | dependencies:
645 | '@jridgewell/set-array': 1.1.1
646 | '@jridgewell/sourcemap-codec': 1.4.13
647 | '@jridgewell/trace-mapping': 0.3.13
648 | dev: true
649 |
650 | /@jridgewell/resolve-uri@3.0.7:
651 | resolution: {integrity: sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==}
652 | engines: {node: '>=6.0.0'}
653 | dev: true
654 |
655 | /@jridgewell/set-array@1.1.1:
656 | resolution: {integrity: sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==}
657 | engines: {node: '>=6.0.0'}
658 | dev: true
659 |
660 | /@jridgewell/sourcemap-codec@1.4.13:
661 | resolution: {integrity: sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==}
662 | dev: true
663 |
664 | /@jridgewell/trace-mapping@0.3.13:
665 | resolution: {integrity: sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==}
666 | dependencies:
667 | '@jridgewell/resolve-uri': 3.0.7
668 | '@jridgewell/sourcemap-codec': 1.4.13
669 | dev: true
670 |
671 | /@jridgewell/trace-mapping@0.3.9:
672 | resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==}
673 | dependencies:
674 | '@jridgewell/resolve-uri': 3.0.7
675 | '@jridgewell/sourcemap-codec': 1.4.13
676 | dev: true
677 |
678 | /@nodelib/fs.scandir@2.1.5:
679 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
680 | engines: {node: '>= 8'}
681 | dependencies:
682 | '@nodelib/fs.stat': 2.0.5
683 | run-parallel: 1.2.0
684 | dev: true
685 |
686 | /@nodelib/fs.stat@2.0.5:
687 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
688 | engines: {node: '>= 8'}
689 | dev: true
690 |
691 | /@nodelib/fs.walk@1.2.8:
692 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
693 | engines: {node: '>= 8'}
694 | dependencies:
695 | '@nodelib/fs.scandir': 2.1.5
696 | fastq: 1.13.0
697 | dev: true
698 |
699 | /@sinclair/typebox@0.23.5:
700 | resolution: {integrity: sha512-AFBVi/iT4g20DHoujvMH1aEDn8fGJh4xsRGCP6d8RpLPMqsNPvW01Jcn0QysXTsg++/xj25NmJsGyH9xug/wKg==}
701 | dev: true
702 |
703 | /@sinonjs/commons@1.8.3:
704 | resolution: {integrity: sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==}
705 | dependencies:
706 | type-detect: 4.0.8
707 | dev: true
708 |
709 | /@sinonjs/fake-timers@9.1.2:
710 | resolution: {integrity: sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==}
711 | dependencies:
712 | '@sinonjs/commons': 1.8.3
713 | dev: true
714 |
715 | /@tsconfig/node10@1.0.8:
716 | resolution: {integrity: sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==}
717 | dev: true
718 |
719 | /@tsconfig/node12@1.0.9:
720 | resolution: {integrity: sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==}
721 | dev: true
722 |
723 | /@tsconfig/node14@1.0.1:
724 | resolution: {integrity: sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==}
725 | dev: true
726 |
727 | /@tsconfig/node16@1.0.2:
728 | resolution: {integrity: sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==}
729 | dev: true
730 |
731 | /@types/babel__core@7.1.19:
732 | resolution: {integrity: sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==}
733 | dependencies:
734 | '@babel/parser': 7.18.4
735 | '@babel/types': 7.18.4
736 | '@types/babel__generator': 7.6.4
737 | '@types/babel__template': 7.4.1
738 | '@types/babel__traverse': 7.17.1
739 | dev: true
740 |
741 | /@types/babel__generator@7.6.4:
742 | resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==}
743 | dependencies:
744 | '@babel/types': 7.18.4
745 | dev: true
746 |
747 | /@types/babel__template@7.4.1:
748 | resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==}
749 | dependencies:
750 | '@babel/parser': 7.18.4
751 | '@babel/types': 7.18.4
752 | dev: true
753 |
754 | /@types/babel__traverse@7.17.1:
755 | resolution: {integrity: sha512-kVzjari1s2YVi77D3w1yuvohV2idweYXMCDzqBiVNN63TcDWrIlTVOYpqVrvbbyOE/IyzBoTKF0fdnLPEORFxA==}
756 | dependencies:
757 | '@babel/types': 7.18.4
758 | dev: true
759 |
760 | /@types/graceful-fs@4.1.5:
761 | resolution: {integrity: sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==}
762 | dependencies:
763 | '@types/node': 17.0.41
764 | dev: true
765 |
766 | /@types/istanbul-lib-coverage@2.0.4:
767 | resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==}
768 | dev: true
769 |
770 | /@types/istanbul-lib-report@3.0.0:
771 | resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==}
772 | dependencies:
773 | '@types/istanbul-lib-coverage': 2.0.4
774 | dev: true
775 |
776 | /@types/istanbul-reports@3.0.1:
777 | resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==}
778 | dependencies:
779 | '@types/istanbul-lib-report': 3.0.0
780 | dev: true
781 |
782 | /@types/jest@28.1.1:
783 | resolution: {integrity: sha512-C2p7yqleUKtCkVjlOur9BWVA4HgUQmEj/HWCt5WzZ5mLXrWnyIfl0wGuArc+kBXsy0ZZfLp+7dywB4HtSVYGVA==}
784 | dependencies:
785 | jest-matcher-utils: 27.5.1
786 | pretty-format: 27.5.1
787 | dev: true
788 |
789 | /@types/json-schema@7.0.11:
790 | resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==}
791 | dev: true
792 |
793 | /@types/node@17.0.41:
794 | resolution: {integrity: sha512-xA6drNNeqb5YyV5fO3OAEsnXLfO7uF0whiOfPTz5AeDo8KeZFmODKnvwPymMNO8qE/an8pVY/O50tig2SQCrGw==}
795 | dev: true
796 |
797 | /@types/prettier@2.6.3:
798 | resolution: {integrity: sha512-ymZk3LEC/fsut+/Q5qejp6R9O1rMxz3XaRHDV6kX8MrGAhOSPqVARbDi+EZvInBpw+BnCX3TD240byVkOfQsHg==}
799 | dev: true
800 |
801 | /@types/stack-utils@2.0.1:
802 | resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==}
803 | dev: true
804 |
805 | /@types/yargs-parser@21.0.0:
806 | resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==}
807 | dev: true
808 |
809 | /@types/yargs@17.0.10:
810 | resolution: {integrity: sha512-gmEaFwpj/7f/ROdtIlci1R1VYU1J4j95m8T+Tj3iBgiBFKg1foE/PSl93bBd5T9LDXNPo8UlNN6W0qwD8O5OaA==}
811 | dependencies:
812 | '@types/yargs-parser': 21.0.0
813 | dev: true
814 |
815 | /@typescript-eslint/eslint-plugin@5.27.1(@typescript-eslint/parser@5.27.1)(eslint@8.17.0)(typescript@4.7.3):
816 | resolution: {integrity: sha512-6dM5NKT57ZduNnJfpY81Phe9nc9wolnMCnknb1im6brWi1RYv84nbMS3olJa27B6+irUVV1X/Wb+Am0FjJdGFw==}
817 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
818 | peerDependencies:
819 | '@typescript-eslint/parser': ^5.0.0
820 | eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
821 | typescript: '*'
822 | peerDependenciesMeta:
823 | typescript:
824 | optional: true
825 | dependencies:
826 | '@typescript-eslint/parser': 5.27.1(eslint@8.17.0)(typescript@4.7.3)
827 | '@typescript-eslint/scope-manager': 5.27.1
828 | '@typescript-eslint/type-utils': 5.27.1(eslint@8.17.0)(typescript@4.7.3)
829 | '@typescript-eslint/utils': 5.27.1(eslint@8.17.0)(typescript@4.7.3)
830 | debug: 4.3.4
831 | eslint: 8.17.0
832 | functional-red-black-tree: 1.0.1
833 | ignore: 5.2.0
834 | regexpp: 3.2.0
835 | semver: 7.3.7
836 | tsutils: 3.21.0(typescript@4.7.3)
837 | typescript: 4.7.3
838 | transitivePeerDependencies:
839 | - supports-color
840 | dev: true
841 |
842 | /@typescript-eslint/parser@5.27.1(eslint@8.17.0)(typescript@4.7.3):
843 | resolution: {integrity: sha512-7Va2ZOkHi5NP+AZwb5ReLgNF6nWLGTeUJfxdkVUAPPSaAdbWNnFZzLZ4EGGmmiCTg+AwlbE1KyUYTBglosSLHQ==}
844 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
845 | peerDependencies:
846 | eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
847 | typescript: '*'
848 | peerDependenciesMeta:
849 | typescript:
850 | optional: true
851 | dependencies:
852 | '@typescript-eslint/scope-manager': 5.27.1
853 | '@typescript-eslint/types': 5.27.1
854 | '@typescript-eslint/typescript-estree': 5.27.1(typescript@4.7.3)
855 | debug: 4.3.4
856 | eslint: 8.17.0
857 | typescript: 4.7.3
858 | transitivePeerDependencies:
859 | - supports-color
860 | dev: true
861 |
862 | /@typescript-eslint/scope-manager@5.27.1:
863 | resolution: {integrity: sha512-fQEOSa/QroWE6fAEg+bJxtRZJTH8NTskggybogHt4H9Da8zd4cJji76gA5SBlR0MgtwF7rebxTbDKB49YUCpAg==}
864 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
865 | dependencies:
866 | '@typescript-eslint/types': 5.27.1
867 | '@typescript-eslint/visitor-keys': 5.27.1
868 | dev: true
869 |
870 | /@typescript-eslint/type-utils@5.27.1(eslint@8.17.0)(typescript@4.7.3):
871 | resolution: {integrity: sha512-+UC1vVUWaDHRnC2cQrCJ4QtVjpjjCgjNFpg8b03nERmkHv9JV9X5M19D7UFMd+/G7T/sgFwX2pGmWK38rqyvXw==}
872 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
873 | peerDependencies:
874 | eslint: '*'
875 | typescript: '*'
876 | peerDependenciesMeta:
877 | typescript:
878 | optional: true
879 | dependencies:
880 | '@typescript-eslint/utils': 5.27.1(eslint@8.17.0)(typescript@4.7.3)
881 | debug: 4.3.4
882 | eslint: 8.17.0
883 | tsutils: 3.21.0(typescript@4.7.3)
884 | typescript: 4.7.3
885 | transitivePeerDependencies:
886 | - supports-color
887 | dev: true
888 |
889 | /@typescript-eslint/types@5.27.1:
890 | resolution: {integrity: sha512-LgogNVkBhCTZU/m8XgEYIWICD6m4dmEDbKXESCbqOXfKZxRKeqpiJXQIErv66sdopRKZPo5l32ymNqibYEH/xg==}
891 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
892 | dev: true
893 |
894 | /@typescript-eslint/typescript-estree@5.27.1(typescript@4.7.3):
895 | resolution: {integrity: sha512-DnZvvq3TAJ5ke+hk0LklvxwYsnXpRdqUY5gaVS0D4raKtbznPz71UJGnPTHEFo0GDxqLOLdMkkmVZjSpET1hFw==}
896 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
897 | peerDependencies:
898 | typescript: '*'
899 | peerDependenciesMeta:
900 | typescript:
901 | optional: true
902 | dependencies:
903 | '@typescript-eslint/types': 5.27.1
904 | '@typescript-eslint/visitor-keys': 5.27.1
905 | debug: 4.3.4
906 | globby: 11.1.0
907 | is-glob: 4.0.3
908 | semver: 7.3.7
909 | tsutils: 3.21.0(typescript@4.7.3)
910 | typescript: 4.7.3
911 | transitivePeerDependencies:
912 | - supports-color
913 | dev: true
914 |
915 | /@typescript-eslint/utils@5.27.1(eslint@8.17.0)(typescript@4.7.3):
916 | resolution: {integrity: sha512-mZ9WEn1ZLDaVrhRaYgzbkXBkTPghPFsup8zDbbsYTxC5OmqrFE7skkKS/sraVsLP3TcT3Ki5CSyEFBRkLH/H/w==}
917 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
918 | peerDependencies:
919 | eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
920 | dependencies:
921 | '@types/json-schema': 7.0.11
922 | '@typescript-eslint/scope-manager': 5.27.1
923 | '@typescript-eslint/types': 5.27.1
924 | '@typescript-eslint/typescript-estree': 5.27.1(typescript@4.7.3)
925 | eslint: 8.17.0
926 | eslint-scope: 5.1.1
927 | eslint-utils: 3.0.0(eslint@8.17.0)
928 | transitivePeerDependencies:
929 | - supports-color
930 | - typescript
931 | dev: true
932 |
933 | /@typescript-eslint/visitor-keys@5.27.1:
934 | resolution: {integrity: sha512-xYs6ffo01nhdJgPieyk7HAOpjhTsx7r/oB9LWEhwAXgwn33tkr+W8DI2ChboqhZlC4q3TC6geDYPoiX8ROqyOQ==}
935 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
936 | dependencies:
937 | '@typescript-eslint/types': 5.27.1
938 | eslint-visitor-keys: 3.3.0
939 | dev: true
940 |
941 | /acorn-jsx@5.3.2(acorn@8.7.1):
942 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
943 | peerDependencies:
944 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
945 | dependencies:
946 | acorn: 8.7.1
947 | dev: true
948 |
949 | /acorn-walk@8.2.0:
950 | resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==}
951 | engines: {node: '>=0.4.0'}
952 | dev: true
953 |
954 | /acorn@8.7.1:
955 | resolution: {integrity: sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==}
956 | engines: {node: '>=0.4.0'}
957 | hasBin: true
958 | dev: true
959 |
960 | /ajv@6.12.6:
961 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
962 | dependencies:
963 | fast-deep-equal: 3.1.3
964 | fast-json-stable-stringify: 2.0.0
965 | json-schema-traverse: 0.4.1
966 | uri-js: 4.2.2
967 | dev: true
968 |
969 | /ansi-escapes@4.3.2:
970 | resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==}
971 | engines: {node: '>=8'}
972 | dependencies:
973 | type-fest: 0.21.3
974 | dev: true
975 |
976 | /ansi-regex@5.0.1:
977 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
978 | engines: {node: '>=8'}
979 | dev: true
980 |
981 | /ansi-styles@3.2.1:
982 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
983 | engines: {node: '>=4'}
984 | dependencies:
985 | color-convert: 1.9.3
986 | dev: true
987 |
988 | /ansi-styles@4.3.0:
989 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
990 | engines: {node: '>=8'}
991 | dependencies:
992 | color-convert: 2.0.1
993 | dev: true
994 |
995 | /ansi-styles@5.2.0:
996 | resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==}
997 | engines: {node: '>=10'}
998 | dev: true
999 |
1000 | /anymatch@3.1.2:
1001 | resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==}
1002 | engines: {node: '>= 8'}
1003 | dependencies:
1004 | normalize-path: 3.0.0
1005 | picomatch: 2.3.1
1006 | dev: true
1007 |
1008 | /arg@4.1.3:
1009 | resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==}
1010 | dev: true
1011 |
1012 | /argparse@1.0.10:
1013 | resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
1014 | dependencies:
1015 | sprintf-js: 1.0.3
1016 | dev: true
1017 |
1018 | /argparse@2.0.1:
1019 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
1020 | dev: true
1021 |
1022 | /array-union@2.1.0:
1023 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
1024 | engines: {node: '>=8'}
1025 | dev: true
1026 |
1027 | /babel-jest@28.1.1(@babel/core@7.18.2):
1028 | resolution: {integrity: sha512-MEt0263viUdAkTq5D7upHPNxvt4n9uLUGa6pPz3WviNBMtOmStb1lIXS3QobnoqM+qnH+vr4EKlvhe8QcmxIYw==}
1029 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
1030 | peerDependencies:
1031 | '@babel/core': ^7.8.0
1032 | dependencies:
1033 | '@babel/core': 7.18.2
1034 | '@jest/transform': 28.1.1
1035 | '@types/babel__core': 7.1.19
1036 | babel-plugin-istanbul: 6.1.1
1037 | babel-preset-jest: 28.1.1(@babel/core@7.18.2)
1038 | chalk: 4.1.2
1039 | graceful-fs: 4.2.10
1040 | slash: 3.0.0
1041 | transitivePeerDependencies:
1042 | - supports-color
1043 | dev: true
1044 |
1045 | /babel-plugin-istanbul@6.1.1:
1046 | resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==}
1047 | engines: {node: '>=8'}
1048 | dependencies:
1049 | '@babel/helper-plugin-utils': 7.17.12
1050 | '@istanbuljs/load-nyc-config': 1.1.0
1051 | '@istanbuljs/schema': 0.1.3
1052 | istanbul-lib-instrument: 5.2.0
1053 | test-exclude: 6.0.0
1054 | transitivePeerDependencies:
1055 | - supports-color
1056 | dev: true
1057 |
1058 | /babel-plugin-jest-hoist@28.1.1:
1059 | resolution: {integrity: sha512-NovGCy5Hn25uMJSAU8FaHqzs13cFoOI4lhIujiepssjCKRsAo3TA734RDWSGxuFTsUJXerYOqQQodlxgmtqbzw==}
1060 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
1061 | dependencies:
1062 | '@babel/template': 7.16.7
1063 | '@babel/types': 7.18.4
1064 | '@types/babel__core': 7.1.19
1065 | '@types/babel__traverse': 7.17.1
1066 | dev: true
1067 |
1068 | /babel-preset-current-node-syntax@1.0.1(@babel/core@7.18.2):
1069 | resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==}
1070 | peerDependencies:
1071 | '@babel/core': ^7.0.0
1072 | dependencies:
1073 | '@babel/core': 7.18.2
1074 | '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.18.2)
1075 | '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.18.2)
1076 | '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.18.2)
1077 | '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.18.2)
1078 | '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.18.2)
1079 | '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.18.2)
1080 | '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.18.2)
1081 | '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.18.2)
1082 | '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.18.2)
1083 | '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.18.2)
1084 | '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.18.2)
1085 | '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.18.2)
1086 | dev: true
1087 |
1088 | /babel-preset-jest@28.1.1(@babel/core@7.18.2):
1089 | resolution: {integrity: sha512-FCq9Oud0ReTeWtcneYf/48981aTfXYuB9gbU4rBNNJVBSQ6ssv7E6v/qvbBxtOWwZFXjLZwpg+W3q7J6vhH25g==}
1090 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
1091 | peerDependencies:
1092 | '@babel/core': ^7.0.0
1093 | dependencies:
1094 | '@babel/core': 7.18.2
1095 | babel-plugin-jest-hoist: 28.1.1
1096 | babel-preset-current-node-syntax: 1.0.1(@babel/core@7.18.2)
1097 | dev: true
1098 |
1099 | /balanced-match@1.0.0:
1100 | resolution: {integrity: sha512-9Y0g0Q8rmSt+H33DfKv7FOc3v+iRI+o1lbzt8jGcIosYW37IIW/2XVYq5NPdmaD5NQ59Nk26Kl/vZbwW9Fr8vg==}
1101 | dev: true
1102 |
1103 | /brace-expansion@1.1.11:
1104 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
1105 | dependencies:
1106 | balanced-match: 1.0.0
1107 | concat-map: 0.0.1
1108 | dev: true
1109 |
1110 | /braces@3.0.2:
1111 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
1112 | engines: {node: '>=8'}
1113 | dependencies:
1114 | fill-range: 7.0.1
1115 | dev: true
1116 |
1117 | /browserslist@4.20.4:
1118 | resolution: {integrity: sha512-ok1d+1WpnU24XYN7oC3QWgTyMhY/avPJ/r9T00xxvUOIparA/gc+UPUMaod3i+G6s+nI2nUb9xZ5k794uIwShw==}
1119 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
1120 | hasBin: true
1121 | dependencies:
1122 | caniuse-lite: 1.0.30001352
1123 | electron-to-chromium: 1.4.150
1124 | escalade: 3.1.1
1125 | node-releases: 2.0.5
1126 | picocolors: 1.0.0
1127 | dev: true
1128 |
1129 | /bs-logger@0.2.6:
1130 | resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==}
1131 | engines: {node: '>= 6'}
1132 | dependencies:
1133 | fast-json-stable-stringify: 2.0.0
1134 | dev: true
1135 |
1136 | /bser@2.1.1:
1137 | resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==}
1138 | dependencies:
1139 | node-int64: 0.4.0
1140 | dev: true
1141 |
1142 | /buffer-from@1.1.1:
1143 | resolution: {integrity: sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==}
1144 | dev: true
1145 |
1146 | /callsites@3.1.0:
1147 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
1148 | engines: {node: '>=6'}
1149 | dev: true
1150 |
1151 | /camelcase@5.3.1:
1152 | resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==}
1153 | engines: {node: '>=6'}
1154 | dev: true
1155 |
1156 | /camelcase@6.3.0:
1157 | resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
1158 | engines: {node: '>=10'}
1159 | dev: true
1160 |
1161 | /caniuse-lite@1.0.30001352:
1162 | resolution: {integrity: sha512-GUgH8w6YergqPQDGWhJGt8GDRnY0L/iJVQcU3eJ46GYf52R8tk0Wxp0PymuFVZboJYXGiCqwozAYZNRjVj6IcA==}
1163 | dev: true
1164 |
1165 | /chalk@2.4.2:
1166 | resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
1167 | engines: {node: '>=4'}
1168 | dependencies:
1169 | ansi-styles: 3.2.1
1170 | escape-string-regexp: 1.0.5
1171 | supports-color: 5.5.0
1172 | dev: true
1173 |
1174 | /chalk@4.1.2:
1175 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
1176 | engines: {node: '>=10'}
1177 | dependencies:
1178 | ansi-styles: 4.3.0
1179 | supports-color: 7.2.0
1180 | dev: true
1181 |
1182 | /char-regex@1.0.2:
1183 | resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==}
1184 | engines: {node: '>=10'}
1185 | dev: true
1186 |
1187 | /ci-info@3.3.1:
1188 | resolution: {integrity: sha512-SXgeMX9VwDe7iFFaEWkA5AstuER9YKqy4EhHqr4DVqkwmD9rpVimkMKWHdjn30Ja45txyjhSn63lVX69eVCckg==}
1189 | dev: true
1190 |
1191 | /cjs-module-lexer@1.2.2:
1192 | resolution: {integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==}
1193 | dev: true
1194 |
1195 | /cliui@7.0.4:
1196 | resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==}
1197 | dependencies:
1198 | string-width: 4.2.3
1199 | strip-ansi: 6.0.1
1200 | wrap-ansi: 7.0.0
1201 | dev: true
1202 |
1203 | /co@4.6.0:
1204 | resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==}
1205 | engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'}
1206 | dev: true
1207 |
1208 | /collect-v8-coverage@1.0.1:
1209 | resolution: {integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==}
1210 | dev: true
1211 |
1212 | /color-convert@1.9.3:
1213 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
1214 | dependencies:
1215 | color-name: 1.1.3
1216 | dev: true
1217 |
1218 | /color-convert@2.0.1:
1219 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
1220 | engines: {node: '>=7.0.0'}
1221 | dependencies:
1222 | color-name: 1.1.4
1223 | dev: true
1224 |
1225 | /color-name@1.1.3:
1226 | resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==}
1227 | dev: true
1228 |
1229 | /color-name@1.1.4:
1230 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
1231 | dev: true
1232 |
1233 | /concat-map@0.0.1:
1234 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
1235 | dev: true
1236 |
1237 | /convert-source-map@1.8.0:
1238 | resolution: {integrity: sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==}
1239 | dependencies:
1240 | safe-buffer: 5.1.2
1241 | dev: true
1242 |
1243 | /create-require@1.1.1:
1244 | resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==}
1245 | dev: true
1246 |
1247 | /cross-spawn@7.0.3:
1248 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
1249 | engines: {node: '>= 8'}
1250 | dependencies:
1251 | path-key: 3.1.1
1252 | shebang-command: 2.0.0
1253 | which: 2.0.2
1254 | dev: true
1255 |
1256 | /debug@4.3.4:
1257 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
1258 | engines: {node: '>=6.0'}
1259 | peerDependencies:
1260 | supports-color: '*'
1261 | peerDependenciesMeta:
1262 | supports-color:
1263 | optional: true
1264 | dependencies:
1265 | ms: 2.1.2
1266 | dev: true
1267 |
1268 | /dedent@0.7.0:
1269 | resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==}
1270 | dev: true
1271 |
1272 | /deep-is@0.1.3:
1273 | resolution: {integrity: sha512-GtxAN4HvBachZzm4OnWqc45ESpUCMwkYcsjnsPs23FwJbsO+k4t0k9bQCgOmzIlpHO28+WPK/KRbRk0DDHuuDw==}
1274 | dev: true
1275 |
1276 | /deepmerge@4.2.2:
1277 | resolution: {integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==}
1278 | engines: {node: '>=0.10.0'}
1279 | dev: true
1280 |
1281 | /detect-newline@3.1.0:
1282 | resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==}
1283 | engines: {node: '>=8'}
1284 | dev: true
1285 |
1286 | /diff-sequences@27.5.1:
1287 | resolution: {integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==}
1288 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
1289 | dev: true
1290 |
1291 | /diff-sequences@28.1.1:
1292 | resolution: {integrity: sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==}
1293 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
1294 | dev: true
1295 |
1296 | /diff@4.0.2:
1297 | resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==}
1298 | engines: {node: '>=0.3.1'}
1299 | dev: true
1300 |
1301 | /dir-glob@3.0.1:
1302 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
1303 | engines: {node: '>=8'}
1304 | dependencies:
1305 | path-type: 4.0.0
1306 | dev: true
1307 |
1308 | /doctrine@3.0.0:
1309 | resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
1310 | engines: {node: '>=6.0.0'}
1311 | dependencies:
1312 | esutils: 2.0.3
1313 | dev: true
1314 |
1315 | /electron-to-chromium@1.4.150:
1316 | resolution: {integrity: sha512-MP3oBer0X7ZeS9GJ0H6lmkn561UxiwOIY9TTkdxVY7lI9G6GVCKfgJaHaDcakwdKxBXA4T3ybeswH/WBIN/KTA==}
1317 | dev: true
1318 |
1319 | /emittery@0.10.2:
1320 | resolution: {integrity: sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==}
1321 | engines: {node: '>=12'}
1322 | dev: true
1323 |
1324 | /emoji-regex@8.0.0:
1325 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
1326 | dev: true
1327 |
1328 | /error-ex@1.3.2:
1329 | resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==}
1330 | dependencies:
1331 | is-arrayish: 0.2.1
1332 | dev: true
1333 |
1334 | /escalade@3.1.1:
1335 | resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
1336 | engines: {node: '>=6'}
1337 | dev: true
1338 |
1339 | /escape-string-regexp@1.0.5:
1340 | resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
1341 | engines: {node: '>=0.8.0'}
1342 | dev: true
1343 |
1344 | /escape-string-regexp@2.0.0:
1345 | resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==}
1346 | engines: {node: '>=8'}
1347 | dev: true
1348 |
1349 | /escape-string-regexp@4.0.0:
1350 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
1351 | engines: {node: '>=10'}
1352 | dev: true
1353 |
1354 | /eslint-config-ts-vcfvct@1.0.1(eslint@8.17.0):
1355 | resolution: {integrity: sha512-LF+yISgzo5hduH7IKZqb2pAKfGtxquv4q6mFQ4EbDsKRLBh6jqfGjmTVOIAwGhX8KbZuYMl1Bi++5QaCxGnoGg==}
1356 | peerDependencies:
1357 | eslint: '>= 6'
1358 | dependencies:
1359 | eslint: 8.17.0
1360 | dev: true
1361 |
1362 | /eslint-scope@5.1.1:
1363 | resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==}
1364 | engines: {node: '>=8.0.0'}
1365 | dependencies:
1366 | esrecurse: 4.3.0
1367 | estraverse: 4.3.0
1368 | dev: true
1369 |
1370 | /eslint-scope@7.1.1:
1371 | resolution: {integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==}
1372 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
1373 | dependencies:
1374 | esrecurse: 4.3.0
1375 | estraverse: 5.3.0
1376 | dev: true
1377 |
1378 | /eslint-utils@3.0.0(eslint@8.17.0):
1379 | resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==}
1380 | engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0}
1381 | peerDependencies:
1382 | eslint: '>=5'
1383 | dependencies:
1384 | eslint: 8.17.0
1385 | eslint-visitor-keys: 2.1.0
1386 | dev: true
1387 |
1388 | /eslint-visitor-keys@2.1.0:
1389 | resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==}
1390 | engines: {node: '>=10'}
1391 | dev: true
1392 |
1393 | /eslint-visitor-keys@3.3.0:
1394 | resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==}
1395 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
1396 | dev: true
1397 |
1398 | /eslint@8.17.0:
1399 | resolution: {integrity: sha512-gq0m0BTJfci60Fz4nczYxNAlED+sMcihltndR8t9t1evnU/azx53x3t2UHXC/uRjcbvRw/XctpaNygSTcQD+Iw==}
1400 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
1401 | hasBin: true
1402 | dependencies:
1403 | '@eslint/eslintrc': 1.3.0
1404 | '@humanwhocodes/config-array': 0.9.5
1405 | ajv: 6.12.6
1406 | chalk: 4.1.2
1407 | cross-spawn: 7.0.3
1408 | debug: 4.3.4
1409 | doctrine: 3.0.0
1410 | escape-string-regexp: 4.0.0
1411 | eslint-scope: 7.1.1
1412 | eslint-utils: 3.0.0(eslint@8.17.0)
1413 | eslint-visitor-keys: 3.3.0
1414 | espree: 9.3.2
1415 | esquery: 1.4.0
1416 | esutils: 2.0.3
1417 | fast-deep-equal: 3.1.3
1418 | file-entry-cache: 6.0.1
1419 | functional-red-black-tree: 1.0.1
1420 | glob-parent: 6.0.2
1421 | globals: 13.15.0
1422 | ignore: 5.2.0
1423 | import-fresh: 3.3.0
1424 | imurmurhash: 0.1.4
1425 | is-glob: 4.0.3
1426 | js-yaml: 4.1.0
1427 | json-stable-stringify-without-jsonify: 1.0.1
1428 | levn: 0.4.1
1429 | lodash.merge: 4.6.2
1430 | minimatch: 3.1.2
1431 | natural-compare: 1.4.0
1432 | optionator: 0.9.1
1433 | regexpp: 3.2.0
1434 | strip-ansi: 6.0.1
1435 | strip-json-comments: 3.1.1
1436 | text-table: 0.2.0
1437 | v8-compile-cache: 2.3.0
1438 | transitivePeerDependencies:
1439 | - supports-color
1440 | dev: true
1441 |
1442 | /espree@9.3.2:
1443 | resolution: {integrity: sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==}
1444 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
1445 | dependencies:
1446 | acorn: 8.7.1
1447 | acorn-jsx: 5.3.2(acorn@8.7.1)
1448 | eslint-visitor-keys: 3.3.0
1449 | dev: true
1450 |
1451 | /esprima@4.0.1:
1452 | resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
1453 | engines: {node: '>=4'}
1454 | hasBin: true
1455 | dev: true
1456 |
1457 | /esquery@1.4.0:
1458 | resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==}
1459 | engines: {node: '>=0.10'}
1460 | dependencies:
1461 | estraverse: 5.3.0
1462 | dev: true
1463 |
1464 | /esrecurse@4.3.0:
1465 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
1466 | engines: {node: '>=4.0'}
1467 | dependencies:
1468 | estraverse: 5.3.0
1469 | dev: true
1470 |
1471 | /estraverse@4.3.0:
1472 | resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==}
1473 | engines: {node: '>=4.0'}
1474 | dev: true
1475 |
1476 | /estraverse@5.3.0:
1477 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
1478 | engines: {node: '>=4.0'}
1479 | dev: true
1480 |
1481 | /esutils@2.0.3:
1482 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
1483 | engines: {node: '>=0.10.0'}
1484 | dev: true
1485 |
1486 | /execa@5.1.1:
1487 | resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
1488 | engines: {node: '>=10'}
1489 | dependencies:
1490 | cross-spawn: 7.0.3
1491 | get-stream: 6.0.1
1492 | human-signals: 2.1.0
1493 | is-stream: 2.0.1
1494 | merge-stream: 2.0.0
1495 | npm-run-path: 4.0.1
1496 | onetime: 5.1.2
1497 | signal-exit: 3.0.7
1498 | strip-final-newline: 2.0.0
1499 | dev: true
1500 |
1501 | /exit@0.1.2:
1502 | resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==}
1503 | engines: {node: '>= 0.8.0'}
1504 | dev: true
1505 |
1506 | /expect@28.1.1:
1507 | resolution: {integrity: sha512-/AANEwGL0tWBwzLNOvO0yUdy2D52jVdNXppOqswC49sxMN2cPWsGCQdzuIf9tj6hHoBQzNvx75JUYuQAckPo3w==}
1508 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
1509 | dependencies:
1510 | '@jest/expect-utils': 28.1.1
1511 | jest-get-type: 28.0.2
1512 | jest-matcher-utils: 28.1.1
1513 | jest-message-util: 28.1.1
1514 | jest-util: 28.1.1
1515 | dev: true
1516 |
1517 | /fast-deep-equal@3.1.3:
1518 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
1519 | dev: true
1520 |
1521 | /fast-glob@3.2.11:
1522 | resolution: {integrity: sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==}
1523 | engines: {node: '>=8.6.0'}
1524 | dependencies:
1525 | '@nodelib/fs.stat': 2.0.5
1526 | '@nodelib/fs.walk': 1.2.8
1527 | glob-parent: 5.1.2
1528 | merge2: 1.4.1
1529 | micromatch: 4.0.5
1530 | dev: true
1531 |
1532 | /fast-json-stable-stringify@2.0.0:
1533 | resolution: {integrity: sha512-eIgZvM9C3P05kg0qxfqaVU6Tma4QedCPIByQOcemV0vju8ot3cS2DpHi4m2G2JvbSMI152rjfLX0p1pkSdyPlQ==}
1534 | dev: true
1535 |
1536 | /fast-levenshtein@2.0.6:
1537 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
1538 | dev: true
1539 |
1540 | /fastq@1.13.0:
1541 | resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==}
1542 | dependencies:
1543 | reusify: 1.0.4
1544 | dev: true
1545 |
1546 | /fb-watchman@2.0.1:
1547 | resolution: {integrity: sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==}
1548 | dependencies:
1549 | bser: 2.1.1
1550 | dev: true
1551 |
1552 | /file-entry-cache@6.0.1:
1553 | resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
1554 | engines: {node: ^10.12.0 || >=12.0.0}
1555 | dependencies:
1556 | flat-cache: 3.0.4
1557 | dev: true
1558 |
1559 | /fill-range@7.0.1:
1560 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
1561 | engines: {node: '>=8'}
1562 | dependencies:
1563 | to-regex-range: 5.0.1
1564 | dev: true
1565 |
1566 | /find-up@4.1.0:
1567 | resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==}
1568 | engines: {node: '>=8'}
1569 | dependencies:
1570 | locate-path: 5.0.0
1571 | path-exists: 4.0.0
1572 | dev: true
1573 |
1574 | /flat-cache@3.0.4:
1575 | resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==}
1576 | engines: {node: ^10.12.0 || >=12.0.0}
1577 | dependencies:
1578 | flatted: 3.2.5
1579 | rimraf: 3.0.2
1580 | dev: true
1581 |
1582 | /flatted@3.2.5:
1583 | resolution: {integrity: sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==}
1584 | dev: true
1585 |
1586 | /fs.realpath@1.0.0:
1587 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
1588 | dev: true
1589 |
1590 | /fsevents@2.3.2:
1591 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
1592 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
1593 | os: [darwin]
1594 | requiresBuild: true
1595 | dev: true
1596 | optional: true
1597 |
1598 | /function-bind@1.1.1:
1599 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
1600 | dev: true
1601 |
1602 | /functional-red-black-tree@1.0.1:
1603 | resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==}
1604 | dev: true
1605 |
1606 | /gensync@1.0.0-beta.2:
1607 | resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
1608 | engines: {node: '>=6.9.0'}
1609 | dev: true
1610 |
1611 | /get-caller-file@2.0.5:
1612 | resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
1613 | engines: {node: 6.* || 8.* || >= 10.*}
1614 | dev: true
1615 |
1616 | /get-package-type@0.1.0:
1617 | resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==}
1618 | engines: {node: '>=8.0.0'}
1619 | dev: true
1620 |
1621 | /get-stream@6.0.1:
1622 | resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
1623 | engines: {node: '>=10'}
1624 | dev: true
1625 |
1626 | /glob-parent@5.1.2:
1627 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
1628 | engines: {node: '>= 6'}
1629 | dependencies:
1630 | is-glob: 4.0.3
1631 | dev: true
1632 |
1633 | /glob-parent@6.0.2:
1634 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
1635 | engines: {node: '>=10.13.0'}
1636 | dependencies:
1637 | is-glob: 4.0.3
1638 | dev: true
1639 |
1640 | /glob@7.1.6:
1641 | resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==}
1642 | dependencies:
1643 | fs.realpath: 1.0.0
1644 | inflight: 1.0.6
1645 | inherits: 2.0.4
1646 | minimatch: 3.1.2
1647 | once: 1.4.0
1648 | path-is-absolute: 1.0.1
1649 | dev: true
1650 |
1651 | /globals@11.12.0:
1652 | resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
1653 | engines: {node: '>=4'}
1654 | dev: true
1655 |
1656 | /globals@13.15.0:
1657 | resolution: {integrity: sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==}
1658 | engines: {node: '>=8'}
1659 | dependencies:
1660 | type-fest: 0.20.2
1661 | dev: true
1662 |
1663 | /globby@11.1.0:
1664 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
1665 | engines: {node: '>=10'}
1666 | dependencies:
1667 | array-union: 2.1.0
1668 | dir-glob: 3.0.1
1669 | fast-glob: 3.2.11
1670 | ignore: 5.2.0
1671 | merge2: 1.4.1
1672 | slash: 3.0.0
1673 | dev: true
1674 |
1675 | /graceful-fs@4.2.10:
1676 | resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==}
1677 | dev: true
1678 |
1679 | /has-flag@3.0.0:
1680 | resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
1681 | engines: {node: '>=4'}
1682 | dev: true
1683 |
1684 | /has-flag@4.0.0:
1685 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
1686 | engines: {node: '>=8'}
1687 | dev: true
1688 |
1689 | /has@1.0.3:
1690 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==}
1691 | engines: {node: '>= 0.4.0'}
1692 | dependencies:
1693 | function-bind: 1.1.1
1694 | dev: true
1695 |
1696 | /html-escaper@2.0.2:
1697 | resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==}
1698 | dev: true
1699 |
1700 | /human-signals@2.1.0:
1701 | resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
1702 | engines: {node: '>=10.17.0'}
1703 | dev: true
1704 |
1705 | /ignore@5.2.0:
1706 | resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==}
1707 | engines: {node: '>= 4'}
1708 | dev: true
1709 |
1710 | /import-fresh@3.3.0:
1711 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
1712 | engines: {node: '>=6'}
1713 | dependencies:
1714 | parent-module: 1.0.1
1715 | resolve-from: 4.0.0
1716 | dev: true
1717 |
1718 | /import-local@3.1.0:
1719 | resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==}
1720 | engines: {node: '>=8'}
1721 | hasBin: true
1722 | dependencies:
1723 | pkg-dir: 4.2.0
1724 | resolve-cwd: 3.0.0
1725 | dev: true
1726 |
1727 | /imurmurhash@0.1.4:
1728 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
1729 | engines: {node: '>=0.8.19'}
1730 | dev: true
1731 |
1732 | /inflight@1.0.6:
1733 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
1734 | dependencies:
1735 | once: 1.4.0
1736 | wrappy: 1.0.2
1737 | dev: true
1738 |
1739 | /inherits@2.0.4:
1740 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
1741 | dev: true
1742 |
1743 | /is-arrayish@0.2.1:
1744 | resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
1745 | dev: true
1746 |
1747 | /is-core-module@2.9.0:
1748 | resolution: {integrity: sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==}
1749 | dependencies:
1750 | has: 1.0.3
1751 | dev: true
1752 |
1753 | /is-extglob@2.1.1:
1754 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
1755 | engines: {node: '>=0.10.0'}
1756 | dev: true
1757 |
1758 | /is-fullwidth-code-point@3.0.0:
1759 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
1760 | engines: {node: '>=8'}
1761 | dev: true
1762 |
1763 | /is-generator-fn@2.1.0:
1764 | resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==}
1765 | engines: {node: '>=6'}
1766 | dev: true
1767 |
1768 | /is-glob@4.0.3:
1769 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
1770 | engines: {node: '>=0.10.0'}
1771 | dependencies:
1772 | is-extglob: 2.1.1
1773 | dev: true
1774 |
1775 | /is-number@7.0.0:
1776 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
1777 | engines: {node: '>=0.12.0'}
1778 | dev: true
1779 |
1780 | /is-stream@2.0.1:
1781 | resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
1782 | engines: {node: '>=8'}
1783 | dev: true
1784 |
1785 | /isexe@2.0.0:
1786 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
1787 | dev: true
1788 |
1789 | /istanbul-lib-coverage@3.2.0:
1790 | resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==}
1791 | engines: {node: '>=8'}
1792 | dev: true
1793 |
1794 | /istanbul-lib-instrument@5.2.0:
1795 | resolution: {integrity: sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==}
1796 | engines: {node: '>=8'}
1797 | dependencies:
1798 | '@babel/core': 7.18.2
1799 | '@babel/parser': 7.18.4
1800 | '@istanbuljs/schema': 0.1.3
1801 | istanbul-lib-coverage: 3.2.0
1802 | semver: 6.3.0
1803 | transitivePeerDependencies:
1804 | - supports-color
1805 | dev: true
1806 |
1807 | /istanbul-lib-report@3.0.0:
1808 | resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==}
1809 | engines: {node: '>=8'}
1810 | dependencies:
1811 | istanbul-lib-coverage: 3.2.0
1812 | make-dir: 3.1.0
1813 | supports-color: 7.2.0
1814 | dev: true
1815 |
1816 | /istanbul-lib-source-maps@4.0.1:
1817 | resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==}
1818 | engines: {node: '>=10'}
1819 | dependencies:
1820 | debug: 4.3.4
1821 | istanbul-lib-coverage: 3.2.0
1822 | source-map: 0.6.1
1823 | transitivePeerDependencies:
1824 | - supports-color
1825 | dev: true
1826 |
1827 | /istanbul-reports@3.1.4:
1828 | resolution: {integrity: sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==}
1829 | engines: {node: '>=8'}
1830 | dependencies:
1831 | html-escaper: 2.0.2
1832 | istanbul-lib-report: 3.0.0
1833 | dev: true
1834 |
1835 | /jest-changed-files@28.0.2:
1836 | resolution: {integrity: sha512-QX9u+5I2s54ZnGoMEjiM2WeBvJR2J7w/8ZUmH2um/WLAuGAYFQcsVXY9+1YL6k0H/AGUdH8pXUAv6erDqEsvIA==}
1837 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
1838 | dependencies:
1839 | execa: 5.1.1
1840 | throat: 6.0.1
1841 | dev: true
1842 |
1843 | /jest-circus@28.1.1:
1844 | resolution: {integrity: sha512-75+BBVTsL4+p2w198DQpCeyh1RdaS2lhEG87HkaFX/UG0gJExVq2skG2pT7XZEGBubNj2CytcWSPan4QEPNosw==}
1845 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
1846 | dependencies:
1847 | '@jest/environment': 28.1.1
1848 | '@jest/expect': 28.1.1
1849 | '@jest/test-result': 28.1.1
1850 | '@jest/types': 28.1.1
1851 | '@types/node': 17.0.41
1852 | chalk: 4.1.2
1853 | co: 4.6.0
1854 | dedent: 0.7.0
1855 | is-generator-fn: 2.1.0
1856 | jest-each: 28.1.1
1857 | jest-matcher-utils: 28.1.1
1858 | jest-message-util: 28.1.1
1859 | jest-runtime: 28.1.1
1860 | jest-snapshot: 28.1.1
1861 | jest-util: 28.1.1
1862 | pretty-format: 28.1.1
1863 | slash: 3.0.0
1864 | stack-utils: 2.0.5
1865 | throat: 6.0.1
1866 | transitivePeerDependencies:
1867 | - supports-color
1868 | dev: true
1869 |
1870 | /jest-cli@28.1.1(@types/node@17.0.41)(ts-node@10.8.1):
1871 | resolution: {integrity: sha512-+sUfVbJqb1OjBZ0OdBbI6OWfYM1i7bSfzYy6gze1F1w3OKWq8ZTEKkZ8a7ZQPq6G/G1qMh/uKqpdWhgl11NFQQ==}
1872 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
1873 | hasBin: true
1874 | peerDependencies:
1875 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
1876 | peerDependenciesMeta:
1877 | node-notifier:
1878 | optional: true
1879 | dependencies:
1880 | '@jest/core': 28.1.1(ts-node@10.8.1)
1881 | '@jest/test-result': 28.1.1
1882 | '@jest/types': 28.1.1
1883 | chalk: 4.1.2
1884 | exit: 0.1.2
1885 | graceful-fs: 4.2.10
1886 | import-local: 3.1.0
1887 | jest-config: 28.1.1(@types/node@17.0.41)(ts-node@10.8.1)
1888 | jest-util: 28.1.1
1889 | jest-validate: 28.1.1
1890 | prompts: 2.4.2
1891 | yargs: 17.5.1
1892 | transitivePeerDependencies:
1893 | - '@types/node'
1894 | - supports-color
1895 | - ts-node
1896 | dev: true
1897 |
1898 | /jest-config@28.1.1(@types/node@17.0.41)(ts-node@10.8.1):
1899 | resolution: {integrity: sha512-tASynMhS+jVV85zKvjfbJ8nUyJS/jUSYZ5KQxLUN2ZCvcQc/OmhQl2j6VEL3ezQkNofxn5pQ3SPYWPHb0unTZA==}
1900 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
1901 | peerDependencies:
1902 | '@types/node': '*'
1903 | ts-node: '>=9.0.0'
1904 | peerDependenciesMeta:
1905 | '@types/node':
1906 | optional: true
1907 | ts-node:
1908 | optional: true
1909 | dependencies:
1910 | '@babel/core': 7.18.2
1911 | '@jest/test-sequencer': 28.1.1
1912 | '@jest/types': 28.1.1
1913 | '@types/node': 17.0.41
1914 | babel-jest: 28.1.1(@babel/core@7.18.2)
1915 | chalk: 4.1.2
1916 | ci-info: 3.3.1
1917 | deepmerge: 4.2.2
1918 | glob: 7.1.6
1919 | graceful-fs: 4.2.10
1920 | jest-circus: 28.1.1
1921 | jest-environment-node: 28.1.1
1922 | jest-get-type: 28.0.2
1923 | jest-regex-util: 28.0.2
1924 | jest-resolve: 28.1.1
1925 | jest-runner: 28.1.1
1926 | jest-util: 28.1.1
1927 | jest-validate: 28.1.1
1928 | micromatch: 4.0.5
1929 | parse-json: 5.2.0
1930 | pretty-format: 28.1.1
1931 | slash: 3.0.0
1932 | strip-json-comments: 3.1.1
1933 | ts-node: 10.8.1(@types/node@17.0.41)(typescript@4.7.3)
1934 | transitivePeerDependencies:
1935 | - supports-color
1936 | dev: true
1937 |
1938 | /jest-diff@27.5.1:
1939 | resolution: {integrity: sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==}
1940 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
1941 | dependencies:
1942 | chalk: 4.1.2
1943 | diff-sequences: 27.5.1
1944 | jest-get-type: 27.5.1
1945 | pretty-format: 27.5.1
1946 | dev: true
1947 |
1948 | /jest-diff@28.1.1:
1949 | resolution: {integrity: sha512-/MUUxeR2fHbqHoMMiffe/Afm+U8U4olFRJ0hiVG2lZatPJcnGxx292ustVu7bULhjV65IYMxRdploAKLbcrsyg==}
1950 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
1951 | dependencies:
1952 | chalk: 4.1.2
1953 | diff-sequences: 28.1.1
1954 | jest-get-type: 28.0.2
1955 | pretty-format: 28.1.1
1956 | dev: true
1957 |
1958 | /jest-docblock@28.1.1:
1959 | resolution: {integrity: sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA==}
1960 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
1961 | dependencies:
1962 | detect-newline: 3.1.0
1963 | dev: true
1964 |
1965 | /jest-each@28.1.1:
1966 | resolution: {integrity: sha512-A042rqh17ZvEhRceDMi784ppoXR7MWGDEKTXEZXb4svt0eShMZvijGxzKsx+yIjeE8QYmHPrnHiTSQVhN4nqaw==}
1967 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
1968 | dependencies:
1969 | '@jest/types': 28.1.1
1970 | chalk: 4.1.2
1971 | jest-get-type: 28.0.2
1972 | jest-util: 28.1.1
1973 | pretty-format: 28.1.1
1974 | dev: true
1975 |
1976 | /jest-environment-node@28.1.1:
1977 | resolution: {integrity: sha512-2aV/eeY/WNgUUJrrkDJ3cFEigjC5fqT1+fCclrY6paqJ5zVPoM//sHmfgUUp7WLYxIdbPwMiVIzejpN56MxnNA==}
1978 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
1979 | dependencies:
1980 | '@jest/environment': 28.1.1
1981 | '@jest/fake-timers': 28.1.1
1982 | '@jest/types': 28.1.1
1983 | '@types/node': 17.0.41
1984 | jest-mock: 28.1.1
1985 | jest-util: 28.1.1
1986 | dev: true
1987 |
1988 | /jest-get-type@27.5.1:
1989 | resolution: {integrity: sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==}
1990 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
1991 | dev: true
1992 |
1993 | /jest-get-type@28.0.2:
1994 | resolution: {integrity: sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==}
1995 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
1996 | dev: true
1997 |
1998 | /jest-haste-map@28.1.1:
1999 | resolution: {integrity: sha512-ZrRSE2o3Ezh7sb1KmeLEZRZ4mgufbrMwolcFHNRSjKZhpLa8TdooXOOFlSwoUzlbVs1t0l7upVRW2K7RWGHzbQ==}
2000 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
2001 | dependencies:
2002 | '@jest/types': 28.1.1
2003 | '@types/graceful-fs': 4.1.5
2004 | '@types/node': 17.0.41
2005 | anymatch: 3.1.2
2006 | fb-watchman: 2.0.1
2007 | graceful-fs: 4.2.10
2008 | jest-regex-util: 28.0.2
2009 | jest-util: 28.1.1
2010 | jest-worker: 28.1.1
2011 | micromatch: 4.0.5
2012 | walker: 1.0.8
2013 | optionalDependencies:
2014 | fsevents: 2.3.2
2015 | dev: true
2016 |
2017 | /jest-leak-detector@28.1.1:
2018 | resolution: {integrity: sha512-4jvs8V8kLbAaotE+wFR7vfUGf603cwYtFf1/PYEsyX2BAjSzj8hQSVTP6OWzseTl0xL6dyHuKs2JAks7Pfubmw==}
2019 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
2020 | dependencies:
2021 | jest-get-type: 28.0.2
2022 | pretty-format: 28.1.1
2023 | dev: true
2024 |
2025 | /jest-matcher-utils@27.5.1:
2026 | resolution: {integrity: sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==}
2027 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
2028 | dependencies:
2029 | chalk: 4.1.2
2030 | jest-diff: 27.5.1
2031 | jest-get-type: 27.5.1
2032 | pretty-format: 27.5.1
2033 | dev: true
2034 |
2035 | /jest-matcher-utils@28.1.1:
2036 | resolution: {integrity: sha512-NPJPRWrbmR2nAJ+1nmnfcKKzSwgfaciCCrYZzVnNoxVoyusYWIjkBMNvu0RHJe7dNj4hH3uZOPZsQA+xAYWqsw==}
2037 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
2038 | dependencies:
2039 | chalk: 4.1.2
2040 | jest-diff: 28.1.1
2041 | jest-get-type: 28.0.2
2042 | pretty-format: 28.1.1
2043 | dev: true
2044 |
2045 | /jest-message-util@28.1.1:
2046 | resolution: {integrity: sha512-xoDOOT66fLfmTRiqkoLIU7v42mal/SqwDKvfmfiWAdJMSJiU+ozgluO7KbvoAgiwIrrGZsV7viETjc8GNrA/IQ==}
2047 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
2048 | dependencies:
2049 | '@babel/code-frame': 7.16.7
2050 | '@jest/types': 28.1.1
2051 | '@types/stack-utils': 2.0.1
2052 | chalk: 4.1.2
2053 | graceful-fs: 4.2.10
2054 | micromatch: 4.0.5
2055 | pretty-format: 28.1.1
2056 | slash: 3.0.0
2057 | stack-utils: 2.0.5
2058 | dev: true
2059 |
2060 | /jest-mock@28.1.1:
2061 | resolution: {integrity: sha512-bDCb0FjfsmKweAvE09dZT59IMkzgN0fYBH6t5S45NoJfd2DHkS3ySG2K+hucortryhO3fVuXdlxWcbtIuV/Skw==}
2062 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
2063 | dependencies:
2064 | '@jest/types': 28.1.1
2065 | '@types/node': 17.0.41
2066 | dev: true
2067 |
2068 | /jest-pnp-resolver@1.2.2(jest-resolve@28.1.1):
2069 | resolution: {integrity: sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==}
2070 | engines: {node: '>=6'}
2071 | peerDependencies:
2072 | jest-resolve: '*'
2073 | peerDependenciesMeta:
2074 | jest-resolve:
2075 | optional: true
2076 | dependencies:
2077 | jest-resolve: 28.1.1
2078 | dev: true
2079 |
2080 | /jest-regex-util@28.0.2:
2081 | resolution: {integrity: sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==}
2082 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
2083 | dev: true
2084 |
2085 | /jest-resolve-dependencies@28.1.1:
2086 | resolution: {integrity: sha512-p8Y150xYJth4EXhOuB8FzmS9r8IGLEioiaetgdNGb9VHka4fl0zqWlVe4v7mSkYOuEUg2uB61iE+zySDgrOmgQ==}
2087 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
2088 | dependencies:
2089 | jest-regex-util: 28.0.2
2090 | jest-snapshot: 28.1.1
2091 | transitivePeerDependencies:
2092 | - supports-color
2093 | dev: true
2094 |
2095 | /jest-resolve@28.1.1:
2096 | resolution: {integrity: sha512-/d1UbyUkf9nvsgdBildLe6LAD4DalgkgZcKd0nZ8XUGPyA/7fsnaQIlKVnDiuUXv/IeZhPEDrRJubVSulxrShA==}
2097 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
2098 | dependencies:
2099 | chalk: 4.1.2
2100 | graceful-fs: 4.2.10
2101 | jest-haste-map: 28.1.1
2102 | jest-pnp-resolver: 1.2.2(jest-resolve@28.1.1)
2103 | jest-util: 28.1.1
2104 | jest-validate: 28.1.1
2105 | resolve: 1.22.0
2106 | resolve.exports: 1.1.0
2107 | slash: 3.0.0
2108 | dev: true
2109 |
2110 | /jest-runner@28.1.1:
2111 | resolution: {integrity: sha512-W5oFUiDBgTsCloTAj6q95wEvYDB0pxIhY6bc5F26OucnwBN+K58xGTGbliSMI4ChQal5eANDF+xvELaYkJxTmA==}
2112 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
2113 | dependencies:
2114 | '@jest/console': 28.1.1
2115 | '@jest/environment': 28.1.1
2116 | '@jest/test-result': 28.1.1
2117 | '@jest/transform': 28.1.1
2118 | '@jest/types': 28.1.1
2119 | '@types/node': 17.0.41
2120 | chalk: 4.1.2
2121 | emittery: 0.10.2
2122 | graceful-fs: 4.2.10
2123 | jest-docblock: 28.1.1
2124 | jest-environment-node: 28.1.1
2125 | jest-haste-map: 28.1.1
2126 | jest-leak-detector: 28.1.1
2127 | jest-message-util: 28.1.1
2128 | jest-resolve: 28.1.1
2129 | jest-runtime: 28.1.1
2130 | jest-util: 28.1.1
2131 | jest-watcher: 28.1.1
2132 | jest-worker: 28.1.1
2133 | source-map-support: 0.5.13
2134 | throat: 6.0.1
2135 | transitivePeerDependencies:
2136 | - supports-color
2137 | dev: true
2138 |
2139 | /jest-runtime@28.1.1:
2140 | resolution: {integrity: sha512-J89qEJWW0leOsqyi0D9zHpFEYHwwafFdS9xgvhFHtIdRghbadodI0eA+DrthK/1PebBv3Px8mFSMGKrtaVnleg==}
2141 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
2142 | dependencies:
2143 | '@jest/environment': 28.1.1
2144 | '@jest/fake-timers': 28.1.1
2145 | '@jest/globals': 28.1.1
2146 | '@jest/source-map': 28.0.2
2147 | '@jest/test-result': 28.1.1
2148 | '@jest/transform': 28.1.1
2149 | '@jest/types': 28.1.1
2150 | chalk: 4.1.2
2151 | cjs-module-lexer: 1.2.2
2152 | collect-v8-coverage: 1.0.1
2153 | execa: 5.1.1
2154 | glob: 7.1.6
2155 | graceful-fs: 4.2.10
2156 | jest-haste-map: 28.1.1
2157 | jest-message-util: 28.1.1
2158 | jest-mock: 28.1.1
2159 | jest-regex-util: 28.0.2
2160 | jest-resolve: 28.1.1
2161 | jest-snapshot: 28.1.1
2162 | jest-util: 28.1.1
2163 | slash: 3.0.0
2164 | strip-bom: 4.0.0
2165 | transitivePeerDependencies:
2166 | - supports-color
2167 | dev: true
2168 |
2169 | /jest-snapshot@28.1.1:
2170 | resolution: {integrity: sha512-1KjqHJ98adRcbIdMizjF5DipwZFbvxym/kFO4g4fVZCZRxH/dqV8TiBFCa6rqic3p0karsy8RWS1y4E07b7P0A==}
2171 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
2172 | dependencies:
2173 | '@babel/core': 7.18.2
2174 | '@babel/generator': 7.18.2
2175 | '@babel/plugin-syntax-typescript': 7.17.12(@babel/core@7.18.2)
2176 | '@babel/traverse': 7.18.2
2177 | '@babel/types': 7.18.4
2178 | '@jest/expect-utils': 28.1.1
2179 | '@jest/transform': 28.1.1
2180 | '@jest/types': 28.1.1
2181 | '@types/babel__traverse': 7.17.1
2182 | '@types/prettier': 2.6.3
2183 | babel-preset-current-node-syntax: 1.0.1(@babel/core@7.18.2)
2184 | chalk: 4.1.2
2185 | expect: 28.1.1
2186 | graceful-fs: 4.2.10
2187 | jest-diff: 28.1.1
2188 | jest-get-type: 28.0.2
2189 | jest-haste-map: 28.1.1
2190 | jest-matcher-utils: 28.1.1
2191 | jest-message-util: 28.1.1
2192 | jest-util: 28.1.1
2193 | natural-compare: 1.4.0
2194 | pretty-format: 28.1.1
2195 | semver: 7.3.7
2196 | transitivePeerDependencies:
2197 | - supports-color
2198 | dev: true
2199 |
2200 | /jest-util@28.1.1:
2201 | resolution: {integrity: sha512-FktOu7ca1DZSyhPAxgxB6hfh2+9zMoJ7aEQA759Z6p45NuO8mWcqujH+UdHlCm/V6JTWwDztM2ITCzU1ijJAfw==}
2202 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
2203 | dependencies:
2204 | '@jest/types': 28.1.1
2205 | '@types/node': 17.0.41
2206 | chalk: 4.1.2
2207 | ci-info: 3.3.1
2208 | graceful-fs: 4.2.10
2209 | picomatch: 2.3.1
2210 | dev: true
2211 |
2212 | /jest-validate@28.1.1:
2213 | resolution: {integrity: sha512-Kpf6gcClqFCIZ4ti5++XemYJWUPCFUW+N2gknn+KgnDf549iLul3cBuKVe1YcWRlaF8tZV8eJCap0eECOEE3Ug==}
2214 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
2215 | dependencies:
2216 | '@jest/types': 28.1.1
2217 | camelcase: 6.3.0
2218 | chalk: 4.1.2
2219 | jest-get-type: 28.0.2
2220 | leven: 3.1.0
2221 | pretty-format: 28.1.1
2222 | dev: true
2223 |
2224 | /jest-watcher@28.1.1:
2225 | resolution: {integrity: sha512-RQIpeZ8EIJMxbQrXpJQYIIlubBnB9imEHsxxE41f54ZwcqWLysL/A0ZcdMirf+XsMn3xfphVQVV4EW0/p7i7Ug==}
2226 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
2227 | dependencies:
2228 | '@jest/test-result': 28.1.1
2229 | '@jest/types': 28.1.1
2230 | '@types/node': 17.0.41
2231 | ansi-escapes: 4.3.2
2232 | chalk: 4.1.2
2233 | emittery: 0.10.2
2234 | jest-util: 28.1.1
2235 | string-length: 4.0.2
2236 | dev: true
2237 |
2238 | /jest-worker@28.1.1:
2239 | resolution: {integrity: sha512-Au7slXB08C6h+xbJPp7VIb6U0XX5Kc9uel/WFc6/rcTzGiaVCBRngBExSYuXSLFPULPSYU3cJ3ybS988lNFQhQ==}
2240 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
2241 | dependencies:
2242 | '@types/node': 17.0.41
2243 | merge-stream: 2.0.0
2244 | supports-color: 8.1.1
2245 | dev: true
2246 |
2247 | /jest@28.1.1(@types/node@17.0.41)(ts-node@10.8.1):
2248 | resolution: {integrity: sha512-qw9YHBnjt6TCbIDMPMpJZqf9E12rh6869iZaN08/vpOGgHJSAaLLUn6H8W3IAEuy34Ls3rct064mZLETkxJ2XA==}
2249 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
2250 | hasBin: true
2251 | peerDependencies:
2252 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
2253 | peerDependenciesMeta:
2254 | node-notifier:
2255 | optional: true
2256 | dependencies:
2257 | '@jest/core': 28.1.1(ts-node@10.8.1)
2258 | '@jest/types': 28.1.1
2259 | import-local: 3.1.0
2260 | jest-cli: 28.1.1(@types/node@17.0.41)(ts-node@10.8.1)
2261 | transitivePeerDependencies:
2262 | - '@types/node'
2263 | - supports-color
2264 | - ts-node
2265 | dev: true
2266 |
2267 | /js-tokens@4.0.0:
2268 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
2269 | dev: true
2270 |
2271 | /js-yaml@3.14.1:
2272 | resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==}
2273 | hasBin: true
2274 | dependencies:
2275 | argparse: 1.0.10
2276 | esprima: 4.0.1
2277 | dev: true
2278 |
2279 | /js-yaml@4.1.0:
2280 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
2281 | hasBin: true
2282 | dependencies:
2283 | argparse: 2.0.1
2284 | dev: true
2285 |
2286 | /jsesc@2.5.2:
2287 | resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==}
2288 | engines: {node: '>=4'}
2289 | hasBin: true
2290 | dev: true
2291 |
2292 | /json-parse-even-better-errors@2.3.1:
2293 | resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
2294 | dev: true
2295 |
2296 | /json-schema-traverse@0.4.1:
2297 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
2298 | dev: true
2299 |
2300 | /json-stable-stringify-without-jsonify@1.0.1:
2301 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
2302 | dev: true
2303 |
2304 | /json5@2.2.1:
2305 | resolution: {integrity: sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==}
2306 | engines: {node: '>=6'}
2307 | hasBin: true
2308 | dev: true
2309 |
2310 | /kleur@3.0.3:
2311 | resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==}
2312 | engines: {node: '>=6'}
2313 | dev: true
2314 |
2315 | /leven@3.1.0:
2316 | resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==}
2317 | engines: {node: '>=6'}
2318 | dev: true
2319 |
2320 | /levn@0.4.1:
2321 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
2322 | engines: {node: '>= 0.8.0'}
2323 | dependencies:
2324 | prelude-ls: 1.2.1
2325 | type-check: 0.4.0
2326 | dev: true
2327 |
2328 | /lines-and-columns@1.2.4:
2329 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
2330 | dev: true
2331 |
2332 | /locate-path@5.0.0:
2333 | resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==}
2334 | engines: {node: '>=8'}
2335 | dependencies:
2336 | p-locate: 4.1.0
2337 | dev: true
2338 |
2339 | /lodash.memoize@4.1.2:
2340 | resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==}
2341 | dev: true
2342 |
2343 | /lodash.merge@4.6.2:
2344 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
2345 | dev: true
2346 |
2347 | /lru-cache@6.0.0:
2348 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
2349 | engines: {node: '>=10'}
2350 | dependencies:
2351 | yallist: 4.0.0
2352 | dev: true
2353 |
2354 | /make-dir@3.1.0:
2355 | resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==}
2356 | engines: {node: '>=8'}
2357 | dependencies:
2358 | semver: 6.3.0
2359 | dev: true
2360 |
2361 | /make-error@1.3.6:
2362 | resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==}
2363 | dev: true
2364 |
2365 | /makeerror@1.0.12:
2366 | resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==}
2367 | dependencies:
2368 | tmpl: 1.0.5
2369 | dev: true
2370 |
2371 | /merge-stream@2.0.0:
2372 | resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
2373 | dev: true
2374 |
2375 | /merge2@1.4.1:
2376 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
2377 | engines: {node: '>= 8'}
2378 | dev: true
2379 |
2380 | /micromatch@4.0.5:
2381 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==}
2382 | engines: {node: '>=8.6'}
2383 | dependencies:
2384 | braces: 3.0.2
2385 | picomatch: 2.3.1
2386 | dev: true
2387 |
2388 | /mimic-fn@2.1.0:
2389 | resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
2390 | engines: {node: '>=6'}
2391 | dev: true
2392 |
2393 | /minimatch@3.1.2:
2394 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
2395 | dependencies:
2396 | brace-expansion: 1.1.11
2397 | dev: true
2398 |
2399 | /ms@2.1.2:
2400 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
2401 | dev: true
2402 |
2403 | /natural-compare@1.4.0:
2404 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
2405 | dev: true
2406 |
2407 | /node-int64@0.4.0:
2408 | resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==}
2409 | dev: true
2410 |
2411 | /node-releases@2.0.5:
2412 | resolution: {integrity: sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==}
2413 | dev: true
2414 |
2415 | /normalize-path@3.0.0:
2416 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
2417 | engines: {node: '>=0.10.0'}
2418 | dev: true
2419 |
2420 | /npm-run-path@4.0.1:
2421 | resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
2422 | engines: {node: '>=8'}
2423 | dependencies:
2424 | path-key: 3.1.1
2425 | dev: true
2426 |
2427 | /once@1.4.0:
2428 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
2429 | dependencies:
2430 | wrappy: 1.0.2
2431 | dev: true
2432 |
2433 | /onetime@5.1.2:
2434 | resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
2435 | engines: {node: '>=6'}
2436 | dependencies:
2437 | mimic-fn: 2.1.0
2438 | dev: true
2439 |
2440 | /optionator@0.9.1:
2441 | resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==}
2442 | engines: {node: '>= 0.8.0'}
2443 | dependencies:
2444 | deep-is: 0.1.3
2445 | fast-levenshtein: 2.0.6
2446 | levn: 0.4.1
2447 | prelude-ls: 1.2.1
2448 | type-check: 0.4.0
2449 | word-wrap: 1.2.4
2450 | dev: true
2451 |
2452 | /p-limit@2.3.0:
2453 | resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==}
2454 | engines: {node: '>=6'}
2455 | dependencies:
2456 | p-try: 2.2.0
2457 | dev: true
2458 |
2459 | /p-locate@4.1.0:
2460 | resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==}
2461 | engines: {node: '>=8'}
2462 | dependencies:
2463 | p-limit: 2.3.0
2464 | dev: true
2465 |
2466 | /p-try@2.2.0:
2467 | resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
2468 | engines: {node: '>=6'}
2469 | dev: true
2470 |
2471 | /parent-module@1.0.1:
2472 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
2473 | engines: {node: '>=6'}
2474 | dependencies:
2475 | callsites: 3.1.0
2476 | dev: true
2477 |
2478 | /parse-json@5.2.0:
2479 | resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
2480 | engines: {node: '>=8'}
2481 | dependencies:
2482 | '@babel/code-frame': 7.16.7
2483 | error-ex: 1.3.2
2484 | json-parse-even-better-errors: 2.3.1
2485 | lines-and-columns: 1.2.4
2486 | dev: true
2487 |
2488 | /path-exists@4.0.0:
2489 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
2490 | engines: {node: '>=8'}
2491 | dev: true
2492 |
2493 | /path-is-absolute@1.0.1:
2494 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
2495 | engines: {node: '>=0.10.0'}
2496 | dev: true
2497 |
2498 | /path-key@3.1.1:
2499 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
2500 | engines: {node: '>=8'}
2501 | dev: true
2502 |
2503 | /path-parse@1.0.7:
2504 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
2505 | dev: true
2506 |
2507 | /path-type@4.0.0:
2508 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
2509 | engines: {node: '>=8'}
2510 | dev: true
2511 |
2512 | /picocolors@1.0.0:
2513 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
2514 | dev: true
2515 |
2516 | /picomatch@2.3.1:
2517 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
2518 | engines: {node: '>=8.6'}
2519 | dev: true
2520 |
2521 | /pirates@4.0.5:
2522 | resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==}
2523 | engines: {node: '>= 6'}
2524 | dev: true
2525 |
2526 | /pkg-dir@4.2.0:
2527 | resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==}
2528 | engines: {node: '>=8'}
2529 | dependencies:
2530 | find-up: 4.1.0
2531 | dev: true
2532 |
2533 | /prelude-ls@1.2.1:
2534 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
2535 | engines: {node: '>= 0.8.0'}
2536 | dev: true
2537 |
2538 | /pretty-format@27.5.1:
2539 | resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==}
2540 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
2541 | dependencies:
2542 | ansi-regex: 5.0.1
2543 | ansi-styles: 5.2.0
2544 | react-is: 17.0.2
2545 | dev: true
2546 |
2547 | /pretty-format@28.1.1:
2548 | resolution: {integrity: sha512-wwJbVTGFHeucr5Jw2bQ9P+VYHyLdAqedFLEkdQUVaBF/eiidDwH5OpilINq4mEfhbCjLnirt6HTTDhv1HaTIQw==}
2549 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
2550 | dependencies:
2551 | '@jest/schemas': 28.0.2
2552 | ansi-regex: 5.0.1
2553 | ansi-styles: 5.2.0
2554 | react-is: 18.1.0
2555 | dev: true
2556 |
2557 | /prompts@2.4.2:
2558 | resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==}
2559 | engines: {node: '>= 6'}
2560 | dependencies:
2561 | kleur: 3.0.3
2562 | sisteransi: 1.0.5
2563 | dev: true
2564 |
2565 | /punycode@2.1.1:
2566 | resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==}
2567 | engines: {node: '>=6'}
2568 | dev: true
2569 |
2570 | /queue-microtask@1.2.3:
2571 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
2572 | dev: true
2573 |
2574 | /react-is@17.0.2:
2575 | resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==}
2576 | dev: true
2577 |
2578 | /react-is@18.1.0:
2579 | resolution: {integrity: sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==}
2580 | dev: true
2581 |
2582 | /regexpp@3.2.0:
2583 | resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==}
2584 | engines: {node: '>=8'}
2585 | dev: true
2586 |
2587 | /require-directory@2.1.1:
2588 | resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
2589 | engines: {node: '>=0.10.0'}
2590 | dev: true
2591 |
2592 | /resolve-cwd@3.0.0:
2593 | resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==}
2594 | engines: {node: '>=8'}
2595 | dependencies:
2596 | resolve-from: 5.0.0
2597 | dev: true
2598 |
2599 | /resolve-from@4.0.0:
2600 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
2601 | engines: {node: '>=4'}
2602 | dev: true
2603 |
2604 | /resolve-from@5.0.0:
2605 | resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==}
2606 | engines: {node: '>=8'}
2607 | dev: true
2608 |
2609 | /resolve.exports@1.1.0:
2610 | resolution: {integrity: sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==}
2611 | engines: {node: '>=10'}
2612 | dev: true
2613 |
2614 | /resolve@1.22.0:
2615 | resolution: {integrity: sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==}
2616 | hasBin: true
2617 | dependencies:
2618 | is-core-module: 2.9.0
2619 | path-parse: 1.0.7
2620 | supports-preserve-symlinks-flag: 1.0.0
2621 | dev: true
2622 |
2623 | /reusify@1.0.4:
2624 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
2625 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
2626 | dev: true
2627 |
2628 | /rimraf@3.0.2:
2629 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
2630 | hasBin: true
2631 | dependencies:
2632 | glob: 7.1.6
2633 | dev: true
2634 |
2635 | /run-parallel@1.2.0:
2636 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
2637 | dependencies:
2638 | queue-microtask: 1.2.3
2639 | dev: true
2640 |
2641 | /safe-buffer@5.1.2:
2642 | resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
2643 | dev: true
2644 |
2645 | /semver@6.3.0:
2646 | resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==}
2647 | hasBin: true
2648 | dev: true
2649 |
2650 | /semver@7.3.7:
2651 | resolution: {integrity: sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==}
2652 | engines: {node: '>=10'}
2653 | hasBin: true
2654 | dependencies:
2655 | lru-cache: 6.0.0
2656 | dev: true
2657 |
2658 | /shebang-command@2.0.0:
2659 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
2660 | engines: {node: '>=8'}
2661 | dependencies:
2662 | shebang-regex: 3.0.0
2663 | dev: true
2664 |
2665 | /shebang-regex@3.0.0:
2666 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
2667 | engines: {node: '>=8'}
2668 | dev: true
2669 |
2670 | /signal-exit@3.0.7:
2671 | resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
2672 | dev: true
2673 |
2674 | /sisteransi@1.0.5:
2675 | resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==}
2676 | dev: true
2677 |
2678 | /slash@3.0.0:
2679 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
2680 | engines: {node: '>=8'}
2681 | dev: true
2682 |
2683 | /source-map-support@0.5.13:
2684 | resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==}
2685 | dependencies:
2686 | buffer-from: 1.1.1
2687 | source-map: 0.6.1
2688 | dev: true
2689 |
2690 | /source-map@0.6.1:
2691 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
2692 | engines: {node: '>=0.10.0'}
2693 | dev: true
2694 |
2695 | /sprintf-js@1.0.3:
2696 | resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
2697 | dev: true
2698 |
2699 | /stack-utils@2.0.5:
2700 | resolution: {integrity: sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==}
2701 | engines: {node: '>=10'}
2702 | dependencies:
2703 | escape-string-regexp: 2.0.0
2704 | dev: true
2705 |
2706 | /string-length@4.0.2:
2707 | resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==}
2708 | engines: {node: '>=10'}
2709 | dependencies:
2710 | char-regex: 1.0.2
2711 | strip-ansi: 6.0.1
2712 | dev: true
2713 |
2714 | /string-width@4.2.3:
2715 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
2716 | engines: {node: '>=8'}
2717 | dependencies:
2718 | emoji-regex: 8.0.0
2719 | is-fullwidth-code-point: 3.0.0
2720 | strip-ansi: 6.0.1
2721 | dev: true
2722 |
2723 | /strip-ansi@6.0.1:
2724 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
2725 | engines: {node: '>=8'}
2726 | dependencies:
2727 | ansi-regex: 5.0.1
2728 | dev: true
2729 |
2730 | /strip-bom@4.0.0:
2731 | resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==}
2732 | engines: {node: '>=8'}
2733 | dev: true
2734 |
2735 | /strip-final-newline@2.0.0:
2736 | resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
2737 | engines: {node: '>=6'}
2738 | dev: true
2739 |
2740 | /strip-json-comments@3.1.1:
2741 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
2742 | engines: {node: '>=8'}
2743 | dev: true
2744 |
2745 | /supports-color@5.5.0:
2746 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
2747 | engines: {node: '>=4'}
2748 | dependencies:
2749 | has-flag: 3.0.0
2750 | dev: true
2751 |
2752 | /supports-color@7.2.0:
2753 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
2754 | engines: {node: '>=8'}
2755 | dependencies:
2756 | has-flag: 4.0.0
2757 | dev: true
2758 |
2759 | /supports-color@8.1.1:
2760 | resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==}
2761 | engines: {node: '>=10'}
2762 | dependencies:
2763 | has-flag: 4.0.0
2764 | dev: true
2765 |
2766 | /supports-hyperlinks@2.2.0:
2767 | resolution: {integrity: sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==}
2768 | engines: {node: '>=8'}
2769 | dependencies:
2770 | has-flag: 4.0.0
2771 | supports-color: 7.2.0
2772 | dev: true
2773 |
2774 | /supports-preserve-symlinks-flag@1.0.0:
2775 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
2776 | engines: {node: '>= 0.4'}
2777 | dev: true
2778 |
2779 | /terminal-link@2.1.1:
2780 | resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==}
2781 | engines: {node: '>=8'}
2782 | dependencies:
2783 | ansi-escapes: 4.3.2
2784 | supports-hyperlinks: 2.2.0
2785 | dev: true
2786 |
2787 | /test-exclude@6.0.0:
2788 | resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==}
2789 | engines: {node: '>=8'}
2790 | dependencies:
2791 | '@istanbuljs/schema': 0.1.3
2792 | glob: 7.1.6
2793 | minimatch: 3.1.2
2794 | dev: true
2795 |
2796 | /text-table@0.2.0:
2797 | resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
2798 | dev: true
2799 |
2800 | /throat@6.0.1:
2801 | resolution: {integrity: sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==}
2802 | dev: true
2803 |
2804 | /tmpl@1.0.5:
2805 | resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==}
2806 | dev: true
2807 |
2808 | /to-fast-properties@2.0.0:
2809 | resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
2810 | engines: {node: '>=4'}
2811 | dev: true
2812 |
2813 | /to-regex-range@5.0.1:
2814 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
2815 | engines: {node: '>=8.0'}
2816 | dependencies:
2817 | is-number: 7.0.0
2818 | dev: true
2819 |
2820 | /ts-jest@28.0.4(@babel/core@7.18.2)(jest@28.1.1)(typescript@4.7.3):
2821 | resolution: {integrity: sha512-S6uRDDdCJBvnZqyGjB4VCnwbQrbgdL8WPeP4jevVSpYsBaeGRQAIS08o3Svav2Ex+oXwLgJ/m7F24TNq62kA1A==}
2822 | engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0}
2823 | hasBin: true
2824 | peerDependencies:
2825 | '@babel/core': '>=7.0.0-beta.0 <8'
2826 | babel-jest: ^28.0.0
2827 | esbuild: '*'
2828 | jest: ^28.0.0
2829 | typescript: '>=4.3'
2830 | peerDependenciesMeta:
2831 | '@babel/core':
2832 | optional: true
2833 | babel-jest:
2834 | optional: true
2835 | esbuild:
2836 | optional: true
2837 | dependencies:
2838 | '@babel/core': 7.18.2
2839 | bs-logger: 0.2.6
2840 | fast-json-stable-stringify: 2.0.0
2841 | jest: 28.1.1(@types/node@17.0.41)(ts-node@10.8.1)
2842 | jest-util: 28.1.1
2843 | json5: 2.2.1
2844 | lodash.memoize: 4.1.2
2845 | make-error: 1.3.6
2846 | semver: 7.3.7
2847 | typescript: 4.7.3
2848 | yargs-parser: 20.2.9
2849 | dev: true
2850 |
2851 | /ts-node@10.8.1(@types/node@17.0.41)(typescript@4.7.3):
2852 | resolution: {integrity: sha512-Wwsnao4DQoJsN034wePSg5nZiw4YKXf56mPIAeD6wVmiv+RytNSWqc2f3fKvcUoV+Yn2+yocD71VOfQHbmVX4g==}
2853 | hasBin: true
2854 | peerDependencies:
2855 | '@swc/core': '>=1.2.50'
2856 | '@swc/wasm': '>=1.2.50'
2857 | '@types/node': '*'
2858 | typescript: '>=2.7'
2859 | peerDependenciesMeta:
2860 | '@swc/core':
2861 | optional: true
2862 | '@swc/wasm':
2863 | optional: true
2864 | dependencies:
2865 | '@cspotcode/source-map-support': 0.8.1
2866 | '@tsconfig/node10': 1.0.8
2867 | '@tsconfig/node12': 1.0.9
2868 | '@tsconfig/node14': 1.0.1
2869 | '@tsconfig/node16': 1.0.2
2870 | '@types/node': 17.0.41
2871 | acorn: 8.7.1
2872 | acorn-walk: 8.2.0
2873 | arg: 4.1.3
2874 | create-require: 1.1.1
2875 | diff: 4.0.2
2876 | make-error: 1.3.6
2877 | typescript: 4.7.3
2878 | v8-compile-cache-lib: 3.0.1
2879 | yn: 3.1.1
2880 | dev: true
2881 |
2882 | /tslib@1.14.1:
2883 | resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==}
2884 | dev: true
2885 |
2886 | /tsutils@3.21.0(typescript@4.7.3):
2887 | resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==}
2888 | engines: {node: '>= 6'}
2889 | peerDependencies:
2890 | 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'
2891 | dependencies:
2892 | tslib: 1.14.1
2893 | typescript: 4.7.3
2894 | dev: true
2895 |
2896 | /type-check@0.4.0:
2897 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
2898 | engines: {node: '>= 0.8.0'}
2899 | dependencies:
2900 | prelude-ls: 1.2.1
2901 | dev: true
2902 |
2903 | /type-detect@4.0.8:
2904 | resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==}
2905 | engines: {node: '>=4'}
2906 | dev: true
2907 |
2908 | /type-fest@0.20.2:
2909 | resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
2910 | engines: {node: '>=10'}
2911 | dev: true
2912 |
2913 | /type-fest@0.21.3:
2914 | resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==}
2915 | engines: {node: '>=10'}
2916 | dev: true
2917 |
2918 | /typescript@4.7.3:
2919 | resolution: {integrity: sha512-WOkT3XYvrpXx4vMMqlD+8R8R37fZkjyLGlxavMc4iB8lrl8L0DeTcHbYgw/v0N/z9wAFsgBhcsF0ruoySS22mA==}
2920 | engines: {node: '>=4.2.0'}
2921 | hasBin: true
2922 | dev: true
2923 |
2924 | /uri-js@4.2.2:
2925 | resolution: {integrity: sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==}
2926 | dependencies:
2927 | punycode: 2.1.1
2928 | dev: true
2929 |
2930 | /v8-compile-cache-lib@3.0.1:
2931 | resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==}
2932 | dev: true
2933 |
2934 | /v8-compile-cache@2.3.0:
2935 | resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==}
2936 | dev: true
2937 |
2938 | /v8-to-istanbul@9.0.0:
2939 | resolution: {integrity: sha512-HcvgY/xaRm7isYmyx+lFKA4uQmfUbN0J4M0nNItvzTvH/iQ9kW5j/t4YSR+Ge323/lrgDAWJoF46tzGQHwBHFw==}
2940 | engines: {node: '>=10.12.0'}
2941 | dependencies:
2942 | '@jridgewell/trace-mapping': 0.3.13
2943 | '@types/istanbul-lib-coverage': 2.0.4
2944 | convert-source-map: 1.8.0
2945 | dev: true
2946 |
2947 | /walker@1.0.8:
2948 | resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==}
2949 | dependencies:
2950 | makeerror: 1.0.12
2951 | dev: true
2952 |
2953 | /which@2.0.2:
2954 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
2955 | engines: {node: '>= 8'}
2956 | hasBin: true
2957 | dependencies:
2958 | isexe: 2.0.0
2959 | dev: true
2960 |
2961 | /word-wrap@1.2.4:
2962 | resolution: {integrity: sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==}
2963 | engines: {node: '>=0.10.0'}
2964 | dev: true
2965 |
2966 | /wrap-ansi@7.0.0:
2967 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
2968 | engines: {node: '>=10'}
2969 | dependencies:
2970 | ansi-styles: 4.3.0
2971 | string-width: 4.2.3
2972 | strip-ansi: 6.0.1
2973 | dev: true
2974 |
2975 | /wrappy@1.0.2:
2976 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
2977 | dev: true
2978 |
2979 | /write-file-atomic@4.0.1:
2980 | resolution: {integrity: sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ==}
2981 | engines: {node: ^12.13.0 || ^14.15.0 || >=16}
2982 | dependencies:
2983 | imurmurhash: 0.1.4
2984 | signal-exit: 3.0.7
2985 | dev: true
2986 |
2987 | /y18n@5.0.8:
2988 | resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
2989 | engines: {node: '>=10'}
2990 | dev: true
2991 |
2992 | /yallist@4.0.0:
2993 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
2994 | dev: true
2995 |
2996 | /yargs-parser@20.2.9:
2997 | resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==}
2998 | engines: {node: '>=10'}
2999 | dev: true
3000 |
3001 | /yargs-parser@21.0.1:
3002 | resolution: {integrity: sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==}
3003 | engines: {node: '>=12'}
3004 | dev: true
3005 |
3006 | /yargs@17.5.1:
3007 | resolution: {integrity: sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==}
3008 | engines: {node: '>=12'}
3009 | dependencies:
3010 | cliui: 7.0.4
3011 | escalade: 3.1.1
3012 | get-caller-file: 2.0.5
3013 | require-directory: 2.1.1
3014 | string-width: 4.2.3
3015 | y18n: 5.0.8
3016 | yargs-parser: 21.0.1
3017 | dev: true
3018 |
3019 | /yn@3.1.1:
3020 | resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==}
3021 | engines: {node: '>=6'}
3022 | dev: true
3023 |
--------------------------------------------------------------------------------
/src/example.ts:
--------------------------------------------------------------------------------
1 | import { Retryable, BackOffPolicy } from './retry.decorator';
2 |
3 | let count = 1;
4 |
5 | class RetryExample {
6 | @Retryable({ maxAttempts: 3 })
7 | static async noDelayRetry(): Promise {
8 | console.info(`Calling noDelayRetry for the ${count++} time at ${new Date().toLocaleTimeString()}`);
9 | throw new Error('I failed!');
10 | }
11 |
12 | @Retryable({ maxAttempts: 3, value: [SyntaxError, ReferenceError] })
13 | static async noDelaySpecificRetry(): Promise {
14 | console.info(`Calling noDelayRetry for the ${count++} time at ${new Date().toLocaleTimeString()}`);
15 | throw new SyntaxError('I failed with SyntaxError!');
16 | }
17 |
18 | @Retryable({
19 | maxAttempts: 3,
20 | backOff: 1000,
21 | doRetry: (e: Error) => {
22 | return e.message === 'Error: 429';
23 | },
24 | })
25 | static async doRetry(): Promise {
26 | console.info(`Calling doRetry for the ${count++} time at ${new Date().toLocaleTimeString()}`);
27 | throw new Error('Error: 429');
28 | }
29 |
30 | @Retryable({
31 | maxAttempts: 3,
32 | backOff: 1000,
33 | doRetry: (e: Error) => {
34 | return e.message === 'Error: 429';
35 | },
36 | })
37 | static async doNotRetry(): Promise {
38 | console.info(`Calling doNotRetry for the ${count++} time at ${new Date().toLocaleTimeString()}`);
39 | throw new Error('Error: 404');
40 | }
41 |
42 | @Retryable({
43 | maxAttempts: 3,
44 | backOffPolicy: BackOffPolicy.FixedBackOffPolicy,
45 | backOff: 1000,
46 | })
47 | static async fixedBackOffRetry(): Promise {
48 | console.info(`Calling fixedBackOffRetry 1s for the ${count++} time at ${new Date().toLocaleTimeString()}`);
49 | throw new Error('I failed!');
50 | }
51 |
52 | @Retryable({
53 | maxAttempts: 3,
54 | backOffPolicy: BackOffPolicy.ExponentialBackOffPolicy,
55 | backOff: 1000,
56 | exponentialOption: { maxInterval: 4000, multiplier: 3 },
57 | })
58 | static async ExponentialBackOffRetry(): Promise {
59 | console.info(`Calling ExponentialBackOffRetry backOff 1s, multiplier=3 for the ${count++} time at ${new Date().toLocaleTimeString()}`);
60 | throw new Error('I failed!');
61 | }
62 | }
63 |
64 | (async () => {
65 | try {
66 | resetCount();
67 | await RetryExample.noDelayRetry();
68 | } catch (e) {
69 | console.info(`All retry done as expected, final message: '${e.message}'`);
70 | }
71 |
72 | try {
73 | resetCount();
74 | await RetryExample.noDelaySpecificRetry();
75 | } catch (e) {
76 | console.info(`All retry done as expected, final message: '${e.message}'`);
77 | }
78 |
79 | try {
80 | resetCount();
81 | await RetryExample.doRetry();
82 | } catch (e) {
83 | console.info(`All retry done as expected, final message: '${e.message}'`);
84 | }
85 |
86 | try {
87 | resetCount();
88 | await RetryExample.doNotRetry();
89 | } catch (e) {
90 | console.info(`All retry done as expected, final message: '${e.message}'`);
91 | }
92 |
93 | try {
94 | resetCount();
95 | await RetryExample.fixedBackOffRetry();
96 | } catch (e) {
97 | console.info(`All retry done as expected, final message: '${e.message}'`);
98 | }
99 |
100 | try {
101 | resetCount();
102 | await RetryExample.ExponentialBackOffRetry();
103 | } catch (e) {
104 | console.info(`All retry done as expected, final message: '${e.message}'`);
105 | }
106 |
107 | })();
108 |
109 | function resetCount(): void {
110 | count = 1;
111 | }
112 |
--------------------------------------------------------------------------------
/src/index.ts:
--------------------------------------------------------------------------------
1 | export * from './retry.decorator';
2 |
--------------------------------------------------------------------------------
/src/retry.decorator.test.ts:
--------------------------------------------------------------------------------
1 | import { BackOffPolicy, ExponentialBackoffStrategy, MaxAttemptsError, Retryable } from './retry.decorator';
2 | import { sleep } from './utils';
3 |
4 | jest.mock('./utils', () => ({
5 | sleep: jest.fn()
6 | }));
7 |
8 | // CustomError for testing.
9 | class CustomError extends Error {
10 | constructor(message?: string) {
11 | // Call the parent class constructor with the provided message
12 | super(message);
13 |
14 | // Set the prototype and name properties
15 | Object.setPrototypeOf(this, CustomError.prototype);
16 | this.name = 'CustomError';
17 | }
18 | }
19 |
20 | class TestClass {
21 | count: number;
22 | constructor() {
23 | this.count = 0;
24 | }
25 | @Retryable({ maxAttempts: 2 })
26 | async testMethodWithoutBackOff(): Promise {
27 | console.log(`test method is called for ${++this.count} time`);
28 | await this.called();
29 | }
30 |
31 | @Retryable({ maxAttempts: 3, value: [SyntaxError, ReferenceError, CustomError] })
32 | async testMethodWithException(): Promise {
33 | console.log(`test method is called for ${++this.count} time`);
34 | await this.called();
35 | }
36 |
37 | @Retryable({
38 | maxAttempts: 3,
39 | doRetry: (e: Error) => {
40 | return e.message === 'Error: 429';
41 | },
42 | })
43 | async testDoRetry(): Promise {
44 | console.info(`Calling doRetry for the ${++this.count} time at ${new Date().toLocaleTimeString()}`);
45 | await this.called();
46 | }
47 |
48 | @Retryable({
49 | maxAttempts: 3,
50 | backOffPolicy: BackOffPolicy.FixedBackOffPolicy,
51 | backOff: 1000,
52 | })
53 | async fixedBackOffRetry(): Promise {
54 | console.info(`Calling fixedBackOffRetry 1s for the ${++this.count} time at ${new Date().toLocaleTimeString()}`);
55 | await this.called();
56 | }
57 |
58 | @Retryable({
59 | maxAttempts: 3,
60 | backOffPolicy: BackOffPolicy.ExponentialBackOffPolicy,
61 | exponentialOption: { maxInterval: 4000, multiplier: 3 },
62 | })
63 | async exponentialBackOffRetry(): Promise {
64 | console.info(`Calling ExponentialBackOffRetry backOff 1s, multiplier=3 for the ${++this.count} time at ${new Date().toLocaleTimeString()}`);
65 | await this.called();
66 | }
67 |
68 | @Retryable({
69 | maxAttempts: 3,
70 | backOffPolicy: BackOffPolicy.ExponentialBackOffPolicy,
71 | exponentialOption: { maxInterval: 4000, multiplier: 2, backoffStrategy: ExponentialBackoffStrategy.FullJitter },
72 | })
73 | async exponentialBackOffWithJitterRetry(): Promise {
74 | console.info(`Calling ExponentialBackOffRetry backOff 1s, multiplier=2 for the ${++this.count} time at ${new Date().toLocaleTimeString()}`);
75 | await this.called();
76 | }
77 |
78 | @Retryable({ maxAttempts: 2, useConsoleLogger: false })
79 | async noLog(): Promise {
80 | console.log(`test method is called for ${++this.count} time`);
81 | await this.called();
82 | }
83 |
84 | @Retryable({ maxAttempts: 2, useOriginalError: true })
85 | async useOriginalError(): Promise {
86 | await this.called();
87 | }
88 |
89 | async called(): Promise {
90 | return 'from real implementation';
91 | }
92 | }
93 |
94 | describe('Capture original error data Test', () => {
95 | test('exceed max retry', async () => {
96 | const testClass = new TestClass();
97 |
98 | const originalStackTrace = 'foo';
99 | const errorMsg = 'rejected';
100 |
101 | const unexpectedError = new Error(errorMsg);
102 | unexpectedError.stack = originalStackTrace;
103 |
104 | const calledSpy = jest.spyOn(testClass, 'called');
105 |
106 | calledSpy.mockRejectedValue(unexpectedError);
107 | try {
108 | await testClass.testMethodWithoutBackOff();
109 | } catch (e) {
110 | expect(e.stack).toEqual(originalStackTrace);
111 | }
112 | });
113 | });
114 |
115 |
116 | describe('Retry Test', () => {
117 | let testClass: TestClass;
118 | beforeEach(() => {
119 | testClass = new TestClass();
120 | });
121 |
122 | test('normal retry without backoff', async () => {
123 | const calledSpy = jest.spyOn(testClass, 'called');
124 | calledSpy.mockRejectedValueOnce(new Error('rejected'));
125 | calledSpy.mockResolvedValueOnce('fulfilled');
126 | await testClass.testMethodWithoutBackOff();
127 | expect(calledSpy).toHaveBeenCalledTimes(2);
128 | expect(sleep).toHaveBeenCalledTimes(0);
129 | });
130 |
131 | test('exceed max retry', async () => {
132 | const calledSpy = jest.spyOn(testClass, 'called');
133 | const errorMsg = 'rejected';
134 | calledSpy.mockRejectedValue(new Error(errorMsg));
135 | try {
136 | await testClass.testMethodWithoutBackOff();
137 | } catch (e) {
138 | expect(e).toBeInstanceOf(MaxAttemptsError);
139 | expect(e.message.includes(errorMsg));
140 | }
141 | expect(calledSpy).toHaveBeenCalledTimes(3);
142 | });
143 |
144 | test('retry with specific error', async () => {
145 | const calledSpy = jest.spyOn(testClass, 'called');
146 | calledSpy.mockImplementationOnce(() => { throw new CustomError('I failed!'); });
147 | await testClass.testMethodWithException();
148 | expect(calledSpy).toHaveBeenCalledTimes(2);
149 | });
150 |
151 | test('retry with specific error not match', async () => {
152 | const calledSpy = jest.spyOn(testClass, 'called');
153 | calledSpy.mockImplementationOnce(() => { throw new Error('I failed!'); });
154 | try {
155 | await testClass.testMethodWithException();
156 | } catch (e) { }
157 | expect(calledSpy).toHaveBeenCalledTimes(1);
158 | });
159 |
160 |
161 | test('do retry when high order function retry true', async () => {
162 | const calledSpy = jest.spyOn(testClass, 'called');
163 | calledSpy.mockImplementationOnce(() => { throw new Error('Error: 429'); });
164 | await testClass.testDoRetry();
165 | expect(calledSpy).toHaveBeenCalledTimes(2);
166 | });
167 |
168 | test('do NOT retry when high order function retry false', async () => {
169 | const calledSpy = jest.spyOn(testClass, 'called');
170 | calledSpy.mockImplementationOnce(() => { throw new Error('Error: 500'); });
171 | try {
172 | await testClass.testDoRetry();
173 | } catch (e) { }
174 | expect(calledSpy).toHaveBeenCalledTimes(1);
175 | });
176 |
177 | test('fix backOff policy', async () => {
178 | const calledSpy = jest.spyOn(testClass, 'called');
179 | calledSpy.mockImplementation(() => { throw new Error('Error: 500'); });
180 | try {
181 | await testClass.fixedBackOffRetry();
182 | } catch (e) { }
183 | expect(calledSpy).toHaveBeenCalledTimes(4);
184 | });
185 |
186 | test('exponential backOff policy', async () => {
187 | jest.setTimeout(60000);
188 | const calledSpy = jest.spyOn(testClass, 'called');
189 | calledSpy.mockImplementation(() => { throw new Error(); });
190 | try {
191 | await testClass.exponentialBackOffRetry();
192 | } catch (e) { }
193 | expect(calledSpy).toHaveBeenCalledTimes(4);
194 | });
195 |
196 | test('exponential backOff policy with jitter', async () => {
197 | jest.setTimeout(60000);
198 | const calledSpy = jest.spyOn(testClass, 'called');
199 | calledSpy.mockImplementation(() => { throw new Error(); });
200 | try {
201 | await testClass.exponentialBackOffWithJitterRetry();
202 | } catch (e) { }
203 | expect(calledSpy).toHaveBeenCalledTimes(4);
204 | });
205 |
206 | test('no log', async () => {
207 | const calledSpy = jest.spyOn(testClass, 'called');
208 | const errorSpy = jest.spyOn(console, 'error');
209 | calledSpy.mockRejectedValueOnce(new Error('rejected'));
210 | calledSpy.mockResolvedValueOnce('fulfilled');
211 | await testClass.testMethodWithoutBackOff();
212 | expect(calledSpy).toHaveBeenCalledTimes(2);
213 | expect(errorSpy).not.toHaveBeenCalled();
214 | });
215 |
216 |
217 | test('throw original error', async () => {
218 | jest.setTimeout(60000);
219 | const calledSpy = jest.spyOn(testClass, 'called');
220 | calledSpy.mockImplementation(() => { throw new CustomError(); });
221 | try {
222 | await testClass.useOriginalError();
223 | } catch (e) {
224 | expect(e).toBeInstanceOf(CustomError);
225 | }
226 | });
227 | });
228 |
229 |
--------------------------------------------------------------------------------
/src/retry.decorator.ts:
--------------------------------------------------------------------------------
1 | import { sleep } from './utils';
2 |
3 | /**
4 | * retry decorator which is nothing but a high order function wrapper
5 | *
6 | * @param options the 'RetryOptions'
7 | */
8 | export function Retryable(options: RetryOptions): DecoratorFunction {
9 | /**
10 | * target: The prototype of the class (Object)
11 | * propertyKey: The name of the method (string | symbol).
12 | * descriptor: A TypedPropertyDescriptor — see the type, leveraging the Object.defineProperty under the hood.
13 | *
14 | * NOTE: It's very important here we do not use arrow function otherwise 'this' will be messed up due
15 | * to the nature how arrow function defines this inside.
16 | *
17 | */
18 | return function(target: Record, propertyKey: string, descriptor: TypedPropertyDescriptor) {
19 | const originalFn = descriptor.value;
20 | // set default value for ExponentialBackOffPolicy
21 | if (options.backOffPolicy === BackOffPolicy.ExponentialBackOffPolicy) {
22 | setExponentialBackOffPolicyDefault();
23 | }
24 | descriptor.value = async function(...args: any[]) {
25 | try {
26 | return await retryAsync.apply(this, [originalFn, args, options.maxAttempts, options.backOff]);
27 | } catch (e) {
28 | if (e instanceof MaxAttemptsError) {
29 | const msgPrefix = `Failed for '${propertyKey}' for ${options.maxAttempts} times.`;
30 | e.message = e.message ? `${msgPrefix} Original Error: ${e.message}` : msgPrefix;
31 | }
32 | throw e;
33 | }
34 | };
35 | return descriptor;
36 | };
37 |
38 | async function retryAsync(fn: () => any, args: any[], maxAttempts: number, backOff?: number): Promise {
39 | try {
40 | return await fn.apply(this, args);
41 | } catch (e) {
42 | if (--maxAttempts < 0) {
43 | (typeof options.useConsoleLogger !== 'boolean' || options.useConsoleLogger) && e?.message && console.error(e.message);
44 | if(options.useOriginalError) throw e;
45 | const maxAttemptsErrorInstance = new MaxAttemptsError(e?.message);
46 | // Add the existing error stack if present
47 | if(e?.stack) {
48 | maxAttemptsErrorInstance.stack = e.stack;
49 | }
50 |
51 | throw maxAttemptsErrorInstance;
52 | }
53 | if (!canRetry(e)) {
54 | throw e;
55 | }
56 | if (backOff) {
57 | await sleep(applyBackoffStrategy(backOff));
58 |
59 | if (
60 | options.exponentialOption &&
61 | options.backOffPolicy === BackOffPolicy.ExponentialBackOffPolicy
62 | ) {
63 | backOff = Math.min(
64 | backOff * options.exponentialOption.multiplier,
65 | options.exponentialOption.maxInterval
66 | );
67 | }
68 | }
69 | return retryAsync.apply(this, [fn, args, maxAttempts, backOff]);
70 | }
71 | }
72 |
73 | function canRetry(e: Error): boolean {
74 | if (options.doRetry && !options.doRetry(e)) {
75 | return false;
76 | }
77 | if (options.value?.length && !options.value.some(errorType => e instanceof errorType)) {
78 | return false;
79 | }
80 | return true;
81 | }
82 |
83 | function setExponentialBackOffPolicyDefault(): void {
84 | !options.backOff && (options.backOff = 1000);
85 | options.exponentialOption = {
86 | ...{ maxInterval: 2000, multiplier: 2 },
87 | ...options.exponentialOption,
88 | };
89 | }
90 |
91 | /**
92 | * Calculate the actual backoff using the specified backoff strategy, if any
93 | * @see https://aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/
94 | * @param baseBackoff - base backoff time in ms
95 | */
96 | function applyBackoffStrategy(baseBackoff: number): number {
97 | const { backoffStrategy } = options.exponentialOption ?? {};
98 | if (backoffStrategy === ExponentialBackoffStrategy.EqualJitter) {
99 | return baseBackoff / 2 + (Math.random() * baseBackoff / 2);
100 | }
101 | if (backoffStrategy === ExponentialBackoffStrategy.FullJitter) {
102 | return Math.random() * baseBackoff;
103 | }
104 | return baseBackoff;
105 | }
106 | }
107 |
108 | export class MaxAttemptsError extends Error {
109 | code = '429';
110 | /* if target is ES5, need the 'new.target.prototype'
111 | constructor(msg?: string) {
112 | super(msg)
113 | Object.setPrototypeOf(this, new.target.prototype)
114 | } */
115 | }
116 |
117 | interface ConstructableError {
118 | new (...args: any[]): Error;
119 | }
120 |
121 | export interface RetryOptions {
122 | backOffPolicy?: BackOffPolicy;
123 | backOff?: number;
124 | doRetry?: (e: any) => boolean;
125 | exponentialOption?: {
126 | maxInterval: number;
127 | multiplier: number;
128 | /**
129 | * Optional. If provided, the backoff time will include jitter using the desired strategy.
130 | * For more information, see https://aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/
131 | */
132 | backoffStrategy?: ExponentialBackoffStrategy;
133 | };
134 | maxAttempts: number;
135 | value?: ConstructableError[];
136 | useConsoleLogger?: boolean;
137 | useOriginalError?: boolean;
138 | }
139 |
140 | export enum BackOffPolicy {
141 | FixedBackOffPolicy = 'FixedBackOffPolicy',
142 | ExponentialBackOffPolicy = 'ExponentialBackOffPolicy'
143 | }
144 |
145 | /**
146 | * Represents different strategies for applying jitter to backoff times.
147 | * @see https://aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/
148 | */
149 | export enum ExponentialBackoffStrategy {
150 | /**
151 | * The backoff time will be (base backoff time) * (random number between 0 and 1).
152 | */
153 | FullJitter = 'FullJitter',
154 | /**
155 | * The backoff time will be (base backoff time / 2) + (random number between 0 and (base backoff time / 2)).
156 | */
157 | EqualJitter = 'EqualJitter',
158 | }
159 |
160 | export type DecoratorFunction = (target: Record, propertyKey: string, descriptor: TypedPropertyDescriptor) => TypedPropertyDescriptor;
161 |
162 |
--------------------------------------------------------------------------------
/src/utils.ts:
--------------------------------------------------------------------------------
1 | // wrap the native setTimeout with Promise so it can be used with `await`.
2 | export const sleep: (ms?: number) => void = (ms?: number) => new Promise(resolve => setTimeout(resolve, ms));
3 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "module": "commonjs",
4 | "strictNullChecks": true,
5 | "target": "ES2015",
6 | "noImplicitAny": true,
7 | "declaration": true,
8 | "moduleResolution": "node",
9 | "emitDecoratorMetadata": true,
10 | "experimentalDecorators": true,
11 | "sourceMap": true,
12 | "declarationMap": true,
13 | "skipLibCheck": true,
14 | "lib": [
15 | "dom",
16 | "es2017",
17 | "esnext.asynciterable",
18 | ],
19 | "outDir": "dist",
20 | "baseUrl": ".",
21 | "paths": {
22 | "*": [
23 | "node_modules/*",
24 | ]
25 | }
26 | },
27 | "include": [
28 | "src/**/*",
29 | ],
30 | "exclude": [
31 | "node_modules",
32 | "dist",
33 | ]
34 | }
35 |
--------------------------------------------------------------------------------