├── .husky ├── .gitignore └── pre-commit ├── .nvmrc ├── _config.yml ├── .github ├── FUNDING.yml ├── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md └── workflows │ ├── npm-publish.yml │ └── pull-request.yml ├── examples ├── jest-example │ ├── .gitignore │ ├── .husky │ │ ├── .gitignore │ │ └── pre-commit │ ├── index.ts │ ├── index.spec.ts │ ├── my-custom-coverage │ │ └── coverage-summary.json │ ├── README.md │ └── package.json ├── mocha-chai-example │ ├── .husky │ │ ├── .gitignore │ │ └── pre-commit │ ├── .gitignore │ ├── index.ts │ ├── index.spec.ts │ ├── README.md │ ├── my-custom-coverage │ │ └── coverage-summary.json │ ├── package.json │ └── yarn.lock └── README.md ├── .gitignore ├── pull_request_template.md ├── CONTRIBUTING.md ├── assets └── readme-gif.gif ├── nodemon.json ├── .prettierrc.js ├── .npmignore ├── tests ├── mocks │ ├── accurateCoverage.json │ ├── inaccurateCoverage.json │ ├── brokenCoverage.json │ ├── fakeBadCoverage.json │ ├── fakeReadmeFile.md │ └── accurateReadme.md ├── arguments.spec.ts ├── helpers.spec.ts ├── logger.spec.ts ├── validate.spec.ts ├── index.spec.ts └── editor.spec.ts ├── src ├── index.ts ├── arguments.ts ├── types.ts ├── logger.ts ├── factory.ts ├── constants.ts ├── validate.ts ├── helpers.ts └── editor.ts ├── .eslintrc.js ├── tsconfig.json ├── LICENSE ├── package.json ├── CODE_OF_CONDUCT.md ├── .all-contributorsrc ├── CHANGELOG.md └── README.md /.husky/.gitignore: -------------------------------------------------------------------------------- 1 | _ 2 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | v16.11.0 2 | -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-cayman -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: [the-bugging] 2 | -------------------------------------------------------------------------------- /examples/jest-example/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules -------------------------------------------------------------------------------- /examples/jest-example/.husky/.gitignore: -------------------------------------------------------------------------------- 1 | _ 2 | -------------------------------------------------------------------------------- /examples/mocha-chai-example/.husky/.gitignore: -------------------------------------------------------------------------------- 1 | _ 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | coverage 3 | lib 4 | .DS_Store -------------------------------------------------------------------------------- /pull_request_template.md: -------------------------------------------------------------------------------- 1 | Describe what's being changed 2 | -------------------------------------------------------------------------------- /examples/mocha-chai-example/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .nyc_output -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | Please do feel free to contribute by opening PRs and/or issues 2 | -------------------------------------------------------------------------------- /assets/readme-gif.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the-bugging/istanbul-badges-readme/HEAD/assets/readme-gif.gif -------------------------------------------------------------------------------- /nodemon.json: -------------------------------------------------------------------------------- 1 | { 2 | "watch": ["src"], 3 | "ext": ".ts,.js", 4 | "ignore": [], 5 | "exec": "ts-node ./src/index.ts" 6 | } 7 | -------------------------------------------------------------------------------- /examples/README.md: -------------------------------------------------------------------------------- 1 | # Examples 2 | 3 | 1. With [Jest](./jest-example/README.md) 4 | 5 | 2. With [Mocha/Chai](./mocha-chai-example/README.md) -------------------------------------------------------------------------------- /examples/jest-example/.husky/pre-commit: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | . "$(dirname "$0")/_/husky.sh" 3 | 4 | npm run cover && npm run make-badges && git add 'README.md' 5 | -------------------------------------------------------------------------------- /examples/mocha-chai-example/.husky/pre-commit: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | . "$(dirname "$0")/_/husky.sh" 3 | 4 | npm run cover && npm run make-badges && git add 'README.md' 5 | -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | . "$(dirname "$0")/_/husky.sh" 3 | 4 | npm run lint && npm run cover && npm run build && npm run make-badges && git add 'README.md' 5 | -------------------------------------------------------------------------------- /.prettierrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | semi: true, 3 | trailingComma: 'all', 4 | singleQuote: true, 5 | printWidth: 120, 6 | tabWidth: 2, 7 | }; 8 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | src 2 | tsconfig.json 3 | .eslintrc.js 4 | .prettierrc.js 5 | LICENCE 6 | .gitignore 7 | coverage 8 | CODE_OF_CONDUCT.md 9 | jestconfig.json 10 | nodemon.json 11 | node_modules -------------------------------------------------------------------------------- /examples/jest-example/index.ts: -------------------------------------------------------------------------------- 1 | export const testedIsMyValueString = (value: unknown): boolean => { 2 | return typeof value === 'string'; 3 | }; 4 | 5 | export const untestedRandomMethod = (a: (value: unknown) => void, b: unknown): void => { 6 | return a(b); 7 | }; 8 | -------------------------------------------------------------------------------- /examples/mocha-chai-example/index.ts: -------------------------------------------------------------------------------- 1 | export const testedIsMyValueString = (value: unknown): boolean => { 2 | return typeof value === 'string'; 3 | }; 4 | 5 | export const untestedRandomMethod = (a: (value: unknown) => void, b: unknown): void => { 6 | return a(b); 7 | }; 8 | -------------------------------------------------------------------------------- /tests/mocks/accurateCoverage.json: -------------------------------------------------------------------------------- 1 | { 2 | "total": { 3 | "lines": { "total": 155, "covered": 143, "skipped": 0, "pct": 92.26 }, 4 | "statements": { "total": 177, "covered": 162, "skipped": 0, "pct": 91.53 }, 5 | "functions": { "total": 48, "covered": 40, "skipped": 0, "pct": 83.33 }, 6 | "branches": { "total": 36, "covered": 30, "skipped": 0, "pct": 83.33 } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /tests/mocks/inaccurateCoverage.json: -------------------------------------------------------------------------------- 1 | { 2 | "total": { 3 | "lines": { "total": 155, "covered": 143, "skipped": 0, "pct": 84.26 }, 4 | "statements": { "total": 177, "covered": 162, "skipped": 0, "pct": 34.53 }, 5 | "functions": { "total": 48, "covered": 40, "skipped": 0, "pct": 10.33 }, 6 | "branches": { "total": 36, "covered": 30, "skipped": 0, "pct": 95.33 } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | import { checkConfig } from './validate'; 4 | import { editReadme } from './editor'; 5 | import { logger } from './logger'; 6 | import { badgerFactory } from './factory'; 7 | import { getExitCodeOnError } from './helpers'; 8 | 9 | export const badger = badgerFactory({ checkConfig, editReadme, logger, getExitCodeOnError }); 10 | 11 | badger(); 12 | -------------------------------------------------------------------------------- /tests/arguments.spec.ts: -------------------------------------------------------------------------------- 1 | import { getArgumentValue } from '../src/arguments'; 2 | 3 | it('should return no arguments', () => { 4 | const args = getArgumentValue('coverageDir'); 5 | 6 | expect(args).toBeFalsy(); 7 | }); 8 | 9 | it('should return correct arguments', () => { 10 | process.argv.push('--coverageDir=coverage-custom'); 11 | 12 | const args = getArgumentValue('coverageDir'); 13 | 14 | expect(args).toEqual('coverage-custom'); 15 | }); 16 | -------------------------------------------------------------------------------- /examples/jest-example/index.spec.ts: -------------------------------------------------------------------------------- 1 | import { testedIsMyValueString } from '.'; 2 | 3 | describe('Tests Jest Example Methods', () => { 4 | it('should test testedIsMyValueString for falsy', () => { 5 | const value = testedIsMyValueString(1); 6 | 7 | expect(value).toBeFalsy(); 8 | }); 9 | 10 | it('should test testedIsMyValueString for truthy', () => { 11 | const value = testedIsMyValueString('Hi!'); 12 | 13 | expect(value).toBeTruthy(); 14 | }); 15 | }); 16 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Additional context** 21 | Add any other context about the problem here. 22 | -------------------------------------------------------------------------------- /tests/mocks/brokenCoverage.json: -------------------------------------------------------------------------------- 1 | { 2 | "bad": { 3 | "total": 132, 4 | "covered": 126, 5 | "skipped": 0, 6 | "pct": 95.45 7 | }, 8 | "key": { 9 | "total": 157, 10 | "covered": 151, 11 | "skipped": 0, 12 | "pct": 96.18 13 | }, 14 | "sasa": { 15 | "total": 44, 16 | "covered": 44, 17 | "skipped": 0, 18 | "pct": 100 19 | }, 20 | "sese": { 21 | "total": 30, 22 | "covered": 23, 23 | "skipped": 0, 24 | "pct": 76.67 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /examples/mocha-chai-example/index.spec.ts: -------------------------------------------------------------------------------- 1 | import { expect } from 'chai'; 2 | import { testedIsMyValueString } from '.'; 3 | 4 | describe('Tests Jest Example Methods', () => { 5 | it('should test testedIsMyValueString for falsy', () => { 6 | const value = testedIsMyValueString(1); 7 | 8 | expect(value).to.equal(false); 9 | }); 10 | 11 | it('should test testedIsMyValueString for truthy', () => { 12 | const value = testedIsMyValueString('Hi!'); 13 | 14 | expect(value).to.be.equal(true); 15 | }); 16 | }); 17 | -------------------------------------------------------------------------------- /src/arguments.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Gets the node argument value or returns false 3 | * @param argName the argument name without trailing hyphens i.e. -- 4 | * @example getArgumentValue('coverageDir') 5 | * @returns string | false 6 | */ 7 | export const getArgumentValue = (argName: string): string | false => { 8 | const args = process.argv 9 | .filter((item) => (item.startsWith('--') && item.indexOf(argName) >= 0 ? item : '')) 10 | .toString(); 11 | 12 | return args ? args.replace(`--${argName}=`, '').replace(/["']/g, '') : false; 13 | }; 14 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | env: { 3 | es2020: true, 4 | node: true, 5 | }, 6 | extends: [ 7 | 'standard', 8 | 'plugin:prettier/recommended', 9 | 'eslint:recommended', 10 | 'plugin:@typescript-eslint/eslint-recommended', 11 | 'plugin:@typescript-eslint/recommended', 12 | ], 13 | parser: '@typescript-eslint/parser', 14 | parserOptions: { 15 | ecmaVersion: 11, 16 | sourceType: 'module', 17 | }, 18 | plugins: ['@typescript-eslint'], 19 | rules: { 20 | 'prefer-promise-reject-errors': 'off', 21 | }, 22 | }; 23 | -------------------------------------------------------------------------------- /tests/mocks/fakeBadCoverage.json: -------------------------------------------------------------------------------- 1 | { 2 | "total": { 3 | "bad": { 4 | "total": 132, 5 | "covered": 126, 6 | "skipped": 0, 7 | "pct": 95.45 8 | }, 9 | "key": { 10 | "total": 157, 11 | "covered": 151, 12 | "skipped": 0, 13 | "pct": 96.18 14 | }, 15 | "sasa": { 16 | "total": 44, 17 | "covered": 44, 18 | "skipped": 0, 19 | "pct": 100 20 | }, 21 | "sese": { 22 | "total": 30, 23 | "covered": 23, 24 | "skipped": 0, 25 | "pct": 76.67 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /examples/jest-example/my-custom-coverage/coverage-summary.json: -------------------------------------------------------------------------------- 1 | {"total": {"lines":{"total":4,"covered":3,"skipped":0,"pct":75},"statements":{"total":6,"covered":5,"skipped":0,"pct":83.33},"functions":{"total":2,"covered":1,"skipped":0,"pct":50},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} 2 | ,"/mnt/c/Users/olli/Documents/Projects/istanbul-badges-readme/examples/jest-example/index.ts": {"lines":{"total":4,"covered":3,"skipped":0,"pct":75},"functions":{"total":2,"covered":1,"skipped":0,"pct":50},"statements":{"total":6,"covered":5,"skipped":0,"pct":83.33},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} 3 | } 4 | -------------------------------------------------------------------------------- /src/types.ts: -------------------------------------------------------------------------------- 1 | export type Hashes = { 2 | key: string; 3 | value: string; 4 | }; 5 | 6 | export type Report = { 7 | [total: string]: Record>; 8 | }; 9 | 10 | export type Colors = 'red' | 'yellow' | 'brightgreen'; 11 | 12 | export type BadgeStyles = 'plastic' | 'flat' | 'flat-square' | 'for-the-badge'; 13 | 14 | export type BadgerFactory = { 15 | checkConfig: () => Promise; 16 | editReadme: () => Promise; 17 | logger: () => { 18 | logInfo: (message: string) => void; 19 | logWarn: (message: string) => void; 20 | logError: (message: string) => void; 21 | }; 22 | getExitCodeOnError?: () => number | undefined; 23 | }; 24 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "allowSyntheticDefaultImports": true, 4 | "allowUnreachableCode": false, 5 | "allowUnusedLabels": false, 6 | "declaration": false, 7 | "declarationMap": false, 8 | "esModuleInterop": true, 9 | "module": "commonjs", 10 | "moduleResolution": "node", 11 | "noImplicitReturns": true, 12 | "noUnusedLocals": true, 13 | "noUnusedParameters": true, 14 | "pretty": true, 15 | "sourceMap": true, 16 | "strict": true, 17 | "target": "es2017", 18 | "lib": ["es2017"], 19 | "outDir": "lib", 20 | "rootDir": "src" 21 | }, 22 | "include": ["src"], 23 | "exclude": ["node_modules", "./tests/*"] 24 | } 25 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /src/logger.ts: -------------------------------------------------------------------------------- 1 | import { getArgumentValue } from './arguments'; 2 | 3 | export const logger = (): { 4 | logInfo: (message: string) => void; 5 | logWarn: (message: string) => void; 6 | logError: (message: string) => void; 7 | } => { 8 | const customLog = 9 | (level: (message?: unknown, ...optionalParams: unknown[]) => void, isSupressable: boolean) => (message: string) => { 10 | const isSupressed = isSupressable && getArgumentValue('silent'); 11 | 12 | if (isSupressed) { 13 | return null; 14 | } 15 | 16 | return level(message); 17 | }; 18 | 19 | return { 20 | logInfo: customLog(console.info, true), 21 | logWarn: customLog(console.warn, true), 22 | logError: customLog(console.error, false), 23 | }; 24 | }; 25 | -------------------------------------------------------------------------------- /src/factory.ts: -------------------------------------------------------------------------------- 1 | import { BadgerFactory } from './types'; 2 | 3 | export const badgerFactory = 4 | ({ checkConfig, editReadme, logger, getExitCodeOnError }: BadgerFactory) => 5 | async (): Promise => { 6 | const { logInfo, logError } = logger(); 7 | 8 | logInfo('Istanbul Badges Readme process started'); 9 | 10 | await checkConfig() 11 | .then(() => editReadme()) 12 | .catch((error) => { 13 | logError(`${error}`); 14 | logError('Please refer to the documentation'); 15 | logError('https://github.com/the-bugging/istanbul-badges-readme/blob/master/README.md'); 16 | 17 | process.exitCode = getExitCodeOnError?.() ?? 0; 18 | }) 19 | .finally(() => { 20 | logInfo('Istanbul Badges Readme process finished'); 21 | }); 22 | }; 23 | -------------------------------------------------------------------------------- /tests/mocks/fakeReadmeFile.md: -------------------------------------------------------------------------------- 1 | | Statements | Branches | Functions | Lines | 2 | | ----------------------------------------------------------------- | ---------------------------------------------------------------- | -------------------------------------------------------------- | ----------------------------------------------------------------- | 3 | | ![Scheme](https://img.shields.io/badge/Coverage-44.74%25-red.svg) | ![Bleach](https://img.shields.io/badge/Coverage-5.56%25-red.svg) | ![Bad](https://img.shields.io/badge/Coverage-15.38%25-red.svg) | ![Broken](https://img.shields.io/badge/Coverage-38.71%25-red.svg) | 4 | -------------------------------------------------------------------------------- /.github/workflows/npm-publish.yml: -------------------------------------------------------------------------------- 1 | name: Node.js Package 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | 8 | jobs: 9 | build: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: actions/checkout@v2 13 | - uses: actions/setup-node@v2 14 | with: 15 | node-version: 16 16 | - run: npm install 17 | - run: npm run test:ci 18 | - run: npm run build 19 | 20 | publish-npm: 21 | needs: build 22 | runs-on: ubuntu-latest 23 | steps: 24 | - uses: actions/checkout@v2 25 | - uses: actions/setup-node@v2 26 | with: 27 | node-version: 16 28 | registry-url: https://registry.npmjs.org/ 29 | - run: npm install 30 | - run: npm publish 31 | env: 32 | NODE_AUTH_TOKEN: ${{secrets.NPM_AUTH_TOKEN}} 33 | -------------------------------------------------------------------------------- /examples/jest-example/README.md: -------------------------------------------------------------------------------- 1 | # Jest Example 2 | 3 | ### Reproduce example 4 | 5 | - Run `npm install` 6 | - Run `npm run cover` 7 | - Run `npm run make-badges` 8 | 9 | - Open this very README.md again. 10 | 11 | ### Config inside [package.json](./package.json) 12 | 13 | ### Example functions [index.ts](./index.ts) 14 | 15 | - Tested **testedIsMyValueString** 16 | - Untested **untestedRandomMethod** 17 | 18 | ### Custom Markup 19 | 20 | - My Statements coverage is ![Statements](https://img.shields.io/badge/Coverage-83.33%25-yellow.svg) 21 | - My Branches coverage is ![Branches](https://img.shields.io/badge/Coverage-100%25-brightgreen.svg) 22 | - My Functions coverage is ![Functions](https://img.shields.io/badge/Coverage-50%25-red.svg) 23 | - My Lines coverage is ![Lines](https://img.shields.io/badge/Coverage-75%25-red.svg) 24 | -------------------------------------------------------------------------------- /examples/mocha-chai-example/README.md: -------------------------------------------------------------------------------- 1 | # Mocha/Chai Example 2 | 3 | ### Reproduce example 4 | 5 | - Run `npm install` 6 | - Run `npm run cover` 7 | - Run `npm run make-badges` 8 | 9 | - Open this very README.md again. 10 | 11 | ### Config inside [package.json](./package.json) 12 | 13 | ### Example functions [index.ts](./index.ts) 14 | 15 | - Tested **testedIsMyValueString** 16 | - Untested **untestedRandomMethod** 17 | 18 | ### Custom Markup 19 | 20 | - My Statements coverage is ![Statements](https://img.shields.io/badge/Coverage-93.33%25-brightgreen.svg) 21 | - My Branches coverage is ![Branches](https://img.shields.io/badge/Coverage-100%25-brightgreen.svg) 22 | - My Functions coverage is ![Functions](https://img.shields.io/badge/Coverage-80%25-yellow.svg) 23 | - My Lines coverage is ![Lines](https://img.shields.io/badge/Coverage-92.31%25-brightgreen.svg) 24 | -------------------------------------------------------------------------------- /examples/mocha-chai-example/my-custom-coverage/coverage-summary.json: -------------------------------------------------------------------------------- 1 | {"total": {"lines":{"total":13,"covered":12,"skipped":0,"pct":92.31},"statements":{"total":15,"covered":14,"skipped":0,"pct":93.33},"functions":{"total":5,"covered":4,"skipped":0,"pct":80},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} 2 | ,"/mnt/c/Users/olli/Documents/Projects/istanbul-badges-readme/examples/mocha-example/index.spec.ts": {"lines":{"total":9,"covered":9,"skipped":0,"pct":100},"functions":{"total":3,"covered":3,"skipped":0,"pct":100},"statements":{"total":9,"covered":9,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} 3 | ,"/mnt/c/Users/olli/Documents/Projects/istanbul-badges-readme/examples/mocha-example/index.ts": {"lines":{"total":4,"covered":3,"skipped":0,"pct":75},"functions":{"total":2,"covered":1,"skipped":0,"pct":50},"statements":{"total":6,"covered":5,"skipped":0,"pct":83.33},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} 4 | } 5 | -------------------------------------------------------------------------------- /.github/workflows/pull-request.yml: -------------------------------------------------------------------------------- 1 | # This workflow will do a clean install of node dependencies, cache/restore them, build the source code and run tests across different versions of node 2 | # For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions 3 | 4 | name: Node.js CI 5 | 6 | on: 7 | pull_request: 8 | branches: [develop] 9 | 10 | jobs: 11 | build: 12 | runs-on: ubuntu-latest 13 | 14 | strategy: 15 | matrix: 16 | node-version: [12.x, 14.x, 16.x] 17 | # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ 18 | 19 | steps: 20 | - uses: actions/checkout@v2 21 | - name: Use Node.js ${{ matrix.node-version }} 22 | uses: actions/setup-node@v2 23 | with: 24 | node-version: ${{ matrix.node-version }} 25 | cache: 'npm' 26 | - run: npm ci 27 | - run: npm run build 28 | - run: npm run test:ci 29 | - run: npm run make-badges:ci 30 | -------------------------------------------------------------------------------- /examples/jest-example/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jest-example", 3 | "version": "1.0.0", 4 | "description": "Jest with coverage example", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "jest", 8 | "cover": "jest --coverage", 9 | "make-badges": "istanbul-badges-readme", 10 | "make-badges-silent": "istanbul-badges-readme --silent", 11 | "make-badges-custom-coverage-dir": "istanbul-badges-readme --coverageDir='./my-custom-coverage'", 12 | "make-badges-custom-readme-dir": "istanbul-badges-readme --readmeDir='./my-custom-readme'" 13 | }, 14 | "jest": { 15 | "coverageReporters": [ 16 | "json-summary" 17 | ], 18 | "transform": { 19 | "^.+\\.(t|j)sx?$": "ts-jest" 20 | } 21 | }, 22 | "keywords": [], 23 | "author": "", 24 | "license": "ISC", 25 | "devDependencies": { 26 | "@types/jest": "^27.0.3", 27 | "husky": "^7.0.4", 28 | "istanbul-badges-readme": "^1.8.0", 29 | "jest": "^27.4.3", 30 | "ts-jest": "^27.0.7", 31 | "typescript": "^4.5.2" 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /tests/mocks/accurateReadme.md: -------------------------------------------------------------------------------- 1 | | Statements | Branches | Functions | Lines | 2 | | ------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | 3 | | ![Statements](https://img.shields.io/badge/statements-91.53%25-brightgreen.svg?style=flat) | ![Branches](https://img.shields.io/badge/branches-83.33%25-yellow.svg?style=flat) | ![Functions](https://img.shields.io/badge/functions-83.33%25-yellow.svg?style=flat) | ![Lines](https://img.shields.io/badge/lines-92.26%25-brightgreen.svg?style=flat) | 4 | -------------------------------------------------------------------------------- /examples/mocha-chai-example/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mocha-chai-example", 3 | "version": "1.0.0", 4 | "description": "Mocha/Chai with coverage example", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "mocha -r ts-node/register './*.spec.ts'", 8 | "cover": "nyc mocha -r ts-node/register './*.spec.ts'", 9 | "make-badges": "istanbul-badges-readme", 10 | "make-badges-silent": "istanbul-badges-readme --silent", 11 | "make-badges-custom-dir": "istanbul-badges-readme --coverageDir='./my-custom-coverage'" 12 | }, 13 | "nyc": { 14 | "extension": [ 15 | ".ts" 16 | ], 17 | "reporter": [ 18 | "json-summary" 19 | ], 20 | "all": true 21 | }, 22 | "keywords": [], 23 | "author": "", 24 | "license": "ISC", 25 | "devDependencies": { 26 | "@types/chai": "^4.2.22", 27 | "@types/mocha": "^9.0.0", 28 | "chai": "^4.3.4", 29 | "husky": "^7.0.4", 30 | "istanbul-badges-readme": "^1.8.0", 31 | "mocha": "^9.2.2", 32 | "nyc": "^15.1.0", 33 | "ts-node": "^10.4.0", 34 | "typescript": "^4.5.2" 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/constants.ts: -------------------------------------------------------------------------------- 1 | import { BadgeStyles } from './types'; 2 | 3 | export const readmePathConst = './README.md'; 4 | export const coveragePathConst = './coverage/coverage-summary.json'; 5 | export const hashesConst = { 6 | coverage: [ 7 | { key: 'branches', value: 'Branches' }, 8 | { key: 'functions', value: 'Functions' }, 9 | { key: 'lines', value: 'Lines' }, 10 | { key: 'statements', value: 'Statements' }, 11 | ], 12 | }; 13 | export const coverageUrlConst = ( 14 | alt: string, 15 | coverage: number, 16 | color: string, 17 | badgeStyle: BadgeStyles, 18 | customBadgeLogo: string | false, 19 | ): string => 20 | `https://img.shields.io/badge/${alt}-${coverage}${encodeURI('%')}-${color}.svg?style=${badgeStyle}${ 21 | customBadgeLogo ? `&logo=${customBadgeLogo}` : '' 22 | }`; 23 | export const badgeStyles: Record = { 24 | 'for-the-badge': 'for-the-badge', 25 | 'flat-square': 'flat-square', 26 | flat: 'flat', 27 | plastic: 'plastic', 28 | default: 'flat', 29 | }; 30 | export const defaultColorThresholds = { 31 | red: 80, 32 | yellow: 90, 33 | }; 34 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Olavo Parno 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 | -------------------------------------------------------------------------------- /tests/helpers.spec.ts: -------------------------------------------------------------------------------- 1 | import { getCoveragePath, getExitCodeOnError, getReadmePath, readFileAsync } from '../src/helpers'; 2 | 3 | describe('test helpers file', () => { 4 | afterEach(() => { 5 | process.argv.pop(); 6 | }); 7 | it('should getCoveragePath from arguments', () => { 8 | process.argv.push('--coverageDir=my-custom-dir'); 9 | const args = getCoveragePath('coverageDir'); 10 | 11 | expect(args).toEqual('my-custom-dir/coverage-summary.json'); 12 | }); 13 | 14 | it('should getReadmePath from arguments', () => { 15 | process.argv.push('--readmeDir=my-custom-dir'); 16 | const args = getReadmePath('readmeDir'); 17 | 18 | expect(args).toEqual('my-custom-dir/README.md'); 19 | }); 20 | 21 | it('should fail to read an async file', async () => { 22 | await readFileAsync('./foo/bar.biz', 'utf-8').catch((e) => expect(e).toEqual('File not found at: ./foo/bar.biz')); 23 | }); 24 | 25 | it('should handle optional exitCode usage with a NaN', () => { 26 | process.argv.push('--exitCode=sasa'); 27 | const exitCode = getExitCodeOnError(); 28 | 29 | expect(exitCode).toBeUndefined(); 30 | }); 31 | 32 | it('should handle optional exitCode usage with a valid exit number', () => { 33 | process.argv.push('--exitCode=1'); 34 | const exitCode = getExitCodeOnError(); 35 | 36 | expect(exitCode).toEqual(1); 37 | }); 38 | }); 39 | -------------------------------------------------------------------------------- /tests/logger.spec.ts: -------------------------------------------------------------------------------- 1 | import { logger } from '../src/logger'; 2 | 3 | describe('Tests logger helper', () => { 4 | afterEach(() => { 5 | jest.clearAllMocks(); 6 | }); 7 | 8 | it('should log everything correctly', () => { 9 | console.info = jest.fn(); 10 | console.warn = jest.fn(); 11 | console.error = jest.fn(); 12 | 13 | const infoSpy = jest.spyOn(console, 'info'); 14 | const warnSpy = jest.spyOn(console, 'warn'); 15 | const errorSpy = jest.spyOn(console, 'error'); 16 | 17 | const log = logger(); 18 | 19 | log.logInfo('informed!'); 20 | log.logWarn('warned!'); 21 | log.logError('errored!'); 22 | 23 | expect(infoSpy).toHaveBeenCalledWith('informed!'); 24 | expect(warnSpy).toHaveBeenCalledWith('warned!'); 25 | expect(errorSpy).toHaveBeenCalledWith('errored!'); 26 | }); 27 | 28 | it('should not log with --silent arguments expect for console.error', () => { 29 | process.argv.push('--silent'); 30 | 31 | const infoSpy = jest.spyOn(console, 'info'); 32 | const warnSpy = jest.spyOn(console, 'warn'); 33 | const errorSpy = jest.spyOn(console, 'error'); 34 | 35 | const log = logger(); 36 | 37 | log.logInfo('informed!'); 38 | log.logWarn('warned!'); 39 | log.logError('errored!'); 40 | 41 | expect(infoSpy).not.toHaveBeenCalled(); 42 | expect(warnSpy).not.toHaveBeenCalled(); 43 | expect(errorSpy).toHaveBeenCalledWith('errored!'); 44 | }); 45 | }); 46 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "istanbul-badges-readme", 3 | "version": "1.9.0", 4 | "description": "Creates README badges from istanbul coverage report", 5 | "scripts": { 6 | "test": "jest", 7 | "test:cover": "npm run test -- --coverage", 8 | "test:ci": "CI=TRUE npm run test:cover", 9 | "lint": "eslint src/**/*.{js,ts,tsx} --quiet", 10 | "lint:fix": "npm run lint -- --fix", 11 | "build": "rm -rf lib/ && tsc", 12 | "start": "npm run build && node lib/index.js -- --logo=jest", 13 | "start:dev": "nodemon", 14 | "release": "standard-version", 15 | "make-badges": "node lib/index.js -- --logo=jest", 16 | "make-badges:ci": "npm run make-badges -- --ci", 17 | "prepublishOnly": "npm run build" 18 | }, 19 | "main": "lib/index.js", 20 | "bin": { 21 | "istanbul-badges-readme": "lib/index.js" 22 | }, 23 | "files": [ 24 | "LICENSE", 25 | "README.md", 26 | "lib" 27 | ], 28 | "keywords": [ 29 | "coverage", 30 | "badges", 31 | "jest", 32 | "istanbul", 33 | "mocha", 34 | "chai", 35 | "c8", 36 | "sinon", 37 | "readme", 38 | "markdown" 39 | ], 40 | "author": "Olavo Parno", 41 | "license": "MIT", 42 | "repository": { 43 | "type": "git", 44 | "url": "git://github.com/the-bugging/istanbul-badges-readme.git" 45 | }, 46 | "jest": { 47 | "coverageReporters": [ 48 | "json-summary", 49 | "lcov" 50 | ], 51 | "transform": { 52 | "^.+\\.ts$": "ts-jest" 53 | }, 54 | "modulePathIgnorePatterns": [ 55 | "/node_modules/", 56 | "/examples/" 57 | ], 58 | "coveragePathIgnorePatterns": [ 59 | "/node_modules/", 60 | "/examples/" 61 | ] 62 | }, 63 | "devDependencies": { 64 | "@types/jest": "^29.2.3", 65 | "@types/node": "^18.11.9", 66 | "@types/winston": "^2.4.4", 67 | "@typescript-eslint/eslint-plugin": "^5.44.0", 68 | "@typescript-eslint/parser": "^5.44.0", 69 | "eslint": "^8.28.0", 70 | "eslint-config-prettier": "^8.5.0", 71 | "eslint-config-standard": "^17.0.0", 72 | "eslint-plugin-import": "^2.26.0", 73 | "eslint-plugin-jest": "^27.1.6", 74 | "eslint-plugin-node": "^11.1.0", 75 | "eslint-plugin-prettier": "^4.2.1", 76 | "eslint-plugin-promise": "^6.1.1", 77 | "eslint-plugin-standard": "^5.0.0", 78 | "husky": "^8.0.2", 79 | "jest": "^29.3.1", 80 | "nodemon": "^2.0.20", 81 | "prettier": "^2.8.0", 82 | "standard-version": "^9.5.0", 83 | "ts-jest": "^29.0.3", 84 | "ts-node": "^10.9.1", 85 | "typescript": "^4.9.3" 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /src/validate.ts: -------------------------------------------------------------------------------- 1 | import fs from 'fs'; 2 | import { hashesConst, readmePathConst, coveragePathConst } from './constants'; 3 | import { getCoveragePath, getReadmePath, isNodeErrnoError } from './helpers'; 4 | import { logger } from './logger'; 5 | 6 | const { logInfo } = logger(); 7 | 8 | export const doesReadmeFileExistWithRightPermissions = (readmePath: string): Promise => { 9 | return new Promise((resolve, reject) => { 10 | try { 11 | // NOTE: Doing this check for the accessibility before reading/writing it 12 | // is not recommended as it introduces racing conditions since other 13 | // processes may change the file's state between the two call. 14 | // But for simplicity and considering the context of this library, 15 | // this wrong access file handling is toleralable. 16 | fs.accessSync(getReadmePath(readmePath), fs.constants.R_OK | fs.constants.W_OK); 17 | return resolve(true); 18 | } catch (err) { 19 | if (isNodeErrnoError(err)) { 20 | if (err.code === 'ENOENT') return reject('Readme file does not exist'); 21 | if (err.code === 'EACCES') return reject('Readme file does not have read and write permissions'); 22 | return reject(err.message); 23 | } 24 | 25 | return reject((err as Error).message || 'Something went wrong'); 26 | } 27 | }); 28 | }; 29 | 30 | export const doesCoverageFileExist = (coveragePath: string): Promise => { 31 | return new Promise((resolve, reject) => { 32 | const currentCoveragePath = getCoveragePath(coveragePath); 33 | const doesItExist = fs.existsSync(currentCoveragePath); 34 | 35 | if (doesItExist) return resolve(true); 36 | 37 | return reject(`Coverage file does not exist in ${currentCoveragePath}`); 38 | }); 39 | }; 40 | 41 | export const doesCoverageHashesExist = (coveragePath: string): Promise => { 42 | return new Promise((resolve, reject) => { 43 | const coverageFile = fs.readFileSync(getCoveragePath(coveragePath)); 44 | 45 | hashesConst.coverage.forEach((hash) => { 46 | if (coverageFile.includes(hash.key)) resolve(true); 47 | }); 48 | 49 | return reject('Coverage file does contain the needed hashes'); 50 | }); 51 | }; 52 | 53 | export const doesReadmeHashExist = (readmePath: string): Promise => { 54 | return new Promise((resolve, reject) => { 55 | const readmeFile = fs.readFileSync(getReadmePath(readmePath)); 56 | 57 | hashesConst.coverage.forEach((hash) => { 58 | if (readmeFile.includes(`![${hash.value}]`)) resolve(true); 59 | }); 60 | 61 | return reject('Readme does not contain the needed hashes'); 62 | }); 63 | }; 64 | 65 | export const checkConfig = (): Promise => { 66 | logInfo('Config check process started'); 67 | 68 | return doesReadmeFileExistWithRightPermissions(readmePathConst) 69 | .then(() => { 70 | logInfo('- Readme file exists... ✔️.'); 71 | }) 72 | .then(() => doesCoverageFileExist(coveragePathConst)) 73 | .then(() => { 74 | logInfo('- Coverage file exists... ✔️.'); 75 | }) 76 | .then(() => doesCoverageHashesExist(coveragePathConst)) 77 | .then(() => { 78 | logInfo('- Coverage hashes exist... ✔️.'); 79 | }) 80 | .then(() => doesReadmeHashExist(readmePathConst)) 81 | .then(() => { 82 | logInfo('- Readme hashes exist... ✔️.'); 83 | }) 84 | .then(() => logInfo('Config check process ended')); 85 | }; 86 | -------------------------------------------------------------------------------- /src/helpers.ts: -------------------------------------------------------------------------------- 1 | import fs from 'fs'; 2 | import { logger } from './logger'; 3 | import { getArgumentValue } from './arguments'; 4 | import { defaultColorThresholds } from './constants'; 5 | 6 | const { logWarn } = logger(); 7 | 8 | export const getCoveragePath = (path: string): string => { 9 | let coveragePath: string = path; 10 | const argPath = getArgumentValue('coverageDir'); 11 | 12 | if (argPath) { 13 | coveragePath = `${argPath}/coverage-summary.json`; 14 | } 15 | 16 | return coveragePath; 17 | }; 18 | 19 | export const getReadmePath = (path: string): string => { 20 | let readmePath: string = path; 21 | const argPath = getArgumentValue('readmeDir'); 22 | 23 | if (argPath) { 24 | readmePath = `${argPath}/README.md`; 25 | } 26 | 27 | return readmePath; 28 | }; 29 | 30 | export const readFileAsync = async (path: string, encode: BufferEncoding): Promise => { 31 | return new Promise((resolve, reject) => { 32 | fs.readFile(path, encode, (err, data) => { 33 | if (err) reject(`File not found at: ${path}`); 34 | resolve(data); 35 | }); 36 | }); 37 | }; 38 | 39 | /** 40 | * Asserts that the given `error` was created by Node internals. 41 | * @param error The error object. 42 | * @returns `true` if given error object is a NodeJS error. 43 | */ 44 | export const isNodeErrnoError = (error: unknown): error is NodeJS.ErrnoException => 45 | error instanceof Error && 'code' in error; 46 | 47 | /** 48 | * Handles optional exitCode on eventual application throw. 49 | * @returns `number` for chosen exit code or undefined 50 | */ 51 | export const getExitCodeOnError = (): number | undefined => { 52 | const argExitCode = +getArgumentValue('exitCode'); 53 | 54 | return argExitCode && !isNaN(argExitCode) ? argExitCode : undefined; 55 | }; 56 | 57 | /** 58 | * Parses a string representing colors and their corresponding numeric values into an object. 59 | * The input string should be formatted as "color:value", with multiple color-value pairs separated by commas. 60 | * This function specifically expects "red", "yellow", and "brightgreen" as the only valid colors in the string. 61 | * 62 | * @param optional {string | false} colorConfigString - The string representation of colors and their values to parse. 63 | * @returns {{ red: number; yellow: number; brightgreen: number }} An object with keys "red", "yellow", and "brightgreen", 64 | * each mapped to their numeric value as specified in the input string. 65 | * @example parseColorConfig('red:70,yellow:85,brightgreen:95') => { red: 70, yellow: 85, brightgreen: 95 } 66 | */ 67 | export const parseColorConfig = ( 68 | colorConfigString?: string | false, 69 | ): { 70 | red: number; 71 | yellow: number; 72 | } => { 73 | if (!colorConfigString) { 74 | return defaultColorThresholds; 75 | } 76 | 77 | // checks if colorConfigString is in the correct format color:numberThreshold separated by commas 78 | if (!/^((red|yellow):[0-9]+,?)+$/.test(colorConfigString)) { 79 | logWarn( 80 | `Invalid color configuration string provided: "${colorConfigString}". Using default color thresholds instead.`, 81 | ); 82 | 83 | return defaultColorThresholds; 84 | } 85 | 86 | return colorConfigString.split(',').reduce((acc, colorPair) => { 87 | const [color, value] = colorPair.split(':'); 88 | if (color === 'red' || color === 'yellow') { 89 | acc[color] = parseInt(value, 10); 90 | } 91 | return acc; 92 | }, {} as { red: number; yellow: number }); 93 | }; 94 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as 6 | contributors and maintainers pledge to making participation in our project and 7 | our community a harassment-free experience for everyone, regardless of age, body 8 | size, disability, ethnicity, sex characteristics, gender identity and expression, 9 | level of experience, education, socio-economic status, nationality, personal 10 | appearance, race, religion, or sexual identity and orientation. 11 | 12 | ## Our Standards 13 | 14 | Examples of behavior that contributes to creating a positive environment 15 | include: 16 | 17 | - Using welcoming and inclusive language 18 | - Being respectful of differing viewpoints and experiences 19 | - Gracefully accepting constructive criticism 20 | - Focusing on what is best for the community 21 | - Showing empathy towards other community members 22 | 23 | Examples of unacceptable behavior by participants include: 24 | 25 | - The use of sexualized language or imagery and unwelcome sexual attention or 26 | advances 27 | - Trolling, insulting/derogatory comments, and personal or political attacks 28 | - Public or private harassment 29 | - Publishing others' private information, such as a physical or electronic 30 | address, without explicit permission 31 | - Other conduct which could reasonably be considered inappropriate in a 32 | professional setting 33 | 34 | ## Our Responsibilities 35 | 36 | Project maintainers are responsible for clarifying the standards of acceptable 37 | behavior and are expected to take appropriate and fair corrective action in 38 | response to any instances of unacceptable behavior. 39 | 40 | Project maintainers have the right and responsibility to remove, edit, or 41 | reject comments, commits, code, wiki edits, issues, and other contributions 42 | that are not aligned to this Code of Conduct, or to ban temporarily or 43 | permanently any contributor for other behaviors that they deem inappropriate, 44 | threatening, offensive, or harmful. 45 | 46 | ## Scope 47 | 48 | This Code of Conduct applies both within project spaces and in public spaces 49 | when an individual is representing the project or its community. Examples of 50 | representing a project or community include using an official project e-mail 51 | address, posting via an official social media account, or acting as an appointed 52 | representative at an online or offline event. Representation of a project may be 53 | further defined and clarified by project maintainers. 54 | 55 | ## Enforcement 56 | 57 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 58 | reported by contacting the project team at contact@thebugging.com. All 59 | complaints will be reviewed and investigated and will result in a response that 60 | is deemed necessary and appropriate to the circumstances. The project team is 61 | obligated to maintain confidentiality with regard to the reporter of an incident. 62 | Further details of specific enforcement policies may be posted separately. 63 | 64 | Project maintainers who do not follow or enforce the Code of Conduct in good 65 | faith may face temporary or permanent repercussions as determined by other 66 | members of the project's leadership. 67 | 68 | ## Attribution 69 | 70 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, 71 | available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html 72 | 73 | [homepage]: https://www.contributor-covenant.org 74 | 75 | For answers to common questions about this code of conduct, see 76 | https://www.contributor-covenant.org/faq 77 | -------------------------------------------------------------------------------- /tests/validate.spec.ts: -------------------------------------------------------------------------------- 1 | import fs from 'fs'; 2 | import path from 'path'; 3 | import { 4 | doesReadmeFileExistWithRightPermissions, 5 | doesCoverageFileExist, 6 | doesCoverageHashesExist, 7 | doesReadmeHashExist, 8 | } from '../src/validate'; 9 | 10 | describe('Tests validate file', () => { 11 | afterEach(() => { 12 | jest.clearAllMocks(); 13 | }); 14 | 15 | it('should throw when doesReadmeFileExistWithRightPermissions does not find file', async () => { 16 | const fsSpy = jest.spyOn(fs, 'accessSync').mockImplementation(() => { 17 | const error: NodeJS.ErrnoException = new Error(); 18 | error.code = 'ENOENT'; 19 | throw error; 20 | }); 21 | 22 | await expect(doesReadmeFileExistWithRightPermissions('fake-path')).rejects.toEqual('Readme file does not exist'); 23 | 24 | expect(fsSpy).toHaveBeenNthCalledWith(1, 'fake-path', fs.constants.R_OK | fs.constants.W_OK); 25 | }); 26 | 27 | it('should throw when doesReadmeFileExistWithRightPermissions does find file the file but it does not have read & write permissions', async () => { 28 | const fsMock = jest.spyOn(fs, 'accessSync').mockImplementation(() => { 29 | const error: NodeJS.ErrnoException = new Error(); 30 | error.code = 'EACCES'; 31 | throw error; 32 | }); 33 | 34 | await expect(doesReadmeFileExistWithRightPermissions('fake-path')).rejects.toEqual( 35 | 'Readme file does not have read and write permissions', 36 | ); 37 | 38 | expect(fsMock).toHaveBeenNthCalledWith(1, 'fake-path', fs.constants.R_OK | fs.constants.W_OK); 39 | }); 40 | 41 | test('doesReadmeFileExistWithRightPermissions should rethrow any other fs error there is not related with file permissions nor find issues', async () => { 42 | const fsSpy = jest.spyOn(fs, 'accessSync').mockImplementation(() => { 43 | const error: NodeJS.ErrnoException = new Error('something'); 44 | error.code = 'EBUSY'; 45 | throw error; 46 | }); 47 | 48 | await expect(doesReadmeFileExistWithRightPermissions('fake-path')).rejects.toEqual('something'); 49 | 50 | expect(fsSpy).toHaveBeenNthCalledWith(1, 'fake-path', fs.constants.R_OK | fs.constants.W_OK); 51 | }); 52 | 53 | test('doesReadmeFileExistWithRightPermissions should rethrow any other error there is not related with fs module', async () => { 54 | const fsSpy = jest.spyOn(fs, 'accessSync'); 55 | 56 | fsSpy.mockImplementation(() => { 57 | throw new Error('something'); 58 | }); 59 | 60 | await expect(doesReadmeFileExistWithRightPermissions('fake-path')).rejects.toEqual('something'); 61 | 62 | fsSpy.mockImplementation(() => { 63 | throw new Error(); 64 | }); 65 | 66 | await expect(doesReadmeFileExistWithRightPermissions('fake-path')).rejects.toEqual('Something went wrong'); 67 | 68 | expect(fsSpy).toHaveBeenNthCalledWith(2, 'fake-path', fs.constants.R_OK | fs.constants.W_OK); 69 | }); 70 | 71 | it('should throw when doesCoverageFileExist does not find file', async () => { 72 | const fakePath = 'fake-path'; 73 | 74 | await doesCoverageFileExist('fake-path').catch((error) => { 75 | expect(error).toEqual(`Coverage file does not exist in ${fakePath}`); 76 | }); 77 | }); 78 | 79 | it("should throw when doesCoverageHashesExist can't find a hash", async () => { 80 | const fakeJsonPath = path.join(__dirname, '../tests/mocks/fakeBadCoverage.json'); 81 | 82 | await doesCoverageHashesExist(fakeJsonPath).catch((error) => { 83 | expect(error).toEqual('Coverage file does contain the needed hashes'); 84 | }); 85 | }); 86 | 87 | it("should throw when doesReadmeHashExist can't find a hash", async () => { 88 | const fakeReadmeFile = path.join(__dirname, '../tests/mocks/fakeReadmeFile.md'); 89 | 90 | await doesReadmeHashExist(fakeReadmeFile).catch((error) => { 91 | expect(error).toEqual('Readme does not contain the needed hashes'); 92 | }); 93 | }); 94 | }); 95 | -------------------------------------------------------------------------------- /tests/index.spec.ts: -------------------------------------------------------------------------------- 1 | import { badger } from '../src'; 2 | import { badgerFactory } from '../src/factory'; 3 | 4 | describe('Tests istanbul badges readme', () => { 5 | afterEach(() => { 6 | jest.clearAllMocks(); 7 | }); 8 | 9 | const consoleInfoFn = jest.fn(); 10 | const consoleErrorFn = jest.fn(); 11 | 12 | it('should run mocked badger correctly from start to finish', async () => { 13 | const checkConfig = () => Promise.resolve(); 14 | const editReadme = () => Promise.resolve(); 15 | const logger = () => ({ 16 | logInfo: consoleInfoFn, 17 | logError: () => null, 18 | logWarn: () => null, 19 | }); 20 | 21 | const mockedBadger = badgerFactory({ checkConfig, editReadme, logger }); 22 | 23 | await mockedBadger(); 24 | 25 | expect(consoleInfoFn).toHaveBeenCalledTimes(2); 26 | expect(consoleInfoFn).toHaveBeenNthCalledWith(1, 'Istanbul Badges Readme process started'); 27 | expect(consoleInfoFn).toHaveBeenNthCalledWith(2, 'Istanbul Badges Readme process finished'); 28 | }); 29 | 30 | it('should run mocked badger with error on checking config', async () => { 31 | const checkConfig = () => Promise.reject('Errored!'); 32 | const editReadme = () => Promise.resolve(); 33 | const logger = () => ({ 34 | logInfo: consoleInfoFn, 35 | logError: consoleErrorFn, 36 | logWarn: () => null, 37 | }); 38 | 39 | const mockedBadger = badgerFactory({ checkConfig, editReadme, logger }); 40 | 41 | await mockedBadger(); 42 | 43 | expect(consoleInfoFn).toHaveBeenCalledTimes(2); 44 | expect(consoleInfoFn).toHaveBeenNthCalledWith(1, 'Istanbul Badges Readme process started'); 45 | expect(consoleInfoFn).toHaveBeenNthCalledWith(2, 'Istanbul Badges Readme process finished'); 46 | 47 | expect(consoleErrorFn).toHaveBeenCalledTimes(3); 48 | expect(consoleErrorFn).toHaveBeenNthCalledWith(1, 'Errored!'); 49 | expect(consoleErrorFn).toHaveBeenNthCalledWith(2, 'Please refer to the documentation'); 50 | expect(consoleErrorFn).toHaveBeenNthCalledWith( 51 | 3, 52 | 'https://github.com/the-bugging/istanbul-badges-readme/blob/master/README.md', 53 | ); 54 | }); 55 | 56 | it('should run badger correctly from start to finish', async () => { 57 | console.info = consoleInfoFn; 58 | 59 | await badger(); 60 | 61 | expect(consoleInfoFn).toHaveBeenCalledTimes(2); 62 | expect(consoleInfoFn).toHaveBeenNthCalledWith(1, 'Istanbul Badges Readme process started'); 63 | expect(consoleInfoFn).toHaveBeenNthCalledWith(2, 'Istanbul Badges Readme process finished'); 64 | }); 65 | 66 | it('should run badger with optional exitCode on error', async () => { 67 | process.argv.push('--coverageDir="fake-non-exitent-path"'); 68 | 69 | const processExitSpy = jest.spyOn(process, 'exit').mockImplementation(() => null as unknown as never); 70 | 71 | const checkConfig = () => Promise.reject('Errored!'); 72 | const editReadme = () => Promise.resolve(); 73 | const logger = () => ({ 74 | logInfo: consoleInfoFn, 75 | logError: consoleErrorFn, 76 | logWarn: () => null, 77 | }); 78 | const getExitCodeOnError = () => 1; 79 | 80 | const mockedBadger = badgerFactory({ checkConfig, editReadme, logger, getExitCodeOnError }); 81 | 82 | await mockedBadger() 83 | .catch(() => { 84 | expect(consoleErrorFn).toHaveBeenCalledTimes(3); 85 | expect(consoleErrorFn).toHaveBeenNthCalledWith( 86 | 1, 87 | 'File not found at: fake-non-exitent-path/coverage-summary.json', 88 | ); 89 | expect(consoleErrorFn).toHaveBeenNthCalledWith(2, 'Please refer to the documentation'); 90 | expect(consoleErrorFn).toHaveBeenNthCalledWith( 91 | 3, 92 | 'https://github.com/the-bugging/istanbul-badges-readme/blob/master/README.md', 93 | ); 94 | expect(processExitSpy).toHaveBeenCalledWith(getExitCodeOnError()); 95 | }) 96 | .finally(() => { 97 | expect(consoleInfoFn).toHaveBeenCalledWith('Istanbul Badges Readme process finished'); 98 | }); 99 | }); 100 | }); 101 | -------------------------------------------------------------------------------- /src/editor.ts: -------------------------------------------------------------------------------- 1 | import fs from 'fs'; 2 | import { getArgumentValue } from './arguments'; 3 | import { readmePathConst, coveragePathConst, hashesConst, coverageUrlConst, badgeStyles } from './constants'; 4 | import { getCoveragePath, getReadmePath, readFileAsync, parseColorConfig } from './helpers'; 5 | import { logger } from './logger'; 6 | import { Colors, Hashes, Report } from './types'; 7 | 8 | const { logInfo } = logger(); 9 | 10 | /** 11 | * Gets the hashes from the readme file. 12 | * @param {string} readmeFile - The readme file to search for hashes. 13 | * @returns {Hashes[]} - An array of hashes found in the readme file. 14 | */ 15 | export const getReadmeHashes = (readmeFile: string): Hashes[] => { 16 | logInfo('- Getting readme hashes...'); 17 | 18 | const readmeHashes = hashesConst.coverage.map((hash) => { 19 | if (readmeFile.includes(`![${hash.value}]`)) { 20 | return hash; 21 | } 22 | 23 | return false; 24 | }); 25 | 26 | const filteredHashes = readmeHashes.filter(Boolean); 27 | 28 | return filteredHashes as unknown as Hashes[]; 29 | }; 30 | 31 | /** 32 | * Determines the color representation of code coverage based on coverage percentage. 33 | * Optionally uses a provided string to configure custom color thresholds. 34 | * @param {number} coverage - The code coverage percentage to evaluate. 35 | * @param {string | false} colorConfigString - A string to configure custom color thresholds, or false to use defaults. 36 | * @returns {Colors} - The color associated with the given code coverage percentage, based on either default or custom thresholds. 37 | */ 38 | export const getCoverageColor = (coverage: number, colorConfigString?: string | false): Colors => { 39 | const colorThresholds = parseColorConfig(colorConfigString); 40 | 41 | // Adjusting to use dynamic color thresholds from colorConfigString if provided 42 | if (coverage < colorThresholds.red) { 43 | return 'red'; 44 | } 45 | 46 | if (coverage < colorThresholds.yellow) { 47 | return 'yellow'; 48 | } 49 | 50 | return 'brightgreen'; 51 | }; 52 | 53 | export const getCoverageBadge = (coverageFile: string, hashKey: string): string | boolean => { 54 | logInfo(`- Getting coverage badge url for ${hashKey}...`); 55 | 56 | try { 57 | const parsedCoverage: Report = JSON.parse(coverageFile); 58 | 59 | if (!parsedCoverage.total || !parsedCoverage.total[hashKey]) { 60 | return false; 61 | } 62 | 63 | const coverage: number = parsedCoverage.total[hashKey].pct; 64 | const customColors = getArgumentValue('colors'); 65 | const color = getCoverageColor(coverage, customColors); 66 | const customLabel = getArgumentValue(`${hashKey}Label`); 67 | const customBadgeStyle = getArgumentValue('style'); 68 | const customBadgeLogo = getArgumentValue('logo'); 69 | 70 | const badgeAlt = customLabel ? encodeURI(customLabel) : hashKey; 71 | 72 | const badgeStyle = badgeStyles[customBadgeStyle.toString()] ?? badgeStyles.default; 73 | 74 | return coverageUrlConst(badgeAlt, coverage, color, badgeStyle, customBadgeLogo); 75 | } catch { 76 | return false; 77 | } 78 | }; 79 | 80 | export const getNewReadme = 81 | (readmeFile: string, coverageFile: string) => 82 | (readmeHashes: Hashes[]): Promise => { 83 | logInfo('- Getting new readme data...'); 84 | 85 | let newReadmeFile = readmeFile; 86 | 87 | return new Promise((resolve, reject) => { 88 | readmeHashes.forEach((hash) => { 89 | const coverageBadge = getCoverageBadge(coverageFile, hash.key); 90 | 91 | if (!coverageBadge) { 92 | reject('There has been an error getting new coverage badges'); 93 | } 94 | 95 | const pattern = `![${hash.value}]`; 96 | const enpatterned = (value: string) => `${pattern}(${value})`; 97 | 98 | const startIndex = newReadmeFile.indexOf(pattern); 99 | const valueToChangeStart = newReadmeFile.slice(startIndex + pattern.length); 100 | 101 | const valueToChangeIndex = valueToChangeStart.indexOf(')'); 102 | const valueToChangeFinal = valueToChangeStart.substring(1, valueToChangeIndex); 103 | 104 | const oldBadge = enpatterned(valueToChangeFinal); 105 | const newBadge = enpatterned(coverageBadge as string); 106 | 107 | if (getArgumentValue('ci') && oldBadge !== newBadge) { 108 | reject("The coverage badge has changed, which isn't allowed with the `ci` argument"); 109 | } 110 | 111 | newReadmeFile = newReadmeFile.replace(oldBadge, newBadge); 112 | }); 113 | 114 | resolve(newReadmeFile); 115 | }); 116 | }; 117 | 118 | export const writeNewReadme = 119 | (readmePath: string) => 120 | (newReadmeData: string): boolean | void => { 121 | logInfo('- Writing new readme data...'); 122 | try { 123 | return fs.writeFileSync(readmePath, newReadmeData, 'utf8'); 124 | } catch { 125 | return false; 126 | } 127 | }; 128 | 129 | export const editReadme = async (): Promise => { 130 | logInfo('Editor process started'); 131 | 132 | const readmeFile = await readFileAsync(getReadmePath(readmePathConst), 'utf-8'); 133 | const coverageFile = await readFileAsync(getCoveragePath(coveragePathConst), 'utf8'); 134 | 135 | return Promise.resolve(getReadmeHashes(readmeFile)) 136 | .then(getNewReadme(readmeFile, coverageFile)) 137 | .then(writeNewReadme(getReadmePath(readmePathConst))) 138 | .then(() => logInfo('Editor process ended')); 139 | }; 140 | -------------------------------------------------------------------------------- /.all-contributorsrc: -------------------------------------------------------------------------------- 1 | { 2 | "projectName": "istanbul-badges-readme", 3 | "projectOwner": "the-bugging", 4 | "repoType": "github", 5 | "repoHost": "https://github.com", 6 | "files": [ 7 | "README.md" 8 | ], 9 | "imageSize": 70, 10 | "commit": false, 11 | "contributors": [ 12 | { 13 | "login": "olavoparno", 14 | "name": "Olavo Parno", 15 | "avatar_url": "https://avatars1.githubusercontent.com/u/7513162?v=4", 16 | "profile": "https://olavoparno.github.io", 17 | "contributions": [ 18 | "ideas", 19 | "code", 20 | "test" 21 | ] 22 | }, 23 | { 24 | "login": "nothingismagick", 25 | "name": "nothingismagick", 26 | "avatar_url": "https://avatars1.githubusercontent.com/u/35242872?v=4", 27 | "profile": "https://github.com/nothingismagick", 28 | "contributions": [ 29 | "ideas", 30 | "bug", 31 | "content" 32 | ] 33 | }, 34 | { 35 | "login": "fallenclient", 36 | "name": "Dave Fisher", 37 | "avatar_url": "https://avatars2.githubusercontent.com/u/326470?v=4", 38 | "profile": "http://www.fallenclient.co.uk", 39 | "contributions": [ 40 | "bug" 41 | ] 42 | }, 43 | { 44 | "login": "zaggino", 45 | "name": "Martin Zagora", 46 | "avatar_url": "https://avatars1.githubusercontent.com/u/1067319?v=4", 47 | "profile": "http://twitter.com/zaggino", 48 | "contributions": [ 49 | "ideas", 50 | "bug" 51 | ] 52 | }, 53 | { 54 | "login": "engineervix", 55 | "name": "Victor Miti", 56 | "avatar_url": "https://avatars3.githubusercontent.com/u/7713776?v=4", 57 | "profile": "https://github.com/engineervix", 58 | "contributions": [ 59 | "bug" 60 | ] 61 | }, 62 | { 63 | "login": "signalwerk", 64 | "name": "Stefan Huber", 65 | "avatar_url": "https://avatars1.githubusercontent.com/u/992878?v=4", 66 | "profile": "http://signalwerk.ch", 67 | "contributions": [ 68 | "question", 69 | "doc" 70 | ] 71 | }, 72 | { 73 | "login": "venturalp", 74 | "name": "Guilherme Ventura", 75 | "avatar_url": "https://avatars.githubusercontent.com/u/11214357?v=4", 76 | "profile": "http://www.venturalp.com.br", 77 | "contributions": [ 78 | "ideas", 79 | "code", 80 | "bug" 81 | ] 82 | }, 83 | { 84 | "login": "mh1622", 85 | "name": "Matt Hodges", 86 | "avatar_url": "https://avatars.githubusercontent.com/u/59019985?v=4", 87 | "profile": "https://github.com/mh1622", 88 | "contributions": [ 89 | "bug" 90 | ] 91 | }, 92 | { 93 | "login": "Tlahey", 94 | "name": "Antoine Vendeville", 95 | "avatar_url": "https://avatars.githubusercontent.com/u/2856778?v=4", 96 | "profile": "https://github.com/Tlahey", 97 | "contributions": [ 98 | "bug" 99 | ] 100 | }, 101 | { 102 | "login": "dutchenkoOleg", 103 | "name": "Oleg Dutchenko", 104 | "avatar_url": "https://avatars.githubusercontent.com/u/16334642?v=4", 105 | "profile": "https://github.com/dutchenkoOleg", 106 | "contributions": [ 107 | "bug" 108 | ] 109 | }, 110 | { 111 | "login": "CREEATION", 112 | "name": "Thomas", 113 | "avatar_url": "https://avatars.githubusercontent.com/u/3277769?v=4", 114 | "profile": "https://creeation.de", 115 | "contributions": [ 116 | "ideas" 117 | ] 118 | }, 119 | { 120 | "login": "troypoulter", 121 | "name": "Troy Poulter", 122 | "avatar_url": "https://avatars.githubusercontent.com/u/19419349?v=4", 123 | "profile": "https://github.com/troypoulter", 124 | "contributions": [ 125 | "code", 126 | "ideas", 127 | "test" 128 | ] 129 | }, 130 | { 131 | "login": "liaoliaots", 132 | "name": "LiaoLiao", 133 | "avatar_url": "https://avatars.githubusercontent.com/u/27341089?v=4", 134 | "profile": "https://github.com/liaoliaots", 135 | "contributions": [ 136 | "ideas" 137 | ] 138 | }, 139 | { 140 | "login": "David-Mimnagh", 141 | "name": "David Mimnagh", 142 | "avatar_url": "https://avatars.githubusercontent.com/u/10092258?v=4", 143 | "profile": "https://github.com/David-Mimnagh", 144 | "contributions": [ 145 | "ideas" 146 | ] 147 | }, 148 | { 149 | "login": "micalevisk", 150 | "name": "Micael Levi L. Cavalcante", 151 | "avatar_url": "https://avatars.githubusercontent.com/u/13461315?v=4", 152 | "profile": "http://micalevisk.github.io", 153 | "contributions": [ 154 | "ideas", 155 | "code", 156 | "bug" 157 | ] 158 | }, 159 | { 160 | "login": "myknbani", 161 | "name": "Richard Michael Coo", 162 | "avatar_url": "https://avatars.githubusercontent.com/u/5841268?v=4", 163 | "profile": "https://github.com/myknbani", 164 | "contributions": [ 165 | "bug" 166 | ] 167 | }, 168 | { 169 | "login": "leticiavna", 170 | "name": "Letícia Vidal", 171 | "avatar_url": "https://avatars.githubusercontent.com/u/28829955?v=4", 172 | "profile": "https://www.linkedin.com/in/leticiavna/", 173 | "contributions": [ 174 | "bug" 175 | ] 176 | }, 177 | { 178 | "login": "canbax", 179 | "name": "Yusuf", 180 | "avatar_url": "https://avatars.githubusercontent.com/u/8426741?v=4", 181 | "profile": "https://canbax.github.io/", 182 | "contributions": [ 183 | "doc" 184 | ] 185 | }, 186 | { 187 | "login": "supunTE", 188 | "name": "Supun Tharinda Edirisuriya", 189 | "avatar_url": "https://avatars.githubusercontent.com/u/33794760?v=4", 190 | "profile": "https://github.com/supunTE", 191 | "contributions": [ 192 | "doc" 193 | ] 194 | }, 195 | { 196 | "login": "Ic3m4n34", 197 | "name": "Nico Meyer", 198 | "avatar_url": "https://avatars.githubusercontent.com/u/11556486?v=4", 199 | "profile": "https://nico-meyer.com", 200 | "contributions": [ 201 | "code", 202 | "ideas" 203 | ] 204 | } 205 | ], 206 | "contributorsPerLine": 7, 207 | "skipCi": true, 208 | "commitConvention": "angular", 209 | "commitType": "docs" 210 | } 211 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. 4 | 5 | ## [1.9.0](https://github.com/the-bugging/istanbul-badges-readme/compare/v1.8.5...v1.9.0) (2024-05-04) 6 | 7 | 8 | ### Features 9 | 10 | * color config ([b1da2a6](https://github.com/the-bugging/istanbul-badges-readme/commit/b1da2a6b371d90c480d60e861d5853d98019f815)) 11 | 12 | 13 | ### Bug Fixes 14 | 15 | * typo ([4174c43](https://github.com/the-bugging/istanbul-badges-readme/commit/4174c4334457536952a6a9688a9d5a7fa5c3f2b8)) 16 | 17 | ### [1.8.5](https://github.com/the-bugging/istanbul-badges-readme/compare/v1.8.4...v1.8.5) (2023-02-25) 18 | 19 | ### [1.8.4](https://github.com/the-bugging/istanbul-badges-readme/compare/v1.8.3...v1.8.4) (2022-11-26) 20 | 21 | ### [1.8.3](https://github.com/the-bugging/istanbul-badges-readme/compare/v1.8.2...v1.8.3) (2022-11-25) 22 | 23 | ### [1.8.2](https://github.com/the-bugging/istanbul-badges-readme/compare/v1.8.1...v1.8.2) (2022-06-14) 24 | 25 | ### Bug Fixes 26 | 27 | - **arguments:** check only for args beggining with -- ([49cab51](https://github.com/the-bugging/istanbul-badges-readme/commit/49cab518ba403eecd22fa932d692176166629db6)), closes [#70](https://github.com/the-bugging/istanbul-badges-readme/issues/70) 28 | 29 | ### [1.8.1](https://github.com/the-bugging/istanbul-badges-readme/compare/v1.8.0...v1.8.1) (2021-12-07) 30 | 31 | ### Bug Fixes 32 | 33 | - set exit code only on validation errors ([c3b46cc](https://github.com/the-bugging/istanbul-badges-readme/commit/c3b46cc23ee0c7fd71454270cb6ed362317f2aa8)) 34 | 35 | ## [1.8.0](https://github.com/the-bugging/istanbul-badges-readme/compare/v1.7.0...v1.8.0) (2021-12-04) 36 | 37 | ### Features 38 | 39 | - add option to allow exitCode 1 ([3f37f61](https://github.com/the-bugging/istanbul-badges-readme/commit/3f37f6107a5f78340b929e62065cab73138f87b6)) 40 | 41 | ### Bug Fixes 42 | 43 | - check for read & write permissions on README file ([65809cc](https://github.com/the-bugging/istanbul-badges-readme/commit/65809ccd72b6d2fc93a3649683bbe66f4a6ceeaa)) 44 | 45 | ## [1.7.0](https://github.com/the-bugging/istanbul-badges-readme/compare/v1.6.0...v1.7.0) (2021-11-18) 46 | 47 | ### Features 48 | 49 | - add logo option for the badges ([17829d7](https://github.com/the-bugging/istanbul-badges-readme/commit/17829d758b7950d55effdc12addd0ca684723915)) 50 | 51 | ## [1.6.0](https://github.com/the-bugging/istanbul-badges-readme/compare/v1.5.0...v1.6.0) (2021-10-11) 52 | 53 | ### Features 54 | 55 | - add style option for badges ([b5f6c4c](https://github.com/the-bugging/istanbul-badges-readme/commit/b5f6c4cb42f19168c47a65b68044dd49bdac9e98)) 56 | 57 | ## [1.5.0](https://github.com/the-bugging/istanbul-badges-readme/compare/v1.4.0...v1.5.0) (2021-10-08) 58 | 59 | ### Features 60 | 61 | - add ci argument to fail if a badge changes ([57de3d6](https://github.com/the-bugging/istanbul-badges-readme/commit/57de3d6165fbdde4650e698089123d72376fd93d)) 62 | - change badge label optionally ([9aaa8ab](https://github.com/the-bugging/istanbul-badges-readme/commit/9aaa8aba9265b4ea103cc19a1fb7a43247cd9ec9)) 63 | 64 | ## [1.4.0](https://github.com/the-bugging/istanbul-badges-readme/compare/v1.3.4...v1.4.0) (2021-06-07) 65 | 66 | ### Features 67 | 68 | - add default hashes in coverage badges ([90dff1e](https://github.com/the-bugging/istanbul-badges-readme/commit/90dff1e8040f76c2514eca96b1897ca2599d9beb)) 69 | 70 | ### [1.3.4](https://github.com/the-bugging/istanbul-badges-readme/compare/v1.3.3...v1.3.4) (2021-05-21) 71 | 72 | ### [1.3.3](https://github.com/the-bugging/istanbul-badges-readme/compare/v1.3.1...v1.3.3) (2021-05-21) 73 | 74 | ### Bug Fixes 75 | 76 | - remove husky from package ([6d3ed63](https://github.com/the-bugging/istanbul-badges-readme/commit/6d3ed63d9ca153c1f16da6508e816ae1cbf03171)) 77 | - update husky settings ([a5959a9](https://github.com/the-bugging/istanbul-badges-readme/commit/a5959a97ae53baa4908f84370458dbe35e188088)) 78 | - update prettier lint ([e0f0172](https://github.com/the-bugging/istanbul-badges-readme/commit/e0f01725b859d82c8c5d872b08b48087162cb0fe)) 79 | 80 | ### [1.3.2](https://github.com/the-bugging/istanbul-badges-readme/compare/v1.3.1...v1.3.2) (2021-05-19) 81 | 82 | ### [1.3.1](https://github.com/the-bugging/istanbul-badges-readme/compare/v1.3.0...v1.3.1) (2021-05-19) 83 | 84 | ### Bug Fixes 85 | 86 | - **contributors:** fix contributorsrc file ([28d929d](https://github.com/the-bugging/istanbul-badges-readme/commit/28d929d286e416332a3a00d8364beb1617580976)) 87 | - **validate:** check for readme dir argument to find readmefile ([9087ded](https://github.com/the-bugging/istanbul-badges-readme/commit/9087ded1b14f3d666ba5c419255bf12778064095)) 88 | - **validate:** check for readme dir argument to find readmefile ([aec9a1a](https://github.com/the-bugging/istanbul-badges-readme/commit/aec9a1a548367cd6a943a5626f9da70e810f0271)) 89 | 90 | ## [1.3.0](https://github.com/the-bugging/istanbul-badges-readme/compare/v1.2.2...v1.3.0) (2021-05-17) 91 | 92 | ### Features 93 | 94 | - **arguments:** include custom readme directory argument ([361cff4](https://github.com/the-bugging/istanbul-badges-readme/commit/361cff42aa3f38033672a58bec759265ff852051)) 95 | 96 | ### Bug Fixes 97 | 98 | - try to fix build and install problems ([907d0bf](https://github.com/the-bugging/istanbul-badges-readme/commit/907d0bfd6c5f2d532e094848cbc0ef6f399c1691)) 99 | - **editor:** change to the correct log ([b830ee5](https://github.com/the-bugging/istanbul-badges-readme/commit/b830ee5ff8b71ace266e367fb2fde907379f2476)) 100 | - **helpers:** improve readfileasync log ([055d553](https://github.com/the-bugging/istanbul-badges-readme/commit/055d5534aa00b954f467d9260c556fed5ad05eba)) 101 | 102 | ### [1.2.2](https://github.com/the-bugging/istanbul-badges-readme/compare/v1.2.1...v1.2.2) (2021-05-11) 103 | 104 | ### [1.2.1](https://github.com/the-bugging/istanbul-badges-readme/compare/v1.2.0...v1.2.1) (2021-03-08) 105 | 106 | ## [1.2.0](https://github.com/the-bugging/istanbul-badges-readme/compare/v1.1.0...v1.2.0) (2020-12-10) 107 | 108 | ### Features 109 | 110 | - **examples:** add jest n mocha examples ([36a0505](https://github.com/the-bugging/istanbul-badges-readme/commit/36a05057af59060d621695c75caf973a7cf4979c)) 111 | 112 | ## [1.1.0](https://github.com/the-bugging/istanbul-badges-readme/compare/v1.0.6...v1.1.0) (2020-12-09) 113 | 114 | ### Features 115 | 116 | - **project:** add silent argument n other adjusts ([c465f91](https://github.com/the-bugging/istanbul-badges-readme/commit/c465f91eca99412b954b2ec0451380c4942d8ac3)) 117 | 118 | ### [1.0.6](https://github.com/the-bugging/istanbul-badges-readme/compare/v1.0.5...v1.0.6) (2020-12-08) 119 | 120 | ### Bug Fixes 121 | 122 | - **project:** adjust badges replacement ([6b60566](https://github.com/the-bugging/istanbul-badges-readme/commit/6b60566e491cd046369acf91aa4b875ef971596a)), closes [#2](https://github.com/the-bugging/istanbul-badges-readme/issues/2) 123 | 124 | ### [1.0.5](https://github.com/the-bugging/istanbul-badges-readme/compare/v1.0.4...v1.0.5) (2020-08-12) 125 | 126 | ### [1.0.4](https://github.com/the-bugging/istanbul-badges-readme/compare/v1.0.2...v1.0.4) (2020-08-04) 127 | 128 | ### [1.0.3](https://github.com/the-bugging/istanbul-badges-readme/compare/v1.0.2...v1.0.3) (2020-08-04) 129 | 130 | ### [1.0.2](https://github.com/the-bugging/istanbul-badges-readme/compare/v1.0.1...v1.0.2) (2020-08-04) 131 | 132 | ### 1.0.1 (2020-08-03) 133 | -------------------------------------------------------------------------------- /tests/editor.spec.ts: -------------------------------------------------------------------------------- 1 | import fs from 'fs'; 2 | import path from 'path'; 3 | import { getReadmeHashes, getCoverageBadge, getCoverageColor, getNewReadme, writeNewReadme } from '../src/editor'; 4 | import { parseColorConfig } from '../src/helpers'; 5 | import { defaultColorThresholds } from '../src/constants'; 6 | 7 | describe('Tests editor', () => { 8 | afterEach(() => { 9 | process.argv.pop(); 10 | }); 11 | 12 | it('should getReadmeHashes from invalid readme', () => { 13 | const fakeReadmeFile = path.join(__dirname, '../tests/mocks/fakeReadmeFile.md'); 14 | 15 | const readmeHashes = getReadmeHashes(fakeReadmeFile); 16 | 17 | expect(readmeHashes.length).toEqual(0); 18 | }); 19 | 20 | describe('parseColorConfig', () => { 21 | it('returns defaultColorThresholds with an invalid color configuration string and warns', () => { 22 | const inputString = 'red 70,yellow 85'; 23 | const expectedResult = defaultColorThresholds; 24 | 25 | const results = parseColorConfig(inputString); 26 | 27 | expect(results).toEqual(expectedResult); 28 | }); 29 | 30 | it('correctly parses a valid color configuration string', () => { 31 | const inputString = 'red:70,yellow:85'; 32 | const expectedResult = { red: 70, yellow: 85 }; 33 | expect(parseColorConfig(inputString)).toEqual(expectedResult); 34 | }); 35 | 36 | it('ignores invalid color names', () => { 37 | const inputString = 'red:70,yellow:85,blue:95'; 38 | const expectedResult = defaultColorThresholds; 39 | expect(parseColorConfig(inputString)).toEqual(expectedResult); 40 | }); 41 | 42 | it('returns default colors for an empty string', () => { 43 | const inputString = ''; 44 | const expectedResult = { red: 80, yellow: 90 }; 45 | expect(parseColorConfig(inputString)).toEqual(expectedResult); 46 | }); 47 | }); 48 | 49 | describe('getCoverageColor', () => { 50 | test.each` 51 | coverage | expectedColor 52 | ${75} | ${'red'} 53 | ${85} | ${'yellow'} 54 | ${95} | ${'brightgreen'} 55 | `('returns $expectedColor for a coverage of $coverage using default thresholds', ({ coverage, expectedColor }) => { 56 | expect(getCoverageColor(coverage)).toBe(expectedColor); 57 | }); 58 | 59 | test('uses custom thresholds if provided', () => { 60 | const customConfig = 'red:70,yellow:85'; 61 | expect(getCoverageColor(65, customConfig)).toBe('red'); 62 | expect(getCoverageColor(75, customConfig)).toBe('yellow'); 63 | expect(getCoverageColor(90, customConfig)).toBe('brightgreen'); 64 | }); 65 | 66 | test('returns brightgreen for coverage above 100', () => { 67 | expect(getCoverageColor(105)).toBe('brightgreen'); 68 | }); 69 | }); 70 | 71 | it('should getCoverageBadge from coverageFile', () => { 72 | const fakeJsonCoveragePath = path.join(__dirname, '../tests/mocks/fakeBadCoverage.json'); 73 | const brokenJsonCoveragePath = path.join(__dirname, '../tests/mocks/brokenCoverage.json'); 74 | 75 | const fakeJsonCoverageFile = fs.readFileSync(fakeJsonCoveragePath, 'utf8'); 76 | const brokenJsonCoverageFile = fs.readFileSync(brokenJsonCoveragePath, 'utf8'); 77 | 78 | const existingCoverageBadge = getCoverageBadge(fakeJsonCoverageFile, 'bad'); 79 | const nonExistingCoverageBadges = getCoverageBadge(fakeJsonCoverageFile, 'nonExistingHash'); 80 | const brokenJsonCoverageBadges = getCoverageBadge(brokenJsonCoverageFile, 'nonExistingHash'); 81 | const wrongJsonCoverageBadges = getCoverageBadge('wrong json', 'nonExistingHash'); 82 | 83 | expect(existingCoverageBadge).toEqual('https://img.shields.io/badge/bad-95.45%25-brightgreen.svg?style=flat'); 84 | expect(nonExistingCoverageBadges).toBeFalsy(); 85 | expect(brokenJsonCoverageBadges).toBeFalsy(); 86 | expect(wrongJsonCoverageBadges).toBeFalsy(); 87 | }); 88 | 89 | it('should getNewReadme without coverageBadge', async () => { 90 | const brokenJsonCoveragePath = path.join(__dirname, '../tests/mocks/brokenCoverage.json'); 91 | const brokenJsonCoverageFile = fs.readFileSync(brokenJsonCoveragePath, 'utf8'); 92 | 93 | const makeGetNewReadme = getNewReadme('fake readme data', brokenJsonCoverageFile); 94 | 95 | await makeGetNewReadme([{ key: 'key', value: 'wronghash' }]).catch((error) => { 96 | expect(error).toEqual('There has been an error getting new coverage badges'); 97 | }); 98 | }); 99 | 100 | it('should break writeNewReadme with failure', () => { 101 | const hasItSucceeded = writeNewReadme(path.join(__dirname, '../tests/mocks/NON_EXISTING_PATH/wrongFile.md'))( 102 | 'new fake data', 103 | ); 104 | 105 | expect(hasItSucceeded).toBeFalsy(); 106 | }); 107 | 108 | it('should accept custom label for hashKey', () => { 109 | const fakeJsonCoveragePath = path.join(__dirname, '../tests/mocks/fakeBadCoverage.json'); 110 | const fakeJsonCoverageFile = fs.readFileSync(fakeJsonCoveragePath, 'utf8'); 111 | 112 | process.argv.push('--badLabel=customBadLabel'); 113 | 114 | const customBadgeLabel = getCoverageBadge(fakeJsonCoverageFile, 'bad'); 115 | 116 | expect(customBadgeLabel).toEqual('https://img.shields.io/badge/customBadLabel-95.45%25-brightgreen.svg?style=flat'); 117 | }); 118 | 119 | it('should accept custom style for the badges', () => { 120 | const fakeJsonCoveragePath = path.join(__dirname, '../tests/mocks/fakeBadCoverage.json'); 121 | const fakeJsonCoverageFile = fs.readFileSync(fakeJsonCoveragePath, 'utf8'); 122 | 123 | process.argv.push('--style="for-the-badge"'); 124 | 125 | const customBadgeLabel = getCoverageBadge(fakeJsonCoverageFile, 'bad'); 126 | 127 | expect(customBadgeLabel).toEqual('https://img.shields.io/badge/bad-95.45%25-brightgreen.svg?style=for-the-badge'); 128 | }); 129 | 130 | it('should accept custom style for the badges calling default fallback for non valid style', () => { 131 | const fakeJsonCoveragePath = path.join(__dirname, '../tests/mocks/fakeBadCoverage.json'); 132 | const fakeJsonCoverageFile = fs.readFileSync(fakeJsonCoveragePath, 'utf8'); 133 | 134 | process.argv.push('--style=non-valid-style'); 135 | 136 | const customBadgeLabel = getCoverageBadge(fakeJsonCoverageFile, 'bad'); 137 | 138 | expect(customBadgeLabel).toEqual('https://img.shields.io/badge/bad-95.45%25-brightgreen.svg?style=flat'); 139 | }); 140 | 141 | it('should accept custom logo for the badges', () => { 142 | const fakeJsonCoveragePath = path.join(__dirname, '../tests/mocks/fakeBadCoverage.json'); 143 | const fakeJsonCoverageFile = fs.readFileSync(fakeJsonCoveragePath, 'utf8'); 144 | 145 | process.argv.push('--logo=jest'); 146 | 147 | const customBadgeLabel = getCoverageBadge(fakeJsonCoverageFile, 'bad'); 148 | 149 | expect(customBadgeLabel).toEqual('https://img.shields.io/badge/bad-95.45%25-brightgreen.svg?style=flat&logo=jest'); 150 | }); 151 | 152 | it('should have no errors using --ci when readme matches the coverage summary', async () => { 153 | const accurateCoveragePath = path.join(__dirname, '../tests/mocks/accurateCoverage.json'); 154 | const accurateCoverageFile = fs.readFileSync(accurateCoveragePath, 'utf8'); 155 | 156 | const accurateReadmePath = path.join(__dirname, '../tests/mocks/accurateReadme.md'); 157 | const accurateReadmeFile = fs.readFileSync(accurateReadmePath, 'utf8'); 158 | 159 | const readmeHashes = getReadmeHashes(accurateReadmeFile); 160 | 161 | process.argv.push('--ci'); 162 | 163 | const makeGetNewReadme = getNewReadme(accurateReadmeFile, accurateCoverageFile); 164 | 165 | await makeGetNewReadme(readmeHashes) 166 | .then((response) => { 167 | expect(response).toEqual(accurateReadmeFile); 168 | }) 169 | .catch((error) => expect(error).toBeTruthy()); 170 | }); 171 | 172 | it('should throw error using --ci, when readme does not match coverage summary', async () => { 173 | const inaccurateCoveragePath = path.join(__dirname, '../tests/mocks/inaccurateCoverage.json'); 174 | const inaccurateCoverageFile = fs.readFileSync(inaccurateCoveragePath, 'utf8'); 175 | 176 | const accurateReadmePath = path.join(__dirname, '../tests/mocks/accurateReadme.md'); 177 | const accurateReadmeFile = fs.readFileSync(accurateReadmePath, 'utf8'); 178 | 179 | const readmeHashes = getReadmeHashes(accurateReadmeFile); 180 | 181 | process.argv.push('--ci'); 182 | 183 | const makeGetNewReadme = getNewReadme(accurateReadmeFile, inaccurateCoverageFile); 184 | 185 | await makeGetNewReadme(readmeHashes).catch((error) => { 186 | expect(error).toEqual("The coverage badge has changed, which isn't allowed with the `ci` argument"); 187 | }); 188 | }); 189 | }); 190 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Istanbul Badges Readme 2 | 3 | > Creates README badges from istanbul coverage report 4 | 5 | | Statements | Branches | Functions | Lines | 6 | | ---------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------ | 7 | | ![Statements](https://img.shields.io/badge/statements-100%25-brightgreen.svg?style=flat&logo=jest) | ![Branches](https://img.shields.io/badge/branches-100%25-brightgreen.svg?style=flat&logo=jest) | ![Functions](https://img.shields.io/badge/functions-100%25-brightgreen.svg?style=flat&logo=jest) | ![Lines](https://img.shields.io/badge/lines-100%25-brightgreen.svg?style=flat&logo=jest) | 8 | 9 | --- 10 | 11 | ## Table of Contents 12 | 13 | - [Running example](#running-example) 14 | - [Requirements](#requirements) 15 | - [Installation](#installation) 16 | - [Simple Usage](#simple-usage) 17 | - [Advanced Usage](#advanced-usage-arguments) 18 | - [Usage as a part of your githooks](#usage-as-a-part-of-your-githooks) 19 | - [Usage as a part of your CI](#usage-as-a-part-of-your-ci) 20 | - [Custom badge Styles](#custom-badge-styles) 21 | - [See running examples](#see-running-examples) 22 | - [Contributors](#contributors) 23 | - [License](#license) 24 | 25 | ## Running example 26 | 27 | ![Example](./assets/readme-gif.gif) 28 | 29 | --- 30 | 31 | ## Requirements 32 | 33 | - First, of course, you **must** have a test runner such as Jest and Mocha; 34 | - You **must** have **json-summary** as a **coverageReporter** in your tests configuration; 35 | - For example, if you are using Jest, configuration should either be within `package.json` or inside your jest config file i.e. `jest.config.js` or `jestconfig.json` as written below: 36 | 37 | ```json 38 | "coverageReporters": ["json-summary"] 39 | ``` 40 | 41 | - See more in the [examples](./examples/README.md). 42 | 43 | --- 44 | 45 | ## Installation 46 | 47 | - Install the library in your project as a devDependency: 48 | 49 | ```bash 50 | npm i -D istanbul-badges-readme 51 | ``` 52 | 53 | - Add **at least one** of the below coverage hashes in your README file: 54 | 55 | - `![Statements](#statements#)` 56 | - `![Branches](#branches#)` 57 | - `![Functions](#functions#)` 58 | - `![Lines](#lines#)` 59 | 60 | - A simple example of all hashes being used in a table fashion markup: 61 | 62 | ```markdown 63 | | Statements | Branches | Functions | Lines | 64 | | --------------------------- | ----------------------- | ------------------------- | ----------------- | 65 | | ![Statements](#statements#) | ![Branches](#branches#) | ![Functions](#functions#) | ![Lines](#lines#) | 66 | ``` 67 | 68 | --- 69 | 70 | ## Simple Usage 71 | 72 | - Simply run it from the CLI as follows: 73 | 74 | ```bash 75 | npx istanbul-badges-readme 76 | ``` 77 | 78 | - Or add it to your **package.json** scripts as follows: 79 | 80 | ```json 81 | "scripts": { 82 | "make-badges": "istanbul-badges-readme", 83 | } 84 | ``` 85 | 86 | --- 87 | 88 | ## Advanced Usage Arguments 89 | 90 | #### Coverage Directory 91 | 92 | - Custom coverage directory? Use **--coverageDir** argument: 93 | 94 | ```bash 95 | npm run istanbul-badges-readme --coverageDir="./my-custom-coverage-directory" 96 | ``` 97 | 98 | #### Readme Directory 99 | 100 | - Custom readme directory? Use **--readmeDir** argument: 101 | 102 | ```bash 103 | npm run istanbul-badges-readme --readmeDir="./my-custom-readme-directory" 104 | ``` 105 | 106 | #### Silent 107 | 108 | - Want it without logging? Try silent mode with **--silent** argument: 109 | 110 | ```bash 111 | npm run istanbul-badges-readme --silent 112 | ``` 113 | 114 | #### Functions and Branches Labels 115 | 116 | - You may also create custom labeling for the badges using the corresponding hash and _Label_ e.g. _branchesLabel_ **--branchesLabel='Branches are troublesome!'**: 117 | 118 | ```bash 119 | npm run istanbul-badges-readme --functionsLabel='Mis funciones!' --branchesLabel='Branches are troublesome!' 120 | ``` 121 | 122 | #### Badge Style 123 | 124 | - You can also change the badge styling, according to _[shields.io's](https://shields.io/)_ own style reference. See more examples [here](#badge-styles). 125 | 126 | ```bash 127 | npm run istanbul-badges-readme --style="for-the-badges" 128 | ``` 129 | 130 | #### Badge Logo 131 | 132 | - There is an option to use a _logo_ within the badge, as described on _[shields.io's](https://shields.io/)_ own documentation which uses all icons available at _[simple-icons](https://simpleicons.org/)_. 133 | 134 | ```bash 135 | npm run istanbul-badges-readme --logo="jest" 136 | ``` 137 | 138 | #### Configure Badge Color 139 | - You can configure the color threshold of the badges by passing the `--colors` argument. If you want red badges for a code coverage below 50% and yellow badges for a coverage below 60%, you'd do this: 140 | ```bash 141 | npm run istanbul-badges-readme --colors=red:50,yellow:60 142 | ``` 143 | 144 | 145 | #### Exit code 146 | 147 | - To exit with **1** code on validation errors (eg.: _README doesn't exist_, or _coverage directory doesn't exist_) or on editing errors (eg.: cannot write to README due to lack of permissions). The default exit code is **0**. Set a different one by using **--exitCode** argument. 148 | 149 | ```bash 150 | npm run istanbul-badges-readme --exitCode=1 151 | ``` 152 | 153 | --- 154 | 155 | ## Usage as a part of your githooks 156 | 157 | - If you want to have this run on the **pre-commit** hook and update the commit in place, just install husky and add the `pre-commit` script to your package.json. 158 | 159 | 1. Install Husky. 160 | 161 | ```bash 162 | npm install -D husky 163 | ``` 164 | 165 | 2. Add your **pre-commit** script: 166 | 167 | ```json 168 | "husky": { 169 | "hooks": { 170 | "pre-commit": "npm run test && istanbul-badges-readme && git add 'README.md'" 171 | } 172 | } 173 | ``` 174 | 175 | 3. Git Commit and Push. Just use your workflow as usual. If your tests fail, no commit. If they pass, update the README.md and add the file to the commit. Nice! 176 | 177 | --- 178 | 179 | ## Usage as a part of your CI 180 | 181 | You may want to have peace of mind that contributors have run `istanbul-badges-readme` locally by performing a simple check in your CI. 182 | 183 | The `--ci` argument will throw an error, code 0 by default unless [exitCode](#exit-code) is specified, thus not updating anything regarding coverage, if the badges generated do not match what is already in the `README.md`. 184 | 185 | You can add this to your **package.json** as follows for exitCode 0: 186 | 187 | ```json 188 | "scripts": { 189 | "make-badges": "istanbul-badges-readme", 190 | "make-badges:ci": "npm run make-badges -- --ci", 191 | } 192 | ``` 193 | 194 | Also if you wish a different exitCode: 195 | 196 | ```json 197 | "scripts": { 198 | "make-badges": "istanbul-badges-readme", 199 | "make-badges:ci": "npm run make-badges -- --ci --exitCode=1", 200 | } 201 | ``` 202 | 203 | This is a useful addition/alternative to the githooks approach for some use cases such as larger codebases, slow computers etc, where it isn't always feasible to run all the tests and produce coverage on each commit. 204 | 205 | ## Custom Badge Styles 206 | 207 | - **DEFAULT STYLE** Square `style='square'`: 208 | ![Statements](https://img.shields.io/badge/statements-100%25-brightgreen.svg?style=square) 209 | 210 | - Square flat `style='square-flat'`: 211 | ![Statements](https://img.shields.io/badge/statements-100%25-brightgreen.svg?style=square-flat) 212 | 213 | - Plastic `style='plastic'`: 214 | ![Statements](https://img.shields.io/badge/statements-100%25-brightgreen.svg?style=plastic) 215 | 216 | - For the badge `style='for-the-badge'`: 217 | ![Statements](https://img.shields.io/badge/statements-100%25-brightgreen.svg?style=for-the-badge) 218 | 219 | ## See running examples 220 | 221 | [Examples folder](./examples/README.md) 222 | 223 | > ✔️ **Tip** 224 | > 225 | > We use this in our pull request GitHub Action, check out a recent pull request to see it in action! 226 | 227 | --- 228 | 229 | ## Contributors 230 | 231 | Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)): 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 |
Olavo Parno
Olavo Parno

🤔 💻 ⚠️
nothingismagick
nothingismagick

🤔 🐛 🖋
Dave Fisher
Dave Fisher

🐛
Martin Zagora
Martin Zagora

🤔 🐛
Victor Miti
Victor Miti

🐛
Stefan Huber
Stefan Huber

💬 📖
Guilherme Ventura
Guilherme Ventura

🤔 💻 🐛
Matt Hodges
Matt Hodges

🐛
Antoine Vendeville
Antoine Vendeville

🐛
Oleg Dutchenko
Oleg Dutchenko

🐛
Thomas
Thomas

🤔
Troy Poulter
Troy Poulter

💻 🤔 ⚠️
LiaoLiao
LiaoLiao

🤔
David Mimnagh
David Mimnagh

🤔
Micael Levi L. Cavalcante
Micael Levi L. Cavalcante

🤔 💻 🐛
Richard Michael Coo
Richard Michael Coo

🐛
Letícia Vidal
Letícia Vidal

🐛
Yusuf
Yusuf

📖
Supun Tharinda Edirisuriya
Supun Tharinda Edirisuriya

📖
Nico Meyer
Nico Meyer

💻 🤔
266 | 267 | 268 | 269 | 270 | 271 | 272 | This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! 273 | 274 | --- 275 | 276 | ## License 277 | 278 | Istanbul Badges Readme is [MIT licensed](./LICENSE). 279 | -------------------------------------------------------------------------------- /examples/mocha-chai-example/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/code-frame@^7.16.0": 6 | version "7.16.0" 7 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.0.tgz#0dfc80309beec8411e65e706461c408b0bb9b431" 8 | integrity sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA== 9 | dependencies: 10 | "@babel/highlight" "^7.16.0" 11 | 12 | "@babel/compat-data@^7.16.0": 13 | version "7.16.4" 14 | resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.16.4.tgz#081d6bbc336ec5c2435c6346b2ae1fb98b5ac68e" 15 | integrity sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q== 16 | 17 | "@babel/core@^7.7.5": 18 | version "7.16.0" 19 | resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.16.0.tgz#c4ff44046f5fe310525cc9eb4ef5147f0c5374d4" 20 | integrity sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ== 21 | dependencies: 22 | "@babel/code-frame" "^7.16.0" 23 | "@babel/generator" "^7.16.0" 24 | "@babel/helper-compilation-targets" "^7.16.0" 25 | "@babel/helper-module-transforms" "^7.16.0" 26 | "@babel/helpers" "^7.16.0" 27 | "@babel/parser" "^7.16.0" 28 | "@babel/template" "^7.16.0" 29 | "@babel/traverse" "^7.16.0" 30 | "@babel/types" "^7.16.0" 31 | convert-source-map "^1.7.0" 32 | debug "^4.1.0" 33 | gensync "^1.0.0-beta.2" 34 | json5 "^2.1.2" 35 | semver "^6.3.0" 36 | source-map "^0.5.0" 37 | 38 | "@babel/generator@^7.16.0": 39 | version "7.16.0" 40 | resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.16.0.tgz#d40f3d1d5075e62d3500bccb67f3daa8a95265b2" 41 | integrity sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew== 42 | dependencies: 43 | "@babel/types" "^7.16.0" 44 | jsesc "^2.5.1" 45 | source-map "^0.5.0" 46 | 47 | "@babel/helper-compilation-targets@^7.16.0": 48 | version "7.16.3" 49 | resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz#5b480cd13f68363df6ec4dc8ac8e2da11363cbf0" 50 | integrity sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA== 51 | dependencies: 52 | "@babel/compat-data" "^7.16.0" 53 | "@babel/helper-validator-option" "^7.14.5" 54 | browserslist "^4.17.5" 55 | semver "^6.3.0" 56 | 57 | "@babel/helper-function-name@^7.16.0": 58 | version "7.16.0" 59 | resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz#b7dd0797d00bbfee4f07e9c4ea5b0e30c8bb1481" 60 | integrity sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog== 61 | dependencies: 62 | "@babel/helper-get-function-arity" "^7.16.0" 63 | "@babel/template" "^7.16.0" 64 | "@babel/types" "^7.16.0" 65 | 66 | "@babel/helper-get-function-arity@^7.16.0": 67 | version "7.16.0" 68 | resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz#0088c7486b29a9cb5d948b1a1de46db66e089cfa" 69 | integrity sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ== 70 | dependencies: 71 | "@babel/types" "^7.16.0" 72 | 73 | "@babel/helper-hoist-variables@^7.16.0": 74 | version "7.16.0" 75 | resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz#4c9023c2f1def7e28ff46fc1dbcd36a39beaa81a" 76 | integrity sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg== 77 | dependencies: 78 | "@babel/types" "^7.16.0" 79 | 80 | "@babel/helper-member-expression-to-functions@^7.16.0": 81 | version "7.16.0" 82 | resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz#29287040efd197c77636ef75188e81da8bccd5a4" 83 | integrity sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ== 84 | dependencies: 85 | "@babel/types" "^7.16.0" 86 | 87 | "@babel/helper-module-imports@^7.16.0": 88 | version "7.16.0" 89 | resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz#90538e60b672ecf1b448f5f4f5433d37e79a3ec3" 90 | integrity sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg== 91 | dependencies: 92 | "@babel/types" "^7.16.0" 93 | 94 | "@babel/helper-module-transforms@^7.16.0": 95 | version "7.16.0" 96 | resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz#1c82a8dd4cb34577502ebd2909699b194c3e9bb5" 97 | integrity sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA== 98 | dependencies: 99 | "@babel/helper-module-imports" "^7.16.0" 100 | "@babel/helper-replace-supers" "^7.16.0" 101 | "@babel/helper-simple-access" "^7.16.0" 102 | "@babel/helper-split-export-declaration" "^7.16.0" 103 | "@babel/helper-validator-identifier" "^7.15.7" 104 | "@babel/template" "^7.16.0" 105 | "@babel/traverse" "^7.16.0" 106 | "@babel/types" "^7.16.0" 107 | 108 | "@babel/helper-optimise-call-expression@^7.16.0": 109 | version "7.16.0" 110 | resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz#cecdb145d70c54096b1564f8e9f10cd7d193b338" 111 | integrity sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw== 112 | dependencies: 113 | "@babel/types" "^7.16.0" 114 | 115 | "@babel/helper-replace-supers@^7.16.0": 116 | version "7.16.0" 117 | resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz#73055e8d3cf9bcba8ddb55cad93fedc860f68f17" 118 | integrity sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA== 119 | dependencies: 120 | "@babel/helper-member-expression-to-functions" "^7.16.0" 121 | "@babel/helper-optimise-call-expression" "^7.16.0" 122 | "@babel/traverse" "^7.16.0" 123 | "@babel/types" "^7.16.0" 124 | 125 | "@babel/helper-simple-access@^7.16.0": 126 | version "7.16.0" 127 | resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz#21d6a27620e383e37534cf6c10bba019a6f90517" 128 | integrity sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw== 129 | dependencies: 130 | "@babel/types" "^7.16.0" 131 | 132 | "@babel/helper-split-export-declaration@^7.16.0": 133 | version "7.16.0" 134 | resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz#29672f43663e936df370aaeb22beddb3baec7438" 135 | integrity sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw== 136 | dependencies: 137 | "@babel/types" "^7.16.0" 138 | 139 | "@babel/helper-validator-identifier@^7.15.7": 140 | version "7.15.7" 141 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389" 142 | integrity sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w== 143 | 144 | "@babel/helper-validator-option@^7.14.5": 145 | version "7.14.5" 146 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" 147 | integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== 148 | 149 | "@babel/helpers@^7.16.0": 150 | version "7.16.3" 151 | resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.16.3.tgz#27fc64f40b996e7074dc73128c3e5c3e7f55c43c" 152 | integrity sha512-Xn8IhDlBPhvYTvgewPKawhADichOsbkZuzN7qz2BusOM0brChsyXMDJvldWaYMMUNiCQdQzNEioXTp3sC8Nt8w== 153 | dependencies: 154 | "@babel/template" "^7.16.0" 155 | "@babel/traverse" "^7.16.3" 156 | "@babel/types" "^7.16.0" 157 | 158 | "@babel/highlight@^7.16.0": 159 | version "7.16.0" 160 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.0.tgz#6ceb32b2ca4b8f5f361fb7fd821e3fddf4a1725a" 161 | integrity sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g== 162 | dependencies: 163 | "@babel/helper-validator-identifier" "^7.15.7" 164 | chalk "^2.0.0" 165 | js-tokens "^4.0.0" 166 | 167 | "@babel/parser@^7.16.0", "@babel/parser@^7.16.3": 168 | version "7.16.4" 169 | resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.4.tgz#d5f92f57cf2c74ffe9b37981c0e72fee7311372e" 170 | integrity sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng== 171 | 172 | "@babel/template@^7.16.0": 173 | version "7.16.0" 174 | resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.0.tgz#d16a35ebf4cd74e202083356fab21dd89363ddd6" 175 | integrity sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A== 176 | dependencies: 177 | "@babel/code-frame" "^7.16.0" 178 | "@babel/parser" "^7.16.0" 179 | "@babel/types" "^7.16.0" 180 | 181 | "@babel/traverse@^7.16.0", "@babel/traverse@^7.16.3": 182 | version "7.16.3" 183 | resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.3.tgz#f63e8a938cc1b780f66d9ed3c54f532ca2d14787" 184 | integrity sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag== 185 | dependencies: 186 | "@babel/code-frame" "^7.16.0" 187 | "@babel/generator" "^7.16.0" 188 | "@babel/helper-function-name" "^7.16.0" 189 | "@babel/helper-hoist-variables" "^7.16.0" 190 | "@babel/helper-split-export-declaration" "^7.16.0" 191 | "@babel/parser" "^7.16.3" 192 | "@babel/types" "^7.16.0" 193 | debug "^4.1.0" 194 | globals "^11.1.0" 195 | 196 | "@babel/types@^7.16.0": 197 | version "7.16.0" 198 | resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.16.0.tgz#db3b313804f96aadd0b776c4823e127ad67289ba" 199 | integrity sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg== 200 | dependencies: 201 | "@babel/helper-validator-identifier" "^7.15.7" 202 | to-fast-properties "^2.0.0" 203 | 204 | "@cspotcode/source-map-consumer@0.8.0": 205 | version "0.8.0" 206 | resolved "https://registry.yarnpkg.com/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz#33bf4b7b39c178821606f669bbc447a6a629786b" 207 | integrity sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg== 208 | 209 | "@cspotcode/source-map-support@0.7.0": 210 | version "0.7.0" 211 | resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz#4789840aa859e46d2f3173727ab707c66bf344f5" 212 | integrity sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA== 213 | dependencies: 214 | "@cspotcode/source-map-consumer" "0.8.0" 215 | 216 | "@istanbuljs/load-nyc-config@^1.0.0": 217 | version "1.1.0" 218 | resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" 219 | integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== 220 | dependencies: 221 | camelcase "^5.3.1" 222 | find-up "^4.1.0" 223 | get-package-type "^0.1.0" 224 | js-yaml "^3.13.1" 225 | resolve-from "^5.0.0" 226 | 227 | "@istanbuljs/schema@^0.1.2": 228 | version "0.1.3" 229 | resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" 230 | integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== 231 | 232 | "@tsconfig/node10@^1.0.7": 233 | version "1.0.8" 234 | resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.8.tgz#c1e4e80d6f964fbecb3359c43bd48b40f7cadad9" 235 | integrity sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg== 236 | 237 | "@tsconfig/node12@^1.0.7": 238 | version "1.0.9" 239 | resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.9.tgz#62c1f6dee2ebd9aead80dc3afa56810e58e1a04c" 240 | integrity sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw== 241 | 242 | "@tsconfig/node14@^1.0.0": 243 | version "1.0.1" 244 | resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.1.tgz#95f2d167ffb9b8d2068b0b235302fafd4df711f2" 245 | integrity sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg== 246 | 247 | "@tsconfig/node16@^1.0.2": 248 | version "1.0.2" 249 | resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.2.tgz#423c77877d0569db20e1fc80885ac4118314010e" 250 | integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA== 251 | 252 | "@types/chai@^4.2.22": 253 | version "4.2.22" 254 | resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.22.tgz#47020d7e4cf19194d43b5202f35f75bd2ad35ce7" 255 | integrity sha512-tFfcE+DSTzWAgifkjik9AySNqIyNoYwmR+uecPwwD/XRNfvOjmC/FjCxpiUGDkDVDphPfCUecSQVFw+lN3M3kQ== 256 | 257 | "@types/mocha@^9.0.0": 258 | version "9.0.0" 259 | resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.0.0.tgz#3205bcd15ada9bc681ac20bef64e9e6df88fd297" 260 | integrity sha512-scN0hAWyLVAvLR9AyW7HoFF5sJZglyBsbPuHO4fv7JRvfmPBMfp1ozWqOf/e4wwPNxezBZXRfWzMb6iFLgEVRA== 261 | 262 | "@ungap/promise-all-settled@1.1.2": 263 | version "1.1.2" 264 | resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" 265 | integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== 266 | 267 | acorn-walk@^8.1.1: 268 | version "8.2.0" 269 | resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" 270 | integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== 271 | 272 | acorn@^8.4.1: 273 | version "8.6.0" 274 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.6.0.tgz#e3692ba0eb1a0c83eaa4f37f5fa7368dd7142895" 275 | integrity sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw== 276 | 277 | aggregate-error@^3.0.0: 278 | version "3.1.0" 279 | resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" 280 | integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== 281 | dependencies: 282 | clean-stack "^2.0.0" 283 | indent-string "^4.0.0" 284 | 285 | ansi-colors@4.1.1: 286 | version "4.1.1" 287 | resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" 288 | integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== 289 | 290 | ansi-regex@^5.0.1: 291 | version "5.0.1" 292 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 293 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 294 | 295 | ansi-styles@^3.2.1: 296 | version "3.2.1" 297 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 298 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 299 | dependencies: 300 | color-convert "^1.9.0" 301 | 302 | ansi-styles@^4.0.0, ansi-styles@^4.1.0: 303 | version "4.3.0" 304 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 305 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 306 | dependencies: 307 | color-convert "^2.0.1" 308 | 309 | anymatch@~3.1.2: 310 | version "3.1.2" 311 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" 312 | integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== 313 | dependencies: 314 | normalize-path "^3.0.0" 315 | picomatch "^2.0.4" 316 | 317 | append-transform@^2.0.0: 318 | version "2.0.0" 319 | resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-2.0.0.tgz#99d9d29c7b38391e6f428d28ce136551f0b77e12" 320 | integrity sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg== 321 | dependencies: 322 | default-require-extensions "^3.0.0" 323 | 324 | archy@^1.0.0: 325 | version "1.0.0" 326 | resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" 327 | integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA= 328 | 329 | arg@^4.1.0: 330 | version "4.1.3" 331 | resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" 332 | integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== 333 | 334 | argparse@^1.0.7: 335 | version "1.0.10" 336 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 337 | integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== 338 | dependencies: 339 | sprintf-js "~1.0.2" 340 | 341 | argparse@^2.0.1: 342 | version "2.0.1" 343 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" 344 | integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== 345 | 346 | assertion-error@^1.1.0: 347 | version "1.1.0" 348 | resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" 349 | integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== 350 | 351 | balanced-match@^1.0.0: 352 | version "1.0.2" 353 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 354 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 355 | 356 | binary-extensions@^2.0.0: 357 | version "2.2.0" 358 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" 359 | integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== 360 | 361 | brace-expansion@^1.1.7: 362 | version "1.1.11" 363 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 364 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 365 | dependencies: 366 | balanced-match "^1.0.0" 367 | concat-map "0.0.1" 368 | 369 | braces@~3.0.2: 370 | version "3.0.2" 371 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 372 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 373 | dependencies: 374 | fill-range "^7.0.1" 375 | 376 | browser-stdout@1.3.1: 377 | version "1.3.1" 378 | resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" 379 | integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== 380 | 381 | browserslist@^4.17.5: 382 | version "4.18.1" 383 | resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.18.1.tgz#60d3920f25b6860eb917c6c7b185576f4d8b017f" 384 | integrity sha512-8ScCzdpPwR2wQh8IT82CA2VgDwjHyqMovPBZSNH54+tm4Jk2pCuv90gmAdH6J84OCRWi0b4gMe6O6XPXuJnjgQ== 385 | dependencies: 386 | caniuse-lite "^1.0.30001280" 387 | electron-to-chromium "^1.3.896" 388 | escalade "^3.1.1" 389 | node-releases "^2.0.1" 390 | picocolors "^1.0.0" 391 | 392 | caching-transform@^4.0.0: 393 | version "4.0.0" 394 | resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-4.0.0.tgz#00d297a4206d71e2163c39eaffa8157ac0651f0f" 395 | integrity sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA== 396 | dependencies: 397 | hasha "^5.0.0" 398 | make-dir "^3.0.0" 399 | package-hash "^4.0.0" 400 | write-file-atomic "^3.0.0" 401 | 402 | camelcase@^5.0.0, camelcase@^5.3.1: 403 | version "5.3.1" 404 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" 405 | integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== 406 | 407 | camelcase@^6.0.0: 408 | version "6.2.1" 409 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.1.tgz#250fd350cfd555d0d2160b1d51510eaf8326e86e" 410 | integrity sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA== 411 | 412 | caniuse-lite@^1.0.30001280: 413 | version "1.0.30001284" 414 | resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001284.tgz#d3653929ded898cd0c1f09a56fd8ca6952df4fca" 415 | integrity sha512-t28SKa7g6kiIQi6NHeOcKrOrGMzCRrXvlasPwWC26TH2QNdglgzQIRUuJ0cR3NeQPH+5jpuveeeSFDLm2zbkEw== 416 | 417 | chai@^4.3.4: 418 | version "4.3.4" 419 | resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.4.tgz#b55e655b31e1eac7099be4c08c21964fce2e6c49" 420 | integrity sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA== 421 | dependencies: 422 | assertion-error "^1.1.0" 423 | check-error "^1.0.2" 424 | deep-eql "^3.0.1" 425 | get-func-name "^2.0.0" 426 | pathval "^1.1.1" 427 | type-detect "^4.0.5" 428 | 429 | chalk@^2.0.0: 430 | version "2.4.2" 431 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 432 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 433 | dependencies: 434 | ansi-styles "^3.2.1" 435 | escape-string-regexp "^1.0.5" 436 | supports-color "^5.3.0" 437 | 438 | chalk@^4.1.0: 439 | version "4.1.2" 440 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 441 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 442 | dependencies: 443 | ansi-styles "^4.1.0" 444 | supports-color "^7.1.0" 445 | 446 | check-error@^1.0.2: 447 | version "1.0.2" 448 | resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" 449 | integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= 450 | 451 | chokidar@3.5.3: 452 | version "3.5.3" 453 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" 454 | integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== 455 | dependencies: 456 | anymatch "~3.1.2" 457 | braces "~3.0.2" 458 | glob-parent "~5.1.2" 459 | is-binary-path "~2.1.0" 460 | is-glob "~4.0.1" 461 | normalize-path "~3.0.0" 462 | readdirp "~3.6.0" 463 | optionalDependencies: 464 | fsevents "~2.3.2" 465 | 466 | clean-stack@^2.0.0: 467 | version "2.2.0" 468 | resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" 469 | integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== 470 | 471 | cliui@^6.0.0: 472 | version "6.0.0" 473 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" 474 | integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== 475 | dependencies: 476 | string-width "^4.2.0" 477 | strip-ansi "^6.0.0" 478 | wrap-ansi "^6.2.0" 479 | 480 | cliui@^7.0.2: 481 | version "7.0.4" 482 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" 483 | integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== 484 | dependencies: 485 | string-width "^4.2.0" 486 | strip-ansi "^6.0.0" 487 | wrap-ansi "^7.0.0" 488 | 489 | color-convert@^1.9.0: 490 | version "1.9.3" 491 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 492 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 493 | dependencies: 494 | color-name "1.1.3" 495 | 496 | color-convert@^2.0.1: 497 | version "2.0.1" 498 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 499 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 500 | dependencies: 501 | color-name "~1.1.4" 502 | 503 | color-name@1.1.3: 504 | version "1.1.3" 505 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 506 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 507 | 508 | color-name@~1.1.4: 509 | version "1.1.4" 510 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 511 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 512 | 513 | commondir@^1.0.1: 514 | version "1.0.1" 515 | resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" 516 | integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= 517 | 518 | concat-map@0.0.1: 519 | version "0.0.1" 520 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 521 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 522 | 523 | convert-source-map@^1.7.0: 524 | version "1.8.0" 525 | resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" 526 | integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== 527 | dependencies: 528 | safe-buffer "~5.1.1" 529 | 530 | create-require@^1.1.0: 531 | version "1.1.1" 532 | resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" 533 | integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== 534 | 535 | cross-spawn@^7.0.0: 536 | version "7.0.3" 537 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" 538 | integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== 539 | dependencies: 540 | path-key "^3.1.0" 541 | shebang-command "^2.0.0" 542 | which "^2.0.1" 543 | 544 | debug@4.3.3, debug@^4.1.0, debug@^4.1.1: 545 | version "4.3.3" 546 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" 547 | integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== 548 | dependencies: 549 | ms "2.1.2" 550 | 551 | decamelize@^1.2.0: 552 | version "1.2.0" 553 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 554 | integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= 555 | 556 | decamelize@^4.0.0: 557 | version "4.0.0" 558 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" 559 | integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== 560 | 561 | deep-eql@^3.0.1: 562 | version "3.0.1" 563 | resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" 564 | integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== 565 | dependencies: 566 | type-detect "^4.0.0" 567 | 568 | default-require-extensions@^3.0.0: 569 | version "3.0.0" 570 | resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-3.0.0.tgz#e03f93aac9b2b6443fc52e5e4a37b3ad9ad8df96" 571 | integrity sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg== 572 | dependencies: 573 | strip-bom "^4.0.0" 574 | 575 | diff@5.0.0: 576 | version "5.0.0" 577 | resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" 578 | integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== 579 | 580 | diff@^4.0.1: 581 | version "4.0.2" 582 | resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" 583 | integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== 584 | 585 | electron-to-chromium@^1.3.896: 586 | version "1.4.11" 587 | resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.11.tgz#303c9deebbe90c68bf5c2c81a88a3bf4522c8810" 588 | integrity sha512-2OhsaYgsWGhWjx2et8kaUcdktPbBGjKM2X0BReUCKcSCPttEY+hz2zie820JLbttU8jwL92+JJysWwkut3wZgA== 589 | 590 | emoji-regex@^8.0.0: 591 | version "8.0.0" 592 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 593 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 594 | 595 | es6-error@^4.0.1: 596 | version "4.1.1" 597 | resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" 598 | integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== 599 | 600 | escalade@^3.1.1: 601 | version "3.1.1" 602 | resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" 603 | integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== 604 | 605 | escape-string-regexp@4.0.0: 606 | version "4.0.0" 607 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" 608 | integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== 609 | 610 | escape-string-regexp@^1.0.5: 611 | version "1.0.5" 612 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 613 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 614 | 615 | esprima@^4.0.0: 616 | version "4.0.1" 617 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 618 | integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== 619 | 620 | fill-range@^7.0.1: 621 | version "7.0.1" 622 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 623 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 624 | dependencies: 625 | to-regex-range "^5.0.1" 626 | 627 | find-cache-dir@^3.2.0: 628 | version "3.3.2" 629 | resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" 630 | integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== 631 | dependencies: 632 | commondir "^1.0.1" 633 | make-dir "^3.0.2" 634 | pkg-dir "^4.1.0" 635 | 636 | find-up@5.0.0: 637 | version "5.0.0" 638 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" 639 | integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== 640 | dependencies: 641 | locate-path "^6.0.0" 642 | path-exists "^4.0.0" 643 | 644 | find-up@^4.0.0, find-up@^4.1.0: 645 | version "4.1.0" 646 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" 647 | integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== 648 | dependencies: 649 | locate-path "^5.0.0" 650 | path-exists "^4.0.0" 651 | 652 | flat@^5.0.2: 653 | version "5.0.2" 654 | resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" 655 | integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== 656 | 657 | foreground-child@^2.0.0: 658 | version "2.0.0" 659 | resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-2.0.0.tgz#71b32800c9f15aa8f2f83f4a6bd9bff35d861a53" 660 | integrity sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA== 661 | dependencies: 662 | cross-spawn "^7.0.0" 663 | signal-exit "^3.0.2" 664 | 665 | fromentries@^1.2.0: 666 | version "1.3.2" 667 | resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.3.2.tgz#e4bca6808816bf8f93b52750f1127f5a6fd86e3a" 668 | integrity sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg== 669 | 670 | fs.realpath@^1.0.0: 671 | version "1.0.0" 672 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 673 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 674 | 675 | fsevents@~2.3.2: 676 | version "2.3.2" 677 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" 678 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 679 | 680 | gensync@^1.0.0-beta.2: 681 | version "1.0.0-beta.2" 682 | resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" 683 | integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== 684 | 685 | get-caller-file@^2.0.1, get-caller-file@^2.0.5: 686 | version "2.0.5" 687 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" 688 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== 689 | 690 | get-func-name@^2.0.0: 691 | version "2.0.0" 692 | resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" 693 | integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= 694 | 695 | get-package-type@^0.1.0: 696 | version "0.1.0" 697 | resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" 698 | integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== 699 | 700 | glob-parent@~5.1.2: 701 | version "5.1.2" 702 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 703 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 704 | dependencies: 705 | is-glob "^4.0.1" 706 | 707 | glob@7.2.0, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: 708 | version "7.2.0" 709 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" 710 | integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== 711 | dependencies: 712 | fs.realpath "^1.0.0" 713 | inflight "^1.0.4" 714 | inherits "2" 715 | minimatch "^3.0.4" 716 | once "^1.3.0" 717 | path-is-absolute "^1.0.0" 718 | 719 | globals@^11.1.0: 720 | version "11.12.0" 721 | resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" 722 | integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== 723 | 724 | graceful-fs@^4.1.15: 725 | version "4.2.8" 726 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" 727 | integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== 728 | 729 | growl@1.10.5: 730 | version "1.10.5" 731 | resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" 732 | integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== 733 | 734 | has-flag@^3.0.0: 735 | version "3.0.0" 736 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 737 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 738 | 739 | has-flag@^4.0.0: 740 | version "4.0.0" 741 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 742 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 743 | 744 | hasha@^5.0.0: 745 | version "5.2.2" 746 | resolved "https://registry.yarnpkg.com/hasha/-/hasha-5.2.2.tgz#a48477989b3b327aea3c04f53096d816d97522a1" 747 | integrity sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ== 748 | dependencies: 749 | is-stream "^2.0.0" 750 | type-fest "^0.8.0" 751 | 752 | he@1.2.0: 753 | version "1.2.0" 754 | resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" 755 | integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== 756 | 757 | html-escaper@^2.0.0: 758 | version "2.0.2" 759 | resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" 760 | integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== 761 | 762 | husky@^7.0.4: 763 | version "7.0.4" 764 | resolved "https://registry.yarnpkg.com/husky/-/husky-7.0.4.tgz#242048245dc49c8fb1bf0cc7cfb98dd722531535" 765 | integrity sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ== 766 | 767 | imurmurhash@^0.1.4: 768 | version "0.1.4" 769 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 770 | integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= 771 | 772 | indent-string@^4.0.0: 773 | version "4.0.0" 774 | resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" 775 | integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== 776 | 777 | inflight@^1.0.4: 778 | version "1.0.6" 779 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 780 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 781 | dependencies: 782 | once "^1.3.0" 783 | wrappy "1" 784 | 785 | inherits@2: 786 | version "2.0.4" 787 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 788 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 789 | 790 | is-binary-path@~2.1.0: 791 | version "2.1.0" 792 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 793 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 794 | dependencies: 795 | binary-extensions "^2.0.0" 796 | 797 | is-extglob@^2.1.1: 798 | version "2.1.1" 799 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 800 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 801 | 802 | is-fullwidth-code-point@^3.0.0: 803 | version "3.0.0" 804 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 805 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 806 | 807 | is-glob@^4.0.1, is-glob@~4.0.1: 808 | version "4.0.3" 809 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 810 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 811 | dependencies: 812 | is-extglob "^2.1.1" 813 | 814 | is-number@^7.0.0: 815 | version "7.0.0" 816 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 817 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 818 | 819 | is-plain-obj@^2.1.0: 820 | version "2.1.0" 821 | resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" 822 | integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== 823 | 824 | is-stream@^2.0.0: 825 | version "2.0.1" 826 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" 827 | integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== 828 | 829 | is-typedarray@^1.0.0: 830 | version "1.0.0" 831 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 832 | integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= 833 | 834 | is-unicode-supported@^0.1.0: 835 | version "0.1.0" 836 | resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" 837 | integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== 838 | 839 | is-windows@^1.0.2: 840 | version "1.0.2" 841 | resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" 842 | integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== 843 | 844 | isexe@^2.0.0: 845 | version "2.0.0" 846 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 847 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 848 | 849 | istanbul-badges-readme@^1.8.0: 850 | version "1.8.0" 851 | resolved "https://registry.yarnpkg.com/istanbul-badges-readme/-/istanbul-badges-readme-1.8.0.tgz#f7ecf8109ec459f9b64c11e193d522fe14547711" 852 | integrity sha512-RDk15LEuxezfwMCcEze6Qgo0cT5VV5+LJZOVAqugrl1q+RioiWdoipKcpAHjP/zuJsfuQAf1AOwKNN2NLRq8Tg== 853 | 854 | istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.0.0-alpha.1: 855 | version "3.2.0" 856 | resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" 857 | integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== 858 | 859 | istanbul-lib-hook@^3.0.0: 860 | version "3.0.0" 861 | resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz#8f84c9434888cc6b1d0a9d7092a76d239ebf0cc6" 862 | integrity sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ== 863 | dependencies: 864 | append-transform "^2.0.0" 865 | 866 | istanbul-lib-instrument@^4.0.0: 867 | version "4.0.3" 868 | resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" 869 | integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== 870 | dependencies: 871 | "@babel/core" "^7.7.5" 872 | "@istanbuljs/schema" "^0.1.2" 873 | istanbul-lib-coverage "^3.0.0" 874 | semver "^6.3.0" 875 | 876 | istanbul-lib-processinfo@^2.0.2: 877 | version "2.0.2" 878 | resolved "https://registry.yarnpkg.com/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz#e1426514662244b2f25df728e8fd1ba35fe53b9c" 879 | integrity sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw== 880 | dependencies: 881 | archy "^1.0.0" 882 | cross-spawn "^7.0.0" 883 | istanbul-lib-coverage "^3.0.0-alpha.1" 884 | make-dir "^3.0.0" 885 | p-map "^3.0.0" 886 | rimraf "^3.0.0" 887 | uuid "^3.3.3" 888 | 889 | istanbul-lib-report@^3.0.0: 890 | version "3.0.0" 891 | resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" 892 | integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== 893 | dependencies: 894 | istanbul-lib-coverage "^3.0.0" 895 | make-dir "^3.0.0" 896 | supports-color "^7.1.0" 897 | 898 | istanbul-lib-source-maps@^4.0.0: 899 | version "4.0.1" 900 | resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" 901 | integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== 902 | dependencies: 903 | debug "^4.1.1" 904 | istanbul-lib-coverage "^3.0.0" 905 | source-map "^0.6.1" 906 | 907 | istanbul-reports@^3.0.2: 908 | version "3.1.1" 909 | resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.1.tgz#7085857f17d2441053c6ce5c3b8fdf6882289397" 910 | integrity sha512-q1kvhAXWSsXfMjCdNHNPKZZv94OlspKnoGv+R9RGbnqOOQ0VbNfLFgQDVgi7hHenKsndGq3/o0OBdzDXthWcNw== 911 | dependencies: 912 | html-escaper "^2.0.0" 913 | istanbul-lib-report "^3.0.0" 914 | 915 | js-tokens@^4.0.0: 916 | version "4.0.0" 917 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 918 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 919 | 920 | js-yaml@4.1.0: 921 | version "4.1.0" 922 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" 923 | integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== 924 | dependencies: 925 | argparse "^2.0.1" 926 | 927 | js-yaml@^3.13.1: 928 | version "3.14.1" 929 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" 930 | integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== 931 | dependencies: 932 | argparse "^1.0.7" 933 | esprima "^4.0.0" 934 | 935 | jsesc@^2.5.1: 936 | version "2.5.2" 937 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" 938 | integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== 939 | 940 | json5@^2.1.2: 941 | version "2.2.3" 942 | resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" 943 | integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== 944 | 945 | locate-path@^5.0.0: 946 | version "5.0.0" 947 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" 948 | integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== 949 | dependencies: 950 | p-locate "^4.1.0" 951 | 952 | locate-path@^6.0.0: 953 | version "6.0.0" 954 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" 955 | integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== 956 | dependencies: 957 | p-locate "^5.0.0" 958 | 959 | lodash.flattendeep@^4.4.0: 960 | version "4.4.0" 961 | resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" 962 | integrity sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI= 963 | 964 | log-symbols@4.1.0: 965 | version "4.1.0" 966 | resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" 967 | integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== 968 | dependencies: 969 | chalk "^4.1.0" 970 | is-unicode-supported "^0.1.0" 971 | 972 | make-dir@^3.0.0, make-dir@^3.0.2: 973 | version "3.1.0" 974 | resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" 975 | integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== 976 | dependencies: 977 | semver "^6.0.0" 978 | 979 | make-error@^1.1.1: 980 | version "1.3.6" 981 | resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" 982 | integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== 983 | 984 | minimatch@4.2.1: 985 | version "4.2.1" 986 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-4.2.1.tgz#40d9d511a46bdc4e563c22c3080cde9c0d8299b4" 987 | integrity sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g== 988 | dependencies: 989 | brace-expansion "^1.1.7" 990 | 991 | minimatch@^3.0.4: 992 | version "3.1.2" 993 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 994 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 995 | dependencies: 996 | brace-expansion "^1.1.7" 997 | 998 | mocha@^9.2.2: 999 | version "9.2.2" 1000 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.2.2.tgz#d70db46bdb93ca57402c809333e5a84977a88fb9" 1001 | integrity sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g== 1002 | dependencies: 1003 | "@ungap/promise-all-settled" "1.1.2" 1004 | ansi-colors "4.1.1" 1005 | browser-stdout "1.3.1" 1006 | chokidar "3.5.3" 1007 | debug "4.3.3" 1008 | diff "5.0.0" 1009 | escape-string-regexp "4.0.0" 1010 | find-up "5.0.0" 1011 | glob "7.2.0" 1012 | growl "1.10.5" 1013 | he "1.2.0" 1014 | js-yaml "4.1.0" 1015 | log-symbols "4.1.0" 1016 | minimatch "4.2.1" 1017 | ms "2.1.3" 1018 | nanoid "3.3.1" 1019 | serialize-javascript "6.0.0" 1020 | strip-json-comments "3.1.1" 1021 | supports-color "8.1.1" 1022 | which "2.0.2" 1023 | workerpool "6.2.0" 1024 | yargs "16.2.0" 1025 | yargs-parser "20.2.4" 1026 | yargs-unparser "2.0.0" 1027 | 1028 | ms@2.1.2: 1029 | version "2.1.2" 1030 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1031 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1032 | 1033 | ms@2.1.3: 1034 | version "2.1.3" 1035 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 1036 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 1037 | 1038 | nanoid@3.3.1: 1039 | version "3.3.1" 1040 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35" 1041 | integrity sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw== 1042 | 1043 | node-preload@^0.2.1: 1044 | version "0.2.1" 1045 | resolved "https://registry.yarnpkg.com/node-preload/-/node-preload-0.2.1.tgz#c03043bb327f417a18fee7ab7ee57b408a144301" 1046 | integrity sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ== 1047 | dependencies: 1048 | process-on-spawn "^1.0.0" 1049 | 1050 | node-releases@^2.0.1: 1051 | version "2.0.1" 1052 | resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5" 1053 | integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA== 1054 | 1055 | normalize-path@^3.0.0, normalize-path@~3.0.0: 1056 | version "3.0.0" 1057 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 1058 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 1059 | 1060 | nyc@^15.1.0: 1061 | version "15.1.0" 1062 | resolved "https://registry.yarnpkg.com/nyc/-/nyc-15.1.0.tgz#1335dae12ddc87b6e249d5a1994ca4bdaea75f02" 1063 | integrity sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A== 1064 | dependencies: 1065 | "@istanbuljs/load-nyc-config" "^1.0.0" 1066 | "@istanbuljs/schema" "^0.1.2" 1067 | caching-transform "^4.0.0" 1068 | convert-source-map "^1.7.0" 1069 | decamelize "^1.2.0" 1070 | find-cache-dir "^3.2.0" 1071 | find-up "^4.1.0" 1072 | foreground-child "^2.0.0" 1073 | get-package-type "^0.1.0" 1074 | glob "^7.1.6" 1075 | istanbul-lib-coverage "^3.0.0" 1076 | istanbul-lib-hook "^3.0.0" 1077 | istanbul-lib-instrument "^4.0.0" 1078 | istanbul-lib-processinfo "^2.0.2" 1079 | istanbul-lib-report "^3.0.0" 1080 | istanbul-lib-source-maps "^4.0.0" 1081 | istanbul-reports "^3.0.2" 1082 | make-dir "^3.0.0" 1083 | node-preload "^0.2.1" 1084 | p-map "^3.0.0" 1085 | process-on-spawn "^1.0.0" 1086 | resolve-from "^5.0.0" 1087 | rimraf "^3.0.0" 1088 | signal-exit "^3.0.2" 1089 | spawn-wrap "^2.0.0" 1090 | test-exclude "^6.0.0" 1091 | yargs "^15.0.2" 1092 | 1093 | once@^1.3.0: 1094 | version "1.4.0" 1095 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1096 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 1097 | dependencies: 1098 | wrappy "1" 1099 | 1100 | p-limit@^2.2.0: 1101 | version "2.3.0" 1102 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" 1103 | integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== 1104 | dependencies: 1105 | p-try "^2.0.0" 1106 | 1107 | p-limit@^3.0.2: 1108 | version "3.1.0" 1109 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" 1110 | integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== 1111 | dependencies: 1112 | yocto-queue "^0.1.0" 1113 | 1114 | p-locate@^4.1.0: 1115 | version "4.1.0" 1116 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" 1117 | integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== 1118 | dependencies: 1119 | p-limit "^2.2.0" 1120 | 1121 | p-locate@^5.0.0: 1122 | version "5.0.0" 1123 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" 1124 | integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== 1125 | dependencies: 1126 | p-limit "^3.0.2" 1127 | 1128 | p-map@^3.0.0: 1129 | version "3.0.0" 1130 | resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" 1131 | integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== 1132 | dependencies: 1133 | aggregate-error "^3.0.0" 1134 | 1135 | p-try@^2.0.0: 1136 | version "2.2.0" 1137 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" 1138 | integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== 1139 | 1140 | package-hash@^4.0.0: 1141 | version "4.0.0" 1142 | resolved "https://registry.yarnpkg.com/package-hash/-/package-hash-4.0.0.tgz#3537f654665ec3cc38827387fc904c163c54f506" 1143 | integrity sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ== 1144 | dependencies: 1145 | graceful-fs "^4.1.15" 1146 | hasha "^5.0.0" 1147 | lodash.flattendeep "^4.4.0" 1148 | release-zalgo "^1.0.0" 1149 | 1150 | path-exists@^4.0.0: 1151 | version "4.0.0" 1152 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 1153 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 1154 | 1155 | path-is-absolute@^1.0.0: 1156 | version "1.0.1" 1157 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1158 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 1159 | 1160 | path-key@^3.1.0: 1161 | version "3.1.1" 1162 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 1163 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 1164 | 1165 | pathval@^1.1.1: 1166 | version "1.1.1" 1167 | resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" 1168 | integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== 1169 | 1170 | picocolors@^1.0.0: 1171 | version "1.0.0" 1172 | resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" 1173 | integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== 1174 | 1175 | picomatch@^2.0.4, picomatch@^2.2.1: 1176 | version "2.3.0" 1177 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" 1178 | integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== 1179 | 1180 | pkg-dir@^4.1.0: 1181 | version "4.2.0" 1182 | resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" 1183 | integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== 1184 | dependencies: 1185 | find-up "^4.0.0" 1186 | 1187 | process-on-spawn@^1.0.0: 1188 | version "1.0.0" 1189 | resolved "https://registry.yarnpkg.com/process-on-spawn/-/process-on-spawn-1.0.0.tgz#95b05a23073d30a17acfdc92a440efd2baefdc93" 1190 | integrity sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg== 1191 | dependencies: 1192 | fromentries "^1.2.0" 1193 | 1194 | randombytes@^2.1.0: 1195 | version "2.1.0" 1196 | resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" 1197 | integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== 1198 | dependencies: 1199 | safe-buffer "^5.1.0" 1200 | 1201 | readdirp@~3.6.0: 1202 | version "3.6.0" 1203 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" 1204 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== 1205 | dependencies: 1206 | picomatch "^2.2.1" 1207 | 1208 | release-zalgo@^1.0.0: 1209 | version "1.0.0" 1210 | resolved "https://registry.yarnpkg.com/release-zalgo/-/release-zalgo-1.0.0.tgz#09700b7e5074329739330e535c5a90fb67851730" 1211 | integrity sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA= 1212 | dependencies: 1213 | es6-error "^4.0.1" 1214 | 1215 | require-directory@^2.1.1: 1216 | version "2.1.1" 1217 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 1218 | integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= 1219 | 1220 | require-main-filename@^2.0.0: 1221 | version "2.0.0" 1222 | resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" 1223 | integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== 1224 | 1225 | resolve-from@^5.0.0: 1226 | version "5.0.0" 1227 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" 1228 | integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== 1229 | 1230 | rimraf@^3.0.0: 1231 | version "3.0.2" 1232 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" 1233 | integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== 1234 | dependencies: 1235 | glob "^7.1.3" 1236 | 1237 | safe-buffer@^5.1.0: 1238 | version "5.2.1" 1239 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 1240 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 1241 | 1242 | safe-buffer@~5.1.1: 1243 | version "5.1.2" 1244 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 1245 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 1246 | 1247 | semver@^6.0.0, semver@^6.3.0: 1248 | version "6.3.0" 1249 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" 1250 | integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== 1251 | 1252 | serialize-javascript@6.0.0: 1253 | version "6.0.0" 1254 | resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" 1255 | integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== 1256 | dependencies: 1257 | randombytes "^2.1.0" 1258 | 1259 | set-blocking@^2.0.0: 1260 | version "2.0.0" 1261 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 1262 | integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= 1263 | 1264 | shebang-command@^2.0.0: 1265 | version "2.0.0" 1266 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 1267 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 1268 | dependencies: 1269 | shebang-regex "^3.0.0" 1270 | 1271 | shebang-regex@^3.0.0: 1272 | version "3.0.0" 1273 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 1274 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 1275 | 1276 | signal-exit@^3.0.2: 1277 | version "3.0.6" 1278 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.6.tgz#24e630c4b0f03fea446a2bd299e62b4a6ca8d0af" 1279 | integrity sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ== 1280 | 1281 | source-map@^0.5.0: 1282 | version "0.5.7" 1283 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" 1284 | integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= 1285 | 1286 | source-map@^0.6.1: 1287 | version "0.6.1" 1288 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 1289 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 1290 | 1291 | spawn-wrap@^2.0.0: 1292 | version "2.0.0" 1293 | resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-2.0.0.tgz#103685b8b8f9b79771318827aa78650a610d457e" 1294 | integrity sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg== 1295 | dependencies: 1296 | foreground-child "^2.0.0" 1297 | is-windows "^1.0.2" 1298 | make-dir "^3.0.0" 1299 | rimraf "^3.0.0" 1300 | signal-exit "^3.0.2" 1301 | which "^2.0.1" 1302 | 1303 | sprintf-js@~1.0.2: 1304 | version "1.0.3" 1305 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 1306 | integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= 1307 | 1308 | string-width@^4.1.0, string-width@^4.2.0: 1309 | version "4.2.3" 1310 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" 1311 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 1312 | dependencies: 1313 | emoji-regex "^8.0.0" 1314 | is-fullwidth-code-point "^3.0.0" 1315 | strip-ansi "^6.0.1" 1316 | 1317 | strip-ansi@^6.0.0, strip-ansi@^6.0.1: 1318 | version "6.0.1" 1319 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 1320 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 1321 | dependencies: 1322 | ansi-regex "^5.0.1" 1323 | 1324 | strip-bom@^4.0.0: 1325 | version "4.0.0" 1326 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" 1327 | integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== 1328 | 1329 | strip-json-comments@3.1.1: 1330 | version "3.1.1" 1331 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" 1332 | integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== 1333 | 1334 | supports-color@8.1.1: 1335 | version "8.1.1" 1336 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" 1337 | integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== 1338 | dependencies: 1339 | has-flag "^4.0.0" 1340 | 1341 | supports-color@^5.3.0: 1342 | version "5.5.0" 1343 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 1344 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 1345 | dependencies: 1346 | has-flag "^3.0.0" 1347 | 1348 | supports-color@^7.1.0: 1349 | version "7.2.0" 1350 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 1351 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 1352 | dependencies: 1353 | has-flag "^4.0.0" 1354 | 1355 | test-exclude@^6.0.0: 1356 | version "6.0.0" 1357 | resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" 1358 | integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== 1359 | dependencies: 1360 | "@istanbuljs/schema" "^0.1.2" 1361 | glob "^7.1.4" 1362 | minimatch "^3.0.4" 1363 | 1364 | to-fast-properties@^2.0.0: 1365 | version "2.0.0" 1366 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" 1367 | integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= 1368 | 1369 | to-regex-range@^5.0.1: 1370 | version "5.0.1" 1371 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 1372 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 1373 | dependencies: 1374 | is-number "^7.0.0" 1375 | 1376 | ts-node@^10.4.0: 1377 | version "10.4.0" 1378 | resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.4.0.tgz#680f88945885f4e6cf450e7f0d6223dd404895f7" 1379 | integrity sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A== 1380 | dependencies: 1381 | "@cspotcode/source-map-support" "0.7.0" 1382 | "@tsconfig/node10" "^1.0.7" 1383 | "@tsconfig/node12" "^1.0.7" 1384 | "@tsconfig/node14" "^1.0.0" 1385 | "@tsconfig/node16" "^1.0.2" 1386 | acorn "^8.4.1" 1387 | acorn-walk "^8.1.1" 1388 | arg "^4.1.0" 1389 | create-require "^1.1.0" 1390 | diff "^4.0.1" 1391 | make-error "^1.1.1" 1392 | yn "3.1.1" 1393 | 1394 | type-detect@^4.0.0, type-detect@^4.0.5: 1395 | version "4.0.8" 1396 | resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" 1397 | integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== 1398 | 1399 | type-fest@^0.8.0: 1400 | version "0.8.1" 1401 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" 1402 | integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== 1403 | 1404 | typedarray-to-buffer@^3.1.5: 1405 | version "3.1.5" 1406 | resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" 1407 | integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== 1408 | dependencies: 1409 | is-typedarray "^1.0.0" 1410 | 1411 | typescript@^4.5.2: 1412 | version "4.5.2" 1413 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.2.tgz#8ac1fba9f52256fdb06fb89e4122fa6a346c2998" 1414 | integrity sha512-5BlMof9H1yGt0P8/WF+wPNw6GfctgGjXp5hkblpyT+8rkASSmkUKMXrxR0Xg8ThVCi/JnHQiKXeBaEwCeQwMFw== 1415 | 1416 | uuid@^3.3.3: 1417 | version "3.4.0" 1418 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" 1419 | integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== 1420 | 1421 | which-module@^2.0.0: 1422 | version "2.0.0" 1423 | resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" 1424 | integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= 1425 | 1426 | which@2.0.2, which@^2.0.1: 1427 | version "2.0.2" 1428 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 1429 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 1430 | dependencies: 1431 | isexe "^2.0.0" 1432 | 1433 | workerpool@6.2.0: 1434 | version "6.2.0" 1435 | resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.0.tgz#827d93c9ba23ee2019c3ffaff5c27fccea289e8b" 1436 | integrity sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A== 1437 | 1438 | wrap-ansi@^6.2.0: 1439 | version "6.2.0" 1440 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" 1441 | integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== 1442 | dependencies: 1443 | ansi-styles "^4.0.0" 1444 | string-width "^4.1.0" 1445 | strip-ansi "^6.0.0" 1446 | 1447 | wrap-ansi@^7.0.0: 1448 | version "7.0.0" 1449 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" 1450 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 1451 | dependencies: 1452 | ansi-styles "^4.0.0" 1453 | string-width "^4.1.0" 1454 | strip-ansi "^6.0.0" 1455 | 1456 | wrappy@1: 1457 | version "1.0.2" 1458 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1459 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 1460 | 1461 | write-file-atomic@^3.0.0: 1462 | version "3.0.3" 1463 | resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" 1464 | integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== 1465 | dependencies: 1466 | imurmurhash "^0.1.4" 1467 | is-typedarray "^1.0.0" 1468 | signal-exit "^3.0.2" 1469 | typedarray-to-buffer "^3.1.5" 1470 | 1471 | y18n@^4.0.0: 1472 | version "4.0.3" 1473 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" 1474 | integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== 1475 | 1476 | y18n@^5.0.5: 1477 | version "5.0.8" 1478 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" 1479 | integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== 1480 | 1481 | yargs-parser@20.2.4: 1482 | version "20.2.4" 1483 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" 1484 | integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== 1485 | 1486 | yargs-parser@^18.1.2: 1487 | version "18.1.3" 1488 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" 1489 | integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== 1490 | dependencies: 1491 | camelcase "^5.0.0" 1492 | decamelize "^1.2.0" 1493 | 1494 | yargs-parser@^20.2.2: 1495 | version "20.2.9" 1496 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" 1497 | integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== 1498 | 1499 | yargs-unparser@2.0.0: 1500 | version "2.0.0" 1501 | resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" 1502 | integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== 1503 | dependencies: 1504 | camelcase "^6.0.0" 1505 | decamelize "^4.0.0" 1506 | flat "^5.0.2" 1507 | is-plain-obj "^2.1.0" 1508 | 1509 | yargs@16.2.0: 1510 | version "16.2.0" 1511 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" 1512 | integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== 1513 | dependencies: 1514 | cliui "^7.0.2" 1515 | escalade "^3.1.1" 1516 | get-caller-file "^2.0.5" 1517 | require-directory "^2.1.1" 1518 | string-width "^4.2.0" 1519 | y18n "^5.0.5" 1520 | yargs-parser "^20.2.2" 1521 | 1522 | yargs@^15.0.2: 1523 | version "15.4.1" 1524 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" 1525 | integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== 1526 | dependencies: 1527 | cliui "^6.0.0" 1528 | decamelize "^1.2.0" 1529 | find-up "^4.1.0" 1530 | get-caller-file "^2.0.1" 1531 | require-directory "^2.1.1" 1532 | require-main-filename "^2.0.0" 1533 | set-blocking "^2.0.0" 1534 | string-width "^4.2.0" 1535 | which-module "^2.0.0" 1536 | y18n "^4.0.0" 1537 | yargs-parser "^18.1.2" 1538 | 1539 | yn@3.1.1: 1540 | version "3.1.1" 1541 | resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" 1542 | integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== 1543 | 1544 | yocto-queue@^0.1.0: 1545 | version "0.1.0" 1546 | resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" 1547 | integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== 1548 | --------------------------------------------------------------------------------