├── .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 | ![Retry](https://cdn.iconscout.com/icon/free/png-256/retry-1-386755.png) 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 | --------------------------------------------------------------------------------